pax_global_header00006660000000000000000000000064127233022720014512gustar00rootroot0000000000000052 comment=9fa5e76831168a7b93eb409d1c8a7e6f6adc243a aqemu-0.9.2/000077500000000000000000000000001272330227200126325ustar00rootroot00000000000000aqemu-0.9.2/AUTHORS000066400000000000000000000002401272330227200136760ustar00rootroot00000000000000Andrey Rijov ( Original Author, Developer, Author ) Tobias Gläßer ( Maintainer, Developer, from version 0.9.0 and up ) aqemu-0.9.2/CHANGELOG000066400000000000000000000201651272330227200140500ustar00rootroot000000000000002016-05-31 Tobias Gläßer (Version 0.9.2) * Fixed bug that prevented AQEMU from closing when no VM was created yet * Added frugalware icon * Fixed aqemu icon name to match .desktop file * Fixed incorrect information for raw images * Removed artificial 6GB limit on VM memory size * Show "Option ... not supported" errors that are wrongly sent to stdout by qemu 2016-05-13 Tobias Gläßer (Version 0.9.1) * 0.8.2 AQEMU settings and files get loaded correctly (If you want to go back to 0.8.2, make a backup) * Embedded VNC client now can make use of the user defined VNC port number * Error Log Window doesn't get shown for messages about deprecated options by default anymore * The VM state is now getting reflected in the VM icon (Running, Paused, ...) * Removed code to support qemu qemu-kvm fork, because it has been merged into qemu * Many small UI improvements * All new VMs are now created with the wizard, which generally gives better results * Put all application wide settings in a single dialog * Exchanged some deprecated qemu command line options with their new equivalents * Fixed various bugs * Reorganized/Restructured the main UI for more clarity * Fixed bug that led to VMs not being terminated when closing the application * New feature: Folder sharing * New feature: Send clipboard as keys to the VM * Fixed bug where SPICE dialog didn't validate correctly. * Applied patches for Intel HDA and CS4231A sound suppport (thanks to Eli Carter and others!) * Applied patch for fixing SPICE video stream compression support * Applied patch that fixes typo * Put QDom* TinyXML2 wrapper into its own namespace. Fixes runtime problems in conjunction with KDE. 2016-04-20 Tobias Gläßer (Version 0.9.0) * Ported to Qt5 * Ported to C++-11 * Applied downstream patches (Fedora) 2011-07-27 Andrey Rijov (Version 0.8.2) * Added QEMU/KVM 0.14 support * Bug Fixes 2010-12-21 Andrey Rijov (Version 0.8.1) * Added SPICE support * Added QEMU/KVM 0.13 support * Initial Windows support * Improved English localization * Added German localization (Not complete) * Improved Device Manager * GUI restyling (Changes affect almost all windows) * Added new OS icons * Added ability to change the font in the emulator monitor * Major Bug Fix 2010-07-12 Andrey Rijov (Version 0.8) * Support finding available emulator options and devices. * Change to CMake build system * Improved Ports Tab GUI * Improved USB System (Support read data from /sys, /dev, /proc) * Support Connecting QEMU Virtual USB Devices (mouse, tablet, wacom-tablet, keyboard, braille) * Support Change GUI Icon Theme * Support Change VM Icons Size * Support boot orger list * Support set SMP settings * Support remove VM with all files (like HDD images) * Improved code determines the amount of available memory * Added support new sound systems: PulseAudio, ESD, SDL * Added possibility to set advanced storage device settings * Rebuild "Convert HDD Image" window * Other Small Improvements and Bug Fixes 2009-09-28 Andrey Rijov (Version 0.7.3) * Added New Network Settings GUI * Added Devices /dev/srX in CD/DVD List * Support Adding User Devices in CD/DVD List * "Format" Button on HDD Tab * Support Resize Machines List Width * AQEMU Window Save Position on Desktop * Improved Support New Versions QEMU and KVM * Added "Create Shell Script" Command * Updated VM Templates * Other Small Improvements and Bug Fixes 2009-06-18 Andrey Rijov (Version 0.7.2) * Improved Support KVM * Added Support for Simultaneous use of Multiple Versions of Emulators * Added First Start Wizard * Changed Settings Window * Improved Support "Additional Arguments" * Support Include Emulator Control in Main Window * Support Include QEMU Display in Main Window * Improved Handling QEMU Errors * A Huge Amount of a Small Improvements and Bug Fixes 2009-03-31 Andrey Rijov (Version 0.7.1) * Added Support QEMU 0.10.0 and KVM 8X * Added 'No Shutdown' Option * Added 'Curces' Option * Added 'Show Cursor' Option * Added 'RTC TD Hack' Option * Added 'KVM Nesting' Option * Added 'Disable KVM kernel mode PIT interrupt reinjection' Option * Added 'No Use Embedded VNC Display' Option * Minor Interface Rebuilding * Fix in Network Redirections (thanks Guillem Rieu) * Fix in IP Address RegExp (thanks Karol Krenski) * Major Bug Fix 2009-03-04 Andrey Rijov (Version 0.7) * Embedded VNC Display (This Experimental Function) * Option Screenshot in Info Tab * Discard Button Enable If VM Changet * Full Support for Not English VM Names * New Copy VM Window * Support Full VM Copy * Rebuild Interface Settings Window * And Other Minor Changes 2009-01-27 Andrey Rijov (Version 0.6.1) * Complete Support for QEMU 0.9.1 Device Style * Added More Functionaly in Multi-Snapshot Mode * New 'Start Date' Option * Recent CD-ROM Images Menu in 'Emulator Control' * New VM Templates * Added VM Icons * And Other Minor Changes 2008-12-13 Andrey Rijov (Version 0.6) * Multi-Snapshot Mode * Support VNC (Remote Control) * Setting Generation MAC Address * New Code to Support Translation Into Other Languages. (Now you can simply copy translation file) * Initial Support Settings For Sound Driver * Manage AQEMU Logging * VM Copy Function * Improvement in Network Settings * Major Code Improvement * Big Bugs Fix 2008-10-17 Andrey Rijov (Version 0.5.2) * Created Russian Documentation * New Manage QEMU Binary Window * Minor Interface Rebuilding. * More Bug Fix 2008-09-17 Andrey Rijov (Version 0.5.1) * New Network Option "Hostname". * New OS Logos Icons (From Qemulator). * Minor Interface Rebuilding. * Major Bug Fix. 2008-09-01 Andrey Rijov (Version 0.5) * AQEMU compiles and works under FreeBSD. * Code rewritten globally. * Heavily reworked interface. * Completed "Device Manager". * Network cards settings has changed. * Tab "Ports" completely transformed. * Added tab Additional settings. * Information displayed on the tab Info can be configured. * Added choice binaries QEMU, for all supported architectures. (Especially helpful to those who KVM) * Users QEMU 0.9.1, can now choose the type of processor for the VM (486, Pentium 3, etc.) * Using QEMU 0.9.1 QEMU in the window now displays the name VM. * Options AQEMU now are in two boxes, ordinary and extra (Advanced). * You can choose what format to save screenshots. * Ability to use as a screen icon VM (in save state). * AQEMU checks the version of QEMU, and adjusts opportunities under the desired version (there is a regime installed by force compatibility with QEMU 0.9.0 or 0.9.1). * It checks whether the module loaded KVM (For systems with KVM). * Setting withdrawal logera QEMU (not AQEMU, namely QEMU). * Converting the image HDD is now happening in a separate thread. * AQEMU remembers the size of its main window. * Added many additional options for the QEMU 0.9.1 and KVM QEMU. (For example choice model network card or support a larger number of models of audio cards, the ability to connect images of memory cards, etc.). * Improved support for USB. * Fix errors discovered since the 0.4 version. 2008-07-12 Andrey Rijov (Version 0.4) * Added USB Support * Added VM Temlates Support * Added ROM File Option (For EtherBoot) * Info Panel in Device Manager * Fixes Typographical Errors * Initial KVM Support * Bug Fixes * And Other Minor Changes 2008-06-12 Andrey Rijov (Version 0.3) * Added Other x86 Platforms VM Settings * Initial Device Manager Mode Support * New OS Logos Icons * New QEMU Monitor Window * Created Info Tab Logic * And Other Minor Changes 2008-06-08 Andrey Rijov (Version 0.2.1) * Binary Version Build Without Network Audio System (libaudio) 2008-06-05 Andrey Rijov (Version 0.2) * Added Select OS Icon Window * Added OS Icon Menu * Create Logic for IBM PC Template Generation on Release Date (New VM Wizard Window) * Bug Fixes and Code Clean 2008-05-31 Andrey Rijov (Version: 0.1) * First Public Release aqemu-0.9.2/CMakeLists.txt000066400000000000000000000233361272330227200154010ustar00rootroot00000000000000# AQEMU CMake Project # Authors: # Andrey Rijov (AQEMU developer) # Timothy Redaelli (Fix for build in a different folder) # Tobias Gläßer (Qt5 port) PROJECT( AQEMU CXX ) CMAKE_MINIMUM_REQUIRED( VERSION 3.1.0 FATAL_ERROR ) # Available options OPTION( DEBUG "Build with debug information" ) OPTION( WITHOUT_EMBEDDED_DISPLAY "Build without support Embedded VNC Display" ) OPTION( UPDATE_TRANSLATIONS "Update source translation files (WARNING: make clean will delete the source .ts files!)" ) OPTION( INSTALL_MAN "Install MAN page file" "ON" ) # Debug mode IF( DEBUG ) # Verbose compiler output SET( CMAKE_VERBOSE_MAKEFILE ON ) # GCC ADD_DEFINITIONS( -Wall -g ) ENDIF( DEBUG ) # For find VNC libs SET( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) # Files SET( aqemu_headers src/IP_Edit.h src/Dialog_Button_Box.h src/docopt/docopt.h src/Settings_Widget.h src/QDom.h src/tinyxml2.h src/About_Window.h src/Add_New_Device_Window.h src/Add_Port_Window.h src/Add_USB_Port_Window.h src/Advanced_Settings_Window.h src/Boot_Device_Window.h src/Convert_HDD_Image_Window.h src/Copy_VM_Window.h src/Create_HDD_Image_Window.h src/Create_Template_Window.h src/Delete_VM_Files_Window.h src/Device_Manager_Widget.h src/Edit_Emulator_Version_Window.h src/Emulator_Control_Window.h src/Error_Log_Window.h src/First_Start_Wizard.h src/Folder_Sharing_Widget.h src/HDD_Image_Info.h src/Main_Window.h src/Monitor_Window.h src/Network_Widget.h src/Old_Network_Widget.h src/Ports_Tab_Widget.h src/Properties_Window.h src/Emulator_Options_Window.h src/Select_Icon_Window.h src/SMP_Settings_Window.h src/Snapshot_Properties_Window.h src/Snapshots_Window.h src/SPICE_Settings_Widget.h src/System_Info.h src/Utils.h src/VM.h src/VM_Devices.h src/VM_Wizard_Window.h src/VNC_Password_Window.h ) SET( aqemu_sources src/IP_Edit.cpp src/Dialog_Button_Box.cpp src/docopt/docopt.cpp src/Settings_Widget.cpp src/QDom.cpp src/tinyxml2.cpp src/About_Window.cpp src/Add_New_Device_Window.cpp src/Add_Port_Window.cpp src/Add_USB_Port_Window.cpp src/Advanced_Settings_Window.cpp src/Boot_Device_Window.cpp src/Convert_HDD_Image_Window.cpp src/Copy_VM_Window.cpp src/Create_HDD_Image_Window.cpp src/Create_Template_Window.cpp src/Delete_VM_Files_Window.cpp src/Device_Manager_Widget.cpp src/Edit_Emulator_Version_Window.cpp src/Emulator_Control_Window.cpp src/Error_Log_Window.cpp src/First_Start_Wizard.cpp src/Folder_Sharing_Widget.cpp src/HDD_Image_Info.cpp src/main.cpp src/Main_Window.cpp src/Monitor_Window.cpp src/Network_Widget.cpp src/Old_Network_Widget.cpp src/Ports_Tab_Widget.cpp src/Properties_Window.cpp src/Emulator_Options_Window.cpp src/Select_Icon_Window.cpp src/SMP_Settings_Window.cpp src/Snapshot_Properties_Window.cpp src/Snapshots_Window.cpp src/SPICE_Settings_Widget.cpp src/System_Info.cpp src/Utils.cpp src/VM.cpp src/VM_Devices.cpp src/VM_Wizard_Window.cpp src/VNC_Password_Window.cpp ) SET( aqemu_ui src/About_Window.ui src/Add_New_Device_Window.ui src/Add_Port_Window.ui src/Add_USB_Port_Window.ui src/Advanced_Settings_Window.ui src/Boot_Device_Window.ui src/Convert_HDD_Image_Window.ui src/Copy_VM_Window.ui src/Create_HDD_Image_Window.ui src/Create_Template_Window.ui src/Delete_VM_Files_Window.ui src/Device_Manager_Widget.ui src/Edit_Emulator_Version_Window.ui src/Emulator_Control_Window.ui src/Error_Log_Window.ui src/First_Start_Wizard.ui src/Folder_Sharing_Widget.ui src/Main_Window.ui src/Monitor_Window.ui src/Network_Widget.ui src/Old_Network_Widget.ui src/Ports_Tab_Widget.ui src/Properties_Window.ui src/Emulator_Options_Window.ui src/Select_Icon_Window.ui src/Settings_Window.ui src/SMP_Settings_Window.ui src/Snapshot_Properties_Window.ui src/Snapshots_Window.ui src/SPICE_Settings_Widget.ui src/VM_Wizard_Window.ui src/VNC_Password_Window.ui ) SET( aqemu_qrc resources/shared_images.qrc resources/icons.qrc ) SET( aqemu_man_page resources/docs/aqemu.1 ) SET( translations translations/German.ts transtations/Russian.ts translations/Ukrainian.ts translations/French.ts translations/English.ts ) SET( files_to_translate ${files_to_translate} ${aqemu_headers} ${aqemu_sources} ${aqemu_ui} ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) # Instruct CMake to run uic automatically when needed. SET(CMAKE_AUTOUIC ON) # Instruct CMake to run rcc automatically when needed. SET(CMAKE_AUTORCC ON) # Check Qt FIND_PACKAGE( Qt5Core ) FIND_PACKAGE( Qt5Widgets ) FIND_PACKAGE( Qt5Network ) FIND_PACKAGE( Qt5Test ) FIND_PACKAGE( Qt5PrintSupport ) # Embedded VNC display IF( NOT WITHOUT_EMBEDDED_DISPLAY ) FIND_PACKAGE( LibVNCServer REQUIRED ) SET( aqemu_headers ${aqemu_headers} src/Embedded_Display/Machine_View.h src/Embedded_Display/remoteview.h src/Embedded_Display/vncclientthread.h src/Embedded_Display/vncview.h ) SET( aqemu_sources ${aqemu_sources} src/Embedded_Display/Machine_View.cpp src/Embedded_Display/remoteview.cpp src/Embedded_Display/vncclientthread.cpp src/Embedded_Display/vncview.cpp ) ADD_DEFINITIONS( -DVNC_DISPLAY -DQTONLY ) ENDIF( NOT WITHOUT_EMBEDDED_DISPLAY ) # TODO: port from Qt4 to Qt5 # For translation #IF( UPDATE_TRANSLATIONS ) # QT5_CREATE_TRANSLATION( qm_files ${CMAKE_CURRENT_SOURCE_DIR} ${files_to_translate} ${translations} ) #ELSE( UPDATE_TRANSLATIONS ) # QT5_ADD_TRANSLATION( qm_files ${translations} ) #ENDIF( UPDATE_TRANSLATIONS ) ADD_CUSTOM_TARGET( translations_target DEPENDS ${qm_files} ) IF( COMMAND CMAKE_POLICY ) CMAKE_POLICY( SET CMP0003 NEW ) ENDIF( COMMAND CMAKE_POLICY ) ADD_EXECUTABLE( aqemu ${aqemu_sources} ${ui_headers} ${moc_srcs} ${qm_files} ${aqemu_qrc} ) target_include_directories(aqemu PUBLIC src/ ) # Require C++-11 standard SET_PROPERTY(TARGET aqemu PROPERTY CXX_STANDARD 11) SET_PROPERTY(TARGET aqemu PROPERTY CXX_STANDARD_REQUIRED ON) TARGET_LINK_LIBRARIES( aqemu Qt5::Widgets Qt5::Network Qt5::Test Qt5::PrintSupport ) # Embedded VNC display IF( NOT WITHOUT_EMBEDDED_DISPLAY ) TARGET_LINK_LIBRARIES( aqemu ${LIBVNCCLIENT_LIBRARIES} ) ENDIF( NOT WITHOUT_EMBEDDED_DISPLAY ) # Install files INSTALL( TARGETS aqemu DESTINATION bin ) INSTALL( FILES ${qm_files} DESTINATION share/aqemu ) FILE( GLOB os_icons "${CMAKE_CURRENT_SOURCE_DIR}/resources/os_icons/*.*" ) INSTALL( FILES ${os_icons} DESTINATION share/aqemu/os_icons ) FILE( GLOB os_templates "${CMAKE_CURRENT_SOURCE_DIR}/resources/os_templates/*.*") INSTALL( FILES ${os_templates} DESTINATION share/aqemu/os_templates ) FILE( GLOB links "${CMAKE_CURRENT_SOURCE_DIR}/resources/docs/links.html" ) INSTALL( FILES ${links} DESTINATION share/aqemu/docs ) FILE( GLOB pixmaps "${CMAKE_CURRENT_SOURCE_DIR}/menu_data/*.png" ) INSTALL( FILES ${pixmaps} DESTINATION share/pixmaps ) FILE( GLOB app_menu "${CMAKE_CURRENT_SOURCE_DIR}/menu_data/aqemu.desktop" ) INSTALL( FILES ${app_menu} DESTINATION share/applications ) # Create docs .bz2 files MACRO( create_docs _sources ) FOREACH( curFile ${ARGN} ) GET_FILENAME_COMPONENT( _in ${curFile} ABSOLUTE ) GET_FILENAME_COMPONENT( _basename ${curFile} NAME_WE ) SET( _out ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.bz2 ) ADD_CUSTOM_COMMAND( OUTPUT ${_out} COMMAND bzip2 ARGS -zkf9 ${_in} DEPENDS ${_in} ) SET( ${_sources} ${${_sources}} ${_out} ) ENDFOREACH( curFile ) ENDMACRO( create_docs ) CREATE_DOCS( docs_bz2 AUTHORS CHANGELOG README TODO ) ADD_CUSTOM_TARGET( docs ALL DEPENDS ${docs_bz2} ) INSTALL( FILES ${docs_bz2} DESTINATION share/doc/aqemu ) # Build RCC files (GUI icons) MACRO( pack_icons _sources ) FOREACH( curFile ${ARGN} ) GET_FILENAME_COMPONENT( _in ${curFile} ABSOLUTE ) GET_FILENAME_COMPONENT( _basename ${curFile} NAME_WE ) SET( _out ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.rcc ) ADD_CUSTOM_COMMAND( OUTPUT ${_out} COMMAND rcc ARGS ${_in} -binary -o ${_out} DEPENDS ${_in} ) SET( ${_sources} ${${_sources}} ${_out} ) ENDFOREACH( curFile ) ENDMACRO( pack_icons ) PACK_ICONS( gui_icons resources/shared_images.qrc resources/icons.qrc ) ADD_CUSTOM_TARGET( icons ALL DEPENDS ${gui_icons} ) INSTALL( FILES ${gui_icons} DESTINATION share/aqemu ) # Compress and install MAN page file IF( NOT MAN_PAGE_COMPRESSOR ) MESSAGE( STATUS "MAN page will be installed is not packed." ) ELSEIF( MAN_PAGE_COMPRESSOR STREQUAL "gzip" ) SET( COMPRESSOR_SUFFIX gz ) ELSEIF( MAN_PAGE_COMPRESSOR STREQUAL "bzip2" ) SET( COMPRESSOR_SUFFIX bz2 ) ELSEIF( MAN_PAGE_COMPRESSOR STREQUAL "lzma" ) SET( COMPRESSOR_SUFFIX lzma ) ELSE( NOT MAN_PAGE_COMPRESSOR ) MESSAGE( STATUS "${MAN_PAGE_COMPRESSOR} not supported!" ) MESSAGE( FATAL_ERROR "Correct values: gzip, bzip2, lzma" ) ENDIF( NOT MAN_PAGE_COMPRESSOR ) # Compress MAN file? IF( INSTALL_MAN ) IF( COMPRESSOR_SUFFIX ) # Find gzip, bzip or lzma FIND_PROGRAM( COMPRESSOR_BIN NAMES ${MAN_PAGE_COMPRESSOR} ) IF( ${COMPRESSOR_BIN} MATCHES COMPRESSOR_BIN-NOTFOUND ) MESSAGE( STATUS "${MAN_PAGE_COMPRESSOR} - NOT FOUND!" ) MESSAGE( FATAL_ERROR "Please install ${MAN_PAGE_COMPRESSOR} package!" ) ENDIF( ${COMPRESSOR_BIN} MATCHES COMPRESSOR_BIN-NOTFOUND ) # Compress EXECUTE_PROCESS( OUTPUT_FILE ${aqemu_man_page}.${COMPRESSOR_SUFFIX} COMMAND "${COMPRESSOR_BIN}" -9 INPUT_FILE ${aqemu_man_page} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) # Install MAN INSTALL( FILES ${CMAKE_SOURCE_DIR}/${aqemu_man_page}.${COMPRESSOR_SUFFIX} DESTINATION share/man/man1 ) ELSE( COMPRESSOR_SUFFIX ) MESSAGE( STATUS "MAN_PAGE_COMPRESSOR flag not set. Available values: gzip, bzip2, lzma" ) MESSAGE( STATUS "Will be installed not compressed MAN pages" ) INSTALL( FILES ${CMAKE_SOURCE_DIR}/${aqemu_man_page} DESTINATION share/man/man1 ) ENDIF( COMPRESSOR_SUFFIX ) ENDIF( INSTALL_MAN ) aqemu-0.9.2/COPYING000066400000000000000000000431131272330227200136670ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. aqemu-0.9.2/README000066400000000000000000000042751272330227200135220ustar00rootroot00000000000000AQEMU is a graphical frontend for QEMU based virtual machines. AQEMU compiling and running Linux, BSD and Windows! (Windows support in development stage) AQEMU Minimal Version Dependencies: * Qt >= 5.X * CMake >= 3.1.0 * QEMU >= 2.0.0 (using a recent version recommended) * GCC >= 4.8.1 (MinGW in Windows) !!! ATTENTION READ THIS FIRST !!! In AQEMU 0.7 support for an "Embedded VNC Display" was added. This is an experimental feature, with many unfixed bugs! When you upgrade from version 0.5 or above, simply click "Apply" for each VM to keep it in the new version. Installation now verifies the existence of previous versions of AQEMU and removes them before installing (If you didn't install AQEMU in /usr/share/aqemu or /usr/share/apps/aqemu, you will have to delete the folder with the resources of the last AQEMU version manually!) INSTALLATION (For Unix): 1. Extract AQEMU source code. 2. `cd' to AQEMU source directory. 3. Configure: -DCMAKE_INSTALL_PREFIX = Path to installation directory (Default is: /usr/local) For example, `cmake -DCMAKE_INSTALL_PREFIX=/usr/local/' this install AQEMU binary in /usr/local/bin and install data in /usr/local/share/aqemu -DWITHOUT_EMBEDDED_DISPLAY = on | off (Default is: off) To build without support Embedded VNC Display. -DDEBUG = on | off (Default is: off) To build in debug mode run: `cmake -DDEBUG=on' -DINSTALL_MAN = on | off (Default is: on) Install AQEMU man page file. -DMAN_PAGE_COMPRESSOR = gzip | bzip2 | lzma | off (Default is: off) Set compressor for AQEMU man page file. Example: cmake -DCMAKE_INSTALL_PREFIX=/usr -DMAN_PAGE_COMPRESSOR=bzip2 4. type `make' 5. type `sudo make install' 6. Installation complete! To start AQEMU type: `aqemu' in shell. Note: I'm not the original author of this software, all credits go to him. But as it looks like as if he has abandoned this project I've taken the freedom to maintain it on my github account in the meantime. You can file issues on github.com/tobimensch/aqemu . I'll be happy to receive pull requests. I'm not promising to fix each and every issue, help with that (and further development) would be very welcome. aqemu-0.9.2/README.md000066400000000000000000000005701272330227200141130ustar00rootroot00000000000000![ScreenShot](https://i.imgur.com/PkvFUEk.png) Current stable release: https://github.com/tobimensch/aqemu/releases/tag/v0.9.1 See the CHANGELOG for details. Upgrading from 0.8.2 is highly recommended. --- Port of AQEmu 0.8.2 from Qt4 to Qt5. --- Use cmake to build. Dependencies: - Qt5Core - Qt5Widgets - Qt5Network - Qt5Test - Qt5PrintSupport - LibVNCServer aqemu-0.9.2/TODO000066400000000000000000000005661272330227200133310ustar00rootroot00000000000000# This TODO list was originally created by Andrej Rijov. # It looks like those would still be nice to have. * New embedded display * Ability to minimize to tray. * Update Emulator Control * Easy USB disconnect support * Ability save emulator window position and size * Tool tips for all options * Complete GUI for managing QEMU sound system * Complete windows port aqemu-0.9.2/cmake/000077500000000000000000000000001272330227200137125ustar00rootroot00000000000000aqemu-0.9.2/cmake/modules/000077500000000000000000000000001272330227200153625ustar00rootroot00000000000000aqemu-0.9.2/cmake/modules/CheckPointerMember.cmake000066400000000000000000000024711272330227200220760ustar00rootroot00000000000000# - Check if the given struct or class has the specified member variable # CHECK_POINTER_MEMBER (POINTER MEMBER HEADER VARIABLE) # # POINTER - the name of the struct or class you are interested in # MEMBER - the member which existence you want to check # HEADER - the header(s) where the prototype should be declared # VARIABLE - variable to store the result # # The following variables may be set before calling this macro to # modify the way the check is run: # # CMAKE_REQUIRED_FLAGS = string of compile command line flags # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) # CMAKE_REQUIRED_INCLUDES = list of include directories # Copyright (c) 2006, Alexander Neundorf, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. INCLUDE(CheckCXXSourceCompiles) MACRO (CHECK_POINTER_MEMBER _STRUCT _MEMBER _HEADER _RESULT) SET(_INCLUDE_FILES) FOREACH (it ${_HEADER}) SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n") ENDFOREACH (it) SET(_CHECK_POINTER_MEMBER_SOURCE_CODE " ${_INCLUDE_FILES} int main() { ${_STRUCT} tmp; tmp->${_MEMBER}; return 0; } ") CHECK_CXX_SOURCE_COMPILES("${_CHECK_POINTER_MEMBER_SOURCE_CODE}" ${_RESULT}) ENDMACRO (CHECK_POINTER_MEMBER) aqemu-0.9.2/cmake/modules/FindLibVNCServer.cmake000066400000000000000000000032531272330227200214340ustar00rootroot00000000000000# cmake macro to test LIBVNCSERVER LIB # Copyright (c) 2006, Alessandro Praduroux # Copyright (c) 2007, Urs Wolfer # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. INCLUDE(CheckPointerMember) IF (LIBVNCSERVER_INCLUDE_DIR AND LIBVNCSERVER_LIBRARIES) # Already in cache, be silent SET(LIBVNCSERVER_FIND_QUIETLY TRUE) ENDIF (LIBVNCSERVER_INCLUDE_DIR AND LIBVNCSERVER_LIBRARIES) FIND_PATH(LIBVNCSERVER_INCLUDE_DIR rfb/rfb.h) FIND_LIBRARY(LIBVNCSERVER_LIBRARIES NAMES vncserver libvncserver) # libvncserver and libvncclient are in the same package, so it does # not make sense to add a new cmake script for finding libvncclient. # instead just find the libvncclient also in this file. FIND_PATH(LIBVNCCLIENT_INCLUDE_DIR rfb/rfbclient.h) FIND_LIBRARY(LIBVNCCLIENT_LIBRARIES NAMES vncclient libvncclient) IF (LIBVNCSERVER_INCLUDE_DIR AND LIBVNCSERVER_LIBRARIES) SET(CMAKE_REQUIRED_INCLUDES "${LIBVNCSERVER_INCLUDE_DIR}" "${CMAKE_REQUIRED_INCLUDES}") CHECK_POINTER_MEMBER(rfbClient* GotXCutText rfb/rfbclient.h LIBVNCSERVER_FOUND) ENDIF (LIBVNCSERVER_INCLUDE_DIR AND LIBVNCSERVER_LIBRARIES) IF (LIBVNCSERVER_FOUND) IF (NOT LIBVNCSERVER_FIND_QUIETLY) MESSAGE(STATUS "Found LibVNCServer: ${LIBVNCSERVER_LIBRARIES}") ENDIF (NOT LIBVNCSERVER_FIND_QUIETLY) ELSE (LIBVNCSERVER_FOUND) IF (LIBVNCSERVER_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could NOT find acceptable version of LibVNCServer (version 0.9 or later required).") ENDIF (LIBVNCSERVER_FIND_REQUIRED) ENDIF (LIBVNCSERVER_FOUND) MARK_AS_ADVANCED(LIBVNCSERVER_INCLUDE_DIR LIBVNCSERVER_LIBRARIES) aqemu-0.9.2/menu_data/000077500000000000000000000000001272330227200145675ustar00rootroot00000000000000aqemu-0.9.2/menu_data/aqemu.desktop000066400000000000000000000003731272330227200172750ustar00rootroot00000000000000[Desktop Entry] Exec=aqemu Terminal=false Type=Application Icon=aqemu StartupNotify=true Categories=System;Emulator; Name=AQEMU Comment=Virtual machine manager Name[ru]=AQEMU Comment[ru]=Управление виртуальными машинами aqemu-0.9.2/menu_data/aqemu.png000066400000000000000000000166111272330227200164120ustar00rootroot00000000000000PNG  IHDR@@iqPIDATxI$yګ}̀e !A79#|c;>8|Q&[>a[h˖h"E`fg}2_|{@hS==mgs @~?pE=W:TՙOJ?WA. DI5 =b;mg75?82_ 7Х?%گ 3BX -كǃ-{33 ^of=`)q kN~]I!5HT1@2TebT 6ZNmw&Mۿ-o;0r>V Y]ߔ:R#dD2 ?O}1%bt`A ux{c.aۿk׀.M~jF@'O5Tx^=K%k R //y<+sYc:gxLzb6O``O'WˤodT*iPi\~ɚB`eq>u V¦D}';\~8Rl,o ϨFsLETg*dQ*U`Jx$Al6Ż\9I]bPB% cP1/$Kcywi]/GÎCp ]{Ȩwuu/Pd\C):cp>t)G=j0Z Om;qn_"*e#1bu`.н]Lg??ցOOB/SYyK To,f0fj=~W\ xut=66x"T/P8'·iso~Na=;^cW+՗_~3wv{I8F~H􉢸0 B 3S"\JWqV=ՕgCB .vʗZk1[7oޭ>a &Qid2J&DMrWsY6T.G1B LMDݧ1އJxHl !36m]{QD,uxj t>/?K^ c}{Ugq踂J+ȨUvw{^;avv CV¹Y-3P .M`6vpI]z_N}S]ŕoȨB/ʓ!yd/$Ew?~[#)rTRHQJ"D*DJ(.cgJLQGAG,,NFsFT oo'Nshf*5Tq<$內R=|Q*@rWTL4 qfHS#E30*CREQB %;h11DHfyp0LJ]LwGl5QGGJ_q寅RV-ŧ ӀfrjX\lR { ޝmD(7BxADF=gf@tS_hE'ȎFѰ㷀#B(Rʇѡ ҊJT!-^&Pj29>ܧV4' R-kﳻGH]<xo0w Wgouj@I< i&= #w8kPR&H)2s\@)I{ {]qEQž{q  xf JeLNvE_q kd@_ϲ,Qegg}Ty4YhL4A^}|q/xfg岤Z~>B;9Wi]2JT2(R%EN83@J#heMTsmX9 )$b.^7"1r%AMH$I|" 3Ak{Bfcq΅"iKWVE[9 wAGɱ]ā0R U9;9JHބDU6dooZt:Kl<9*FUd.Oҷ {>ynBE&l[왜s?s|_8ǥitȨ[۬Bs-6&%2 " H^@*Ą5'z}EPȨDJXW7Rq+ĴYlaLڜH WZo w;NI"13z-' PIWAҠ+YA7ۨW_OpOY YMAkf 3\y: $.녉IC0,PTQ"/tN O2ݰ$f/<$>o tu1^"dbtREW&ѕyR9˛6Oƿ; ԙaDzQ O>ަ͵c_jLIBjTTbh~E?˗yWƺסHRi%TQm-B)cN*(S7ƥahl!% 7[F(\>}J"؍4;5fq6XWTb%*I!Vk"Ft><ۼGoAD\n J)d1_ Xb],JZ67[1Z`U#;-`@ ލ1QXHNȌ`{k̂'?>U:AJ2&n0Rmk'(dž+I1" B%0`IJ˥e#oo25REGuǦ#wygvJ wAorvf.Eb)AZI(!*?v4[ɋ?@$sTjMʥI 3$hin0]0(!m'.rx޳2*!F U荞SvxCźclȦp{p'LUZ|Sgeil{\\IhLN3^1bgN "Ԡ"0*L橢Ooz*\{:APaJ<%7]ˑ8v BfuuuΠ)!}DcO^֨Qx髜3ֻ|J O{u + ;.46yÖƫ,S K\}t}l >$K$`UoKdpQX&'c}AA=s_|j1wnr)#T\L8sxy{A jq& Bb{ygtt&TR#F=Ququym̰3aMGPZ%UAu2.IP0Q@G%6z0v!".F?n~|z2< lt)fgeqoK.uAQf38bay4Zkfg62PТ:b^`oQ:FJy(qm$P7DWKuޗ/ oSM)ޤ޷x,7ÝxwFiK߆o19΃1~KMdI%00HRcgL__^!]_hw!8gmrho3iPMw9}c$6عw{-0=!ަqcפNJA 99RM2&8LISO AoB= T)zH#K m#reիW?]ϳN f8 2f.޽ ] M/eaDJ 2B'({LY/IRbnyťI'G>&ps<2&+Uz=\䓟ss㡊ugTs wonL2q̀Νuå׀5Bu]*5:,O UTCCgF3TDq K+s4՚B Q"=6=aqʅ9<(Sx),O.:y>95jGH҅ei.+NHw5{x3jI<Gʘ ֽ|z@V!(h2=7 ËQ)ϟgbzJ;XZǼƻ>;'eI[.!:bgg8k&Lηo_-N>?[( ;6ʗbO װ u0I˲`Qjm5ŵ;7m4Fְ^swK.,KyWؾ`-u_$??'Q;B0nx[ӌ!O[K1bBxXYӗl?bm\%)pΆrXʱy{}nWֽv SY' Ó-/k͗4Cw. /0CŇ}$PVKs+2"22.(,8 Et$*G (ߣSXġ)0u0%8UV$ZЈ0جK[dLElš o3:k/nd7x`bMn ~%/\ #OQ|ߣ2FYxQlA^3L*C$MxkXQˆ)R#0 n9NN^ q5ue ]_|\H-Fn02|tz < Bh*Aaٲx/ 1+9 sG煨96qYI okѭQz97LwK(]B ;e`: !(/4o8AxRɌ'ϳ` .=|Ngۜ2?!Q΂sik==y]'tejbl( zU-QcrI:֤慤p~|zwԥ -B}<nzpywOFGd\>݁)N9<3aXl%pL}ogNO~\71޾V @& Nl`w\m̼%}ʀBC0N`ϭ'q6C-@?ko֍oo_weNMB? irԏW%.L3muXy.qoPʺ u׿9~㭢[n^0h@,t}ҧ-=u̔LR1Dp&sꐶsl;[:A>6g3r$0B%Qܕ5Vfte*Tue`75a޺[Gygs숰ƲO0~@c%@xt3L`H6NMOl$c95c>n>W T U ~*׏7*ڤHpIENDB`aqemu-0.9.2/menu_data/aqemu_48x48.png000066400000000000000000000172571272330227200173000ustar00rootroot00000000000000PNG  IHDR00W pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATxڼYdٕ=)Ι7ofXv;m\vɦg@ƈG~h !$-$FGxADw.vuUeUVeVÝ޸1GqCD ml\ H:ZB)>ү|w^y Ol@xqnlsE3Of@ePK:je!Ac6k't}EOW^uׅZ|Q%6; Rb9)]sIO3dM:O!jU~/:rظudF8(mՐܡnf62&{Br!$.mҠT)FYs:>8 PL fohq 뗼4w:k,&=~/:jds罇ܺ[p5NG<ۛ>gEPרln6rSH:dMv$[@koTP$h)knͫ ڟrNi7)UQQ:@kh?k{=SJͭZ}8!bѲXC1:jM&Q_Gk/W@1WK CJ_;AR)$B؈!C*q|2=VT6L; %Y_a䊉p㏟4/*;5YtʕsW_,<*;;묯(;&I3R>vB&%>vDR٪pzt`X ƹ|Q;^ͫ6~ ? :EE(j!Z5GVckZ S8[B!`?fsE($S8!?"L1!"(>mDGMsɄ>n^'Rn6F0*1xHr%"JD ++-׫zN603Bz:CbE@7W(W*='s˪.&ئ.kS^e_n k /]geuý{Ԫ!|_{ě3q&!4j ۫Ül>d:s' (f>6*TUxWdHSLp& Y6g@TWB*$e}5/^yƣC)2^i+j%vBNwQ"V B(Mf}NLNHb!M?aYl#eoxjJ+IǘtR5o^- URG\_?x EEZ'O*Zgx 99:@ߗh/@zH=8N1N!TuN=hlLNU1;w`}yë[~9:{y0«Q8ǜߪiG\ҫ05{{pEKB\nn@ ɔK/RטЋcs1&OLcZHO'K9v?NbTPE{>~Ycl6bkB:-ΟkѬZd1ٮQ6!i!8q&æ#QEz|]\oR,Ʋxi vJev^ç2KHUG1ZeܸBbLN !Z0*fgFŵLQh%I(**D >(ցuk["2#\~Tke$p~Nw!9EIMjB8HJ, 58kA(}DZKBIZ c]sRE<V֩Tlm|.d5%Nyi<;e8\ 8ݡ Y9 8P"% !殈qgspc-i`xBbIAHT=8:ڬ0;}LEWh󌧏xވAU j_`X#<{x6 ) 83l6Ys&8r`&lN<;:@iJt!A9<s:_z" R ݾǻwG J %Ak\%m{[J B}jLKOk'-B>|Z-egR?=w: KH!?ڗk2L<<N0q]gLEaz=4¹5 %,Z <%B8._}0 CMI|-w&/im[dpi;ncÃfR8gR̼|v> o"g.H@pgGqsTtM,@&* -A)5+>.xza}-,ڎz̥k \!|{Εk;FExe:`!gW$O3 6?<5GEAsuڐP3H)dcpaF Ir0 ~rw}Bd"96O>vּ &C7BJCX2h#RZJ14 &t$j̑ΧGjŋmv\FB*,/``M+bl>)ك8>|<@js[IR-PA=JAA^!,UX\Y OLG'V:QL]iz]^ ;Y=g6P0ֱֶو>E1}G|f~XRkmQԖ@L1ٴG9Rxl^fcd4;=坻g$<Pt6{;o"K2x$ߩ^kU7+ү::j *"xvF F6fHBx4-HRN`TBFe&E7y=NGw 'ͦ^U׿$''Ţ'!4WPa8M,ᬟqr l-*,/ Ndq=f?>~폜I'd6'C6fĠpR#U(kU!WyU.S8%KSr6b Xk-7=`GUO6bf'B^eumw -`'ۢ_HNA;N=MkB-vk0,YsKQ F 磻ofo.SWz Tү|%Z̯_x)\vyү, ^;!>-p{$;Yҽszܽ >d&g?׿PցϪRWٸ7.\t]~ŗ^YtTlY6gbvrd0,-}C0j@XV?2Y4X2޲,m?f Le [^,Àr/-n"/?/(kIENDB`aqemu-0.9.2/menu_data/aqemu_64x64.png000066400000000000000000000166111272330227200172650ustar00rootroot00000000000000PNG  IHDR@@iqPIDATxI$yګ}̀e !A79#|c;>8|Q&[>a[h˖h"E`fg}2_|{@hS==mgs @~?pE=W:TՙOJ?WA. DI5 =b;mg75?82_ 7Х?%گ 3BX -كǃ-{33 ^of=`)q kN~]I!5HT1@2TebT 6ZNmw&Mۿ-o;0r>V Y]ߔ:R#dD2 ?O}1%bt`A ux{c.aۿk׀.M~jF@'O5Tx^=K%k R //y<+sYc:gxLzb6O``O'WˤodT*iPi\~ɚB`eq>u V¦D}';\~8Rl,o ϨFsLETg*dQ*U`Jx$Al6Ż\9I]bPB% cP1/$Kcywi]/GÎCp ]{Ȩwuu/Pd\C):cp>t)G=j0Z Om;qn_"*e#1bu`.н]Lg??ցOOB/SYyK To,f0fj=~W\ xut=66x"T/P8'·iso~Na=;^cW+՗_~3wv{I8F~H􉢸0 B 3S"\JWqV=ՕgCB .vʗZk1[7oޭ>a &Qid2J&DMrWsY6T.G1B LMDݧ1އJxHl !36m]{QD,uxj t>/?K^ c}{Ugq踂J+ȨUvw{^;avv CV¹Y-3P .M`6vpI]z_N}S]ŕoȨB/ʓ!yd/$Ew?~[#)rTRHQJ"D*DJ(.cgJLQGAG,,NFsFT oo'Nshf*5Tq<$內R=|Q*@rWTL4 qfHS#E30*CREQB %;h11DHfyp0LJ]LwGl5QGGJ_q寅RV-ŧ ӀfrjX\lR { ޝmD(7BxADF=gf@tS_hE'ȎFѰ㷀#B(Rʇѡ ҊJT!-^&Pj29>ܧV4' R-kﳻGH]<xo0w Wgouj@I< i&= #w8kPR&H)2s\@)I{ {]qEQž{q  xf JeLNvE_q kd@_ϲ,Qegg}Ty4YhL4A^}|q/xfg岤Z~>B;9Wi]2JT2(R%EN83@J#heMTsmX9 )$b.^7"1r%AMH$I|" 3Ak{Bfcq΅"iKWVE[9 wAGɱ]ā0R U9;9JHބDU6dooZt:Kl<9*FUd.Oҷ {>ynBE&l[왜s?s|_8ǥitȨ[۬Bs-6&%2 " H^@*Ą5'z}EPȨDJXW7Rq+ĴYlaLڜH WZo w;NI"13z-' PIWAҠ+YA7ۨW_OpOY YMAkf 3\y: $.녉IC0,PTQ"/tN O2ݰ$f/<$>o tu1^"dbtREW&ѕyR9˛6Oƿ; ԙaDzQ O>ަ͵c_jLIBjTTbh~E?˗yWƺסHRi%TQm-B)cN*(S7ƥahl!% 7[F(\>}J"؍4;5fq6XWTb%*I!Vk"Ft><ۼGoAD\n J)d1_ Xb],JZ67[1Z`U#;-`@ ލ1QXHNȌ`{k̂'?>U:AJ2&n0Rmk'(dž+I1" B%0`IJ˥e#oo25REGuǦ#wygvJ wAorvf.Eb)AZI(!*?v4[ɋ?@$sTjMʥI 3$hin0]0(!m'.rx޳2*!F U荞SvxCźclȦp{p'LUZ|Sgeil{\\IhLN3^1bgN "Ԡ"0*L橢Ooz*\{:APaJ<%7]ˑ8v BfuuuΠ)!}DcO^֨Qx髜3ֻ|J O{u + ;.46yÖƫ,S K\}t}l >$K$`UoKdpQX&'c}AA=s_|j1wnr)#T\L8sxy{A jq& Bb{ygtt&TR#F=Ququym̰3aMGPZ%UAu2.IP0Q@G%6z0v!".F?n~|z2< lt)fgeqoK.uAQf38bay4Zkfg62PТ:b^`oQ:FJy(qm$P7DWKuޗ/ oSM)ޤ޷x,7ÝxwFiK߆o19΃1~KMdI%00HRcgL__^!]_hw!8gmrho3iPMw9}c$6عw{-0=!ަqcפNJA 99RM2&8LISO AoB= T)zH#K m#reիW?]ϳN f8 2f.޽ ] M/eaDJ 2B'({LY/IRbnyťI'G>&ps<2&+Uz=\䓟ss㡊ugTs wonL2q̀Νuå׀5Bu]*5:,O UTCCgF3TDq K+s4՚B Q"=6=aqʅ9<(Sx),O.:y>95jGH҅ei.+NHw5{x3jI<Gʘ ֽ|z@V!(h2=7 ËQ)ϟgbzJ;XZǼƻ>;'eI[.!:bgg8k&Lηo_-N>?[( ;6ʗbO װ u0I˲`Qjm5ŵ;7m4Fְ^swK.,KyWؾ`-u_$??'Q;B0nx[ӌ!O[K1bBxXYӗl?bm\%)pΆrXʱy{}nWֽv SY' Ó-/k͗4Cw. /0CŇ}$PVKs+2"22.(,8 Et$*G (ߣSXġ)0u0%8UV$ZЈ0جK[dLElš o3:k/nd7x`bMn ~%/\ #OQ|ߣ2FYxQlA^3L*C$MxkXQˆ)R#0 n9NN^ q5ue ]_|\H-Fn02|tz < Bh*Aaٲx/ 1+9 sG煨96qYI okѭQz97LwK(]B ;e`: !(/4o8AxRɌ'ϳ` .=|Ngۜ2?!Q΂sik==y]'tejbl( zU-QcrI:֤慤p~|zwԥ -B}<nzpywOFGd\>݁)N9<3aXl%pL}ogNO~\71޾V @& Nl`w\m̼%}ʀBC0N`ϭ'q6C-@?ko֍oo_weNMB? irԏW%.L3muXy.qoPʺ u׿9~㭢[n^0h@,t}ҧ-=u̔LR1Dp&sꐶsl;[:A>6g3r$0B%Qܕ5Vfte*Tue`75a޺[Gygs숰ƲO0~@c%@xt3L`H6NMOl$c95c>n>W T U ~*׏7*ڤHpIENDB`aqemu-0.9.2/resources/000077500000000000000000000000001272330227200146445ustar00rootroot00000000000000aqemu-0.9.2/resources/docs/000077500000000000000000000000001272330227200155745ustar00rootroot00000000000000aqemu-0.9.2/resources/docs/aqemu.1000066400000000000000000000003161272330227200167660ustar00rootroot00000000000000.Dd May 13, 2016 .Dt AQEMU 1 .Os .Sh NAME .Nm aqemu .Nd frontend for qemu .Sh SYNOPSIS .Nm aqemu .Op Ar options .Sh DESCRIPTION Frontend for qemu. .Sh OPTIONS .Bl -tag -width Ds .El .Bl -tag -width Ds .El aqemu-0.9.2/resources/docs/links.html000066400000000000000000000035411272330227200176050ustar00rootroot00000000000000 AQEMU Links Development of AQEMU is currently taking place on:
https://github.com/tobimensch/aqemu/

If you have issues, suggestions or want to help with development,
this is the place you are looking for.

New releases are made available at:
https://github.com/tobimensch/aqemu/releases/


The following links were included in AQEMU 0.8.2 and may be outdated:

Russian AQEMU Documentaion:
http://sourceforge.net/projects/aqemu/files/AQEMU%20Russian%20Documentation/0.7.3/AQEMU-Documentation-0.7.3.tar.bz2/download

German AQEMU Documentaion:
http://qemu-buch.de/d/Managementtools/_Tools_für_QEMU_und_KVM/_AQEMU

Forum About AQEMU (Russian)
Version 0.8
Version 0.7
Version 0.6
Version 0.5
Version 0.1-0.5

QEMU Home Page (English)
http://www.nongnu.org/qemu/

Good Forum About QEMU (English)
http://qemu-forum.ipi.fi/

Wiki and Other Information About QEMU (German and English)
http://qemu-buch.de/ aqemu-0.9.2/resources/icons.qrc000066400000000000000000000106271272330227200164740ustar00rootroot00000000000000 icons/oxygen/dialog-close.png icons/oxygen/preferences-other.png icons/oxygen/preferences-system-windows-actions.png icons/oxygen/camera-photo.png icons/oxygen/utilities-system-monitor.png icons/oxygen/about.png icons/oxygen/help-about.png icons/oxygen/add.png icons/oxygen/blockdevice.png icons/oxygen/bug.png icons/oxygen/cancel.png icons/oxygen/cdrom.png icons/oxygen/edit.png icons/oxygen/drive-optical.png icons/oxygen/eject.png icons/oxygen/eraser.png icons/oxygen/open-file.png icons/oxygen/open-folder.png icons/oxygen/pause.png icons/oxygen/error.png icons/oxygen/exec.png icons/oxygen/exit.png icons/oxygen/play.png icons/oxygen/remove.png icons/oxygen/restart.png icons/oxygen/clock.png icons/oxygen/configure.png icons/oxygen/connect.png icons/oxygen/copy.png icons/oxygen/disconnect.png icons/oxygen/down.png icons/oxygen/fdd.png icons/oxygen/hdd.png icons/oxygen/help.png icons/oxygen/save-all.png icons/oxygen/save-as.png icons/oxygen/save.png icons/oxygen/icon.png icons/oxygen/key.png icons/oxygen/ok.png icons/oxygen/stop.png icons/oxygen/terminal.png icons/oxygen/update.png icons/oxygen/up.png icons/oxygen/usb.png icons/oxygen/view_detailed.png icons/oxygen/view_icon.png icons/oxygen/wizard.png icons/oxygen/apply.png icons/oxygen/go.png icons/oxygen/scale.png icons/oxygen/fullscreen.png icons/oxygen/previous.png icons/oxygen/next.png icons/oxygen/find.png icons/oxygen/port.png icons/oxygen/font.png icons/oxygen/media-flash.png icons/oxygen/audio-card.png icons/oxygen/preferences-system-network-sharing.png icons/oxygen/preferences-system-network.png icons/oxygen/video-display.png icons/oxygen/preferences-desktop-display.png icons/oxygen/input-mouse.png icons/oxygen/com_port.png icons/oxygen/lpt_port.png icons/serial-port.png icons/parallel-port.png icons/oxygen/system-search.png aqemu-0.9.2/resources/icons/000077500000000000000000000000001272330227200157575ustar00rootroot00000000000000aqemu-0.9.2/resources/icons/aqemu.png000066400000000000000000000166111272330227200176020ustar00rootroot00000000000000PNG  IHDR@@iqPIDATxI$yګ}̀e !A79#|c;>8|Q&[>a[h˖h"E`fg}2_|{@hS==mgs @~?pE=W:TՙOJ?WA. DI5 =b;mg75?82_ 7Х?%گ 3BX -كǃ-{33 ^of=`)q kN~]I!5HT1@2TebT 6ZNmw&Mۿ-o;0r>V Y]ߔ:R#dD2 ?O}1%bt`A ux{c.aۿk׀.M~jF@'O5Tx^=K%k R //y<+sYc:gxLzb6O``O'WˤodT*iPi\~ɚB`eq>u V¦D}';\~8Rl,o ϨFsLETg*dQ*U`Jx$Al6Ż\9I]bPB% cP1/$Kcywi]/GÎCp ]{Ȩwuu/Pd\C):cp>t)G=j0Z Om;qn_"*e#1bu`.н]Lg??ցOOB/SYyK To,f0fj=~W\ xut=66x"T/P8'·iso~Na=;^cW+՗_~3wv{I8F~H􉢸0 B 3S"\JWqV=ՕgCB .vʗZk1[7oޭ>a &Qid2J&DMrWsY6T.G1B LMDݧ1އJxHl !36m]{QD,uxj t>/?K^ c}{Ugq踂J+ȨUvw{^;avv CV¹Y-3P .M`6vpI]z_N}S]ŕoȨB/ʓ!yd/$Ew?~[#)rTRHQJ"D*DJ(.cgJLQGAG,,NFsFT oo'Nshf*5Tq<$內R=|Q*@rWTL4 qfHS#E30*CREQB %;h11DHfyp0LJ]LwGl5QGGJ_q寅RV-ŧ ӀfrjX\lR { ޝmD(7BxADF=gf@tS_hE'ȎFѰ㷀#B(Rʇѡ ҊJT!-^&Pj29>ܧV4' R-kﳻGH]<xo0w Wgouj@I< i&= #w8kPR&H)2s\@)I{ {]qEQž{q  xf JeLNvE_q kd@_ϲ,Qegg}Ty4YhL4A^}|q/xfg岤Z~>B;9Wi]2JT2(R%EN83@J#heMTsmX9 )$b.^7"1r%AMH$I|" 3Ak{Bfcq΅"iKWVE[9 wAGɱ]ā0R U9;9JHބDU6dooZt:Kl<9*FUd.Oҷ {>ynBE&l[왜s?s|_8ǥitȨ[۬Bs-6&%2 " H^@*Ą5'z}EPȨDJXW7Rq+ĴYlaLڜH WZo w;NI"13z-' PIWAҠ+YA7ۨW_OpOY YMAkf 3\y: $.녉IC0,PTQ"/tN O2ݰ$f/<$>o tu1^"dbtREW&ѕyR9˛6Oƿ; ԙaDzQ O>ަ͵c_jLIBjTTbh~E?˗yWƺסHRi%TQm-B)cN*(S7ƥahl!% 7[F(\>}J"؍4;5fq6XWTb%*I!Vk"Ft><ۼGoAD\n J)d1_ Xb],JZ67[1Z`U#;-`@ ލ1QXHNȌ`{k̂'?>U:AJ2&n0Rmk'(dž+I1" B%0`IJ˥e#oo25REGuǦ#wygvJ wAorvf.Eb)AZI(!*?v4[ɋ?@$sTjMʥI 3$hin0]0(!m'.rx޳2*!F U荞SvxCźclȦp{p'LUZ|Sgeil{\\IhLN3^1bgN "Ԡ"0*L橢Ooz*\{:APaJ<%7]ˑ8v BfuuuΠ)!}DcO^֨Qx髜3ֻ|J O{u + ;.46yÖƫ,S K\}t}l >$K$`UoKdpQX&'c}AA=s_|j1wnr)#T\L8sxy{A jq& Bb{ygtt&TR#F=Ququym̰3aMGPZ%UAu2.IP0Q@G%6z0v!".F?n~|z2< lt)fgeqoK.uAQf38bay4Zkfg62PТ:b^`oQ:FJy(qm$P7DWKuޗ/ oSM)ޤ޷x,7ÝxwFiK߆o19΃1~KMdI%00HRcgL__^!]_hw!8gmrho3iPMw9}c$6عw{-0=!ަqcפNJA 99RM2&8LISO AoB= T)zH#K m#reիW?]ϳN f8 2f.޽ ] M/eaDJ 2B'({LY/IRbnyťI'G>&ps<2&+Uz=\䓟ss㡊ugTs wonL2q̀Νuå׀5Bu]*5:,O UTCCgF3TDq K+s4՚B Q"=6=aqʅ9<(Sx),O.:y>95jGH҅ei.+NHw5{x3jI<Gʘ ֽ|z@V!(h2=7 ËQ)ϟgbzJ;XZǼƻ>;'eI[.!:bgg8k&Lηo_-N>?[( ;6ʗbO װ u0I˲`Qjm5ŵ;7m4Fְ^swK.,KyWؾ`-u_$??'Q;B0nx[ӌ!O[K1bBxXYӗl?bm\%)pΆrXʱy{}nWֽv SY' Ó-/k͗4Cw. /0CŇ}$PVKs+2"22.(,8 Et$*G (ߣSXġ)0u0%8UV$ZЈ0جK[dLElš o3:k/nd7x`bMn ~%/\ #OQ|ߣ2FYxQlA^3L*C$MxkXQˆ)R#0 n9NN^ q5ue ]_|\H-Fn02|tz < Bh*Aaٲx/ 1+9 sG煨96qYI okѭQz97LwK(]B ;e`: !(/4o8AxRɌ'ϳ` .=|Ngۜ2?!Q΂sik==y]'tejbl( zU-QcrI:֤慤p~|zwԥ -B}<nzpywOFGd\>݁)N9<3aXl%pL}ogNO~\71޾V @& Nl`w\m̼%}ʀBC0N`ϭ'q6C-@?ko֍oo_weNMB? irԏW%.L3muXy.qoPʺ u׿9~㭢[n^0h@,t}ҧ-=u̔LR1Dp&sꐶsl;[:A>6g3r$0B%Qܕ5Vfte*Tue`75a޺[Gygs숰ƲO0~@c%@xt3L`H6NMOl$c95c>n>W T U ~*׏7*ڤHpIENDB`aqemu-0.9.2/resources/icons/aqemu_logo.png000066400000000000000000002607131272330227200206260ustar00rootroot00000000000000PNG  IHDR?= pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FVIDATxg$W\Gz)zեK6Պl4fϐ4rmh4[_+lvggH6g!mHNuW,J4 Z<"=\{GxċHBYXL w>F]|}3FB܃ZZZ"Q<<RjR)5ZOh`B@+-:k#K)d3v(~O>Ya-~o/}R~ ) *bx(eYv! )BG(%B%Д)BᚂJk5$ZKUFNRHR)U2VJJI*&+JzrRz0kͥ]O>f]5U*-և,;$!0!d 2-QKRd9)!)3Q0E2 Zkߠ5@%LSPr£F STȦdĤy=E,7R+cض6E5UL]ud@UDz,{Tk=8w2F1^FPQ$!JNG,M u  E`PPcJe"x&``RN-(gDCRL+)fdtٺzrsmۯ,--F.VW 2uu`R꼔򃄐3{x+l"dK(TLjTDHR!C  (jh )>2>Mr  TqP0" 2- XZlm鶈:qa^ZZ@.ՀSW 2u&e1Rʏ1q Q7b!I}D !2CS T0gτ_<2{ZI@IhHd `Z)1hZB,a.q-;ִܰ$:iD@u3n---m"7j`-)GbXz6h MT} .GBG`Mzr*`3ڣQ#_1ʳ,@GJjTBK4.d`ʄ6D1cx'E3rr]i_o4OXYZZjk2 dY%!ģ,Ă,!eA@"EcKD"}`P"{!c> dMEBhX(dCg *UPY(!mpeBPmڶ}֚Ln]s?mD!>11lvQAa)/q7I/Ȕ"飗6RBk0%T@XFf  _+?tyv7f/_ *K ,@چ\vZF3]+_?1==k~ZUG,{Pơ@K{?DWn!]d,1%{fKPfrlel`Cq3l*Z 8@?TA$F*}0iA=;eTZ㡕B'fff"`SW 2u!,~0٥E7ڀ/.4OA/ 22saw 0W'K3ɘ> 3TC&)T!JC$ A:NNF6Z^N>a33ܑ?YnMB`eS!6g,vivY wщ-$B{eR`Ԇ|7I~5{CÝdxƺpf@#l *̇.utś_xty9eY655b3u S׻`H)Rެ8f :aE;Z6B n"}~ظEl)v7`3o12g٥:vUdH 3*E@34aD)y0)E@2Pq~ gQҲQ0=,o8ʼ YF @ʾ;9VFfſD+V,d"iBfqX2g p- aPCRE)w3"< 3 X35YPNsxʯUg- F`c&M*lbbLkeYvom^M]5-3R&s鮅6ֱ-#6Z/UL`xYlҐLLۀ sPQ):bJLP\VD3B)eL 5 L0mcQ(")( 3DiEDIE4*#R*"f&R*!1vJ-)o)jN*jMk0[k&rv .* ) [*d4R(dQ,ɠpɑKf?pZ|ѣԫhu S-5##XNn!odm faUڃ}eh^$H@+@оJU+52cJ\BRӖi mMF8K4fFЈR$! !$B2Dk0PJZ+C)mRJRj+R3I#IRl43)7%gu왜p{8}Nn˷ l<5(2q4Nhw\Sf?ξԩ峺j>XIdϢwn6lB1A,{edQ&@{ h_v/E%TK_dcHcBpZ6iX!z23J.!|<8,xCљN)  &[kݐR6R-)e3d32/ #;C3,ОF"Lʝyɜq,lSU)PMj; 8dK2Ii>^ t^/VjdgcX,䱿ڧڦlx;6b12{LҒ+AAeU}P1YdT%ьY ؖλ]J!dS< P)%C| 2s%XD0sn#y7SMK)g4Id h'µDS=spJ{p(MZ}4Ć(2H.!yyD~w^:qĿn.--5UL]o`,R ෼C8a4CM[5d"xa-{29.h@:rYkeQٶwecǦat9;-B `k)JVa+zյCua~v4T@V@W@`SJJys2MsJ)gy,;'B؋{;=jbc9aM@(`Ë>Yw9[K!U \A2V $yX7SN^Çw.}j͂ AnO~(MB|;,FGmb;@oB1UF+о ll]Rj#lsb&&']:nlFs]'X-05 o*u蔲K)iP*ZBi4<=8Aowo¿[C8*ychY[fh![>l@F3h!bt~͗\zzii[iA70eI}˶r`GdJo" V nc0H#=Tϲ{x6g/2`*4kel Ŗi(nlů`rum㾖r )klQWΔb4c람T/F`ӽ@Dn6xn@CІ& PT2svl<USםh]/g>յw`f|"ML9b;-be`oyK5灴T6.M52-mBMp_KN{Yyd8`N*u$K3I' ha"pc8@x>ɽg*TCE ̢܀CG X Z6ݿ^x'sNlǟf} S2,=sޱcsn%7Qf^A߬,-U -kO麕dfj2ZMhx=Ӵ69g!Wp 9g,p`Rj1$tڝNS|@r55!Q]5cF :6H b_xvZ̙3,xGj岺Ol,'}yx݊oנ9TUIN;)\[ ڏ:۴tJ8lve4eZ+.RHc$+Xia-oDV[ A)e05ƣN;x9hE=2qr``& vf=ZQ EchaklU/^gϞ(;KKKuf]53`$udJG[{,@e~[v^V~ldF1hDض9I `neҟvr Iv(+i\_4 :j/wOmw[ѪߊwckDDfa*5rҨIhܘ?Ͼ|ΟWY@SW 25`',}yt Jr9yxcd*.\nI&] n3Jרijc1ypޙpGɓ ըUtH)ޕ R!_\=/3gkTU{`r]cicg><<9pm4HGw[/隝$kvbpM/LQ횆qRz+*r;N .oLJ[ Dclòu'/-#;4zfg*)Xhg{Q$`.rvo\szwiiv S{ `>k7@lNE8{ga\J}l \KSu'RI''ZbrZBy.!wmPZ˛BBuJugtggL]M'w.uH+s/[ |ܹ8V`A@9MZ am'⹋lc$22^at>kQI8z mCuM!ĵ\.:~@R=da~6#D6tmNpl;+}鴗T,hMX73_Z>_/^ Ϟ=?z:~Y|$`S#nbCs ؕ=0`= Ò3Г*>0j4Lk}=Ig,{Nk66r+{-0?H)0.c*c.ηѬݞIh4եiHvb2e)dp80/={Wd&~JFx Myl;  fJd=Z4)˒. #|'[rcO˴WqwRJʶT*pb}}F.0&ٚ\1|%MJS2G=`cAE@Sh%ߔZ_X~p˛NҒ_{ؿ~?70 /B~; b'Z6CpWh\PH(H!Lƽc&I|#v5:C⢼qFdކ'SJM!!D` v@14{!CUc ̕is !c;Hoܸ;w_3~ */I)=lm eb/9~H [󝑐HB"1;MXgv[w*xlf Sq,땥uYf#gBH9meno8T;Z,`Th]":#(HH`h>eh{oNOM4345S$Iμ>eڲ;j;6R#ȣb*s0ڻ.y$őp0'"A~u:DtG߶,qAmgJ& BS;˛T;LM-@3Rw2*:8&?^Lė_pЃ.䆺j]b,8;V:z-naSa1NSR _b/I]R),=t >YV˷SDr5Ff[KKK;Zǿ@W!© M~}Tj}*q\Ѽh 58>uru _<zG>H 2u;XLW9&.ɖ]PK;IeU! O#nZ641.2Z)Lr_ UCxΔdHCC&)T!z.lӞeO}ƞH_5~fc#zQFm؍BJ%(-ϦM@?h6||ЭÄE BپVh0<ة%5`IýxmW.`SO VbUL]#ׄKl;A[@3ZWFeoE:/XbA! CHuqil՛JymFϙ3qmbEJ;747w/5޿#@$@ͣ({-9L,/U;s{GwܲO:{NݟzN>:'Sd ~rl/ߑm0[ga3O>3z֐g`h|o<xJ&9e:$1"EMR›aQgЏȲ3M3*37MT%P IklN.[Ǭq )TQE^%簒Iqٹlcc-$s25N7(kl!1S11G64?FX*|i.r70R#fi7T!:f@JtMs"0Dܘ{؈_h|s~ciii4 l6֚|])O- Yg#LF-5{<Z};g˲q}j8cq !;P;u(3곖=kG÷3.F:f)vS+ ؔRZ*,Bv xL)szK v500ѭ02]y-)4 os.GL&sf0`L@& 2I)Ҭ83!Cq:vf˽[6{?B|j}.yc@V;;kəy&MA!JF#5šVtG7WwMg:,(]Pv6!+e21f"ƀ.bd$iy/ "cJ%U9 )Ѫ`7n*:HiN)$EH8aLs"NH^uoq҂ZJ{#F֚h]mm=QVHo:\09f=z.ZkьW64dOX p MQ0O:j6xTӔiAWT.dL?N`τwѩ!A/j Ji r)-HY)tqY(pWb. 9(%5zUsk?>r_|D+M@ 2uxXk9xו:LLWU%􈀤GvKk0܍6n*RZ 2$ȒY &v|Ƕvljxp3|sV$!v_Rͦ&w8c/5NrJFSϰf2@Ga+[/~{F#BdzY /<+;VW "; Fn$2ZMTd9u @G,0kLlF+Ú@e9by:wV峪+M߇RZVJ2$CQ@00S)k"]އ֢?4 ?{a6P'AtrmVb-nszY%Mj =ÊD^P94aY>~hrPL]`<]/>Md"3u0pe`u-Y 6@ӟmh.@8f+_U}}0!#˰heLFLCQg97 *d $S åX.6-7J7nvk#mF) kj)Ri$IY[zbS0oV3e1HCaM*4?sx+ί~&&&ÅnmAwǢ(%1,9mD bʡ^V9+ة\:&BS C}B1ԏ?$\>t=43CX+Y88wcDJM"نbֵٮeu&ekg9!ķZַ !KKK[4r 9è?9ȬznZYMql2@gMTgvm7ͨ6 S;Sm7_mA YIT.%ʠesӾx|IYg + YE-%A]gv!9siC9a0l ،(N0Q)o,4CF3B0zY"[Mk6:V>)X̹(~868] 26bY.%.C |m ؈v#jN{$k&*,RD87#7ܬ{G5p[p$TmaǍV~*0!Ъïae$F)iBx#1#u(v5Qg]ٰR:iJzqq1[\\TՕQk4%gz9P 0 F0FZgP<+h`1`ܜH`vz,}Ir3 ED9r!]}P쐹7 rHwJQPZCn_lY/a[f}k岺b,h_2l@ A76L`X^e*Ymku.=xVJh +6.98z'݃;ۿc8Xchi@xy_V3`FLQ f237ChVHii% :++)3]k<.'_ض"f4MSBɺ:stf\r8iq :3 Ksp攰Og;_m0}Թf5g2SZOf2=lӎZ2\"dzEI|XлEt2Wt? ֑٣̧RTi.esj~4l6Em, ю&Yo ё x o(<`(CZ5 I( %!2P$%PYcLӽN|6Mf$6@fN8 f/L%xuOfxE$ Uj/XeXYifzlf25뭱pǟsf2 tŔv`| Rw-904Bsls%>7yV23 )Lpi[_o?f$ 9Ƕ #ng1#EBv'G*6jQV4 yVkd"Bęg`:kNU\a5nhȇKyfGorTU *+ȯ3rkN2[a>> j&Sd[>Rͺz  FT{1n*H l<k4aB~5^Jt=lua^:+2͝wJS)yJ\k!*9emǶvMadupG=جHz$ rC6jho>4CFcd K)HLhgQ/^TJadܔF!TJpbaע_Jd9zqqd7$i9Jk, 8<Ą+R&@*\r:3B SL] dʵI|Q[lnZQӽ |ؽ`dӈggSv^|V(Q /wu瘭8cÍq@hh@dV65]}0ޭ˩qlcˆaܲmk۶ln7Y1% K9h@{c$slgn$4VyK)fnb&CRZa- @(sv(HNH)]43 ܼFc<Ƨ̹ #3d<)o d*Ud457Lx@zdG (-X$]Tt aRY5iU/O5'jX-ݚh6 C?p@gumCIIJ,y^&FG؅r66{Y{ƷmHV6d6A6keCeou$Vm)۹_YV{ǁ͈+HjCeLPH@ cʎ'h<$Ɍ")-$e @nC3AHf7(2N{ .߶83B]ױqdϪe5IH)PB:yJoؽ+<#5!5|Jw(32yf7[C(,|̈B,vjoj87"`#յ  ^M af]6 iCݮom9-<46xH Y\9t/P)ېхj2wIu|MZ$Abم6rt2N6uw:=`_X q^|JkOo']NK PqS"RUnTh=D.Zs,ln{ iB7S3*)(~Gw@o"m0GňSb}`1W3jbrb0ď sd1R0ĩIÑ4]i9;E~vٶiƐcz%I[ۄ mYk4F.лͳ&Hh$ 1wVF6d__3xhh*!I$5aP `zi*0?5u$I`3)@ =HXrNK `-#u[B) *MlFrռ?`^,o/wTW*Y*)@ P ՗u}a~sa~6 `ssi=}uJ`DnHhyGk#k|rgX9$1U;9NXځBBr||M_NK)f2:d1Ҵ låՕuݕ7Oy5Zir*nj _)H7fS>]ћhH#d13I_--R.K`n=$?]":ׁUkEY $I5sɒ|92Z e;y/l*{VqΜK<8NPȾUM0?oRJ)}4Ӯ|g{,oQ"8Dy(1".ު]9З*Gb06'ҽ+mdzuYV[Şm}2Z'I<}{vsK,92*a(+ !E?ϘT Jc1QL 2u2PJr,%=P6ue6&YL.2[ımU sG! #j5^K\r7V1 B*RC?i*{C nS՗w}Cigg1#J::%4N9}>?ѵ mh&0N`M{mE|niKhC gd{V#5lh|eL2ѕ Osqle+qnYk랛(Ź5FxUi‚ i:lg"FV Mj|LJy4 󳽻yUL]Heq?HtMfOP4C^}䫐{kj[Iӵ|r`1KGgL8gqk;1pQYuhFgn/z_jxS{/wUtl0nZaڶu7vcŠB贏%FPlFiXG>`ґVK#++ؕ& ãhs=kǎފ 0k7Ə+l:1Mz4jN}Cwſ_-MMJ0,l+mvAkiÀ3`氝vIU=VsҊT]5 T-r`!"i״|:cO_o؈.pΟl4(VFQ#Gy3&[=neLNej#)BC8҄υ^o#|u3VkA7W9׳2HRʪ#Eyrcm1ˌ*[2 .e>є %-،.vGTwCIfޛ5ηx_h4Q63p$0? Obby4O7͇ 8 w۟ Αr(<6H6KG1,m -к2oMFHd\0ʙfM%׽Gé+۶(fn=7zjz*\Y]Jx;j/td *CLf8 gu4@䅷#R+ A- S/7I4OȌBdخF?Q+p}FĿm?8`m?<օ駴4WYƷfYMy`3e0oֆRzQiJGZjvu p`cR0،2{1sSq`Nhis2]vkll$2~7LӼT$ܐ|Z/HxYʡcL.. &4㓱YǶ&)5 Sºʲ5ݳ4͐!{=n6hm \]!&fb||ݻ422@fOl &Y=YL]wYz6٣l:$I m\ec2&kMۖՂlc˻`36t_EB6/3Mi3֌Μyq~8N^1`Suu;nPJ_B_ Zχv{16 ͣJvatJuSvfn;ktrK22a3g3k/z-ھlf Ti‘v1Y44Aovn?Ê6#M:>rFWfnԘb>h$L3i4 3x`z +s&87l~qO>$9qK7W mYPG2+TW/00<@Lf&R3,ejA,/Mllg$46|tcM k&1a,- %IZx'+h4X<ܛEfÇ*-*QF~Hs;;s`j{Vۉn% f>F|d~ZRL frfa3aӄ;RAשb>ƓR5'CK 6ɘяI:},s MB|tKfk"Jo[ 4?,؛)L|0v,GM~3s3olJGZ\ / Lsݶ[\,h&yYJi"{ Khzٌa۠S$C!&]ӜM='669<BKKKx᜚1sΟ;8ߛP ]2Cd89ᓉ_O*fcloXW 2RJP$"^CGbdMwsQHͦPJ7GBV(3_Hۻb^oZQ3eofiF~l4cLeM+"ӌdU9D_i|П^ I1`SfSz0ijemMw:+AkFNXl6ٳ#,ŵ)2`9X)#3& |Y6pIY(3! cmvjjtp3|s͉' )mo(@;vq-z'ye*+<337\VftulYvԆSu`f 2uNi.27XFb( c0O^& n!x1V܅ޫ: #lzۺ7)fՃs,15s3}/NwLo${0ijakڿOYBtŦwDm`->CRN4 U{)bZi$3 q>4Od՛JyHc)q,J8ai8ÉɠZpPYMhٗQؙ&a&!@ݗA,F"4H6O((|FFxjB1Fw 쭸*B15ÌWP~.،{֟^0g 6!LӸ$4F^/8]vW+:+8h:8r)?|줸i uUH.wfDJ(pǙ p8x]OYV+/o710 $c9/&@ *{e$.3n0/3^2/䜙^vZW 2u˲,[0["h_g{cyҏI{Cx&(e[v ^fz?oVo]釀]*݌FHVZo3lᙛ ;wCmG;Jt`t  6iMIJ+в2]s37Q!.9'q6z᝕ >_ܴ1bX\\\{8눈7S1w)f3=z**g5 SJJْ*=μ+dfbUvc9iHTpSJWY6Do422{na4d25SrUfʄl 9(MDweߏm"vHMp~4g]=:l&#t07 Zs()Mepάһ6Ι!q滎[iru4 |l>I)UM`a<ǜaZGÕoV0**fuY 2u_ISsbe\"jL'ڿdd> *9sSJJW+f6]?w^rӝBjL(#W8@ 1r6cMkx绳HŴl1 FkbҐR>zYFWނinݭ#t18GQf/;}0,n)3B$YCFl1t?=C_mm_, t )!qPq"2frڮϳdzJt1ψD P5kP!3ӔN!YF!1tY˩J@ٛU7h20[{$:E0. a+6@xk4M4'i'wW)Hp]F1FR*Wbmܼp4{hzNۉ݌9 ~hƷHv]YF4IhTCVlMBfٔRʡA;eԔ\E2^P&|NFLKJH,~A5=x]4+%3spPe('0b̃Wϴ?1Msj  Oo{ ćnvͶ UFG<1lR n9hPmtMkkYJc*~bk#yLvt P=lGa!o!Ĕ<ل_gaVL]w)bg\MASY gPZ'oO%Iq.T yfdITfcf(sps0t;?ka>{0MJ䏜)G7d'a.Vp-]\e̐k[3 8)7)|s8 :⩒ e]pj2m-Ӵܧ"e)$IXt}nbo&| ,T破|6!NnbOl$U# Fsy殌 2(!$!REp&(!c=C]Wݍ )檈RZ{.xddl-28j4? G/L2"Q2O d0͆+NlNr8?3#GƆ{绳wKf̦~c38KZ\]7ml&X| ʝ{qAL `y{+ PcZ>k^y})Q 8@|YJ|yl^FHo( 7Vc7[%e"Iv IRL]"NF2nR1DQ!e?'%hT$4ux KrwAfI%bQ{1MsŞ`eu6ێoCV`f% >%-D)jpXH%ַgxʼn e;xG`M$Fe*]'6UvsF2Q=fFP= 4DQJyKjmWL]5Ե1)T M`ڋ4Չ-&r>'5)q\laEag1<';oUa3Ӛg3zqn= 6~}ʉmĮ^Bp[YC* `ѨcY헁OHw * Cnx%vgc>AM@c1_m͝b]"S k)GxcF:GV}V+߻oTeV^T)Eu>'#jA;{ TweΨBPBH2jÔ?u']fApf0ُt$(3g3ޤBp 5Ms63 0w\=whe(3n|f5#G /7v/Q]BXdn~Z03۷Od;'@ejnrPוej{6fCʍ}IE&CF CTkXrY 2uA.+dw2UGDSB4!$Ơiee~n}sJR.K+Q3`tнjhM>ٝ ^m?,Sf$qNs#vձ06ڃb 6_n5йT| 1w`4<5,J[l A0<̇Αhǀa;"ٕn16o3j:X?l񬲛hZno!O(@)֚ wdjrTCQ;8SDUd)p;b:Yg+t66L0q$  ;Y?lĮ imn2]0\Ve1e]V,p<<Ͻ9^Bp4EsO%qrA3lh.ƦwH"8 8sʁrU4/ln؅lHe pRP0BPgd`_h =jA;0F>CI NyԌ!}+GilTȑaj f pNSݛٶak#WOm&ںG;y~H&3ZHd:l`\E׽.f8g(C1*cC#ml%ͳw_ ;+ٛt%/]CI`#{$㤬!Ikdxn؄e`龁rgA#>]UL]|F"S~HJsLg=OTMorsf:@e3U@Yy;ZCqg\[\o` *eسi>y޹0 v -w1#@Xn&sŌ(>,oƱQt,d 'd!{?{a&jkӇE ;q?x,/6gVJHtZjf`yğn?g+B3ǸP KYր-.е<277:}1 <:3klRJoQJ/qΟ7Mg(:bpF7z84a)v0]ZJldܱ1,9=I ZL 2u ȼяI5VM(${AyL[,fʩqZΤwXjfhvћyП3SVOL|)?|S2=Ȓ[^ 2778sR;0,S oF]e]c$ qԶ49W[=˟ k< 4}UH6FvADvBƣX$`j7qT"ZݙwtϚq ` ;K#F#jx :;79Z0<kwLrߦ `QzƫBgL-ha88 I`#?9H]?]|sao\^p*Ie0u 42۶i/2[\jf, e0I+0@ܳYGO6.7hyO{,Z5M4lvvgY˔ `0cM0?!?RJ)58sn"vc:Nt={vZj4y='AWiCs@MyYSd꺋ʴ"zfaօ\lw(֓v_#THf\ g C zd~o`!+$`&[-633X2%XL^۷a&!emv;ݓ+A+ճӾGZ[AlMVZKZGl0E[>?$]W 2u BB@RАJZUc4QA'M鉿z_ 4JgΆ3tL?8X3:3ϸ]Ƕ;{ 0 ٝfX.p@\ߴy 0cfoCdd*x4l3`jf α􎀴4kz`.F JS L]a d ( <9B3ѥdZ:%hi|ƅfRV|-M,zt_%IZ`;9Cάg 쳙ɵax22jMo;,fy|yE+·`}yf4eam6{3Yl>t#;i`6)ϲF+=T많N&y3 wETBFeЭ835n* )fT+'x0c1Hfڛ g2~s&3r=};_jO !vT]doNןIꩩM˺@ AE"[-z.ظyJakM8yC^\w՟] `vV㨢9g6$5[o/c@'DQJA;>VW 2 &#Ckw̖ 2T(I>>/3\~ػnN4b@)"-78 aÙgq4ͭn`\I^.U&[ԄZyg0~n#&r*:c%4NP +ݻs-*:>m#k&J rq=o*fJh"M%TQJ4!$A^([Yyf @XPS,I)e >YU8Nc_ tt ({|tn\%T 4U̻!g 4Qt'f͌(%3&jKr*{qצзd0͆Kvs'dR53:Y/8&05kǒz@$ryv5]IS~ uB\($`ґ֡nPJo_6 zj?[wܬhc ݟ0#`V6"knRJ_ޚoOyj)_k%]GLjH { SL]1(M8:,$*{Iu`懢T52#I9s?2$I纷oٗAhJ,Tɸtr8($QCOtv;OJi%`g4g؎;t3&`~Zf?ճFBYy,2icd2uOP1!ZeZQ@ 5`lf "&R39)U17 H Tk9=3*^Ѭ+N?5i Lm5֋ xsoۉAk``0r0`z2;$3T$!39LUL" ,gLBqdj1."yh_fD2NXVJiB}?^0d὘?]weT)?wQ&3@lR^@~hJ"7>LKV+_?í{ 0L!U,'RR!(UR~Y)A&2!0f 2u_O>djtLjd%R A yhLfq*%gظ?M:N1S2J)eT3+0ShM>֙'0G7ힱF6+`c­J\ U)0:*c+,?բkIHr,3 PJ$5U"sss[/oi$KP2* *)epsFZq,C1o gzںD;>93;YL9XT!>ۛ7s[~0ma#x n@YLVgO>`lyI"Vv5c#2ephJ{s.2S a]YuY}L9tMӌ8O@|d4zGO* (*&a_&?J seYؘ4K+@YPo{(0=9fVŷ5lˈw `7`S~OL!M$I1[&YlArE5]#U;}YP.۩eu STL)}9]3(؀;T`8礔E_$Im\hm$[SJfY7tg 6 ѥm A@{.i i*YF=sF^,;JAxߕ z=)J鉕4"TRdcL#?{gd7 3r`V xʕ-===ݮuUJSZ>*#;CIcd)Q @*)1RJ6b&K]L]w/%!n9%ٛ+@SJfq9%|A,˚d$IDR|wڑ`8S&{3uɑyfCFs ; ՃM) }rVLw}0?YdoqИI-%<M ɌcdD@d,R-%Mdz#eqdSɑ̨d?hCk pZQRs.U2{aqtkY{Wa3(4~?ஹ`V3;;5-Bee_)c("!`Xh*v>!m c8 2uqHPu{GK]HfCv%ɬlRGsY/^W 2y'c.wdje#Uɬ;y`94{4`Y>4pf*0&3[#c=`["KozQd33CDG*$9;NX(6"&CYe2_nEԲ,!kdz3fffBj u:p;]f#lU)lSd&o p׌QĬJeeE- ܤJF8N9_E 15V= .2+do_=lF|ffVS|gId0M>UJp͙͙ȝ!#V z\a*慎bnn6qYu24M?g ,R(m{*QðV2Ѻ26c&uں\L]od.\.o]P*#*3#]iI^aXSw.LYp:腏j7g?]36gf#N3=/R^+o;Q\BKznn6sl2v0?SJ@Ǭこ"Ӌ62m Ȃ| ]3m[X+k W5s[&zz1+l)>ԙ%IRꃄt>BAx6^*u|dqӽ[Ff[67McRry?:Jf2uݛX;m,䲪ӬoiQɌyŚ|(ZZJ{OJ) guðt;ۀ{ڰDw5zwsl`p`( R|ҒY[- $I~Z9@m#c󬸊l\ÿ*K@:[ZfyB,BnVUVL]Bǝ+2HF2c{y(3()p0-#;Ͳq$IZOvXg83ugiFE:+3n# sٙB. յw0 g4so5)o h ;駙3Ot]zDA(iqC>s18Ns~`;0k~SiEbk=t(+*IM%g4m}h`\E>5 ءOݗ3G{3]{[@\Ȝ.0Z`:?,\e[wR|94Ŏ/}饗RjR Vj }ӗbJ3+y?۱s! !z!ծdz;4 DW2XUz;86S@\85d՚oL9OϴVӀȻTJY1w֟v9)e H. 9RLgH6b͍nK/7iJ)7 49/6͟? RA̖d%BI}x/^nsMMx?!#Ωr RD{}l˕ lL%i1J`*5vTʶ_p6òQ(f@c0io$ITRd(?)}Q\꾙tsCe&|?L$ ! ny_TFJAyJٴv*6-'h6vs2P74Z9/C4M)<6PP}lTz1I2C0_UZfV#}|ԉ5$Nc_m`v!Y+zI%l4Vd314S0q+kEQcg{~<`T~Zc+\L]j6k0L[= 0ޟfaJz|AJ!uJݰ:r[5Dt`x?J HP'9.Z7~h3ˢ%'Vwb02J/$.8ʢ\&\ ;q=m1.R&n SO$ImzggkiOgeo&gVV3l )`ê7AJ|GGLB{}ReY4ѕ$2 J1xGcWOt]Ixiש&祔;N3V'[fzu2XD`  S\9&^7;;;U)n*>M9஛.ud"p_,&a1*3 Z33Xl&\B- SOHB˲rŒMP3l64+e3f4ٍ43YyL'I,szfqu-P_j͙txMu?)|w&zȲlAke߯lbSY)Iq::"8SKko4`3ȶ4g.}sl=SU]@{tv7а!DRc1C?1#%RI#DECD.W=\{9sOWUUeq"|kײFs_<8+1`Z>mjBT }w;Hh3>>ecS vk5g1T6sc 3]8xjߴۼz@!(B8"ʌ{]4uƅ13/%qG>lj=o7z/ַ u]3˔Ya7rI2|4Al?t>wȽ'[{L\ j [q02pA,<,L൜: R[;8osn SI?ocRd97( PQ&Y}P[w33XJ&W5ƶYdfuzϺlED?́]/e3̴| 8uOus;?o^{36N{ovim16)~fy23V֨DڥBJ S7e,KNN]GOg?&,}ͿA}8444@랬p9/o5gjJIlB>Xk1bNj`t7S;aj6J+,fZt}kE)tKrٿ:wCusWhQQfb>@=8-=_~7ֺq3qzJ;I `Zp jYMQqcQC,z?f Fplu 0K^)A%"e4$LOVucK)l ::C6}e1T̰7lS =hk@lvx9b:,f 2-g4n7v_ wnFAp' 6g"!aRdo4ys&[&&gVf1eB@j &,Z_.zRJqνt߷֮^#^C'X6Yj7lX ̦j LAkǣ?}W66lW,i!e~DRټ }%4<Xjᾔw1)5nq &.A- Y iMm7.mK׷Oџ#)7攪P-Gl>ۃpT/g1MVHu 639x .ݨzk-+ys 4f2u( o4ߘs,4ƑEΛv7Bl^?Ń8RSZ+ow~ؼc蒺N7r6CSfQ*+NsI4GjsNn^f1ThJh5^ "Dr m:l0٬Sm%I4YadM;j+LLy Bȋj1;vOAfƊXk;F^ln_6z-a4 ڬ58}֟yi$ иNk0+xGj33 8Ԙ9 3˝ƕ &U!GjFSJOwprk#φ}"v|RU;ʪ 5H- x͎~_dN?;Luo?ܘ=?aޢ^˳ۘzMAf؍$$!a{4#ޢ:>t/띱}90L}g_vnZicuSƺά˙ Pɭf}fz}#|yvn /oNޜ[Q0-gul:z%Q@(ǚ.'d6}``@m>f7 !#t^dhN6ޘNp/ih$k>D{gHq},0YF]fg~W_RG"ąAk٬jcql,W^@m5 ~d )#7KRζ?K6{@#d]W*mg3Ւ*mL]R 0ere/sXomd~~j- ^D>S)L]ιrKJ;WoFXi' АH|h@6Y/ګ`k4?)otn8[Sm,O,fJ ,"xx@RşUZG%vјsqKٙn.fDyّRVW\Q/Lٛj% ԩ;hF99d]jLAf8mF(j<N839Ќ,g*;hAY'tgv/[_}Wc$sfU~WRf(4+wYi&GV3 P;4LLҺq3G@o !5;;O&iWݺ)()` 0 ).C`9@ݮly5B3Xii[ݿ; G`?<$=_[f`*;g|nD K$-09>{6h62 tuz$ J!$q2_40抠]*d2WZ <À%rr~r*TEfs̙3juu޸q}ғV+[O 2CQy$0 D-$ |Ol.QXH|F^(>ޔy(A̦zplҌsz.~d-,,t}-?@V? l5|Acc{W7{~ QV L6J=4b? ."?_~׬oY!gދmu`I\5n;,PhٿG?j9c66|V iv]D(;( "[}[Y&Sn;??}{,zS)LׇxyL)%Fqu_"fu6w6=,L Akn_4ͽoړeqb}'J!Vf&͚)IftqcB$M=}/ͭN- ~wow+˘2ȐwC*c\|@ l{ey뵛< MdMzNeedf1'孴CN v]K,F-BA)*D |`N f${O~3PJwt @ QfĐ6KLF2:i~ѣ>^|o= A?8r^3gϚZXKzSoέ|Aequ m#F;KbigfZoB{uCmeSd`FR6Y;aYB@$P';,5pd"az}ߍEټIQ\}!3fΰjCR_Gр9v8sɂgqMX&6l{?B:ޑۑ g0|?jO.Y߈1<U1Ht˔;WY P0x5Ng>F;f\)e?Tl 2GsMeLAcffZm AK0C)s Y*F$ĀR\Tw̿yqmmzRV6/fXa)X*2np.fƙCr~ZqܼybrTz<~Y7&?9?]`y-&{hk"AJN`U=#'N֏i&3]W&S(m 4QMJkl:`*$uĈj4>۹/G5 BH(T)̴;;31c|V2T =B&Ը vֻ 68pɔUfht~fwPQgΜ1Bf2SdlXk]ۧ&mTҢ Yhީ.sRJa-, ,1 oQICuΆ:avWWWy`ڶ1ӵ ck؜9I\庌w2%0F˃=־y^xQp 1JkǢ9&Uv4- ?|- @9 X21"W_ùٗ&LAf 2u@jpv薜Iuڢ @2X&d(M>8(8j+Ӄ3 |nM|cl0 U Zٽd"Y14~T#J>9M}|O>#t:U&,Qkr.~~>]=ӷFlsA%1Jȼ*q4%pe8#d>q0f 2S#2Ci64qBitK&znmf!ɠgD P 9Lܲo&?GIP!fuuU?LNSNųDTҹ chEe5gQyW|/~?ښ\]]]#ι_u/vZxnq:NFǭC.|7>hgPkWѬq(aDE;Xy@3)Lh͆0m1T➮0 AJKLe5ZhXdǒw<WvoDaUhv`n';+9s>&ԝͳ銾y/J ڝ#f Zluuu.CSTx]&IcB/ p G OC(( 6WEreCY #މhތ¹LAf 2u@&W c|3Elio&!F1~.`SY RXq_Nk::4M1%Zֆ4~'\|_I_32,e3(Kti`j4<}/yrmm>mι/NSO>$u왛.٘dfUC`rڐLwrP$RF\7`nn2)LAfȔFn܏3 CQ)VMjЬd3X  ljF\Ll&?$cqjݸ{ @E%]Ɠ*@L.SQ?֖k3[ܸHrnwXμVWW!"YEONSN.t7ob@v`e XBe02C,z(Vg+5wJFP#gins.óf;oFh 3: SJIryr;ޣ'z8ZH]R(vG ,I@յNF xRw^욟čy+f7Z27lO]<@5D%h"kY]]]hkgձK{G6^z{&dV @3\ʨdr0G&;pv<;^*eUѧC#T>҃d6cN`csۮ,/F ͪwF,D&+1ˬ9X>;=ț'}3 !䳜e6[3oc`szUX?l Ѩ5OLZ$!l_//_id41nS"57;6W't`EQ]G@$ώ3yssjSt\g2q Hؤ*N`6׸|߬f/wWMJBaљW=-fleW))OͦQwAIlβRr)|v0o+jJiM)&xMJqnߺ6IJ-s#w`ܝ\,F8&/;Z0xWW_o%`jHyRz z@g<&&Hw[%=tjHŝw>)LAf>z@(h@z_gӽ΂a?@rNލ3faYf`Utٰ|Xj &*]P-AC"BO&"ض?o}T(Wvl-.-ŵA]p{Fn>y⸋İ\+(q ,1W)Ƥu`i`&&%rCk}2 6,`^.2̈@km4(13Wv~5+W.<d#6zeyK)N_:آ?c\s@j3ok^N\Os9h]Y^0)vG|{\ݝKv{6HP?j?*S1k He#q6yf3vPpZ#(G VkF `XyJp&/D e)K I]54(ha%a]q "lL= X5 Ea?9ofӀnsn bΈٙV;W<EM!8:ܖܗC{ wJ>2R;8@lQ>Ol&~K/%\_>O9g+ˋ !d3RkmAM;Ng&Q~ <χj*c`C 뙑@1Q, wT6B 4%ЬpchI3II\=;j(:Ay c`c7LVG.R~0؄K7T*p|"{y)ke;!L~}f@B`P~fmflԝ'v_ܿryOgyL)LG hiڌPڣn !w:O^ wf~axlN")<3!|\\:+7RZ+ØJ_n,1UV9̖)J3S޹T BEF[+6=l[>f3)@~P[~Bl|+5RJ+nvvow/uw?a `,lA8o ԝnK/ٙ^k 28̧یZηv5،j;9vfG&gY҈l@ˠb&l*J"/st&d3 BAuag[o46$B1UG8 %TD;FmIR pSvX^vtey1M!ove wh+l+p m-]jߖ{ϕŭm=}# 3]],%B")D1~GV|sveo3?o$Ac5yoF2\wMT3(g BQђ[ʬ v;^mRQMdrUwC^dvj.7灝eVo{>/}6lz-E)}.K@m'hg4{BG5:S~΋@uj/H}FSS.}W3ef]s7vtSZf $(:e,è;<`sf3d<)ha$ひg9Az,1EM>CuS;~=%dˋQ<`IyK95v^5{ 4nmq=)sk`:;u8W^K 9獲+2]S2ؕ>!$3BZ>_ڹիwODΙT6Nƛmnu&g7cYA 'W`+I2Lˊ䪸\0CFCȻˡKo7+Pv}e=ʼn-h6"8g !x95 @̠B-h /\>%/9&C 4b.0 笆N)LY !Gf]R\k?>{7{_ԫ~ f3왙d8i_h9~T 軏;T42U6 aT3Q}\s:O;@= »/1<<%l4Q[s`y 6ms|ey1z7̕{IsJm&v^V=wKˋ^o (}ltMAf>`,/jBHD9B᜿yfndA]ƒ6W3`ZpeepEU΋ ͕NU*Qk(=}1@K' >R`UjoRR[l >kޫd\@ٞ0K8ېF=!R:F&whm`4/ ޤb͛D2g^iإEh4nr^[9LfS?Z@>!tWJysޕޭ|aX Qi *Ou128EVo8@I\0ԓ&o"*}Թ쿖u蛘:Z{ zmIosv67s~.~[3{xCJ2;̲&nqiB!\2Ӣdk,/FȬ@zm) 5OzQ]{KA'2EZx3 E{ΠSN 4*17pyf; &Cd0KM,I;~̊Ճ3=ńMOj8!mo0 BmBuoǍ+}n@^v[5s` 0q..-ЙVk]!~SutMAf`\ СnJI✾ycZr$~{3z;KXR? 3\00ij#)5.VEj:cnœf1TRD@L~ܻe-[ύnKm{R#eTzfg^Ş'B|64;ǘ)\{cG6 d=8%uxݭ?4Dq)sbv2*,`3}nMWj)#RJ4k!/Ռ]!clr FoA&T p_,;ˀ\wF5t= ]0 )e0G&XCֿ3)Lt'rcQzIzs~F|Թhh7ۯ+.Z9KL,,fN ~YUaLB<)&e-G7̾1vJm0*pZHj5^OqۡnʭXϳ}dR$AC o@βUٽ";jj6RdE&Lf 25]6 Jئk%)V[TSq FňLe'Ђc KePl&l#OO *w1J̎ (M$eX\] ˎdpܚYEX,D80R)@~ۥn`r'?lNN'uڞ̧;i/ݗkެdE:jnj0Lf 25],$o6!MlAJy< YUJHt9V~Q Rʞ0!yy-KLl=-7lf@so\g9av=Q0![SdStMCn2&!u cl^JJQ?aYQZ/T&IHK;HwU$an !Q"-%!9¼|poV蜋I6!M}03AgqPڔ9u)NSC)qI<ϳB>|9PJ۔<] t:I {_jmo` 3]~g72+@RҤp<[[.Zk1ژ֦T$I*\Gjc6XgaYBDXH{,,C39M$KM@(Qʜ B'jRH+L9 c,bc=Jirn PʠRPa 0*}.1#h6۹ 0dk޷GXiNRҠ50`97k-n VmJ(eDSc,qq 4RG)c3sn9g3n()4%&҄RQJ#BHAsꫛSd8ao:, !BL?)_BBۄ`"dk> 'rU"?c#kʿWI(u~MkQy.}GFLZ(skZX)1۳Mdɣ kkkO*~R9J|f-cR.,,Oc^?pgֿH)8!d9gs4Mi>OnYZY^@&RJ*;.V6"jY86 ѮK;߻!lZ\\08j!^#".j?K8cg`̈́!P2PHE]ѴNF>(@w,Lbr4qÕJ;<}:pν{)K)@6޷ =Oo5yE.&E@ &d>캪ȸm} ͽ zXik7!? SAg#9HٴB$Zuob|^VQ~bWg屾DP҈`JvI2M{m_;v?ΟիW#'1oMqY{ 50Q!ZK.s=$Iyr9i)sp0Hݠێwo4~ii&-R? ޏ>10ĺ |BT1Pǡg;/yWRΟ?ݏק'1k~s~Zl(R#N15P6Ejch@;chG*5wܢBQ N8)lG鞗wM+ҫ333mdfqr c ;"}Y`%4;@+@\~G@:vvy}/^|au~Z>3,_p$6=D `A!`Ce\;~ҥK@uӇr1,l~0AT^mo׿F)3g8(Iw%^zXwB#0ơF[nyG~b)_Zrrw@wK>l%XTyeH7ArMnw(߬sJ-y?3:4M }w{P4c eMX h#d\``N;zwKy5O 4;aLvhm'mD p&IN`_`{O>ĿB? DyTJ;Hx$[m ,S 4L9 apw1: Jiae;z%/m>v[=(ā,f C'i;V ΥKvƠ/i'vbہF j9z9~k^]<Ȱ$VWWH? fg'vk}KⷰDd[A1k$p̂6Z\{IzX `d|Qk(1c_K{i"{-7qhރ1 o|] U_90@ H)zHCRׇFZ<սSE̅Frټ U{ƍ9$ɯ #"P [/ULs 0`2;ppLCmC`l&wfQ7=BcDѭNv`wq! ,II K Sa6[ĩ_:[[[}~KIMւdnFYLhh09QB1%w ;s7Ο?3Z4M},l+z]+O:X`ZW[VoeyYԦxuuu%M_p2YqiIT`˞w Q K53<.~C|o7)R1ԟaF,vv6:v# (=L\TT`ѯkwN:e77\j '1 ZѼ%Ooc;}} }@6{<׫"L(#/c)PRiᘂfR2@ M@b1ά#Tכ&Y]]57nxV_gΚMo]POCs ̤kq!gq,{r!qr|ZpޭkܣT{|{l+z 6v`Fy;D-vܖ*M_0Fq g6ǝs_[J=Ys3pT x4NRBHg]?+Nwе[ _P\ ܁2:H7k~~OJ_݋~L-;(=aWI0?;V!ǭ?f i)k)(h k:$=>{'zΜ>,/~(f;c~L)W}Dx6["d&bt`ym@FE~(@و*oZrzg)j &;씁 U]0C! ?=[0 kkkGR'}D8d? k3 U캑4$sZOu=d9 p7ѵ@AcL :;X1@Z _ݽH)oey~C9pgc1lt= WĄIDž3&1́ X\ʝ7N)//]|̼k?r-|@ rf7Ao>:.V(I !Ÿ#S VJ-F[@E0wd3Md`q3~}QɟqXI+7AAt E4  `d|nF=8৭(<nu;IvK;#ʳi2]j6&FN[[4I"b>_Z.zwܹ@=ZMvDWl@cہl';hٛdUId #cjι^@6 ^Af!I/O?F.,,QEfG`xMHhj! l8Oχ2 }?}ޡic^6vN&es'M?̂P@$@x}bhw:veyQoln?ȳ)$Y"1]{>fg͸hc.8o,/Lky9̹Z_* `y2b`]#8@);ftZ{sn ~;{PS݆ )dP [w,B7 )o,/KxIJsؖ7؏oc6XTZ"+Yzъ̄Ѯfw 0ISTä 8_N|+_[Z}W/^QJwvOd,t!14@dKP<;#">d s`@kUVqQ8M9SIl{xn(%ԧ5|IN C"kމh(J>)ۜ3s,] ?gɨlC"3ƮXcW&ƠܝJRW;j84L@SI, S ~8}嗃K.W 4J)BY FR8ɰnWiV&{nJDHDPX] .YdM>6isJ쾟6RJO6,(!mW Ȕ6"9z~ fE_ 9h}fi>)N|U# Sthr%JkxT ZsQR hNlj:!kU9" "%*SjJ7Me,W"TJ.PJ}=>W `E)y 2m8QJ_;тαj|wC9碙gF W#̈́~4M_\]nc/u@=3~S:C9{G*h CYMB!k$+ 3걹4B\y1F֢49g3d)E rB0*h4y&_2ؼX;_w9+g3oj_h8x9`{zlhl,9 F;ΉYgP֝_Y@'aFz!0> )NwDPٱaF5a3rσpsl1q?BJ%BTvy $If~]^r 6eY]iG^L.$pyݹ+!𔨵rP%z_g²-(h|qIrٵOe͕ⱬx 0AеԦƮ{d=,(-`e{'-<ƘeL$#e``WȤEuQ}dZ{s}:OW$e0#`^I 126 Iҏt3XG-,5 eAXq.+>83sh9X.΁s+Pnf˹V Hc< 2 q,,q]Xz1Nv WΕ~@p776'bAis4ܣ :v ,z-nݕkR'E50QvZREVh=5/+$ {)kqJ+ˋ e* 3V~>GJQecǞ/N2K,A&Z&8ө["=@J8 Q +Z8 qN'w4M/:#|I+%p'9?U{6^zse!=Uk1;\ug,ȩnVhzd?hVC.v )a:jX 0}'O<5CyJ,i֩( ]@g&8.2.пt&3;a꺁o08g3y;iaYs dNlҪ J7*3B&pu@6q;P k  ƘsyvFOs+p9LFdͷue]ʙ d[Tlzh) 52221;G dK(s,LM™ #E[9ΈŢax 7|=%*;o |ҭ dmN}qѶXv ,p7mw' tW҃#BkeY_Ԗ`1= {^ ؄f;2?m<ɯ>WO=3<@%zqP* J(n_~]/Ƴwdl.ßeGFڮԦ)A_gVsWJ:c@s> u 촺9㣠Wl<(q1㙠eυfbY朅+ˋG3#cNȷ4˱ʳFu1R˙Ȟi|Don.Ry}.23Q+ޱ}2Ο]q] _Ng MЅcI/!b<@䅻.$a/7ZSa(o,/FPsf-/ j6d âD,a(׀WatW k#f`&KFCCECSŰ1yhl7n^Z}2WƤ(4 ޜ3?ui_믿pWॗzctO$IL)c#(L7pKlF,Odz0>9;-sXr Gs9;C 399}BƟER{4lT:3깽865M2UCINahFF8T֕lE^4'_~7:̅$IנOv®ž%`=dRVQVٍ6 u[jR֗sK(s &Q6i$o*ڛMX6>sh+hZvbdY 2wZՓP1NٜJ40]usFA2+^cDA(jsp!-B[^\tQ(Vt0  Nen/=-4#ϛ 뎲Vq|1ѨZQ}J@,45a Cl.+!*1֚8bxЌpe#*C0̷ γOM$PgR? &6@rbi0?|2^ٛsOjפ['Ƃsn1)n-ar m0 QRn\g5C``. R( }?B=Ji QN X!81Fi=X njѶͳٵxr[vYs+(y3o<W8WIF4E7UYbE s6 um(jB3[Yuo# ǢsEy>z%5r0LVw╺Tf|V" GsFG% $x S :Б7j) P9}ek9MqKvQ-zc>+OD r!*Kگ2bpOMᐝc,P;ןy1^ڞ~ sX.Vwj 16Ѭ緅;mB6}d=IsvP77͕$Mw;3~ѩ^+::s!DXY͘tdLl!,? ~i}ucc߭,ꞻy𲧘`!29vU?6i~Ul^8}c!)NVƖjdAЃ0Xwf o9 颱vYRsH|>5Xff:[\l)K(R9^& RcLZ[E@ y#<2ZN=!ϴHIɾRFh}#?=)S Pgl[J)%H~800c:Q$]`׀ݗf-jtnvքa-El-dcPcyгLJc5،b)3q\.nvصQZD\b|7\lPnjW{}WVv/ς ޕgk@FG}6)@z88j'Y8ܻ MDRo# +f$HHMqE"X'RBz߫; kR?YOZƘ\5qILfi-e;+~u&Ru vmtIK2b]s2Le >h6NxRn^LjbEt4]rdLg(^_oE$dqqnRJ_ 7sw1a$O)SJ)c??  qj+^(T@s%gƏ^Wڇ"TL?(Drp_3<$PbiO c:` A ڮvb1 e"&<9hJ"ҕavh&сTfaTXfs3z8؄+phz d15Kua5 AV3DZ?Ӄvf>,V8eތCp&nt,cOQ^ޏf1ǣ(2߶{CKzw/Fgk?o"}|l4ۜ !/;w|l+,/򍹹='9BVqƀ^a6鲦avp5Pw_ ߭1AFBf2eQ~9gwDZjdEf":'P@=QCw mFJ3Y.ar#9mYgF)u2,tFq7nRV_l@^L WR?Y?ɼ/@kY̳CԻ5]&p9wQꅉ@xh0TT5@Ks;Uec= P/fSEQyвLUS (:Z8wJmV_[;&SQ=FlrN{@+!O3AEo?Xٹ͓!3tx.[C<$kkst}@&OZk?.OjH,ye^H@-`p  9N ޮM*(嗤3#  <44/q1, 1sN;a˒ sy`9t#LI`yiֳ ^3v&q_" ?7]jQ$i.i#П.'sJ.)W٣z@!Pk}Ռ2=m ڠ&)Όק2Gb!8diè\iਅ @X 4(6_I'b$YGXf o(sn 2b5\&̞K}?{c O% {H< .v?a}$6eVdhL3wfyj ,2Gtg1; r깡iaubcM$5h[hΟ-k0oq`cc]F7gfMt*򰹱m9g}Bٙ>|tCvT!Fܒl&FsA^|EH?_L m ٦R&)S 6-m *O䟈q+bek1: Xq ԙ?X%wJ&D1s94t$c$IS ̇,)<.NvC >;*3ٮw ׅbsa9lHϻ"Kr$$(#^ ) |Rk]Hnqce~fr|jYcLw H6=Egfg7rϫgɔ7)sn)wsue2:Ku ) %lr Ҋ[QZk|䣲1fR{3* {tJ)^kUiazƳuiz.e8V\Je1 `T5@z@F-\`SmrɔTɘY`:>b.{ceJD04hY~1T#M@HBl [iSBv^؄*:f`8pQF3g{G1+2!ɭ$IOI3ATK6< Iwza3 ϫ7I11Ρj6~3}Ltk4$f3%F&2x^)I!5DgI\LTYF)dpMGJ8f.|Aa{nu/5G]ytֺ8;o*T~: RZ0+q#cƘUBHGhBZɐJF\"@ugRJKA)6!K¢[L8ά !}RX0T3LP٤4hO&0RJ}]v"&#:S߀ě5Z3˘ d9U8 S;"Ѩ7<*Od lʼnt9g7lXkɓ'-ص)8$_,\Ɯl?џ_HS虼9>ϖFMcy>ypX9UDz:d>qc{euzo;xlS:/;+d6SKJ) {%>8X(1j&3ˢl8r8Ao|gfߦS4ۤUWEμ9ԓddZ%,f,tο 0ټ ޥ(i<3FS#j6 GfQ Ҵƴ ]%iJi 6Ӗ:}H !1<rcj輀9A_4C fGW)CgL6嗧<JqQeE#vިk)`n!1Ga6TJtR 3=%8/csqe)au!Y1f5q(ɗ'x{2:\#lJLQJm7if[4ܤLƇ7oM$S|1 P$>$]Sl`H6BFپ (x}iRCf~Y.IvJ}2 ีq*t\ C FzIX 5c|MF~IK! D#dT yJ=:EF*S3P='RmLCg 31~8@ f.f> )-M&uO *SepwBH{f[(J&RfUwBV0Rjf2Zl~Yb,ƍ *;gPY?LO(lr=lw7j#ia+Yu&oZm&}xͲp0"3,L%v8P=g*Εeq6ڀs5l[MŇ4]$ɬs) `sN.B4,G5QJݑi)elNwdt` 0oj-\ 2.e9M5y< @ bׁi+˥ kTVl-U.n"Q;(!PGW.eV8T97hEQ|Qkss03<iK԰۝ó1ԆM SٞLWu /[!ĭd[pyRfC7Kdg[̳ T *h8fHJ剓Kv:ΊjO(333/ ^mlVUX]guDROґ=nq?FB50ECF%Ll C@6}{# HU!B#^.c11?;13ln  1.vs}?id'X+_nEn:$l9'Z[8yK:﫠l`YH3hemu@ מ8緑YJ- 2Ҕ1Rz `2 V@a_A}[&0C!.B|y.>aI.իW傒ZgROcܳP  m51K)聠O)}|~I9B`u&!vvCo)cB#c8b E;ړ<"8ۣlHO}nv$7`edɬkHl2x)ۚKGihI3²x̣kGԿR !Io1z}U6|<Ӝo21ThH))3oO Of6p5Irjp6N9rԆ2;>!d#b+BZ 4֙$.CP]h{<|{,+ߞmf\s:[ׄU՞^[[| B|*,5NVʥ:V-MWh=7j?];́18y,-Sfk_XcɅwܘ|TZL%UfzBe=ٛ-1~2nXJ >˞7R)Ms BH*1i~!xSF,wa0KxleCSe;$Ny_b2 V1F3KWfF^̲霣H:baԎ虲K]T@Ů B8A)9ʳ.R)zRX b衆ᮒLP 4usΒWW`,*נV}ZnSA:nd*:Z 5;B:_;}Bkkk|L.af]rEN<4! J$ջ 0/yϕ?L}yV %l$]]2en t.!c382R8khZ&; aӆC&pRzc JT %v~!9 ( ΘAcbpcn*/ӥ00t 2Gdޘ`E_@`y:>:.̫,ݖZʂ*c7lK-=Qfb;oK? .v6?٨WJuzRjɼLF'M+B~NG,9oLiH*YLh]}D9rwǑ׹D'Q|5 b@=e#ӷn3AZ|0T = --{L1fNFQ=eRw&LČ)! bZpƎeLe$?/aТzx_ e~"5$ZjZŻp]4zPuuLD LE e@sU-k]L|_uUsE CNeRoLUw6A@dyVNo'&Qt1nÞ|4lɒ6f1v63DkBrG fR\q\J,g,! +|Bt0R2wb:3 9x`iÆ0 5d yV^k|xC4,H m|Zfrln;wn87'3Ɯ=;_T1Nf JpSJ;y^sο޿VsJ,UXOȷDÖ˓D1.hۀxI1=g]_zGddUc9A(kmkma91Ai1XW(SLv>л ԺKZ¹QbW|=zu vyc昗*uhfxSnc}8猵Y퍇NGqu&/%HHLO8JC\pT>ms.}IJr_px5 #jg=;lsrx4J_Ϩ4 |ڎOq I>{OXrSi%f4r0U7*i3%AN9;@xgMQTEzn'_Oݗ s$_}d(\) ڃ- e:a=uctx"!p0WI2zJ02ޘcQiz,s\Tm ړR={Qf[LbHw̜q6}J)g:0  J]#!R"Fi7uupg1wHJ˭s92?QEFSަJůy0NgmG0H֟ɧK`Ԭ|XhXwʆ$+[C,!RJ~M\+Me3d׬doOEE\7gOhPV dTR "Pqllnرc۶)k8@e@]IG5"̛d|1OP$ޘp2d\k k8<wFSf;ʬ虙jI#BfF8xJ q̀ f)aJtODđ&R07QH\ R84??L8»~07xQ ҁҼKkI~{͟-PJ08F2ֈy*3sJILa8f}sFme,eU{ϳ>v| @4<(ѕM3hI_q:{9{ mqEy>z|Y̽coHxcZBH@իWM^azсpߝCRpG`Z#K \X Mɴ cl=߀K311!<S~X+5i&s@&/(>,H\ڀy*Z A{@ _)!DJ nu3|1y<9~?EcZS{lZ[Ss^HtɁ:5b1 pdu*&S]j A=fj,vL9,w|hfjI"TVrl#[Y_s;ۺc[rdNDɕ<ٛ‹^9c^fƘI[u#!p|\3F$IBX׃ˍ˽C@S5o8'z#c / 9*Q`1exPlL4^֨Y벌18kscf> wXI|Nو.O%:hjð̫p|?|晛K5;H2^'esff8I3Ca3a#0*.E'zK$Q" ?M<fY w rt TXb)%b6sa.aܾ l 2&ӻ|\]3ƶm{RAy~۽Xt#0GYfUfj.W'd3Mϥc 5܍n*F2+Oɓ1P \D(igS0MW,c*]>al_Yx"k$ ,`wFrzGY& t \Fbo>l~cw8:-13 Bf ` *%^Οws-*q0uWkzڄɗդSz^ZZz_Ǘ"2D&8#Y@.ar}c1挷y*Z&EA:0na$]RIsveRj3E- 990oR~"]6'HΉAw=gbd1U]/5C9Pl2j}f櫋_ ek|'VÜ:w_!!d ctXL#u7!r)3h3\uyt: FQt7$E/1B,Ձ$oF 2EВKr00]usVFPF1f)ͺ9ۥY%x-}4=/{{#0M^_… ?Ag#mᑊبbLyǣzC$_2+:W6?FsPBp"h[^)cޓ5ot@OV3\)3c߳GN:A]/lN(>+OD zBA !a㦘ZXǕǏ,/@qqcإe@͛*T:ߗw/e+5͉hQsp+~Lis" ;ǒ;wg]]ݵvS\,$$Iexd__ 0lx$hl@3sSOm2u ' @>D !pg 3ip1I]G(TƘpElnC\ݴԱ"3_˅1ԃbxJ̖fXp]*)^( )w&w)@d?pCy= GR;v0z[*Ј\\ _=w2q?R):k*z="KV)B nZU_>%+魠o>>tu^Ɇ4cSʦV8-@Jn1=CxA)].cZgYi1ggg ʰtw]g9 SDNNfVq14É}ghvna28J}1ŕ/: L07K7 _8.tH `fY*@A2/3GS5dTDXX0hh$`&fV%dfqw5-o-/-@Jm0%1~9zάD3.gV0]+yA}=yh$):W)̺ם7o?K)'Ok8f9,^ecb=]yFFmiȇ JSGȼcFlpaxF0IlE٥ )2+T}&c1[m9לw{9ߓ:y"Y Fx'KzƘ% g)LJɰi>*uy$%; bH7"#f܁GŕUana+.(swRkI>ϓl2o)FjUa\ů1OxpsF,^9X,O 4bJnD2vwFTF-X 0v++2Ya*d&ܮ" $&G}9rnvZFd3RJzQP^:u]VkO\hhS6LZg3W40J*ѻ/4jeFuͲ/Ղ8?.d-+`SZ頀d[[9<Jc45T]#00H)IJ39$'oi0!c 3'J'{/) 6FrJ*Q{2'%T&PYeCTQ R>C/>Rӭ*励VYYL C2 ߈>l6[3F3O*:!5l7<9[d-SJZ+,g`g6~G[K7<e9pE~L[7؛oi.\/cO)^h"4N i{^jX=]T= )'=a[9/@{/ӂ#id*sPJbˇ~lvvJz7jP *W`]]Tt̜'.'AZ *bAGN,cl%Gr;q[UM*"BgonA`d 4%WB_V2FjIi\BH{JW:Plȝ$d}SZ XI"#uO)ܒ.ȥ<:j6uWv͕b*+Q#)v>m31_!*v0tʲtIIu1z?kfzs/7]ӷG߭B3Agfff1|LL$?mw&v<xÀ ƏrL/ߺ{7~1vy6 Olԧy %^ݢC.]լx5I ]kWJysP8E 3G%!~ŋO'T#*s< 4[",*gC0 ó}zba˒Cqk!#lˈ1"YJRnB RaN'Hè;Y5(aOpҙU.>Y*%13FFd,˞'^~/P٘LN֜j%Ê~JUdzVv(>HfS-$应q޲D87wBym(Jɛ=v?ukdM;a`s u1.xP?M㤵$yDP/Q 9l^i?=KCl"jpYSJUlF-5ƬgL&@&Tq+cZR _1|`N'¦AB@)) ȶr藾1Z`UkHUJhkd+C ê_r_)v_E1 Q;IKRf6bc`(:&lYB.(J)c ?.0leή=HflG(zDca d ~ PX[Om^l\8p3(yhh`uh= $N8B,DjGM*GgŴRd -MPCN g,%$ȠpVrMͦZfT(dDPw)gs Ic@`NmO #*1$=@Yx1YŸ2˷1өЩPSw"4JyژL>OĉN4%Yڋ'q3{91c>k-QdR̎r6s*lH (1;Y6:TTLXs/j >S[5q7rfgͼ<涑ZӠ1 'roh<5bi?R8& 8NlJŽ18oF){nH73R+ x0Y #}߃|Wn X_@ĺH,C]=aڜLُ32qRR+fP]2W^ʋ/\n#RPjGVuy, Q=k2&aPM,1k\63yͳ-Dd?&M'wAཊ̑ WWWqaqd@dac:ke;jS `H1zQX..vl8ct4,>L3)bnAfeeƸ@BefU5|r3!!H&S2KjE#|+3s6qr^Jus:ĚY;IGZ  VMvm .M~|xj{g׍1VȪp8ޝ<=rf@@17q0_0f=)NVd@Hpw1v۲B/IB[6M*)}A[ c,eAid]$/]xpSy ~A&PA.U)4)Ui0 ŕ}h̫̙3d^R8W`ƒ#i"8vyĢ+%4]3rw3f~hdc*{;^F/8~=̩61A9)fcʞ a;`V]MQBIS̒s(]!*޴aMrʉf$}VFSuޒ:2}f (ܧh,u&/mg/_\:<ʣ0H=0slќ{²aQ r'BMBeK/W)5O aNi+4Cs`y&?bRz/2U5A2")1p@`g E5&JfM_}?c|2}ŋ~6e(%fT#;fp[ۂkQګխ t)r=ohvp4r)[:1|H *}*nY3'2Fv c 6`|j3}Nh3y?u}\$IayC?1CHy=eׁt)j;iZr!SC "/*-dbtjLFS{cnUMgbNz@pn띤0x:]Nf/SP61̈́mZN S#^23^__ (w,^XU4QcN %jIAZK}nܸ?w+++BnކY e \GsGd'iY(o&t¹B?l2Tf7|@k.%M͛3gRjmee%^]]}nĄ3oE ~wc֡j!{];=c=+ *{D;M e]&Kq/#c5Y]]5O9zjc6 Y/2/'UDI/xĘH'd] !: )hźֈS TNT1[i燐$2/s &aq `Bd0`?0hAnn~^,2=@S 0_szM7fqOդI t"ޠdNޘ".JF+l85r$I$*tӵ(;0ٺ7@GdAjpex_ AM!B`lЬn:d8LN(:3f $i*Rޕq1W)/ (@[Q P00~?M\sssw}fvVVV OK!![Z🥯;?|wbԣU}0Z 1H[ `1vi&~В?zRkHay17C E 9cRJ S__C)M/F5>DBY\MH U0d^}GcHJ{sڟmR%IƗh찛?'<:νì$ɂ=g\w6.&pNURi FBm (ڟ=8.?y7mȎ kcNR<͵[zHnQΗ'S2*J4>mesuwc'2s3]mLTcUmSg@j˺ASl~q ;眧BYL2ڵ2\'IԘ(cOz/|;j&Baq2Yؠ p8X5×ȗ0 LT?S>!q>x:uCA&c }UI1mRPA'8e,f Yg9R#ߘ*6ft&$s|3g_}.=qW;T4lěAtM2eu߱@t ;ֿܻiStЄZA2Pg&@M9x6>:-N"]k.ڗ\I@´l Yck;:|K@;!g݈I RKObήݠ(e*RRƘG'uYu# 25 ~[m,0> f3B#7#.\K񎎩F\W @NU0W"yX0]r!R2%!$4U0 Xc'2S-T3&#Zir)UfO;,hϨ K:*!3]@0-no]×ǹw}߿RGkiqƘs/Yپ =֓o#fCeF3>qM|#H: 8BBn`Wfc,$x!#M@eT+5.0B:BG8[x~> #KK˷{?{7.UP@F)"p3)V)aQgB|}/. P&S2 וDH*i4yqVgτmycv^u~FSB:!6tR֪:A)mB.rnj< llCvţspSJ?ɂ[2x%Zs$BG\󤲹yPLY !ss8sϞ(s{ڍeA).  YJ)E|Tty^oE423e"QiVly'f [@BCLu+^˷&b;m -u 1=UTI2O:PZQj4Sr?{iwi)T'cg6RH̄9)թ p,/-֤4a#.-x/YaHJLy%IZ(ܦ$CGptټ [.Ԧ(w0UTe9 F̶Mdb`Dmt ߘ} 8;okkϟ?wsdIS5"P^|ufݙ@GcRJI)dYߴZשּׁuXg񈣩j,~òҍ2LVe RRv<-`?ph9UEe"t(u5cyȕ16OLLג*Y4(.t-Tc>4l[q\2CFG&66!&!G ٬0= NPhk2! 8c-l4I!6z "8/.Qޟ 0yT V/ûT]7kPJ3p#΋ 2bIeV9+-@U1eOrjuFT_}ayQҖ_eVZ3rϸq'N\yHn_rԾ)A%5jzKR\Ae,E&7> +NPaBBR L$#'"q30GXkz:Z"41`>~w/~'|y0/2k4w(Ns\ceY728P}i!DMdל\u?տ_-..`eee8% )>2X[vĚT93"%1O9]Mv܆Q*UeTQQI]Td5!9c塗RY| յY 2N`M)Rctdή$I!\|Y&LMZ5t,ā" PLC J{GYlU@O/MĤH!3@aD>w.eDaDl4M㜿 G֓o`)˲x>T&Zo@\i 1 d[T&aB1\5 zxܳ^~9|%!7ϥ]"c/}hp;??|F#sq61)eNz轔(@ThndEB!cMT 0@jHHBF \A@kd&44a|}~z]xw;R*mudf .ip_ҭU8{}bC7xQ=ś1@| MV}Yeɸ'> _[_m\O6⏤oqb-T4 !9qgaVWWg}nYj#S}0F<1{YSmL2Wahӛ_o.ƹh;Jh,2d T;aE^M&9$2hC*6w+RQUqpQl[ ouB[*ۙv&rKRӽf" ܐהuIʊk@]?kocaLr+W^J9vWK@gzݰ2ޱrzBIy奅pm}SRٙ@] |—4LSԲ\m6ٳ!uZq.)L)%&% ?TP>a/4t&a /7?A^ϝ;J-;dpemloMJ!N!9@=u#QTuT LNyCoN‹/~Ϟ&hҗ!UeQ L2F c,2ҔbtYxր*$f$͢ՠ[mid='\XU]>!]^^yc'Z1W+_C؋Jh}ԘkՌj4^-=m>3XZw(>SEjS .*3RH\EvMKS^W(I׀;@ɕ|47i[~!_~wK5Zc`-5qx!Di]sfa[B0-44{k֞6,; l5W ,^J DvIijΟh?Yi2PF(e%Bc_8,-- ߥ^2p R*3:dFdI/6SW$LQ%d!e ]]]%N-v $319~֫[+ε.y@9`Kps(nM8]{ nӀ?_T5, LhAiB|~̠*Z \eArW~yX 詰*զ T`@|c;緷/yoPf"ϡV)+6'0 2q(^i~K< nj1-/- DYũP)4Ӡ5w\wU\ u#t#7GX)ڿ.0i=v/zU(-{7 :9Ј0yT !ގ6D(s "R@g\EiZ+AApXVהR5![]CgiMUaZ^=vJp޻@dj˗f 25qY+TO4JYQFh^1O"T6z/JnjOErL|P 1` @̑^^Z&)l\q/%w{ F vda7 ӂʹEX_ :ׁx&[ 2+!;,%֩"pwʬ &{"%рzn|'B.՟rCkgy% LVVF_2qdz*ecE4@ ƹH)rtdϰk d 2N{@C5G]T՞ec}Y>1Bo {N$]`Jqp덴hu-۷-cI2JVVVwӡȄƁJﵺ&E9փ0̦P7Zƿuggg_,[s}jeiUv }l2nP^dZ((ʛ/2:HtnntRJo̫no<;7pnpR 2P4S, ` Ywsn\ў$Vپh|/ֳQny Mr07/evhQF)6)!L?//_gwRqj͢ĮLXɾ~V6gؽZ.ﺹ\3F#L$[71̽vnWQs`n9 ͕RF ['ȷVWoy sf~y_2Rx`WڇwtF\9A!~ 0Mm;Y P6ֳBԂ߿V̜8!#R*w?\h^&2i]쓒bL^5`vb3ȘruǽB d'@$V=<׺/;@*F*lW3J(/ŻZ")f=WLtvҬu hVUuypvqmQ|osqplVsSQ6o+[(GYڈwg 4t|UR nkv߆w[I1N༼} !TJ9gpbYkQn/\L;Nh4~{0af(cts{6n7!dYxVdyT#(5979OLU^t`Y౷Xm!;Dmhm{osUKmg*.r@ Jmj v}q{a͛7r^#vJ{T}?QUR'UQGGx}hfkAw;5u^A{ͷV=qEK#°od@%fJ^Z+鴺l1Xa=RsnHr$ee1>򰠼~X{HLVCϙNuSW3 葅7oB)Ow8'ˣʙ'NxO=`<[ƍF6c-0Ͻ ȴZMI)(;?C:pLI$6 S&k=a_+U_0 n7{aKIټ%x]ߵV0fX?|rftxE)glOFEV6Zԡt:Na#@fYfR\8E+hE2hBm4A=h6#X)M6I ![19h nFp6 zKh,ُhW5+xB9-uHs|ωd4=A:sNhGSZ垖ZNUzH7$pBIֵٹ8_-E |}hO ܂V[Zl y(33Dz5 sn֞oBD`(dnXQ&4/~?, խf3F( kKtgcŸm#YV 2nWt;Bw0{fu%x'b37R7?WqJA[A&o|QƇvo?3RJٶ#$>},|9D7b8b=KvM73cm1+j!rVkEk̸K{p ,q3dFKڭ=! qn5 YXHڃc!hrP{nnv}=%1^h8zInb?e[!cĕtԔθL 0?Cgf}uߴۖ>{52!&,Mk?#mߎT0г]y=YfMBdŔm. uJvLL^ kL45)w`S壽k[6 ޵gTCHHF!3-l6vw! (4>:c>>=3"u!~  wi,.vu"+p Fke1M]ێUgVnImTk͍1GYB)%Fpn:R8N"8r{MB= o\}}*X^ZF]@S['^7[8 1&ě IO16Ȳ\}Fh_ i5r[2BXʃBK  d o-8:{i/^γa RJh#Hx4q^'bDJz.[rgl#|AIu’.3)rζ(- scdj!D⫾C7i6l<#^'fGL(Ra@)pzq+mH?KeY7IR? S!r&fZkz B#9 xu'q9}ƺk z z\t Z礔QR=cB(L`@{OD(=cq'TR~Ti}MJ)8e1Rj^)QZ76>q15>mB*FYMcEH6nf6)܇.iY5Ȕg ۄulڛj36OlQ6`YD1C+Vg6w5c޵o{*fأmFwڷ lY~&m鸨\vV0~+#Ch,ZBϴZ-0?w)_ f|@m yN ܜ8Xm{vb9M{gShak6ѹf;qA^a{@v}f_}|>}y>?˽]gd{_4Hv1N3T޶>!h{vŕ]r_?GZ ♷6JhȞ][ƳS[}m_:l c~Z p{H}G{^[8 bK ؾAnk$IZZk^-]LZ]qޠkMyHw5kiu|@KQe#ࡍS]{,`*QN۲x [`Z,\9֚{-.m*{M3ܪ<ݳNer;$uN+{:=yԁAfJ\~rBO?fJ6T^bUOV6LAl#aHu% T9JSZr)?#|^I}0-BC)<B2nB9oUJV#7aQ6ߏ)A2JW_ϖ#{oum*q=JЩov*hyܟsd/qw}*?u1V,N[i s5fImF~%+})~x}x>uݾsOc %J4p8,---bZSIܩN@~kr]wI__!|>l޼Y-[&o)wNS-l6{/-t[\wl^gkTL|?J+A|d ~l/M J?o]~s]L6Vb̀ qx6s>">Nz}Y=J$i}~Ç +Š \ YfQSSC$a֭ק5k~ɳ~™.9t7D#Ȁ{I0Z*---v[j*t]'/%oHwaɒ%477?S 7ѣG9טyMThOe[ǃ"¡C3gNy@qǏSXXg޽bXpQ\\Lvv6AQQN9) >b11MSN:%KccB!G+X? X,&]]]+aXDF 4] 9 ׯ4eoYB/ .СCr!( U/oj"iYP8>"z>&0.>#//ӧBkk+6l6=zV0"(D"{=*++G=n%%q+̓_6n5\Cqq16K.0 ,ˈpqN8AWWPhҥS]]e׮]#oBMdʕ3a eϞ=i&ٶm sΕE8r *XA:|<ĬnTo*G}t( m6>}KNN#ZN,֊f@ I@@^TTT%KL8BhAdmAAx t:'mNGGMMM|>Ea]\H4N<ɖ-[h4tBxe7 kgF9p@6jjjXb7nI D~{ט!rD@mj(o]"ȈalCCܹ3#| D>):TXX(>]w=7p]31}F/΂;K9x _aIoo/nb%6Ў劔n9 &JM?rwde4P v+q:|>D+Q\:A$ '1N)wBKOHή 'jlvRd167Я`5sqy(si{ |A8 P ]Џ`Nl;fǮ4[0fk>h/ Yw}:4-u<̙38{hϘ p@y58칉ig_P"tMVl^Q& T7N'#qglذX,$:~t .7φ5J @캢Za~\n]H; J1;חV0 vލcFJ1詳QQ=/  AI I;>2n,CK@bޣa̜9V: 4GR-Ǜ_Wl7|36 UU1 p8L{{;rP+j%QU@\`X0H%Gʄ@?=~l."Ah'8zTLu\ :#YLwf}DD݋֋&%^I2*u¼ A_y@pz4b!h=Nzl:GU/88hu΃ ㆜pd͖UUO ™N< _Za*y>lMX,1qN$Q|翟ѹSgo%b32Kg⬶DAxzKK=-g~V6 .73 {"7Un $jolL#J(:[ye??XyQkfxabKGD pHYs  tIME : gAtEXtCommentCreated with The GIMPd%n IDATx}y\W}w[zo$Kfț1X"[^1pBf2!2 s’0La!ı"Y%־;۪[r~>TWu]~֯kZ֯kZ֯kZ֯kIȿ#34TN;r2wD\|13[9,dU\Q>Qn<JڳחU3ܟ=/2u<*ѽ|e@ &`[G-Wl&29}=ؒyd:^M~݊ dB{;0-c%,_ qFeM=O4/Nmp|0u \oB.H^AO^,dE\_T; ,,v%EYҨɦ/='wվrSPU \t_ZB[wv l==_s'X>:Vr}Uu %vzc{ρ;f rx*A&C?t?*^րR?H/u̷ (E&Rk"100W_|9K'G~G'K962EL g92}/"@A_kA_`ߡ oesG2`iܩU- o@/ W[2Q+ < ]xgaYxyo Z:'R_m"|ǩn|O4m7Wg<ܧ~q .8^ٳSKЁLw=s=\K.θt }(=gVa{ @P s=DNOQKf]Yp $$;\ݔ-- hbX|*hB6';|eu kZ\",|R ,lc@I]h{rf&@ 9WNM>۲S` t.#K:O _hm?|YR\IKw~@̌8rej10zpӥO?uW+e_`+g.p)̧i,ө$g Z%PUrFV?~f;ZOkƏ?2zȉCoE?y-<1oS<'#~ZLJ=OCʥQk5wvՉf^[~mxwJǷzO:v4llY>>kKbW?8:N1 0f r;ؚ:f>%.j`H|,IwSX: 9woC6Ճ[p1`sbj\x uM3[o]V u>odVZ)ߠdٍk% 03NE,?.שd^'0}xG|*ik7u-$ () ֠:تw{h3Ƕ>!r 3/5N3m o}ϩcyY*Œ2)5' 7.l#)3Ud0%+&xW,=zSWc@sA31kٮ/| ˟x;qQc)b<=pP~^ TIN`JW!#7@2 I]P3*8lo Kp`sYl0A358XZ>%X|d~I=2 _H n ztw kN$`BoX.-S\⷟Jy(%y  J$eD;IRگpp1r0pLsϋZ1 25-߲քnpn(}`*KXtLzGDkgM@;},@(.k߿k鷇`o{9#7B\Y>w}wA&Dﻱ/:5" JJO;-=y)c*),D/׃]@ ۩ʀ$܄ ږX,q wI^/5]+8,CXJ@9pTs]DʵJ?ѝk" k/APɬV rf _i(= K!韘 0p䉦/cl.OQ P' F=BYbG:柇hey* l:OEaɎ]Ibp ˊ$7-Wc~I0Q1( $/v|?!xǍb"Pg9!ڦhW[Lt)E-II`H_~tS rGT~׆/z흍EӣGq'>KHr4 >m}':LQk ^oX߶m Iti!Jn0Z3PNZxl㻟.A88_"ke8v&)w_U*TJM~%UF^aӏN @R0?Hϖ.z=|7)A4n@?'D Y$84*2L-ߓބt@r`5]B0jlQU}2 ¢O_5G')mh\.ΘE_~seoz)^Cj_ ɿݓ!Bv{EpN'|\F{ppE/0kSrFEjr͟L񋲁)yp$5n^zV"'pV.b9q'V(L$1jg$x Qxb4gN4i'W*sţݔ,/_pRӦ/zŨ^`%(@t"O m*1+ŏlFhYeԿU5;7'u @B]_wx<"5pp̢QT]=#@u:\Iz)E3Y?A O2k4Jd2BҴU+E\?O10}'RGqha(FjwFj eQ e1ߟpX uVlV8e l\d#y9b@٬`ieK:g ,ZRaBCD(Ԙڬkz@S\o1Lvv.쓶o͍z}44t`vaNfLڤ~w0}ǂ<  fhHaܓ{YD/VX^S'\ [ KBw$Y.cjVdg4:{uit(2O|dpЂmGtIe(egrߛ7\reu}lϞAW޾hKiԐL \Pƽ\?tȎ豈xr4$Sw qrY8,ƏqdrciZk*Lt6FohPn8om^e7\Sԯz޳cB0YmNj82˸J<ѭ!szo =ݲ+/>?ЫpV]տV7*4k⥹u)L>>eN3}7hYx˿u>z-G_7ڞwۈ{Fѫ/ 8: ,I`8bH2Kf񔪞sJ]ӿ?W`>o~NyѨ(ĊZu`Όn-qijbF>\Մ),%4Lͻvwϔg^J{o `P |>7;kvn~*f۽AE}\ꐗn VEߖ 2 }~Lm8JsR OKUV '& |Zo6~[6]e.ei$!וv0d\wM/j&LaG,t𙿼`4 1.E _9Rۼ_GnBiօ֯o A3!${R+~bHQ \U$6fǵ5f޼z/7m2S[z|Hq8.?q"%}`d0,n|H45+_g7 MǷ Gao;/ksq'&sn!R??%MqCEI &[Q{d\`ց|A dUvX.FBV/`P,#v~o˿}Do3u!`*Ojf<w_P`6}ہx<NXiG$4}mjݶ]/4ZW8Z+[zԟ!{ ִ.1aM7/ʻ{go>㿹)T C@K78&ljrO+81T 2?+]d28g"ߊ9mg[.U3*!U,x6ov@كJ $ۡ"PvMWuQzS/|}# CP @ j)mtUM}/B-`,}*ӿ`5茮,lPINR* IH @V2!䁶,vwGmSAnwpޅm"b^k_Z+y ۛ$<QtO:uDb3HBQWWZ*(99Ș/p;x.N}M1K 0G7E}~{ |V Ԧ>V[j H2{[y!/^ٽB!IϜvDi-P{wTDNut;A@9^Wgw4Q_/hH[6_yK__}2 &I@OH$N*_~q酟BG9eC"jiD蟃;tVޏQV)url%rBRâ m_J'oN8{qu2DXq(7}r(l@+8[wNA눪IJ~۸RtBqZ`”'-!ŧsYˮjXwg-JC( ! ?Ų/ͿZLxE*z M*xan5/~ 8ˣn :nPIn6ς/&qp^| Ggsp u֞Ydإo4G8o 咋? @4Texd/S@u@z,NsJQ~ g9dф[o Q`:Afx@"K]sv?g\us}9=5 &h6\W=*~߽po5w87K>W7(@)Sot =2P),ـmrMzIGhAq:%LUg4'TKZ J컭`kC&2QYRʗNHr"?L395Ыݴ7䳕/{ۿ?ku Av `4goޖ;d ?-d8}j;E$Jf$s溌e3yިU²MkEwRSm#P/-\.,|M1vyNchW 2) T ]*ސY睨yrefDI_9УtuE)]=-$t8b65?C ›ĭz=7 T؏697SlMM&hpBLPKRUYGnʟ8Ҥ e ^*t[ŎMH]@`Pc":}C-#4[dB8(KYk[o:g&^%NW:)#(\GN# E2:s림eB.UT.wɼ+4v(ox#dut (FqxKCDm>s"c,&3{G =)XvOl؉I_L( ]l*Å]>޽=7]ܹcqHvuOƹNs8M`9HEl `]KnJ9;my=!u"~Xcvd oEIDAT~= XW$ܗQC羑D=8jZ9S+.S2CW@ͨU$ፗU]ЛSw*ۭɝYɫ `T$)_*i^};?Pɟ$:E LmnRJ'y7})PI=@6CQd(naԳD0X0m"*i,t:x'E/'E6/ˣj OJuqpt~f( / =OcV  J)L~$ DA^# j8۾8!)HPd珹SBrA27%_Ky!?$NLЩgH !Lٲ Miߝ?K*N؂;X4$a6  穧1wT4N%ښ0(]!GͿHx'ql?[8X ~PXo`>:ĕb13kPc햯(ajM`fgl_yk$iI ENo!| pfԟDd@"aPu^zN#n?];8:`$s:LZ5H$5u  D!!罗ņ< I>UolC"~|wGBIS>lkXsp3e\"ǟiNM  递I"n?y{/.{}dsjwҕygx\` h-pUb1 ;D7Ý̑@eT B#mΦ-ARО A'2zT |jB0u*wnfxxG>ZH'0cN3 $ u C0'^NYJ%*Ii&#ZUGQjR=#A[??2nt+%2Aa(@L]ʿG!04L"GOX\r]@_4'@Y{)?"㢿LHG`4g߸`k.c_X'/r˓b 4r U Ӗ*'hbVeӿ?TI[m5OW<+*}T!'Dp?3l})8rSL̗(Zf>gU $\RnISAIN${<r!@*1pT {:}mpJځ`C\R?'ɿn $fXAQmP44yޯU\Ujxn*+/W#"tzX[9D ɨ4ٺw 0[ptVn:@5> #oLå*3x$1WSYv_d :+e' @ upF,85o`0mpWV:+Qa(N1E&3E U?zNKQwI *_RXR75@B`b#Q4΋Ӷ.6]I?]򢏨w9R, $A+ `BpjB+jȿ#ʵ1/E? ~=)G,\ &7]ԟ<Q,ܼac&zh_4@W =K7`A;XGrB3U)iUBɦ,)؂Gb`^0c,>)VL`i1S{*042瞬 4Z+wX\w;#YH7lB"W`hg﮻=:"0߮hobL+qpaBȪ53+zVg1$/~fBBd)g\& #7XoR# Ȁ,q dl%:hqԚexpC0u^?VsΗ54IEꟕ ϒkEΘkp?Hߛw0an9 :  q@ އaYPac=ۜȦsȘg.0!' 0Hp] og[oν?4dZ Sn q01[:a)bEk/ oj0Ф\"JnV!qB)xNaX3DT^+w6"^- A$cClݡG؈{ F $JA)$I#&~^pAc]_!]s6%itZ PQXآu|}O M㎚6P?`rw9"KAd׈gM-< g;qfKYl3{j15 ެ!_ڼﺡܹw0߼`dw4˔@8d@,G I mg64| )rLjMe ^e^8N>s>hZ5p _}]k "Txt_Ilh(i8 87H{p ̵`&-%EZs0.єs/ǧ%k>pwյESż F2[JyvkzMYɣG6@.K.u)8dH TR;L8hj KUGfn;˨[o9:K?~5y[ފ/h-wMPsۈqG *2cQ-%␬ {ެWk;i{k7q=g;hɕYf_R!!O#zMTBX%C_L&ۋ@RB<$R"'ǁ뺰, Ba1~RRS)Mj5PJA QzرL&f.;`vBJB({DRJp.j CVc,{W^y^>f3yݝ2&z]T }s]󘜜i8tP8轤؀mۨV {0zzz?pWWS 4ĎCOO>sA( m'NZ#ݾ>ZMo8!ƍX]]mڇaH>Q*UcPzb<<^1~juRJ!ۙAw>J}fVH&`5 B(صkJR`e'߸9G֞@~e1 à` ֬~#%BJH BHp.!\H8WQ,'o 9<%q?]4P , |^X,2e1&LdP&Lb0:T JHH.!< pOLN'릍{󏱱nR%%TO!i::zBJ B%I!mQPQe@J(H $b$:.R5,JH(!J(]= BI@{<j?*vڅr @#i MB)@J)PTBP#!u*PA@*ѲdhߔȴD՝ ۖnNǛXCR!A(R@8M)RBpFF;1gqR(e\(9Ǿ}pJ)\t M:E럀Z8%ik{6s CT` #ԓGa >+r ǩ R;tuuq$MC2iRъ*ch\M@ߛs!DPGw1 PJA)m (mTHs_)TBE}C)(( m\D|B, | FoU'0(dMN0H6+HgltdBa4C",Q32fT]+uG*t~ZCJR\.Z$(%#Hmp|Į)%Z!B#D}Zqx"HD;6(ׇt:J< zx<ގ J@oT O7euG` U,m©z!d ,BpdkaaJEW.64>C+_.Ƃ<(T h3 ~*8\ :[ K&'T `~Vܨu8iDc ^\'G<|sFN}tOpJɰRled.nc F T\.emVnjM tۿ6!$<.:jULUHFjM`͚hHkhS'Au9:zP J00Q L"q! nG@46@s?}3`u3 ^٘ wP45"Vg  !H$ -//eJ`: pQH" J2R; Rh]a]~{- ѢGkZW[-Ь-FIc3X|&4PǘQج(hg5CZ:(; &x78GhЭ.7c_؋_&R5J=Aر;=ċ"r?j pj)(Gccc?i!&޹swbb"`C& L+8"`Zp #  ,DQ @/GNAǦd!lYи?]!6>@lIENDB`aqemu-0.9.2/resources/icons/oxygen/000077500000000000000000000000001272330227200172705ustar00rootroot00000000000000aqemu-0.9.2/resources/icons/oxygen/about.png000066400000000000000000000041101272330227200211040ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWkPnkꘐK$.bc4NZFM;x)&FjFF+E$/iM[)^X Ba/.f $%"Lc>6O3~;}λ0&M'L)0Os߹"w L 8f2j;߿A>y~:ш|Ov]] 9$}}}sSΘ OT*JKK=Çq=ܾ}]]]p8 s5\K2NO|Bpp1rd===1fip-p/[(r)4Ν;=”iATSш ؔ\1:aE?[+ ![nP.{$@_ɩ\x l'* G :p\@֎ۑgCr fM(džZCeZ[(_9ȚiL+yŎnmGT1/t&dFtvTÛWq ʢL^G=+FQˀh:,5c͉:҉Wo#<-1chh9VԈΙx5@"AY;C}2u f_X/:n42Vx٥lL5" `2,m ʤbP0V.9Ӈbm=cm؜ލva9xoϵiь?_ǝ?[qUXu:V&\]MG \1D}+bcasqnAg?t'ciX`  ^-}4RwW çՠsIENDB`aqemu-0.9.2/resources/icons/oxygen/add.png000066400000000000000000000026531272330227200205340ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<(IDATxŗ,Ix6.ֶX; ֶm}2{"zW2|L13J o<ڋ6\r__xrZgA;y/M0a#='>}֖Qr~{ny7 Gmigzi*ddh(:վ7.>c~l.`{t盷~_1?<]\+Kadޭ@* D)`kbUFEđ ҚZbB`b$Ue=Htp j"}\#)"@xC(bW=5=pozxw};9u8ÛUՔ"U}b5Gͻ-d{Bɂ#kx]}k/}3C ]./rp>qBVYo } jKpuO=̭cx'Ch&--cRQāSAK 3X@5?S(|N/d= hB8Gw9!8BYepFX_Fۇ2|e}E*1̻ F #'] gWV/=޿  rfRzN =yj8NqZr'TRK ^oʹ+K$%֭z7 ÊwŊ iP ЁTt)E{edۣb8aRk좋={eTs9]@hu\ Y٬QkK{dbyWq~ :Ab`ٞǍ=[;4%L6_=p^90ۮ\'FG*DM*EH+FS,GF-Q/KJ4X6RS9[;Y\<[~=Yu?ZmJfJiOmOoPlPnRmRoSp{SpSpTnTrVsVtVtWsXsXxYsZw[w[y[{\x]y]{^x^x^z^z^~_|_|`|`}`}a}a~b}b}b~b~bbbbc~cd{ddeeeffffggghhhhhijjjkklllllmmnnopqqrruuvwyzz{{|||||~~~˄؋•ŚΛ΢Τإبٱ `QtRNS +257qnH38`i>Oz,/V$e`Ŋӥ" U! }ʡSn>PڬfwoL~^-۟m`_0?XK1Y txywOި16>x6&/ 90|"4`^wN# Iȸt]W*(P@x߹ & =-Z%|dƫY)rLX4F!L5ˌ *sLq٘>DVAdvz|%Gk+ _w7էS^£Lú);Jx'p"6Yq93cAF% d B>Q~Sj W`pyG/N̑4-S>gWva4ʊ!V%pi721#ܰFJ)v`!,mARQ! ZAL@5Ac+yuɕ2\.\Pu|QhF /L]H $@APma`R$b; f]̬W"#ẖ&RcmuUFh0eNP*XaLE0"ʯ]D["'JtVr4۱ $B(%""U|?aBBCK2my\.D8 PıSSSse8pϑBT@+sss׿ d^O[cV_Y1*cDwww9 <7>>ڡ|F'i\ZZB433 ӮXoWP @\.~8FpoBE~Ho޸ʮ>; 怈P߅@C< 8z"ǒZTy?Or,=&CSG⅓\ut ЄJ B5 Qa9f%ܳy_#bbN8_SN,m@\ϊFQu|WohM Fx@bhR ]VkF*;T ?"`iӬF>uxs]lnw=5\׮|˟Fz0Z> %^~(éa QCz l9s:G0qHvVx5ᵿNJvrOiph4Ъ@4 < ."dlVݬT*F?Xqc-`l1Oll$ 1 T*?e ER͖\)͝ ʆHMEVaND8 A|2iĞBI=_`.Qx n.ڰ0> hp'+`%BNjRQz{S-ltDEEE{޵[zӦZ#9IӒ"1VW4ց2)C OT]]zADCA1K=߿׏p6d22L!555TUUEqqq1n؇5ᬄRB^j2XmT&Дa4қH#.:)7NF#7/)?YSa j"Mo'ߘr#^MJc34&^zދ4Sqxqy$DrU| _5:rSjj*eddP&BP /_9rk<r(0nwdb-zhoh{`Mb]*U111k렕 $CCT3(jԦS84?%s'ulBS=430j2glv tZ&dZM*>^(P<%FqdP~_;te8jNiS8zt+.D[.3׾[?;`{RZW Â__yXB7t)q5'$Й~} mp!nIjM_!4\?ݽg#"52qfi0Rf uSi;B~:pBQC&0`H9xFptT M ӁRJzԉe;as*;ƘiꀡeDڵ6!@^!RJDJ ϡ:Fـ ? ݴ\OC@i LÙfD+X 8dV?Ï ΎnC$瀣@#^6>uhB&lSj*nvchu 1c Y?TrFpb`=Xñ%[p"*ܹjkB@yG(9:L_X$yNbE|5C!EUlE8'U0n8@1AfMbwÁPbK`L7E)Ô7b8\m,JQXdkWs Uq@iϹz_F2q&S_^F_BDwsyj縚g4L1 cD'$`H1Z"97P4Wr\͉Qm 2L׀'IENDB`aqemu-0.9.2/resources/icons/oxygen/camera-photo.png000066400000000000000000000022561272330227200223620ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE\\\lll斖yyy]]]ccc##7%%@///HHHIIINNYSUgggiiinnopppqqqqqurrrssstttuuuvvvwwwyyyzzz{{{|||}}}~~~~%tRNS/=CYll{|ȢIDATxϵ1dr5#/< oAC;~ɰjlB$e߰NX*=v . Zg\0Ng-z%6|]A^5+XC[mϊ!SDtu!nӊULA.H|ŽpVlY$ dTX&sx3g&77.ꝵ*Y*SRmHzoR1[1H]K%UyEFbrwZrԼjt>, y#h" 6-mCW*78>$K[6NܝE g=,"xC!GxӜZ#6xl{ C{4K9+zvR}},vcmw⌅.  垨(=A}i +WEPx}PԷ&tYTC IENDB`aqemu-0.9.2/resources/icons/oxygen/cancel.png000066400000000000000000000042371272330227200212310ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs^tIME (x,IDATx՗kl[9;v8vnBӥkM*QFWtih4nӐ&}&1&m(c+m)Z'4t6$M\\v|n;= QS5\ĤiG-yϣhu O4Ųfӝ?{{gg >\| ?vٳzz~/:i*p?aDobD7oX Ũ#94hD(誊IsH!zeϞ+ka¦50QgGqr9[G߻`IWyMU Q }|Z/oX5bZu!z 0v씩3N^"w|$A~`e^߷Zx†K50KN Sywّz0kH |a-PDcZp dGUx&,c՗ZwW.;`iހKDoC؟Hy|wY 6.VIE>ùe&)XzaҊp3oVH݊wӰE(|:3B8\ɩ3Uy&-YB<| ;%n/. 4+'ct o6~=t(A>W0&.J (n,Y%Lt~]8Be)$!n7\>7tꀯTeD*Le2J5Cfu"5ʌƤI+6MgV27/c_T^+H@3T,$F-%dZxR G>藛7=Ҿi9jt6Tzrd) @5=?vWjcr1Q@[Mib( o, xYeE xMmrɰHv=@G h[ʽ w9R8Ͼxj:%ޠ\^nZ4yeD*[*,8!.LKDZ-|k J O.+Fdx+F 'O@"m𯁡\֏1F }Y }6}K'쮪Ѩ @vKL 1_蓚x.+@\[eZhI X{*+n4,ɜXr68|$R EIކs+_j~fEяnLQ쪝NDy I -HVGP- r RypE-3!6Ѱ`M/ޮ2x- -p1p`,lds&e{F<˦Y MJ!noW=zqy1x3i  GiZߚ5AEz$ , eѣ̌/K6\pClBHq r3@rj#oa:ϣIENDB`aqemu-0.9.2/resources/icons/oxygen/cdrom.png000066400000000000000000000043041272330227200211030ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<AIDATxWkUW^{}΋iQ)-NRLL! " JKuBMX E4U[)):3<Ν:~{[fdR:{o9BkMϡ6Ǯ]T&ٔX|ܲTk$bI%)uruSlnOw?6Ƈ)ɮrjjXbӤd$ {)Eg|"pfU>#-hH<#)@@0j2 Xx>߸q-uɲE?M`۶mr'{+VD#T&4( T 2<|__<7߾[S Fpy_b$LSS6 IkAD@n1yFĝwu}iڋΟZ,`D UIn@ĐXiIL ABr|*>ukƸҔ% ɕ-YU &iB ŅBD7k׋gF9wvZ8wNW2$ [vHtYMDUBP  (<:vȲ{GQO0Q.gNϜ?xC&Ra%x@ԒN?R%8[h`.4r5"c"Q&WhpY"JC-р5b1šܹwKx8G~YT(,IrdMyfe0ݒFvF26lذ.T*uY+~9Kȿ%8K!ڈ($RR՛ {^$p[TkDV*;vNwvfYV}Fە ReC0IlJ: @1;^tL]Tŋkq碑_HhX<_V|cŭd:$T#14D_rGFFla<8Nsd.: &EJv)SL7@`:pDr uyGtz X6VĈmۦϭ1O`\(D2UB4@MWiM3N9ws{D4a$S$\'ͳ? "ny{wģ Π*6!nL/ϝ?iZ# q XGqb;DRqxjh/q>;6G,΅l"  ^-B Eyt(_q?٧DTr{, |EcȄS6_rw_18<z0Tp<,XTΛSlhH4IZZT\"@V5/`6K#91QoFa'Fو&=r\kDaIr\ADHj$|߼ƜԎ{~'\*8([@B.fٕ.ԸFH]йg{%k^iG oa j d2%ࢶHq=o^(0ӽzVZ7{g<>hQP@4|ϜO}k cLV1 y`Ձ?~)9a?_ czc i\(j-*û^H¶:uׯg3Ƈ~ Ϟ3agc]wwRc9DŽHbsܞoDe.zݟ]ӏ.]TFB@Sp;w/ۻ͓os;_Fpd{77l9d:57bL9\)_(Dz.^92w&\%"|oiXW7x2aoER۩IENDB`aqemu-0.9.2/resources/icons/oxygen/clock.png000066400000000000000000000036271272330227200211010ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYs B(xtIMEGnbKGDIDATxgM 7^okv=mڶm|w251nr/WuϩsQ'~kgpy6::ɅKkkkcښ,/-‚qwa3H C2;=%=Xog~kX>8^^>nknUbc$88Hܹs-![pH]X"I,-+ukK%2*RD\,??_S.\ /yy QTA,bbߕ.In,"#]]]211!277'SSSy} 1ELb??ع+X Isy繮Nzzz@233v||\Du4eB,b()ISoeA& >;;yoLOO@`ddĤGS%H}3S ƽK_'fC__Y' ` F R% XVkmi魮r%## HiIl"`Onݒ!SMMMl:` 0%T0rHpjHKHHVT0 Lǚ.144䦧KRR# AVWW@_P|x@ee\t uXSlܽ{466EF 9ʊ?HL+3{8%kQp@;wȾ},0/}[宱!/ ءC5MB7eee'%}!fuuk`;!e;d=*;v BG5Z@ K46`; tɓ'MB9mBy c"`u`4p(߾}QP۹v7Ο"?S.(/)t6JFb¸tS^PH&3uf8p@R t6Zĩ?TUJ \1i!;6`IX'C*w{b >(x-9sNO]oN~E"&pdw?.mnG{>|4277W|jqkL;{Ȍ7-͝A b؏Yo~==+*;'9NaQQQZLimHͷDLLx<SC9~hhPA,b/t5Nk wva(c|>#5=-++o$mooZ\\жtgfeAG5z2\};ְ=% >޿e\[8XZ8ޤ?L:C[{8Ȥ'z}&ܱԵtl􍜝EB~\CJRBI )%JT{R;!%a1?FUM@ʏ]@fuqW&m׶WGmmʀBTBLLReBr\O `|KLW_5OR7K4!$~ނJRH0B@`IIS;W43]'y5tףiFYFa  $R@U@*}(Ii uRQ:W52;WXrq:h.>/TX#.)(<dT0*P8=zyWW˓hLxOSc 5a~e - $'o7P;''m <)͌E#mˁf%XZqGr.ZhZ.TGz=or>ύ[kD G%k oݳ'? wtbKu5-PC!zs._><!߱??T?>&gG=yy߷e|,E8X508<<_~gyS}}CcwzK˩9y:^|c\.`'FTeLzh' O|d%W|{bj*4?@o4V"1}HT73YtL,t/)ym9x7Kil YvD׆l3\;}}ws6W' +`RY*9W~|rC.0 q}( W=1,PG.Mwu9ǖfH&3d3Ea? P]uzkkh ƹ&p[} BH|^ Dҋ6_eGF9@sOFFDǒɸf}Oa@8Zv.^f0<!QO"+;;!!(,8ݺzTP8w)rvv3Ç%b=\\(!\;q%RZ5?ώTJdh<TL*y]Ϟ haǹptrč7@ܿuh;Y+ZZZ!]$;qn%r3/אg xy{d۶o3܂r:d-0Ri'O@sss{Dykh2S #*j׮]NIIMtk=̟?7N>4<<f& 0cGسgO===ljyjǖ3KB$ ].6AQ(C>MMmP_JkuHl05@jj(]FFFHnOc.NDtEC%d\4įS1D`l]SUQQQ=D2d+Mmҋ cQk i1X٧Lu`xK9Tכ=<<~:,]ҫ111=;wfM` 5NVڳ'C9\"j#H'.C7ZIY3ZPz u1e hB''3F(V)0;Y}m?FG6Y@uGNtٺu")]\"""@헗X \ILRVU۔1Y9LEԥ2dy^Y L͎"/'^v3{)}F}&侉zVRK$"ޠ\ ) \b}͊? ŵihh&vttܖX`wnf(h=i4⏲Lrrr4ߺu>(jN:8a[.$cgn1g9~ 'ݏUb_HE(Ū&Q,scG'}{~taa)aLe'!]1?lĜIENDB`aqemu-0.9.2/resources/icons/oxygen/connect.png000066400000000000000000000032171272330227200214320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATxWYLUW=NiSQR9Imbگw~%6VA)NLB@Pʤ8(ݵN^o.$&} s;{g%"O/L r{*6nAhhh[zzhHHH*|.^jշnnnSF`ӦMWYY)W^K.ipEczuuGk>>>G===W̙3gjlٲ .˗Fjkkƍ:>> CgΜR___)K ݻFRUU%Xےϟ?/ׯ_k׮NWv[n޼i Jww0$u-Joss)!u{irܹs nyccNHHOOsݻw7 ^ CŋFMMMԄSzk׮Z(]߽{ qGGIИ>|H р͛1Fmmm4h,=XzzjjڵkgL=m۶Hpdd /H`ID:{ӧ%11qMӡr$qqqHлN644İk0d$##É~R)Q|޽{ƣ(Y ~0"yff)iR"`"(nF#$Aexx -gsԩSQ?O0BΝ;=D ]VVuSBϳu```dNCz;lb.X!DIg2J$r3;vũY*Je_>KJJ@ϭ4@\Yb޿.**"18{2t\P*OV\WXX8’b[%h¢A6 $VN gt9s,ϙ=$0RIrrDDD .`4"T j̈́oF[ o/ S'k'oAnR< sc״/g1OhUPOF癹Vn*%UY/~m*E;8t;j˙E/}ޭ[/s4I{-fw?D=9X۾Űs. <uy}rZUլդ$ѵafS3tw;߯o}4k#''X25=:7,m˛-М55rl"6,3w|Aj Yr /d ~Ex?Qd|vgU>My2}q¼69cu~?An;daݚFC"霉<yn6TPlRkxE;d+cpdZuԾu %Pe/3:491cmKH"@I|],XtnF0o?Dsj7_~kR78ulĩlzZ<3#FL;#}_h'D[9UlUnϴwRÃKt\c6C#>|z,K{5FHDU@Dv(. B0Jd\ڷlzj,w~'YLYL5 K Z/a" -JՎ5}yc5xõ~CcuJ.:)"lA%\o9{tu_+ڴ [! (ұ_ Hiv5;N1Ot'txD2YF#@MBdW2s3-Y3Jq=KOus>qs?レ$6<# VL7I%9BLq =}<4@Z{N>(|j!be5rC)YIm<7Ju$Mo!ChoBHQ!esI%<ĢpLo V3wٷDZ7pWCfЬ#G]$6d bf#lEt;(d1aF1dƇn}>4 R ikeiH m"FFSMtPj'* iJIԾ\cdHm(2ޏd!A$!#K博uUOf9i<9>g&fo&hPFuzog)D\Ha  AJ\'M[iu$ihL1sG) H%^| ' Q/a54E a &YI1 Zun/?+0 P;z{젽QNAV%o[w =^{ 1 P¢Mly//3:h F :.Mq|TM 5}Glᑽl-џ 8~% bdrvt]+Œ"(30qHu59 IENDB`aqemu-0.9.2/resources/icons/oxygen/disconnect.png000066400000000000000000000023741272330227200221350ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<UPLTE5+MDUDZJ!vvvusq lFFF᭭.GGGwww7ʛ>rRuVx^'wYέm%ڑuuuӤJgi nq¾Ɍ Ԫ3(#ղ0֕"|5Ɨ "*$4TGtRNS  !#$%&'()))+,1233448:?ABDEEIMNOPUWX___dory{|}Oa+IDAT8c`ʧ) |$S@֎]`[*0s*04g#Mh=6 T]p֙wZ=sw cOtM[nuU3vwymjS6m;|_tƯضq WM^C.\~`ĥjӁ8T[oE+,|ժVG@靻h-K0\wy߼[7bo.>wҾꝱSieSf^4FNEihXפjKYEik20xWMq¦_͝ 0 7ǞRX9D%UT%D9XL"JZzfV6vV&F:Z\ ao>IENDB`aqemu-0.9.2/resources/icons/oxygen/document-save.png000066400000000000000000000023321272330227200225500ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<WIDATxVE6;LWuV]Fa[fؔWeffz Z>yd9y""iQq/НJIz]~8缋!౤ShnkE^/?Ç S>#7h~FF13I:S??  Kh5[[/f}P%G ߖ7{9Q^tk@PA_ yW VCz{{el_$ Qk @Ɏtj2'": 6P RI8 ͯ>@IFUy3":QS%x3c}g""l3+>\E=t@sQO ]B_Ev- CX N".ӂЇ<̙WbȶwS-k!K'; um_E&l4D/La [߲_xV=՟DV/2p|-8sj{_}!9XEQ#*kr@ =| >V|)^l,6){lk" Wc8 H8VZژ繽ﲀ*RDwO6k4P0ZylJGU@ g4ʋh Ily(riG^Z <3X ) zE('VD5gu100`؀%fYf"РڞX^^2F\t7vtv*t?ܳMPyY09+^clSP|3*-8+f~0)e!g& d|gkk 4M'K.4I$M81L }r3&ˍmll48qaaMDʩtk>kQL//ƹ17WvtvfT+Qa (Bq_{zz91l3⫯*WVV='wU| ߚғtIENDB`aqemu-0.9.2/resources/icons/oxygen/down.png000066400000000000000000000026351272330227200207530ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME  ;+Ck?@/ * F yٖ7mt<~|d|&L`ќsMK}SCHJT-hc;{fQY{}3- hnfD"V_Ns:2}hΐcȭLYض):ɸEh5+Ʀhp Q NdMs H߇3ЀMo@]j䉣*GN7ei%LH3Պ(~2'ϵQBSd/fR9ӂ˽h@Npu±BUTSs#APqr>fn&䍡|_pmF8x(‘"B]uM7YZm@VDdS&k,nN"$:z!NGv| ` ̅isT$'[7ڿ%fR e+*ʡpaJ d0ȺC ڪ,(=} *%vy;H]d @J>,EQ՞;hO92AF I;i>"{ț4Yԍ+Vc!CQ N *RG۩CnuT @bh&ܦOQQ ZWKu.w~fO< z%bCU Q`\38wH޻ =~3<(.t 4d͗dQ|39drjՍs]\ׅ8Ǹws'J ;խR}@Ԍn?;]?&CT5#hz_>bΦoi-O6z{钵zLmA(B5MGN}"$P38֏tLD߇5RLR}ӵIENDB`aqemu-0.9.2/resources/icons/oxygen/drive-optical.png000066400000000000000000000027121272330227200225420ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<GIDATxWt4I7{m۶糞mm6mkN_ޤ\Wޚ鮯hBHN&Z"P*a:E\.)rY,YoMiki룏>#چ琲qF455K`0@ dŋO%FgX펰j Hf$R6׻#"qNg\N>W@:QrA=\ʸ @qw= @9v B-HjsN`p^q ٬8+ ȎҲ3m3 2 !4M*VuurFwRK=`[\hDd͊N {4m&@3uk92: (/ O Բ,zyY/t4ģ SAT ķz/6P9% ٌȡj>%kgT9eUH:e7$ \}q2j*v`T-Bb`uQFd՗HչJ<t c0'<@&m(Eq>ie'I]T52Dv h%ke`Lx< O5eKLK߃} /3N;μ_Ũ'bDc7Zf/]]]{=rג 䃕$v,+Dl2C!+D}zTUC1^v\_m , mIDn}J2"Z<^SN9][ο Nߺ 6{ &Zgȭ^D4]vV(BF6Bt&ٙgfFpQUd7n'|6 ]aQT;5eE-DQ,AkmSp;x2Y( }Ÿ7 ȸ3z~i!%;Ǝ)䜋%,Gj7A<nJz5*M)R/%kطdz"^ə.T[=K,K0 <đ!*%|[3%WIrv,QQw#+l'ydpďc>t]ctt-.h^#N/aŗPS\ C';GG].tC#L>B }u'~~et:͊%iig'W%(;T2tXrY HuΞˀ V5 b,0:1;uo ,BV yH'6g9.y*z_Yz`z Xp@!7~}?.OjxmT9Oeb;U%tr Y @W'P#{x'o'WL^k9U, e.T(CW_ۃ[ͥ??KP@4lf(Ot:)u L^;d`PaӞd2k?౯8!Km L܄o$cx*# ؼ}wOm2>h&|N'UUU444`(mw$u$'q3D*ggދD7q]i5F!-/½^/pAY`&;=wE >>2@_eIjst=7;qݴ(K%8c][ʎ{CT"nD,!:⋨D<ƋG lJu-Pߺ`}V+͜C<ұkwn̙3S)@cSB ,vSݶ Nn2%a@iSm|%d3Ύ/|E4۩,yn, "H&rϟW$ yv`R, IENDB`aqemu-0.9.2/resources/icons/oxygen/eject.png000066400000000000000000000022551272330227200210740ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<,IDATx}Oh\ULf&$ J B bi"-mq!Jօƅn*4T[mKu!TJU&PI$Nf2yKޝ{w=@Vtc0$@]X s:m;jȍ`Mw 6-IEc@`MM4U4Hڇmp:^nw䍕?MCmt[Lc[g.꿊DWݡ˷6.& .THd3'Q{s?W_tQAʊ NRRQ,o7!7^cZ. EzQGIe _Ks/夲I؝yLd/E ؒ5z)4ܽ#şH*M2,bF`+|<LWYOJ:j."˽@W 2\a4_dοiu[Hΐ2GOGQ]Dl DytF16X7rP=M 3\v5r5~|F!7?RCev}MѶqry=dNٻ!x=|ے)5#F j~( 84>UV+,kWMx1s`B=hW)5}z.SW>n-|=4MB(/ӕz w[KޖZR! /,ۦ$916fB~Ojf(Ny6ꦒt ]3*}0 |љgyJSIWFj$03ӊ LF Zl gpNlia guc16>5xCjhʖ^BN˓B ke19Rh*/}A^7*jaBvj_S-ZTTgoUPY -Y j,ބ(].uE^6r#s(}2;!/#VgmCs}ښks65ד;4כ$p17ʘVW6VLIENDB`aqemu-0.9.2/resources/icons/oxygen/eraser.png000066400000000000000000000030651272330227200212630ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx{LSW}m)D t2 S琁(ss#ѹD!4(̖H"!,D!0X$sڗ@{{{ޝN3Uܒe'|efa#jTuo]]ݡgn8V5W`5k,vT>&>3w6m\xdl0@ zMR3 5p:>tw/G&>aEYQ I}}fve\MCڣkS^HXdhi4xwwwEuu6`Zv).] R<<+pbb~> ߦvly37EyJUUUS0]H $)TJdǁjl)n,)9OTԼrp#ᦙ$ERZugX+,)a>H͹ 4 EEiGBs=?t$f ID657r0v&mVa-ެ%9@ a,f8P/\cwJ4A.~? b\]˪T6dIBa;j p7ԬαZAԓqCyxJ@! <:8Qܝ8rp@K{r, 5m.ֲ 3 |ⴠ<ctmΜa Pl5jj\ 37B8|?^uEm>$ɍ<$N6 f14ѠP T m)7cxu9@CCdlwEIʟpNm}??r xtpMxN> ZwKKK4 %~]CE6aFG;l6Z'5 w{nDǎ(z$& 3qgĪ[Buҍ¾ֶe p!+4̀͞+Wȼ7n<wAxX^TA7<՝0##czeek`A:"h.ȇqw!۴4)ʺ|WC.v Pl"͓z+N޳gOWjj.WH )MmG=D_u,Zhfyyy'4tT>bw|ѸN8?/F9 9 J)!!a^?𷥷wN{{#T+`  TTSub*KuttX9JCi>[4//g@$VqP PZ(RL.((pٯ)rH(k  1ga <6" *IȈАx?3|J}IENDB`aqemu-0.9.2/resources/icons/oxygen/error.png000066400000000000000000000040451272330227200211320ustar00rootroot00000000000000PNG  IHDR szz pHYs B(xtIME  bKGDIDATxڥ}lUg?~r[ʻ-+" ` l:4F'e7]f M⒑)SP,3eI c%3`7>BKo~s}yyynQ]+qku+|U/R P]:f2y}P`s@>B``AΆ?3#@ԇawq(d5øe˨?_4*x y,y@B [P{ZJKڕ+n2L&du/(=gΣ2f@qzv:>A95G+/A P%18pQ~=.P^/~U8(ؖŹݻ唼8x$gk`ŀ)+VP1`i,3kfqű ,! dPiȊ,+ qJ| VYIŜ;`ݤ.SvחHuMw F0#d2N|&.]J)[&<'k(G,ZV;d׾#X5|>T7_51izzЦNgS?_ZJŜ;xqxK1 0\$ 4(|p4Uk)֘fڻ"l8NT䗨A H&}}DǎexlApdBK)PRW_ AEdB5j+yÏ?B2mT sp Ny PAl lV6H`!Rrq;+"&M%Z3D75t {ZX3E%f[;F" X8FY8C3h9o"VR{\M2XՆpQC"tAyjAV"̙#~c9NbC E.ІMIx)@))WPTpaSYsg=;8k;ז5TLr9\BUd- Pl0Y8^fЖe,\[`'-!,%,#⦡W$0DȤC|6* ~9r ` i~8656{Aq6A_ :L7AKr${+A \ކʕ. zzݜ Ft }X?hIj%wCH|{_I115n 5IENDB`aqemu-0.9.2/resources/icons/oxygen/exec.png000066400000000000000000000040451272330227200207250ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME  1&bKGDIDATxڽViL(uP֘ m{Ecm FajaЎڴEG`e^TPwAEA}<'/3xrSbŊvvv۷o޲eŪUƫo{.BtGgg'2s ph2s,{S/G+'K~hllą TE icc3lܹsCMMM2l/_FWW5y+o F&~-QJ8xH۾(l F@'HM2 !3Dxӧez1  gE V:%[#`w齴J UTT1,'NG>>ӧO8eʔkF_j15 ؔ"-@mitfӽ'3$|@$skǝ̢'V0t7 |fr^I[J@fwmѢ Ȉ.Fy=~Y|`Ass}܎]eYжmMk"@/us& PjjKeJ%(iB=6x)6;q=ش?u\…_,hY(HT'QI {"d{ [idΟ++_YJP u\Jpj{f pa ؆ɕxuhU#>P%\Rh%l"G ].vQH,T ޽Tٟy-\W)̑ Hš-fřpYL} L]GW t)f` 3nDA؜"ދInOv|$_}MUyz3)x.35mWk>z]:Uig;ASa}Wd9a ]fF[Չ[]K5 M aR@c1cBznڊuqv#[8M Pຈ:C AK9>CvI,yީ}`Ym]ŕTb9e*5蓟q%Dm(7E,Q{wOs (s@2@ 8}?~Tһ|vwAɒ]YcxzZ"R9_"sF\C?FH+^~;^a|vUp늈P(P=3ap,=X6q0X^- D n?z[ĕ.< ~@W_!Ĺd4MYb1]Pn؂O_ 5fSGڏ=o :?TS ROVQU?q ?Չ$a[G=J 1k侜 BfHe%=OOT_$-v(ؐ(sZ3x_΋wr1ojk>s O^NYZoL˟v'5r *z&脰GklhhMazo]fN%_{wd&M[rÌ>t:{w's:O aHڋO>_.{ bIENDB`aqemu-0.9.2/resources/icons/oxygen/fdd.png000066400000000000000000000023131272330227200205320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<HIDATxWnEً7K; B/'w(Rp_#+HDH,%Hu0{iNfk{S5^YYkUFn_%{ߥl;Go} *y }܏'lĖ[Ӊ_~Hbkkh<m?}@tۥK˴k!U}W18?dJb_E(MSjZ*b*"7CNu9g* R^'y <ښm\$F=Lc-&oCݖ@M4 HNSr`U*PoA(&eYb@cH-xOQŒe'6l\lI%XL'֗MfoINlFD`b7>[̚)i GLDn/n|k\ =SC /^’L%D=;ŽfrjMh  ,j!UVg@9!׺Wz}qj4uxx(%`8IRA@FÍ|,U1DZKW_;2lvn&/#x#0LH)ECV~7fD Qc~^pZH\$Ih:TT`2RN3$FbfZ.e =P͐y:aQ҈H *ܞ('Z]ܖ$wSi\)8#kp0r#6J OG^FX&k?W^NzȃYp׮}hNOo1(zfuUBz"VBXg%Og&JH?see˭+づc՗pO !! y|_`}<៓M+GP ZV ƨ)kPebvLBwppApQklpwEO!/'$ڨV*J)K;99 dQm4qb |ȸv\ḷjIENDB`aqemu-0.9.2/resources/icons/oxygen/find.png000066400000000000000000000032511272330227200207170ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<&IDATxVYLTgFVPYgf}o0ðZW(-j["uTmjmҤOKCj]7ԴE[ܹs; bu %xW* ~¨&N޹+ؽi3I^&瑩`xx"@[`aB.B@a_k5ϧ%%AQlEl,aaP(g lV+$P*P?w"!ua*H%׷EBB-z`"2,G2;`6t8iw@&!|۴4 $Ȉ/s:7lD{[st8~G`ۂ ۉR4ÝlFa^n"1 l6<**""zFNj\tzd9hjlĖ>y ْ)2~UeՃK1o7p1 l0vը5-f4X 7I0-Гطg/.;+_F~~ϔKQ?8>U,S2DORB ȭQkaQW'pYTσs U܂::1xBCC/=C,vn pwWgVlb?4*5 ij"29pr{I˖VnCT?\" #yp9!Daa)|J`ܸqo ?5b|\<"##Ke8%*b& QD-H2 rW6lEn݊ヌWzں_~&d0̏҂\s!#p0S`C´;fTUIMIhf?w|^zE.5imo>ޤi~ؤ֏Wk)A-EA?"SᏪCklĉep`k6mb564Mɻ\h89=sG"П?ٟ^" X' L:EJ-- X* 0ssIx~>Buuv$-`ݾ^]M%.^}%,g%xY__[wDls/kCCCEz<0˲QFH#EGPLQ-,! S *%mIFF~8neә/jc,0}czd6Y,(j\K0ٝ*=[(c°FUUUh4褧gffrDx z, V ()蓝;lFܼIΝ^\^^ ip{&\.WV[[ۇ---g$n$t"`3o7z'ȡ۱cݻ-a_c,8-++kz7jjjPFMn;9+ Xy8!v̆)050;'HDq.PFX);;[sDjuu8$}hff&#m#p"`X8}4A޵u֡{ER`:NdY8e'tq ?2xJ "a.^\ `hz|uphAu/j4Zӷ g_bg 0f1z#B!p)\1M 1y|A[=O u:<0qR/Yck~n87YȇTpp妙L|ozWvlIβ"m;rIףE`)cKVe o$-lnP;|z-1ĻH(w>x|QaiH Pu+..~"~6J{Gtְ SSSa;a"ۍ xِjȠMSB| p555Wo}kkkh:1`3n<ԩSh#iUxoo/rɓ'ېg:]ޡ;B8hd8%^vj 5A`v4" yn@ @p&azz3ba7npys}tUHiu3:IENDB`aqemu-0.9.2/resources/icons/oxygen/fullscreen.png000066400000000000000000000013351272330227200221420ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME  -Y]IDATXWMkP=b3M!_LDk?H.ܹ/pSD MSa/;LW 0q9n^! |Hu6FCsKY4 _QPB L@Q0x~f;/;5F?3خB{ĵN$8=rsLL&NB*ޙ~}t"`s ٶ- Xd^!Ȁ@'@$! .. *<KKT)&̽wn/wFtw>,|?s΁KZklg1_.C:Oģo\3T` W>}-;c,~XޤYP(GWiyԠ Mb46pb4"#1K@CX( d{@[%l7 <&ҽE`Sm&XZRaO>LYT 5Wd"pd.jb>흀KhS~[x*I148co-U7hݵ{ыpmBȄ9HnX( 0A l`VC?RpX@ Hh(8a:ڛƷt^ww.a_T @bC87v"6BFk13nen:@@Š"JhXlP)໵z>gpipV;T!K|uɣ'qW;`+ a }v:00!Xz⦾\GV](S,G6'/eu/T#HAvBbVP`;ԭzYS  aāVk:A B VX_k\ҷgT 𭀥(#x^R_T~T ^5R?WESR:<Fؒz}r6wTi?Zqz\ҋ|x3_OC}E__RS2s;˴!IENDB`aqemu-0.9.2/resources/icons/oxygen/hdd.png000066400000000000000000000026521272330227200205420ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<[PLTE333MMM LLLKKKIIINNNhhhiiiTTTWWW|||PPPEEEHHHwwwyyy 000EEE!!!!!!¸ƻ&&&---4_4999IIILLLRRR[[[]]]```ggghjhjjjkkkmmmpppssstttuuuuuvvvwwwyyy~~~>PtRNS  "$(,44EI[[cwzzn[eIDATxڅnYSu JBYe1'-<h6,BHLQuF_-ůA粙44p`{ \.0ͤ&Qw>ajv{uRUQL7{ۏ;a+P4с@uE(@[H; ^ 2Hউ tp"ȆSJ+ E ULvc F)kгdsPU!- V_= _v+kԟjN6ȿvJ9 n߼cA,C- 1R @1`pWw=NhQJy7oՃvV*% $IZsڍL_\jCo}CE7m&=/B `l1Ä}κxCϼW]m$ёv[]w&#V< 4Ԉ5vξٞ: OԞ?MptF9pegrAO⯼?q0k|7Ό J QvZP)x~D<7)R+q]-{˝ Wp=VYokmm~󻠠]z[7 Q8͖0y̝rFۣc+^?;&?˿y.jn{kɋҼ,+k,㍲;mc̊”&:1voO^6;uۛdD y)͏Vssސ(m"Ȓ9 {흶~C}aM8Z[8J%`-5/q {]>l7ʞcvqjXk w .P(a52n^pEDn0go/wO{E^;/[]kon֮DZVb烵0,GLBAT*JseBp{7,&J&6#t}@YƖ.\H@)b- `,(4U 30W1W/㫻0l4JFal%ErEdXBxTkX0K:\z YRZ+ڜv %AZWM|]TPE(8Ƙaɂ)L Y.Q,7 #nd=Mj!M-5S x J '?pjtXqtXx-*Nwz >x(0\r :W K\0Bn-Ң./2_|_3qK$34ΆjDl1I+n$]gy-@x ^ <)Z;%S-1Ҁ,\Wu׼do@c#ĸ.䒑N9UgdJvzgiVQ\JI.,WBnK䇅0WCϯ_q/ŷg-4ۮB1pĵ;*n2 Wۣ?ٍ-w!^yOQ'16~{<].̲b :&|/1qȽisG78Ea+/Ǻ*w P"}*<7Πj̳ J'2Tp͗٩oc|51KʦpN 6*IENDB`aqemu-0.9.2/resources/icons/oxygen/help.png000066400000000000000000000030771272330227200207350ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxW͏EUu|- +, q#~  I8p LL7Op7z0xMEID #3Ntw^uRٕdϮ՛Y#LСC 0b☚{ Ȅ)RkM$[@9ҊPvM_z>'g˞WN>\[_ҵ90vx#lw<=$jX]hA RP3X^RJw?֔Ppuv%s L c4s\R ]W[k@J&k?ı-/4.mHaynDPk#Yxx$I| Lc{Oncka`ǓHKTmXTjTbg1rL?]KS5lK-O)u&L hݿ<R<DSƎ-9] 3|G+xq|C sxsNJP(/ӂFU#MLM$8wQo=pyo|pr?k97Ymp>vՍ(` "xm "Ё({`;mO|^ĈyvN$0 2_h~)厛3TЉrg!@p|P&1E(/…6oQM$Ձ$X#'`e)*DAe^R@14ZS)B֖:tw ?ut2m@% O0"fT DTct{W͵b>CZ \kaõ,, J#56\jbǜdΤf kCh;t<{+9fw>`ju xSWN*j׊S0pY^clw]ggBjD~Y,P:Ќ2YC. DW. FD1pp ل0*W$JGjQohpȸiه؏>$S2s̟"!@/^!hx!22Vŕ@Tx2]C+Ր(Uk>FٕL8CU(d z$6pzrځ; i% McOzhMJ|1]2 x \D58kJ1J^SߎͲ̾}34"/²~.x µ}CnKS[i"/"k}:vޱ["ֺ?99lgJ) TB)Xc׃ p) E);Lۏ' nN w0Fǥ b\bj @]ffԌ5XkoEU8˽:K?!h3A IENDB`aqemu-0.9.2/resources/icons/oxygen/icon.png000066400000000000000000000044371272330227200207360ustar00rootroot00000000000000PNG  IHDR szz pHYs'_'_jtIME + bKGDIDATxVtMj[Ϩm۶mIjvzacMb]Y^71Q-99yO'$$l^2}L&ktҖZj@%&$T繄*QmxaQѧrssVߋQRRO,+**q\Bᐓ_M8J",,l۷oMQ^6-,,Ĵ ¢  QLbXR`,PO e?_@q?dx/CDA)tCPAM /Fip@ir:+z9P(<Q cqiNA)RB !?}6Q9G5"Pd_OD Vŕcl,4@x%wy>7o(y ܹs(ۃ 9>HE%:31/E9d)~{֕08m =Vq9Z 1/;a0^z:RMN .+9b3F'ۅDwfwXмysNt׳jaRAӓ'ڡ 6R>A2%ZL_ ,A u"rƍ78|1?_6gyf`:~IbLPCNu;ǏqT q[6mpڡfמzM]xG^D ">}@ τv666ܼD<Q60еkWN(:SdpC=o5ZWaj9{t"vq6oN\'ODVVϝPxʕ+ \]&tSy d`JR͐φ8:'R|gp>|ǎëWX=t%_2n\k;wnIY\8}0C ĉɹTӹ} )-X]vG5k6Zj :/8==ߘ TK S.0?-/\Ia;y0gÆ ;@GѣGkM5jT4:t>;"[l8uXW!8qQ0GJU ]UiA:99]n3hh龗~u ^$u1\ȸp:Qq3W/ի'y!;GA xo;h*;71"Gaz2oݺuchI5aݻ/9Ҕ##АtUȌѳgO Y9:u\0iIENDB`aqemu-0.9.2/resources/icons/oxygen/input-mouse.png000066400000000000000000000027671272330227200222770ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE///NNN YYY>>>HHHTTTOOOOOOLLLddd444 DDD+++)))///mmm999~~~~~~???'''iiicccuuuȥ˼ϳʿԶ׾ۣ|||@@\\Ϲ555===TTTXXXcccgggoootttwww}}}66 ?}tRNS  "#%&-01239>CEFHKKWX]`abghijqw|n4IDATx]%IecffVg$"|" Ee?"N\Ϣ;sΔ6f|;M\; 7X ,/fFsvw"{ ,"&oIENDB`aqemu-0.9.2/resources/icons/oxygen/key.png000066400000000000000000000013121272330227200205630ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IIDATxڍkAwfߋ`IF.> I+B& Z06j>A " ewGrC䕥)~ !cK8 Rr NZΡj%G'._/\^PD5%(\J<h" жB=4!WD MX.%B f^A6zZ+\.;Տ+A90q govn :Z#`܅E8F@ꌌQ coXMxP[TEM:ntn;C ~ B;s#fKp5>h@̑f&Aup˼afgDGm-io@. @n߾>#N'[duT0'8mڇ:g9غ|sWjOz _?ex߮X6),WOUXI^)jBnUMIENDB`aqemu-0.9.2/resources/icons/oxygen/list-add.png000066400000000000000000000026531272330227200215050ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<(IDATxŗ,Ix6.ֶX; ֶm}2{"zW2|L13J o<ڋ6\r__xrZgA;y/M0a#='>}֖Qr~{ny7 Gmigzi*ddh(:վ7.>c~l.`{t盷~_1?<]\+Kadޭ@* D)`kbUFEđ ҚZbB`b$Ue=Htp j"}\#)"@xC(bW=5=pozxw};9u8ÛUՔ"U}b5Gͻ-d{Bɂ#kx]}k/}3C ]./rp>qBVYo } jKpuO=̭cx'Ch&--cRQāSAK 3X@5?S(|N/d= hB8Gw9!8BYepFX_Fۇ2|e}E*1̻ F #'] gWV/=޿  rfRzN =yj8NqZr'TRK ^oʹ+K$%֭z7 ÊwŊ iP ЁTt)E{edۣb8aRk좋={eTs9]@hu\ Y٬QkK{dbyWq~ :Ab`ٞǍ=[;4%L6_=p^90ۮ\T*>E``%T?,_+?O7Rp Lpy \*/{K֩RQ{^?Ͽ~]33\;wC_ȍj50uFy!7FFFKpr]AifvǍeF1>\`J~d?DRvػfӫ[c!:DrFkhĈS @wB\]6 HpU)L}=''qe'&k_D̦kC I8K1&t1xK$Tuwrjw05B33VA F*ڈԓS/aJk(cLЬVQ¶m*dHphgFvАNF=2\ gL+L D ل;h h2R%~ f q@WDJ2ٚmD. {~w@KA""D}FF@Z~9!_‚ s6KAtz x{Ȅ;.]zx_r]@' ynf|dYys<#eVjC߾-`ߝ&pWXd'/~@LrI*]TI_Fd¶_鋭j@A\ſp F[{S7لy﨣:ߝi"zTXtSoftwarex+//.NN,H/J6XS\IENDB`aqemu-0.9.2/resources/icons/oxygen/lpt_port.png000066400000000000000000000045561272330227200216530ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs."."ݒtIME2cjuIDATXíkm{ٕ.,E EMMUomh/Z?M^L64Ucmljl@KYvXX]2,;;wf90j+Odyr's^+whfOg;otd BW/yf>=W2¯w`8Omi]rp*ϼfoIڷf|5dR鿨rǯKPg:۶;r:XdD)T֬nؠj+iv'M56c̓&عO%f{zz&XpP۲@* _bjT4[_rxh?W=@F⻶.;wޙMnfbZlң =lgIUeB\W$&D.%)H( )4OBBfr2xd :tN|fsM(VFkI'@EVR⸂t$OPQgվwLM(Z! ʅ/^~,d#\'ldX|T*iTC(biݺ/F1Dt3(e0X0h|: 2"BJ4MEU|>P8i @{eo^[s{J1 4ϭEKJUU CCTt]ESUTUEK*) A1<C:D1Mˎu}[sw?V¡yLZo ̛z|u<|>P(C(J>01%M39AJc{ v< jjdEYQQ9?9oj*>[hF#+ͤd9T58xd3yM.kẂp؇ ɤYQU'0"߇ lC"UzrsNuw9}t`G]'UJ‰%wixYtB(]\t@"##gh(T"H4Iߩ!ҩ5kTV  uW5ϭ*kk#}恝Go=n-Kn]bǼ(lճ+oMO0|S<\y[I&M_cft`KSngF[Kщo\3{߯wR_BgeӦGl{m~uߜXöWX9}/p6h?yGP-m/w$FEe+=qkikfӃߚM3Lw'jDZq]mB..׎ .^NN [YL㡉ɣk˛g]v}}0s @PqG`x_߁_t~:Ӛ/:3~?fx=M.'ϲ|+\|./<.RS8[=k +ld2C6S$XEeE{Wf1]i+7x/+P;\g;7?N߁Hx4:;H4At4z47501>iU7•0h?㼸dhM]>PIENDB`aqemu-0.9.2/resources/icons/oxygen/media-flash.png000066400000000000000000000036621272330227200221570ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org</IDATxŗtƯm۶˜ƶIص_m۶m۶{=Lַ:}3W-Xy9;m}GhKMhݛ}@Шn8Zzcuٲ_ҝ_6uQ]]/=\z%W=4wE?rUw7O4&]/-];g6bvS\yӋϼw& Y[Zlw L0yyq29&ˎa U(Do]=15 C%IuYE8c: uG0+jpCY+OA -d SH5#%!MBYC08%7w}AӠԠ֪AURCRBJ2J9H2e IA$P*D |DB|Mط% c}tow9Rp¥ y.'tU7o^K(i ͮ1[:p ׺Qlb4O=ov+e\үȞH d̃ ܅nd|Z*}o4=4=O(>8c.em =No21I\t&s޹PTX23SqG8OP4p~GQ@upsZ֨/NaY{>n p’eKJ ^+3z]M-bREfS037Yg` 3>3 LP"ocMϕZ r}6XLlzlA_7CS<^١aPj qQlb4 PhBݑ' v2jBF8-i˗$)t,$2YP]W x?(ۂxm=ࠜT`[4jz8.` 0@gohzXb1hf3d ԡ}<(G˶j'@=E0J̶t@Wo/ 0uNQㆮB0-!ŧ=&FIo:C$׼B XH<300|^邉)bjk+yd@JM-pBi |4+,8xa**9^Nb ^Om R856Z`tre!Tk80B7aUF*Z4 BO2-&Fp]_j>Ī[?s ŢUMO&_>#uOz\eZEߢp7HM[M?rpq8x ?xeF$AIENDB`aqemu-0.9.2/resources/icons/oxygen/media-playback-start.png000066400000000000000000000022051272330227200237730ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}4Wfm*vRʈmN1m۶33Օc}u^nn'vt{: ʷtl 9CC]`Axyg4'W386T2ڤ 'H1~g% Ξ#ɦ9 x,E*O/$PL{unk3a$l̪LlgBNKs>L"/_6G> K%0X)pO7ϰIQuw'嵰l6-RzxQnKaӔ%)KSLI)ڧl]Tl&6*Us0`ONċlC#*vlz* ;eFd(Y%5%QJ~D Kv-ـ)y>>Ve; Uʇz3pF |4ԏVGQٌ-z{,mo\l!@"VTX|OVW!#X2-xS(~fIp` AeWp#A qhrjV+)5O ~9q9 MG!,a~ ,N#4 x GS'`q*7E3&XLFPL`PĚk5Ee B˷+m+1(RW= [7%'QgYb&BǽBo 2@L P1<ȎI W^wrKtRQ*48n|G+ @G *7Jg+ !DȀmruD?y>I6GR!'&Uy)՚I mŋ8vT5}.`hCUl&/,EQ ,}eCj Tf[S U`5:k.AKBƚb:EkzRc)lI^NG8<6gdz-W].g-&XCnu|ұ9`ܿIENDB`aqemu-0.9.2/resources/icons/oxygen/next.png000066400000000000000000000027011272330227200207540ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME (SpbKGDNIDATxW[lTU]>fL[F&Tc!%H D( j@HI%BˣB}@[yi-ahX5LrkLwq;8~q]Coe$ "Rm5=g'yOAXaK$ǎog7 ^ $QlfO;> F 4\E1sCXd)DOxn9.JuÆa3#W)+cV%<u}!0Q6{򴂸qb[ܮ7gIOM_GM-lb,;eQݓ[Qr|Hձs%j.&8!Ck՟}+DP|/J]Uvi 귗TVwW#t QEGXB\J-"2gs?vx+me1䑗e vX ˲` ӄa4X>SSEj/dp!=[\}aM.*)' @Ȉ S&{({3~37\cGx|JjN"89q $2Y\P (&Qd`Lл% r]=E@gh΋*'C]رG fhDa , Zڐdaw͆V38} L% 1ȌTpL KxGcP<DiZ&,SAr,𸉜ǐ_b1ALڐ,n߶'YмaM L5pAAPI& ]z#UomؖO5{A"K$Af7\~}H U_zwuGu91Rt+q0-ݫtF:%666n+oyfTmBÆ#ѓ %eؗzM&ʒkA0EB 32@v@_1֚]Ν -Y<rJL%+vnkrG[Ҧ~om_cɳo+xP$HI͸gp)lOfڮF !9[-HV (fH5N\v  $7Ֆɖ ,M$XqIZ҈bjb`:85rT;+y9hgW7׮% Brɀ"0HjHl"b(8> s O׌dCi{LeσBHR EQ(K0DY1i5W I u3OZq3ׇ. V ڇ-H0o Ej KNcƹ_/|EN2JL=h}'r ) W:8{AM $WBø}"T `1qLIMODBu|nX}l|{n 8p##\S:zVi4i܍jh ڊu.oIENDB`aqemu-0.9.2/resources/icons/oxygen/open-file.png000066400000000000000000000021001272330227200216450ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŖM\E9Uu?{1a•0;E'vKW#J! H .id:=龷NyN);h4ũy[g]( a L _{M0f(xC9>R}_LJdSO߯F4#& 0ns2NXK6mUsy3q!j<*H#[.N{7@[V2 c.]^3W0P 6/7>no}k `pFF{80oOn?U5X['o:pbNW=?.|FڢCĚ70>WԻ̼րjfO˩L׾{4%ʬX$} CR<\1Ɓ>j 4˚xgc<=fɬjKܰؤ}gu"2- JbW-|ŋy`]N]B"Pfd=d*3B˜i4Pd7 4EH͋,>yW.$* :ΚɌ)TYO&yq*"%$䀔[̘?OMtH@v)^Wv''E뻖3vgd]v{,*G#:јu   \d 9_ɪIENDB`aqemu-0.9.2/resources/icons/oxygen/open-folder.png000066400000000000000000000020651272330227200222130ustar00rootroot00000000000000PNG  IHDR szz pHYs7\7\ǤbKGDIDATxOhUƿ{{IMHjZJMEEЍ[W"" s΅ .bJ+QR< {fmc&?8Áw g{s !HB}[%x%V6K nMqybҹqP7 Hv0J4R3 GwQ'"HP8MeBHOZ3O|1௏~c h+^Ԧx \{BQU=@{?\Gñ0*!f=+`aPiqNc.Y|W /U %jЧȭ! U"@DC,Wӏ8[,6>O(v3퇀m[IƉki*$ÄNgL ' Bq)8  +B}+"E6f{R5P0U4FI~ Ċl兓+NPM+26fe):Yvh(vS3+{]`$V)~wݧ*.A"⳼|sY+f's+}PFEkYy^bmΈVQU8boc+vvbi]p![!(:blua 4&ZTL MȚٕZ#`l (531["DǑ'APDH8clT4#j * XcU FlZVΚ-9{E h[Pv<-׎q`N$ڕpN׮ yp:Μa E7~2Һ.GQȧieλpN7_3ܾuE>㏝׭֮"zTXtSoftwarex+//.NN,H/J6XS\IENDB`aqemu-0.9.2/resources/icons/oxygen/pause.png000066400000000000000000000021711272330227200211140ustar00rootroot00000000000000PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}Oh\Ud&3ɤd`R n:ͪ ,.#S•VE7P]! )08ҙLf&pGr>o|{@}' rN>#+^'HN  Ӝ.⁄ 9 %i2fZKX.TSZlPB!PTg^Ѡܲ;FcኯthpA )a_Ya"9uwj}Š(9]qBWJ6MFD#cl W}Uy\(%#8!^إC[ ~f%Yv?jANj-WgXB\ w O(Q[-6(GgH?f5;Rq^>L@:-h1IEH 2UPsn1F>lxgSyV_OK׳`v<Х{,!ğHK%O0;9 nqy O!-Iz:qY"ߥŎM6 #!+(RӉ0MyxtM ;F'`D)LQG$0*ŕEIFcun2N4: DDEl@70;-V cS I 0d@ncKyDn? /l%aqɮ=Sj 9 zǼUSVp))HȈL"/_6G> K%0X)pO7ϰIQuw'嵰l6-RzxQnKaӔ%)KSLI)ڧl]Tl&6*Us0`ONċlC#*vlz* ;eFd(Y%5%QJ~D Kv-ـ)y>>Ve; Uʇz3pF |4ԏVGQٌ-z{,mo\l!@"VTX|OVW!#X2-xS(~fIp` AeWp#A qhrjV+)5O ~9q9 MG!,a~ ,N#4 x GS'`q*7E3&XLFPL`PĚk5Ee B˷+m+1(RW= [7%'QgYb&BǽBo 2@L P1<ȎI W^wrKtRQ*48n|G+ @G *7Jg+ !DȀmruD?y>I6GR!'&Uy)՚I mŋ8vT5}.`hCUl&/,EQ ,}eCj Tf[S U`5:k.AKBƚb:EkzRc)lI^NG8<6gdz-W].g-&XCnu|ұ9`ܿIENDB`aqemu-0.9.2/resources/icons/oxygen/port.png000066400000000000000000000053771272330227200207760ustar00rootroot00000000000000PNG  IHDR szz pHYs."."ݒgAMA|Q cHRMz%u0`:o_F uIDATxbdػ/O01xݒ3>2p匿 \/^bys]zU/=RW:ae_gl/~q!G+{f@= :yׯ_rÇgbĬg*{;3|Zê_oߛ"Dvϟ?^t? jj \ ~d`?o?{+OWW&C q73\ꅛ *N kF~ b-߽ݻO>~[ viYQ M?~-c$( }b:PWAmC3@h !pS'opreݿ\ARJӟ~} PA_p,#ç/K"/>>Q{@ywy75f&?3Zh1A:h߿$$'Y9ܼ>~=v)v]O?S-fbgз?8v30A &fV71qgf!& Pp='7B~ I~~._@,bAC*HFH;+ÝO:ǰ{_1@`ÆK~C_x9DAq7d8AY@b`B<3D/ׯ?1 E߿X~() /'  ,`P$8KQٿ+Ë?~s@JXPG>dfx;`" 1 G>!!~ wo0<Ç/ @rs 8;KL}903s3 p2s0ps198 ! ce`fGۧO?cff&Fjy `5e8{b IP,,d 3X A$gd;Ǐ 78P 90 c`++ ÷1`"߾fx3?NJG }O^?=݋Ĭauȳh=@ ūO o~e8go>Mlt(n|(s̙܅O;}MHT:hofe71-zܵPgr2<_DDoP6d 6 !7C6aaa?q߿ZO=sy_$/@˿|g'V6Bb{oyhE8ԑ ܑ}ye%1Ro߀H?z uB`9(|WPYnMx))A@_K>}.{ Av@1Q-u_( V,=”(,h9~}LΟ c{ӷ-,@rp=r_ۧ9,P bnݼ#"*ـ OǎYKW>(CgP Xw`fg ll !aLRR\Ϡ?LmX;J<6Vxc{'O~1Q ""?~⥛J Go-by9Q^3~ba`T ʅ@}*a$XtA5?wMOR ]IENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-desktop-display-color.png000066400000000000000000000036751272330227200265400ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYs B(xtIME 79Y bKGD=IDATxŗ,Krk<ڶm+k۶m϶mӬ.e3ѻ8,Ofu5v8N;[8[KRKƍ1TQ2v kysΰOںukӟtnpVyqhCp R0Zaz10 [guk׮ᱏ~4X !(WQZK<, 2Ayjr|";Q7[ND(ւ ]9`̎p V`E&E<ўglxK[-~BfJɡxuqh] )KK-UdYFt=ZAeo]3Q.]qqP)rIۗ΁FA-|{?$"Px~pZ#Nx&mC5'Fy0ZQf>'Dx;}#-v`waDb?:& A[B_:$fTlcrB#EZG^rriQ$ МY EQRIG,7͆ "g#nژ:719X͖^3opH^_CQ%\7M)&0cIɭ&>9!سrX2N"s%"isǒϷ=:RՒm-6vHC1B^]kO;nć~CY}<P}"]H01^2;A95J-8bЅ%%((1~;]8d{qLk/GǏzK_z!)Z{,arXq"O;r{ky劅|\S[RioC=̀sO??1y۔eEh` FH /䕯|ˁHɏٿnŊm"NÖ-[[nM6]r|<+vޱuAS0%}BB`' A&(e8rȽnI3pIENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-desktop-display.png000066400000000000000000000024611272330227200254140ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYs B(xtIME *]bKGDIDATxWE{#Gd53t^[Igp233OxJ_KeO]_ ޫz=m͛7x,t@F)3̾CM{g)?\}vq7_5y8ҫ}He˖QMM xTRRB *>:vYk׮]O\/}cQhk+++iĉP% UV}3}*|pOOϣ?o`WqvVUUc}kޏ+[ O%"v:VJn@ ׹:k^t*Q:um[__߅dxnY \2Y~B>N /+wD'fVr]<[l_wooy@5H k%ݻ@ڇt@ -gl<C5)Q"IENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-desktop-icons.png000066400000000000000000000044371272330227200250670ustar00rootroot00000000000000PNG  IHDR szz pHYs'_'_jtIME + bKGDIDATxVtMj[Ϩm۶mIjvzacMb]Y^71Q-99yO'$$l^2}L&ktҖZj@%&$T繄*QmxaQѧrssVߋQRRO,+**q\Bᐓ_M8J",,l۷oMQ^6-,,Ĵ ¢  QLbXR`,PO e?_@q?dx/CDA)tCPAM /Fip@ir:+z9P(<Q cqiNA)RB !?}6Q9G5"Pd_OD Vŕcl,4@x%wy>7o(y ܹs(ۃ 9>HE%:31/E9d)~{֕08m =Vq9Z 1/;a0^z:RMN .+9b3F'ۅDwfwXмysNt׳jaRAӓ'ڡ 6R>A2%ZL_ ,A u"rƍ78|1?_6gyf`:~IbLPCNu;ǏqT q[6mpڡfמzM]xG^D ">}@ τv666ܼD<Q60еkWN(:SdpC=o5ZWaj9{t"vq6oN\'ODVVϝPxʕ+ \]&tSy d`JR͐φ8:'R|gp>|ǎëWX=t%_2n\k;wnIY\8}0C ĉɹTӹ} )-X]vG5k6Zj :/8==ߘ TK S.0?-/\Ia;y0gÆ ;@GѣGkM5jT4:t>;"[l8uXW!8qQ0GJU ]UiA:99]n3hh龗~u ^$u1\ȸp:Qq3W/ի'y!;GA xo;h*;71"Gaz2oݺuchI5aݻ/9Ҕ##АtUȌѳgO Y9:u\0iIENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-other.png000066400000000000000000000035421272330227200234220ustar00rootroot00000000000000PNG  IHDR szzsRGB pHYsuuÃtIME  47bKGDIDATxWt[w,p!]{w(6`i uO vswΝ|ʪOB]K.LOOCaa&'AFM:xxx=z2TUUiXXT0o<˦DիW-V h4}a޽ϐ`^SM3g򪪫P__ϟAT6~9Wޛв)i+Q[[ uw!}ޝ>{ɓmcbr_LNM6+V8T(!/ 7wRW~W^^|n ;y䝘hQRR$CVV^%=z{>W}qϰs.$&Ky&<==eK+5];w<,cYFxT(^}5$8už}0x 'YW/^<޽{ԼȾEo7w7lrG899aر4fVGR(pvv8u͘!m؈#G૯|>|@\׮]јa: N~\Ÿc~zqq|JSSuq#'{憺x۷R{ +sXX LcccgO! [:J=C̙;[XODXXdJhy]/$z(P̞=[]PP_\r׌h;''6k'|DR[m.޽{W*U I7m~~L x KsXX@R5]ƌ}#DO~X6/cdddfRR,`I~:|H:t3ݽ>svv.٩a{r-cheֱ͞}¢9xW \3sS[Bߠ W^}L EF QW(>+nP2>c-z[kg7lذTHRUӦM111:tvr5~w/**\h?o:_o۶QJf06îFÑS$]r NH)FAJdg̙˿>rJ,2'r\.;`<^j ֭uqs8 bz=غb͚״.]0L-g{kϼ뿻`Æ i:WJ 9n|4 U FYG+g@xy{s111aI-Z >>YVڼ+F? JFNB(e\/urZݎ2{?x| S-q?$~6u;pBg'B^k=i2] pҫw)xgqm7+ ՕBUإ"ܕU\#@N\#h*PHׅ&9~1!z;p$?+EH 8\Pa^_>كz'~fC/}GHW`l'GM=K`Y0?$4"Q2Ɣ+S$tu\zo?oPb.&]712 W=0k&aWF-FH hz6egzd]k[Gq>/-m5FڰK7=C<?[ώ3܋qϿN\'/gv׾jN4 2dW\pR"Da* (΢.apLg#81|>Bi6bp++o߱} _nj ͟V [Jb%c(3+**rR1c@JD( 0::+ UٶϏ) Gi,½er@ 2m|S%}J)̊GV՚T*S5b@:;55`uXdK===ppp s(Htbgt%GF$Lx8 `]]]aoo@z!,J| nQ䅝L3ؠsed_a;0<<\囗[r6==G8k^DXJ*4-q~ob8ŪTŌ_ZAC8(1T*B(@l6.fmDb*gU0T #"\[[#1y@톿f b@$vs*`ׯ`@ @ 2vKiERf8.k8F}յ?34L|U!ݔ1pIENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-system-network.png000066400000000000000000000051431272330227200253130ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATxŖt$ƿrd&cl[ykۻk۶}Z FxI]~TdW{qx!B޸qOs^ IG3Ysya#WiQ})k=Rǹ~)%/l6/SgN/&l]*ԌMQtt%`l-Xaem$XB&ԃ|.R{`ͱ~ 芦6(7a03QoeSv]k¹Uw{2Sq堳,tArUQC<%(a5h+#| MY0(AFzRS<OgUݣ@W5PA,U;uw 8hɾ#_-,`&`y$8~Œ%۲C#Q,46Q?x6fb۪˖KEWy MLȇ`a>nEǦ ߙhX\@ 3ذ-u4Dj% et[~vn/ {]8H|Ћ93Mǂ8&Oá" >lmm}88 ~ HܐNG|+2 F pa?:T M}tuS`gS {(/)A0EFdJKir¿$p$|F5D$y~ , aAuelwr|%<|>xPP: I&1ÐM$U붷A1omW-(iIPI1LXDin!˲cI2òّh7 ј/РrPMNrn@4֏I`LIfE(* s*Xȍ`ݱn^%z`JN>,۩(!EA4 U6WpS(#KT 8܎3gZ@IC"Lt}i7X¨0RR$Zv C)Ûzνoj޾Uq㐟Ki)nڂ-1xn^rfLfSL94*a,\10̞=8䀃W_x ׬/ȱ2GCs/Z:+&P!Hݎi3!Δ +ʡ|vgNˢ Ø1cbJx5pA K_ w2Um9="| 1ۦEU>4H &qނҿif{̱DZ ;ZL!)`d@+hy ]`Xt MIYbZh$q0<ؼu3:h7bC | 䌟bp8& 3 ]U]n {&-Xx/!<*v_yalR: vz2`3i22⠻UwRsP[@MjT[ufnDϒ".L gdž dGb,6[pscs|"*hy߃LlL9@N@t0N7#)>'L9߈Q~ӂ:0D"ư1 q{Ļl.(sÓ?NaUYb +3>FL4cO/.G:;.6#Lf8_hv;Lζg'GSSjk1s<2ad~paDiNͪ˴Ql_<0t=K \r񫯽۷#\iSCeY1[`H4.-]k۶A^HBwB'0M_a&|//\e]Ow*64x],vQg0$ǃB?>_tp;).Isr"}ɏNG=_,kwy^ E#0=n=2x XB4Tfk}?%O?؟^{'x$ۧ2T\.̉p!  ƶAL#=Cu^|fƷhSoyw`GDx^. /ɭ+"\ |A/ó0U^D҈wlW{.w}R3] Mc{;0 {ڵ;#"1B ²` 9`qDmۢV.:Ru]Y ]8B d7@`/Jd0m P/ާIENDB`aqemu-0.9.2/resources/icons/oxygen/preferences-system-windows-actions.png000066400000000000000000000023111272330227200267440ustar00rootroot00000000000000PNG  IHDR DsRGB pHYs B(xtIME "!gs@.PLTE000111444776;;;iiiEEE,,,---000222eeefffzzz{{{zzzUUUƪϵ䉶珺瞞榦P>QtRNS  !!"""$'()*+,.../0068AFFG]^qv|bKGD:`IDATxSA9۫mnSg,b'Nʳm;Ę{+U!-=&#=-=wmŞe#*v =Opo Y{ZE1/_M 'ҵx3q$7 \x.wFj tͱsѠB`V Z'Y{L@`||\yγY7844?8tkj00iu !S~jNc8:Taq8b3ʻJO<5cUWdxePT#7NEL&dz{%4H,\"ixVSVאDr{ H/?z81^Um=* $|MJa\+ xI`X-&+oL<9`6}>7\z -ʾ\YMAIENDB`aqemu-0.9.2/resources/icons/oxygen/previous.png000066400000000000000000000030001272330227200216430ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME '!PbKGDIDATxW[lTUGg-ڤ@U ah$$0hDJ?|T!M@ҨA*mNtfa(vxmv眵k;G[|70lВ2{T8Qɳ w9(J T,ߞwZMO}G!T,{\g7/'ELѧ@xE;㶹1/[m{fZqi.9`i4}"\Q95S-_RGR4#.)I q1=Vw64޼hzimR`'.SZqKi(f}SOXBI\ޢ7&l oJjUg-#IS]~m\Lv4!7Yxvrg<GL#oAA]'jؚLe<bqTU%Ƅ!xNa.s]r]wm]| |,.Л*"jMF 1a "2YAޱa C]MTu֖ESI*M.J0.w1|{l fE kCu!1C)бO p ~B 3̕D@  jvMq1j)XHc@eg9 /x3]{"0TATs2W\ D@ت eN"`8wHP!/_ u%2t|E?8B)k!gΝjfOy iJQi:I0 j44|:m+epAFQP.R ,ib!J9p//l vYra8JqSڥ,% 8`qd ]zΖC DH;2{ZԞ{_i|{^n @e1yd:PQ.0De[h5JfweYI)A߳y8ʁ3cOf1&j@D<%r@{ ѫ%]*+/ǩ\)N8pOFG"]5sunR?ZɌ'`1 Sn1:Ѽ'~MtyO :=o{{uCͳj$k L'+nhO_=]sxݬ-,w2J:`tkadtI>g۷clz; RIENDB`aqemu-0.9.2/resources/icons/oxygen/remove.png000066400000000000000000000020311272330227200212670ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs7\7\ǤIDATx5FEn ,ى<2'ffGylgfff\8jLJ+3d[uꪤn׈:/z3dwZ;<ʣSO'{9?T*>E``%T?,_+?O7Rp Lpy \*/{K֩RQ{^?Ͽ~]33\;wC_ȍj50uFy!7FFFKpr]AifvǍeF1>\`J~d?DRvػfӫ[c!:DrFkhĈS @wB\]6 HpU)L}=''qe'&k_D̦kC I8K1&t1xK$Tuwrjw05B33VA F*ڈԓS/aJk(cLЬVQ¶m*dHphgFvАNF=2\ gL+L D ل;h h2R%~ f q@WDJ2ٚmD. {~w@KA""D}FF@Z~9!_‚ s6KAtz x{Ȅ;.]zx_r]@' ynf|dYys<#eVjC߾-`ߝ&pWXd'/~@LrI*]TI_Fd¶_鋭j@A\ſp F[{S7لy﨣:ߝi"zTXtSoftwarex+//.NN,H/J6XS\IENDB`aqemu-0.9.2/resources/icons/oxygen/restart.png000066400000000000000000000031601272330227200214620ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs^tIME *IDATxVKUέGWwOgz&3c hD•Rq 7MąX/ 'NNf<&33]]u>ʛ)fD=ͩ>w{?"LX7+Q _!it< h\y繛[џ\5kd25V4q7C?>x7MCH+1z- _ں!DԘNp]܅~gdBT웻do3h ''@2Q:` ̵% A" 0Abۚ a89,x`MˌcyID{. !^ggN%M5i(`tRBNG><:{ k衺`u @p{Иk}6/J40Z9`g@i(1|=; vC|A\JH? afmF$ԑ !zL:@5Tϊ;N!@Mӝyi~'7AvCJif= * J^7<#^rM\r%&7kߝEv2g`)9-kKފvBư)[AT#@nLUo¯ (H-Yl  }aA΅M㓠H~|>@-A\䆈iG $|5/ֹH m7ކW(z!s܆4'??Z0vq~}]z I/C^Eg p t0LJ1y^|ڱ ~& ] `eeFiր,Sh۵-Y<eeo<A6嗀[/%47Jhhǀ6\6Co*Zg93ՕչdQ@lz_NS/$ѺC۵bx3NDr0%1`*9h1mMS`gYz )9d _…cз8\6x%%!oؓL&鴦Ow-J@ =Qa}UY_+װ@V"{@l>}(hIa/'%9Pvnu(nF/֜WJYlpc9v+o.9:NJ+0^~vvv|5UOӛ&buzzJ%@Ղ۷>kvyy n.U1eVt}$f=|)VBW-F0L, E _ Oo$}:Xs=|fj )iC{b{2`i?Po!R~ߧNkH0 /.5$s$zD]N  JQ!BRu22(N^@RKG߲0zĥ!87;>=>J׎% ) !pզ -X)zx` VU@ű7iDݝ? ip,Tn+~'kϯV>Bj~fM}uxz3i5&4>GQXÀ1޵B6F))gt&8z8rO=瞳w&65Ov߷;2c ɘn9< ͍GV knYE5H,j, Ѳ  HtGg6S(.."̛p rYCf:Z]>ϒ, ZJ#H&ڱX"fG?X(LRA^tu?jzŲ 9 +'P^.yYh&8ExnRq ;S$L1P5܃ γ@e@2-:w7{5va-5GBU6ᖕ+a1+3'f@OFa B.uC"FGqJd"6M0kz L˜ň7-<;:=SGPo l߸8䭕յ %a(MM z8`z4aW <{TR?R 4/O43m!]cPWЋӈk ~u>!L_)h/9X G{o@UU~huwJϐ);3wFYF3N4$4R<PXDYi]`^S))vih6Ψ:#P1۞x/> EH'I_#4l:oC$=u_}аP[|C/>9 ~iI eyZiSMCoN9¼.kxxyd9y""iQq/НJIz]~8缋!౤ShnkE^/?Ç S>#7h~FF13I:S??  Kh5[[/f}P%G ߖ7{9Q^tk@PA_ yW VCz{{el_$ Qk @Ɏtj2'": 6P RI8 ͯ>@IFUy3":QS%x3c}g""l3+>\E=t@sQO ]B_Ev- CX N".ӂЇ<̙WbȶwS-k!K'; um_E&l4D/La [߲_xV=՟DV/2p|-8sj{_}!9XEQ#*kr@ =| >V|)^l,6){lk" Wc8 H8VZژ繽ﲀ*RDwO6k4P0ZylJGU@ g4ʋh Ily(riG^Z <3X ) zE('VD5gu100`؀%fYf"РڞX^^2F\t7vtv*t?ܳMPyY09+^clSP|3*-8+f~0)e!g& d|gkk 4M'K.4I$M81L }r3&ˍmll48qaaMDʩtk>kQL//ƹ17WvtvfT+Qa (Bq_{zz91l3⫯*WVV='wU| ߚғtIENDB`aqemu-0.9.2/resources/icons/oxygen/scale.png000066400000000000000000000016441272330227200210720ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME 7Jy$IDATxՖKaƟwUӠ:N]j B;]JÃY`VIs!%:t.d)*ٷo//͌3$#e>(T##NFλ &Tqe$dLI6M  ˶Q* FLA27r7>`*] #'  JaX5+KӐo#>,P ^7ñW%2gݝ">&]k! !܆u~60WBvC]+ߘ l '2*e9ҐoVP:gjPE?`[b̉u7p(V qL:y+x);Y4@/ᘟyOQŧYCGe,J`-=)(JY/浊M7E!?cT1f+T{7wƼd:BV"O*Glݞ 3ƅ-`)Ƙx2"<#gkJ اYO"UκJk0sv9?[܆D5ݥc$pl̪"?#C'^Őf8ZE ׫暡P%ǀu  x ! +3(hs\u,B?WA[/(Ӕtx}Vz)_09[O?fخzJ(=+ݔTt" SjA3V606#>; ^%WM} ?O_^*"ҙZ|L3ϧno*-dm-,ːlX%M0A3M d(ZPW\#TE{##jLHcS÷0X(n)j*5j`,5>DxpxBXv.â,ʐyO#U %^z^6Bgx]=!2ub'[8{~aQ }$*,+v—R&Ox\Uꇗ˨^8q=$),%q!C ?K` IENDB`aqemu-0.9.2/resources/icons/oxygen/system-search.png000066400000000000000000000036711272330227200225740ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<6IDATxSC@cۧNN)6{ƶm^v:wUMNDmЬYnٲ9O$Zjkkc`b@!8ԩSb1$fbWuyIKݻW۫W6lt}ڷo ?2 ڰSNy멱ӬMMMhiiqf0uuuXp L8qO *)>8p{555TQQA"{6пP(&0ZV2d2h4XjKKKW@vvR42Q^^N`Ž^/{<r05řZN,@۶mtBx/prpQlTѮ]^0`F.\ Gq!aǏ'Ri$FB/v-'j`ѢEgܹ|eX,e[nė+߻w/aLFkC.7MgvU*iZ&lx c0?r W*ɛF, 㝎=76mm6ma`mDkYGk~{~7ۗnMNrs8Os6n&`7yxϞ=ʢjZ|< O]VqqqJOOݻ92G73ŋ?e?=se8ApfcXΞCtlBm<oX Pɢ}KjSuvqjJ' ۴mTOW@QTT71sqpBvtGx7 f&еkW͈*oKXRC#}:1NiauvbN0f50`EЈ*n 5;!:ol~No3T{fxu`GWG{4#tH]!dhpL,hIhzxx@wWsӚzWxt{J]-na7{VM50`E-4/<ցv;w+\D ygWDbxs\4Bm<3ճ/3AOL8ߦMVөf9<0`E-4/<{b)-޵[SU{Eh3u>IENDB`aqemu-0.9.2/resources/icons/oxygen/terminal.png000066400000000000000000000016721272330227200216170ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<7IDATxW5@!4ۙyh ybĐ333CdguhZngvo!0 (4s $]h+%K(A€%OQIyբiRsYPPA}'Dy1 ?gϞ€)G/JTBJXB7AFC0ҶmhiI`L@B ZC7o 4c͘5@'ŹѠaZlgF!1F!H(b$0J6k۶c I_TT&:.Z'"Z0=lJ^z䓊viӦESeY@Vc#!M693NC'OhTQ^N._7ohr=7*2`` ݾ}G]vB<%)45>-\V\Mt-6`VЉSѣGA Ô($}VTTPyy6&xZG3 Ta8!1nBY-`*۷oM4ihQHԈhc5R#3P0[8L 7-Rn?ܙ={^9bB{11ַ֦)@;:/8>`ژwW-^MjsgNڹd =˾s@#[ m+d2_:YϏԭh\ L kG:"&%Į'vO5iXSZC*RWC-r J7WVySk!j>gwp"gfLaUEk|sK޷!ڂ7!;+{:E0 q=M}WJ\H/L`J[8Zvlnݯ+<`3ox';8C-d~>kW3n4r3]Հxd( ܌9,|Zs]_V=]FMm8R g6>`ʗ LyAH@"#%aFk[usG“-`OԆ]C dMLXSs4[N'骮& =oϿ#L;RgCФς8K GQ^F]UFގۦI4-)(ɗi9 Cy=ۇ y4m\ס3UN ]'sEӣM Vלy)pBa8vvBme! z d\RS=x M#+?VITrтL -:BI A`0t \Y)NF %҃0nϞG#F@@N>4`ThJ@ULqwi@#v#rM 3+.--B^q c"HY c:Ԝ2L'Xqxx~+=4`cha 0+Ka*3{ϳ/\ӍQsHn~X_BduIENDB`aqemu-0.9.2/resources/icons/oxygen/update.png000066400000000000000000000042061272330227200212620ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ{Wǿy}߽w(`Dj"?4!&H4 b J4!XRbe7sg̜s;eY|ɽ}{~wNH)񿈀;m5|*o\[X\R\nKBػ7"?_5n dIg;/^^ѻNX0%Jc8<^>r=d^d;ݷ9k箽{5uM}eU>UJpqGJ'ؼn qĖnq} U j 9+6c_[`0$7:Ѕs-g&nun^яTq((1048(d s,vb^aJ2u-8Hծs%\K(Gw(\fѕB,11 l23WT!0I(vd7/OE-&mKN xK'XNʬ8PoQcC: 6:[0M] 9q <|@J22 ?Ly[ S =3b@d?n;/&t A^cwFj^N+qeFz'369005EpT9(`sdΫo9f$ h$FPlP zbӑr9}ЬjƍGP QU@҃FXr/G}8jء"hG6j$-H,nCa):D*qƢC;C"₰'@4fm( i,d>)ja2:NA M ^$5 6}Dm]?-x賔V G(6` F.0O6q,EvLyUNiW9Lnpld;n9*3+~%s{"wEng*iR~[NbD@Hj Hb< V(` hӸV)G8ԻVP #efXFB!\!!ՀZj+Ca`x$Tl_M<6)0JSCP)wilrs_7^l6PIl_mVZPՅf\$()BD,YAUbp 'RZ^ VvTiQr 1MҤ!n })@6a\\T\aBD\2I }0!ߩY>)'9 RF)Pc 둥!Q].ndnIEh.ڟ 9m .-| yL\Y ^/tl~#ƋSS#0B]3DKk`R M󯗤#ɧ790r23-)oq-: B2tAyVO,R|NQ`3 @v)I0JbE#M; &4a٘- KCŋ͈{e bFd%eM h%c}AE)N$ç{ww}:SZso6'ǂsQ@ @8 a!\N\iq f)zJr8^íOjͣ:n6}nkBřJF@:co 'qE~I9kys;8@y~Pk>XL\}?#< (P"^ BY#<"y}+fg!;j?0x9ǛߩĵFTԾ$@w~ T]+5ݱׁ 8J 8ƌ7I ` 0]p[uafXS ZۈJW/tV6H/</:T3 DxQ=&9FxOD\*J S8fs'`p +l:b4SsEB@&O.d jrWS @NhcK{ FD#wW!9TA\x{IuHRCCL;YN0e=VNf'I䀤@ʊN(X|"jUNlũ@vQ41<$(dIENDB`aqemu-0.9.2/resources/icons/oxygen/utilities-log-viewer.png000066400000000000000000000023471272330227200240750ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<dIDATxWkY윋gm۶m۶-km6V?OTug b +8ls`- |zJ@r&`cA%mÂIJo/~8el6_~1^Uv{D"v"XK{#e, X!Inx0N;Բq_ߏwyGsQ3 l6p iJ444`}eFd2 -. rr3;[~}-"LTTT s~ \sJ lx/pG`M_<-f @r=V{oTmJc1|24`}'|-eySj"F&QXGo3#A./$$l;/\I?1mZ'Ҕ6,?Hxb  ZZ[q΁‹g\YDd4 >BbںZTUW^Z((K[d|| ߾&/ WnJbR +7錮YvaC%yQ! Zҁ.{: 6j 9S뺺r#0j |%tH[W' ] 7-_|TnT{32r 0'0l?bvS^G|浀3b C [,cs$P$x/ I K]8/Ȓb=' j|"&X0IRDjK.8IENDB`aqemu-0.9.2/resources/icons/oxygen/utilities-system-monitor.png000066400000000000000000000026371272330227200250300ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWղ8l%v| _gmiyۭR.W2˼K:ӧu$'&IV_l@*&fe)3%6 . bl lӌAz&*=%ZgbذaCFiO^s 5b4j@1;APk+bA9+"N8hH.yS[%]]jXy!%ZA}5oZ6 ^UQTI1I7*\T0$3bk(yoo`0<<ܜ@3PY _&cTJPeYUtT(ןEGGhB^Bd{￯S\lXj|sܰ&TdT+ oLqg%>?BUEg?ƍ7*ȑ#W=# ##1s<-o"…CEHfx D"noRl +ߢE1.d0C#AĪ0>>|AŒ L􎎥Ν;}p77'Pfm `'IzC+;fȊ %(c%Y%Jh)l}O)m1iQ+qs}X\.wB&QwtGmMܹ)Kإ׭Ik 97>VO؏SO={W\ޔY*KLO%eƚw4O?r'"ni/d$ Ʀ $L&~d|#W*fczٷ &g0闩Jg }yY[0~dx);mFϋSOc2U`¼yXAd=cǎ=Jv' {f( 6K*Ođ$7\ E)P%N>7mڴ+Q$8=m2*!vDc[Ęg4xU߉H2vȊ IENDB`aqemu-0.9.2/resources/icons/oxygen/utilities-terminal.png000066400000000000000000000016721272330227200236300ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<7IDATxW5@!4ۙyh ybĐ333CdguhZngvo!0 (4s $]h+%K(A€%OQIyբiRsYPPA}'Dy1 ?gϞ€)G/JTBJXB7AFC0ҶmhiI`L@B ZC7o 4c͘5@'ŹѠaZlgF!1F!H(b$0J6k۶c I_TT&:.Z'"Z0=lJ^z䓊viӦESeY@Vc#!M693NC'OhTQ^N._7ohr=7*2`` ݾ}G]vB<%)45>-\V\Mt-6`VЉSѣGA Ô($}VTTPyy6&xZG3 Ta8!1nBY-`*۷oM4ihQrtQw@4M=ϟ߈ xce_tEΓ.́9D6D27Q6 LX5]G`2zp?S.OO/ t@E#KO:0df$Œs"[2 -24i?ϫYՁ8 @_JLWR:!c#x@?-f7]ہp"(`E# (F+d(6qGy,#L9p90lRfeGܫ7zoGn :ø$ˎ"a$eR?8%?VDikΗ*߀X"OtHi ,KA߀_$̉a{)m@e[3U8ԗRZQ9JP/Uë'^-J$Rjӑ(gvVj RREUkʂO 82 5P!+C.āu.R}n[Zۡ@s"0SQRk=PR-X$;@VNxT &Ue_*eq )չ|#1\'+'4YjnVw7t*ݝ_H[o$v(*NglI9b1%8Yg\{vj q-?4*hbNnض*QmﻚɻثaUY's r= Iﷺ٢u{صbRƹzzQSSJIN9Cdde. ee(..W,+dP BE#??[\p0u$ܟ̧BEE(SK(' @rPs\Pϸ| l:5 4p`RQϰlEIpvf3g{t0h YQ۶c$'y<^PI#a¢ފLIcbb K,Ke̞QO90=.''K@d(,(UT:aܨz݁#<{O"($%%P4 \Xriu aTW_RR}Sʿ߁K$(@!z~v1Od6/AwW0% 'H>q&ҍIENDB`aqemu-0.9.2/resources/icons/oxygen/view_icon.png000066400000000000000000000007241272330227200217630ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEa efl"r(w8BYϑݑޓ躺EK tRNS 123ʅ~IDATxڽ@ Ew@YdUlb@ѓ47MCa E,P]QUE:knMօv]hl(QyJ@AB~IH) 5\  |6,Z֞.+0_aл/IAPkm[ZIENDB`aqemu-0.9.2/resources/icons/oxygen/wizard.png000066400000000000000000000035701272330227200213030ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗ PU²v d]G"52PBE_ddXJ!4 AU†NδfQ;|sKCOtrrZ>{{?mO//o.ruh3bUX~[Q, g4-=4q}P;WMmL_kl!+ۡS0H9JNg |%:1)IIIc[jk'`'`"cillL,Ǡ='<<| tvqXTɜc70_11<Cd[k,;IdddƍNTeB\B%'AF6NGA`rUEݩHmOBܓ;%xapz_δ$gϦx-ZǂBKyfd= [,7-CqS 9er=o84&(S}ݾ)YҭO~K BZ{hV@ՎjO[(? x~xx|d+S1 euЙ" weNw ;}G%%An E?qWcWgquytnֵͷ/G[ᰧ<7/=Rb.uqqDzݎ@Pŋ@xIq QOO ~~~OQ@ g}\:fl+`WdBxRh`)L&訲377E!""|k5&` FGcD$à>puǸ*E4cSw6G(&K])t<Tm&g|@7\7M] vb1CQk1 "88a.y.Y~0~,hB#R I>puu[[6/ZPpF))k ' 0uT);c3:511!W0!1`eeE;cb BUgk*#CP .NcZʂIENDB`aqemu-0.9.2/resources/icons/parallel-port.png000066400000000000000000000254011272330227200212450ustar00rootroot00000000000000PNG  IHDR,,y}ubKGD pHYsVV1tIME7$p IDATxypa&u (R$D$@HɤdI-ږ,Y5uDNƱl˻vlgs؎JŇ*YI9qDm9-YciA.x$1WwӍsH}* f7_h !ijqq+h,"b`1ED""G)u>ީgAXrooo&!ED ,""XDD ,""1XDD ,"b`1XD""b`΁w^(ea1ED""b`yKXa./9Pl.Xr^NJ/BRD"Z;6o߾FӴRp|ds=w61)x( nOwMjsA~wuA\8=u[|<@ ~X[nE"QJ ZL^$)d\@ 0r{~AZkAMB]zX]]]!Xp!|ZX~oh LԴ=6nd\X嚋&8OyX(`Ņ(ʆsA˶m_!5S-rmeM6s aPnUy)6A khawkTve?3uh*l!*GCGG !dRW4SЏ)h}6 r;aTQ+yϹ.5ECL:,Xf`bʅe]*lYŰ.[U3/ݎB g}H$? ! @fCe&].3C[),SLrCy.Z(֚07úb&uttyVwwהR@h@h fCe g,|p>|fh&d>r/ي ۷BlC"+{`{8ϚTPS Z.uT i,uXw..*(l;׃ga0*P퍘W>zgb[jgO.-x6%FD?S8 ;ҽ!qS|5^6/}x2{G0R1 /-ѫpih¶> #-$FЌfتa-+FYMr>"J'a@U*eUU^+az? c&Q-5aܒc,kqj'G"`޽{#˗/TDVWWs"OiYN<88QU!zF)|_3zFj+[K9b_W[균%Pru-*%vJXZ\vD_%Ev.+-EC([#|>of##h pс0CpwUl.A=>op5v VJ)<9"îe_U;;)6cv֬Y"nĄ _<1$~|I0=v)/=T 3 -3ύ}W5\*?IC"UR{cs?ȩ`:!uxgXX?!ryb,Y<<+Q$SQ~owIڬ8i#Ue s53 N]#b@XÙ]?f{`8nydk()<**~ ɾ'=j(+8d˗akߙ?6cXY F|Cs{6>RXiJJ<;/_ LlgVxq3ÿ񽾇~r2=oaJqckae*k7`*eo@ɼῬY'Cٔ6^/+ Le9^y հe=crվc0敖,$^]_:)ǎ~6^~fbbYoi)ֲv8#8zB89 ^u3ZfAv`ywKOr۟9hY2G;DeO"% UǍ7젲wdo,Y}BۧRSH)3@YY&Ug]|SCv6u\2F4$c(`eg\Gӳ+r=i~۟=8M-O^=$#4HˌkfUqiiqdͪlS[ L׳Ti%}D;3)Oհ/]Vf۴lZFY ˁbD(&QVp xMqFq|itE6XZkقjd{'kCh~ Tzme5u{Q75Uǃ,nCD-!EUXZUEd_ ܆4` DuR=}DJ)@A9YBJ?;Tӛ 9:}X-"p똷*Vtd:+}/'$ :nuzK;,܌ZqVG눴V;"KUxxecՉ(juJC-(fv#ء5hVVT!hX%:i`ie2[j;#N+zﰂM%aJ)N۶mu:3fZKt]Sd7 x;F18SH40V0tv,l#8n%є_氰€e2V-i&fhurM;5m۶WLwspF /)y*sn+m5&MvvvvLdʌ~9ZYCUU¡;36մC|mpI 涚M w5+t &$R8,@A\3 ELih! ~~cs)_31$lT+ MܗXԔLHRPX`k˝,wsS5 >C$VQ<|gI96 E5+pwXnv؅Fpy0'&ҏk\kǝ57Z}@d OێrbXckqkUt_dVCYSGB8T8e:,빬]H)%}+1!Jo]gC>p'j+?s<>kunЫ' [b4xִ2*<ɺOs2|1>_{"0<GjN]e#1sȺ̆:>_p~v'7jqIZ, 4#nOESqǩeSYw5'}X*G";nX3< 偁Gp(ٞvϰ{_x$9M٧< d~':ϰӿů2{6Gڧ|3`Ʒ=2B+e 񟑌cizv5vd{e;D>yăgJ  uO.fWo/__ț=-A_Ⱥv =*?t-PU_ԧFʽ ^&6|Qat a#kYyt* ׏TBA,}3_Kƈ %ѫg\CgkX2/HǦny9뻚> pI$O3*xFpWzH5köS+(lͼ!5ET{>fʠ<{Y=1$a:.H}ԵV5 VN/+؃Ao6z0迬LN.qd}/î[}xY)׃ְ24>rk@QFͱ`Æ)fDu>jr=sr 6]Qk'Q;TGr/Pe%o;9aصsDrx|T[V6VTRGƱz$GsS;-G4:e 67TDj+4TJC/0CEPzOM"ʩ 8oXP$8++]LB9𲄀 \ΦNԓΝsMjYӰM.k+v5x@W2,USz> \*ǝ- 8eS3"cME2`S!!~;ب>kBnjWsX7oo |\kqkQǍ=՚y7Įtr6F.۷n^VaNqa`MY͈ 1۵P-"A) IDATQox@5 "ڨBX54ұ_#Cs v5AuԍVUhF]Ljm)ЖJ]y`+\fSrQDwmBaa`Kp3, ]_lǦEMe.µ+}-+htn(`S >h\.5k(+YJ;P++QMSoոV fbXf'yؼ\'[,+%nrdV=eOՎZ_h]ojv)14KAe$0יAK +Rʏ6e!ve&SXjDWuoT oƊRX5܌2f[|NjU#&r 2pcHB[h>Yitg3_а:ٷʱGVU;Ԋ(ZjtG\%8 E߅KZZd7=O58"KVj x gqBy D>Pµb@`EN# N;T >x E*.mн'XEhTY(F3 Q[rI: (cxKGyƧR0J +l"yG*;R_; /u{2Y!P!ok"Y~ha?[Z:4]-šwjxty7'ĵkÝ1ц'Gvd7N k%zn=ERpr;^-ez6֢dd23x0݃xаFoƖj\ãk_tiλE˸ `OS6N l@jZaxNW+aZ/(35!Q!F&nb=v5Nb61  6ˬGB ײοՆOCixR5Hfpk w!Pt/Dj3Eg6wՈo}aNGWt`ݻ7288eNχ^I!IФ١(}1-f6K] obXQ4yg΂meA>ϵZle%a_vʋyc}V4 hIDLhqwg5aH(M"6q2BH"l4":F^41'mc -̀;Lы!PM,|iR3l(:K~`^[MBwrb PJ=|6⸡h] N*i}kٛ7 ?8d2= PU36"Oћ) fI5ʹw&Քf6:ü;k緰o|`Ϟ=T*k]#{NZ[ͯ~ e1YYm(Y e C.l}%V,q%T{gl;vtJ) kUЏes6DʆHK #GC(6lۆ6cG,x.cVWJAbJF *eǦ&[{ߩߕk&VAKN)?V;)Ko;/^(PlU=n:u.buA4נ5m5] ޹>OM8dU PuAwţ_v1VݛRzZ4 ~mnVyaT1?\}pxcPz9?A˿oB}s͑RuֽR)`Tr`utt^1|kp/:^ $Юj`w웫 %j6?z-ݑ9 7\It&^a0yV|맅>Ъ^6pe*Ǵ"oaY%z#t'lV[Yq|ฦckȒȗm#\wF㘎>k\Q6v:$ w a{dUhx2^@UC}Ny^ZG2| 4 =u(K+'TS]&8ĕJmXDe-6!֠5cbd%Qp>}τ 9H?x4pC0x؄eIE `[ ɮ KdW.*>23'DW@۩mAׁ0A̛4[/;۹4pv_@vv /&KVxLOȐ8;C K`J촫'$3m-G :3BW V.a+C-/Wѵk'sV aK%9dPr4W Pk Zyΰ &S@DC0+dU4El151Fȑ?^2ItvÐHc3g,Zfdi"NfOo,U}H2>UIJ ж0CEhT0 = 1#Dfpk%4/8sYuuAMښnaƗ\vjyVĚRA2Zg;u\BՆ [nt.QeAs2YZk ؔ$ɰmKz ͤ,.:;NI6䅜t- e/Ly Fbk ݭpS7ޠ%2!˝ yԆتiyU~}6Mu{hmi8;l\-T^/X<!w7LyE,&kȰĒfV_s\(} |[3oWFf<w:dy+ y=#K$TN:/zlWNW,~>8 =HQ}uiQ ~Z*'K`fFh;*mrѪyd4qyI .*9!GM|Ų$rn+@>t{ B#wf*TИcR*ɛfP^:pՇi.<C#n2 5.&> ybYk6|ò!rGw2Y[Zόw'D̠LN1d NHE$46!kS-0ǜ6W@7]B"- `{sG,`R ~rc[D$]ϋ Hl d0ecPH k|jyf!">nJse_nCį殸JﱎSlyCZ<>˷C e6X`2wl3V 'A&^X)ˏ<zO'A|Aty'V_A~t==3pG~2hE Q0,ty*V= 6~p8{بߊQ[8!2e };K-E h|s NSͻdn cYzl@DN HkfhZQȆ8f@mys-R2K}]*Dok8p^ e/f`Ѭ#,4֧(@\+qX2%ӵ%5mJZJGb{C.fa4O|A ]Au-;Jhj-볬7f0I9F=h>Yɐ"MDv uאu:jw4` $uiLɰ0y[IӇ#|?3OScIqy e,&aϫZe{tQ-R'3P걵%p"gXщk" F]T^-p[Z͏8*H`݄"<:a;glp D$5jZA?*Z#0D97 LFeLd/d^l*I9gH୮垆7upSomgprtlw&^S>I[j4Cc܉j5J) 86;FFg?u߲zUT<;ߵOdyx>7 *&#P£n;ېza %4GyoDbO+dSJ7N4[+dokZI`Bzގh)@3SՈ&oA9/Jb7O8:htƜ΍,=_hH9%lSNr:b;Uk uO,B{}VA~SN:CjBuw!q0}6A԰+OrݩZ'ɋ\W926%IȔTc a`3@r#' rDlSb-a{@U|@΢ m ^:꓄l?PZ^J VAVY[R4f.(q/9@ii@:Nt|,n1 Jbƪw\v_oG4lU1fi酄tikPԏ &Zc8.אK-{ AE7z $צ2>˭۵֬~ew=SBd$La-L u4Յϭ5K8W1&lLk{^vq&tmXji>kbY-Ц"=zl5d6ySzm6R1=[~LNw|3 GIL7 yA}0iǐJ\am},Oa@jjg+-mm㻁Ã"bzi\!ˣR 54f;b]pTFt3$%q/Ja~?q6) Yfv^h|O]aՊJKMeB{'EyRE:(MQ3 167R P2Sx cëAoYeDs5ӯoCEC6(Yy78ګKx1_`4b_>V45+ؾCE.dVX4;S҄xYcc Q6h4fVkG]hĐa(y3 ,0i:(+4kp~^7fuqfNO]ѽ >,< %UUԔ/wC_;Fi1d=.,nk:ªlR^q|8q!2 j%< :NǚfLd*IgX4ѹYF9!#5`t Fq ?6SS &!G.Uq,l5†g =O `U97gJ!.Y )sne|YR|_ Z糙$e!YRLkmn?f_]+BU8K#s˸6 U|D~SP)_ILO<DVTĆG3?(4Pliy;ojkQq@Jb܀̯ VZ#pv:2} X,˗ZJ gxy"kYgS kGeHʼn, ea$Bpk)!.C5s Ϛʟes}m- XDh`VҠ]Օ&G;u-OYn}م'#vI(v(ݸFc}CB8uQ,\l3Ev׏1(Pm̵.7 #Tv|^/E΍nck">ʷ0"$M>F41dY@̶MB񟛧̡6tDv5;/(BRjHFY= V*$oWpD{F2"1A(uo6v>dFIRIMB4]iV&wot>o>Z2 2uY)ɬVGw4 e%DW)2 g`-5YV;:IPE#1 բ_VybJ EvJQ<  C:_/wgMkQ*p숵QLYMhD5]CDIDATȭ U v5f{"J_-jsd %t=NU#E* vTLGYw ؇3[ פ]\ Ey S02va]]MsE#@MPqHc'Qxy"s3SI@4GmXG{4:&da|wDVR PBNpJ}ldLt1w7@y:r˦Ȕ Bۉ5yIJR˷;KIJyP < X|ڋrBOQ.3#2&,6ۏr( Yړ.) |$j+aj728^DxsMcodTiR}$%vdIYSTpo? X#e?1vۮɀwYln"˳P|#iJoB$yoYS5C+2 A#|;h0]fR6 4v`HyTq_8f`oL}"sv 6@8*{‚0A'"X~#hR͐Ȝ=+0Xѫ!6~#3#󉉧/|ěAcԆ]ށ^{g>xQuZ)~`F*~;\t˧kR40GwhK6kUX*ס C|`%fn#W`+;c2L̥3#_S"~<¸y_`(Tn0va-FImvKV?9;r]i~Jg6τE`5L( %'cIVQʀ+1p^Gg!B]+Q*);)Tb)Rlb^/Im~ևVƽ` \6ȼ'ڸ@q7p\ŵál^7Ɖy=FJoqiqD15kCS߶Xl:Pgk.hF-: )V_Lr'Ҏ؁ 0"ň5B O 0Z];lF eBlyW).$m xQ>s9efUa  epE!&x۞Eb(x"$)*&0D U2~l(,"ۦfX5c֍. vY 7o#P5E;<&atLS 0 nɲ֟QFK~0'PT4{<إg'45fo ](}{#V ,($OED_ Zvĥe# {W4C_L|qq\طм^YoVdDC5aWB}3܎gE}ɤWiqWջN򷸊b3~5ku$Xi]uu__ cc^%#z71c/Kl >Kp6߂oQ&)ŧa7^m Ji:ON,xON|lb&@ë ׸j +#=N+D{nWZ ^i"1.m'B{\xtk[ǃ}š19^$tk}vrk=΁G$Geiх؍W5XQՃ pOIENDB`aqemu-0.9.2/resources/icons/pointcursor.png000066400000000000000000000002421272330227200210520ustar00rootroot00000000000000PNG  IHDRŐsRGBPLTEٟbKGDH pHYs  tIME .|VIDATc` &0OIENDB`aqemu-0.9.2/resources/icons/pointcursormask.png000066400000000000000000000002221272330227200217240ustar00rootroot00000000000000PNG  IHDRŐPLTEٟbKGDH pHYs  tIME(RIDATc```C  JBIENDB`aqemu-0.9.2/resources/icons/qemu-black-and-orange.png000066400000000000000000000222331272330227200225210ustar00rootroot00000000000000PNG  IHDR>abKGD IDATxyW}?U3="hYi$Y%ylKd$  I y@B!vbc6/lFh;twսjWWZ3#ϩSU{{߽[x o.T_beyyyru]oRfՓՑ1 %L !@0 [ND9۫cF)ź4M뺮kZe'7^B !;-zNJmv`:98#)//xa[u]?W4Cut]G4t]:jjjX,F4EubT 41Md2CCC 388XV BtBJ+˲R>?uS((| _80MӚt]0 4M#1|̙Css3͔5ĉ;v.L ²,[ eY,D"ӯ~yq }!AM0nxV,Y… Fs̾l7D"СCR)B [_oooyZq [o=OF" [yXv-mmm= Jd_;vחS eB^SSԔeHvԧ>ui,iownVgٞON}Y<+XeYG-r2;/y&i#oya7 cM=_l7of֬YcH/F~{m;;;y'8vX,B+eee_;-2OJ]l3gmܹsDMKw"ܰiRJv?Ȉ[˲>o}M!fL 0l٦Mظq#g2"uH$xxWĻeY[}{LL1]J~uF]cv]uhkk9FE޵ MȲl6x kțEXBRJ"mmm̝;JT.R~lڵ?9=i۷o7jjj>DZuu]gժU\uUbLeG$FA}?m^ҫAݏD/`o f-; Afe{><<̽ѣG܁,ӻPo~hFt{kXf͛r WD;C xD$c.s ˺MJɣ>ʳ>"ߞK!?J)ob/ֳ݅MJDm C aV͝˭H)9tFI)/Bl[z}v횲q)@{{5M>)KdhV` u3UEK'1N!!b}Ǫfrqg bY;|4]bw.Bl߾=#MM=Xnl6#=H[K|׃hVz*MX}v*++Cu^1{)UKH'OXz!B[s9RSSݻRoɒ%߿X)ʣ$۷o7]6'\r uuu98,4կnOdyj^@NeXreB+\!oD_R#jYFY) B-OOq൞4B$?|*A\zQ̖R>v/'NlݺZs.:vsv M{zKcdwMWX*/wb0Ѵ WDBpzEP+lke弗iZ6ر皦ѰLkan# _î_8 ?Fn) gϞ@7 !hѢ5alܸ SWwNsRV<\Mo}tX[Fid(2ʘjZU7R)!Y'O|'PLWl{UyXbMnwG^}~wzss3uuuRR7p?Yli,56/_m~Ρ4ymKp=qU !Cx B|/S9R),~ZEOfEgK V}\Cb&T*39}hѢE*.`q)~' ږL&s=t]w˟H2дYm /"QVK*Ve6-=A49B|PZWe]T$ 4eOj:k-߮yI.s7"̿ ц+wˡ@, ~H$ٮ"~p^-g/s5Fjz~]dm!e$ZY1o_#J%"eYӤ7/W~iI$2#nn @Ӵ&YJP^7lR1hBy=sd,AXfA4dwnO , 4!օ >|xY<̟??.sd`dd4sN ?#E\q5'睗qۓòa&,/psîÜG}8c bT:`)e`g N*ۂ9m 4y9t 2OV,\sg "4hK(ʺv;Sm! !ޡ(Ts\=P=}j,Mz^ƑE(2-r"~"Bӣ$ݏliγ^0ShSW=iiiɻ:Uyk0\ΉZfh&r2*m}}}״ʟ"~Svr , :W'Je_xE̢e(Fس:w!+^^f+򇆆P̃*]_`*?Nsb)WgK`oYvˆ0Je?V\vr'O,,kQ jPcǎ1k,|9XrdVJoLüpUX ӂ&{t:MWW .rև[8 TE~=EGGG:kd:SӅd7%UV^A !i)S^A\x< H̉sݫtq,Y !HM5d >+3¢E̐ PYvtqeqqg}켺sGs$hVz1 eeY. 7svq^w-;.]BI~{~ɜϙ/v"Z8N[]5 8%ghƱchkkCAB*t7eM"=rO`iN8QP84m-iQ~ T{@I===444Я#Q{1 X{BZ,b]ά U]=wWIj۲tuueFTZ$pG٘P jIm4?|dd$?!y}RRfՅT0,;Ƃ 8g4< 68^.*-պ:~wG|!8?o8{ j^V@}.`"H'M}Z T"pJ[wBN8iyϽ8 ld4Q;_tG%~FkJ/55߆D`" UV/߄*H_ 42 -O/o%ň^A Trhh!kP-{EĂ${LZpߞ{ BUt/IX1e݄;oI)M1,"NY ,^WJSF'CCCʖEJ m,칊hT-rM?g>--3t9aIa,"x?\磣y5DIv9d2waO縀qW%y/\v922լ_FAJ4.AƝTȞ]}JGXVSXA1h粟Tz{ٲ,FGGs~:&~^ί{0 #cNRZu;qBLZ+Pa&k+eT>OLLd["; rC 3Lqt+k !FߘucѨ&ÓK$~"'* ?^\I)aZ &f=c.;i!<а _A'bs?k9朧%52 M +Ph}<ܟƓgp}<҂DFRJ&0xx밁?Mda@ %P o0B@tat~۝-H5wİyCVqedD#*b|zB$qBz>C+r }M{#"t("#~ <# WPH0wƙ@3V_ V$A2ie9&:~E3I~&fczrڸ;A@3A%Gj f9ͺRKDqXhaDe!i K>+R蠏߾*UzߊÐ]  7.;h' ~Ca|:8aO\^/{84?0y "ι_XҽwVHwo pC2/HJSRE-Q U,"H "ޯ.a){:?p~xjۂ??WtaW-:Z_$ %?Dk'~ 3fKU~+/sBD9(%9Oҵ ;"&J/ '1`1k?U(8Z:Hz$z քi%  c@#ɠ~GwxW PbȗR"gqQP1Rte ) 8@?XST.Ǩ\LJ xstLTv:  D!{A)cV@JNpY4/s k8hF| Vhjn\|o0xP nr- 5mFx@HɯS/x"D'ɴ~(ag6Td2^RJ^H&G-Df3 TJW$$hp}fP%[gExol"PQ$Rzh⼄Qqx?+B4jl*_6 T{,8? ,౉/9A֠)(8E|gBQVh8+Pu.[#X9e6?HıDaq@?B[Saw.;- <4A@Hy1i I!H } p*j{sOY[^V`Tj KOH~5ncP 0_x*Ȉ&/An@JΤE傹:&5HNb} ȩ~qL quBJv$5_%=fZ aH/qdud( px7 ]y"/<['"7IIKgD>ͨЃJF|9p>\/E͵XY{&l>< Z#T@󣗔9[R7:Wc_W˟adx!͏dF ~-ohZ0ޔ|gP#md#KSDSZA^bxyBrcC3,5Uv0Ul̻逛QKpYś xpDp(}Ɛ:ΰ;O%9NK`ORf아fU62OsT(H9nOɼzS:\%.x*!y`4c~Xȼ[{[Q/ $pV4y.f2ߨC>1(XxJudZM3%yn&.Ȩ6y)$ep2#X Tango Project \n

\nSince version 0.8.90 Tango Project icons are Public Domain: Tango Project FAQ RPy!tEXtCreation Time2010-03-29T08:37:06%a dtEXtSourcehttps://openclipart.org/detail/35287/tango-preferences-desktop-remote-desktop-by-warszawiankag9XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/~IDATxw\e)gdS6'N$ ;P$P|_ (@ = lMrcڙs6iϰ9s hE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE+ZъVhE[PwѨt$&!ڤd#- ?#F}{ٲeFVV[b臠p4p0jvӆ)w~V!UmM74X \uF>@ޞ+VHhE+θ|#j~8? ^k_)VъOU(Pa m*8vqoZ@u=̝3ѣF*۶mW^ihy߸ˣE*Zb ނ)&#7 x݄|$9XBz73*㗜HyYy.&477Y^D+\Ѽ+oV]`o4NĮӇz'{GfA|{ǫM‚x4q'L]gF}rƵ.Vъ7`ߒ07n_ Y[G7pp3EPU5b4e,%Ͻ,MۚiooGJ{^˗o.Vъ90cz+gn馠$gnJ**QBO~*+l5 W @,gMmf>kiً׊Ch&,?™d+e(wM9P x~ănoC((sֶGjiJR.] ֭[OoTUeZ|ݠ! Y8ǟ0 C8k~J' 6R^|XEۥ6sǣ5 e0BJYX_e{4u ?B3MuBhmM؀Ӓ-o~ PNpD&1 EQ0k3"==_v p۟V$İaCq\ e(BwO'-}jVi5tw8Ҝ|uh;dADbL!A3O@Rދco68} \ޯ|?qbA99Immk`[(XAWg'4v_`!1ܫ/8bx0"ϷFCUtdc%4n-;;1|ϐG}?R"{qc$lZx,z#X-7Һw^q5tuw9u+_h^crp֟t ׋FQU4=-ꮜ_ziģɇ-00q8H/HN+'ʲ뿅)ex<[?۶m7΂ F`B9gb8{x]HEC`tӀGm wi:ddMw=ija&L%#(++]GW_ӊ_]RUyr@LQ e%JCK)zTt]AW4L "PRKUSJF8 X$7MW4!%EO{.D: wvaZT)M߹&b0īn]-NA(]z4A\ī"sM rqGmްQ>/?hu5C*'p?֮I j&kv@ /P]>SQA&%]z(rp uUURQ[¯x*>ϕ\@`Ń{f td!ˤ$A8;7Iꢭ:ZlFOk;g\_ۧ 6nf͢ UTj-JRRʷcBI:: y^jhܸ6U#_ }P0(AIYu;˭h$E3ϯu !Ĺ`NiFe]-ÇP3a(- 𨄼>W#HOh% Haa$?kJ0ZikFF:imc&i_D@lRN[Z!C/ܿ߶ vh]5hDH^{DJKYs rW_acLP%&ȱV[}hF"aLr6P/x -k\r@;}uFWePS 0ji/IȜ$AJWTeTEQ{4$pEI֕4he4h 2%,|QfxUԖz 'nDk1wR槟>&Pzll>XSUm] W%zJi?W #֎7M7qd ۜ> Pk>1k/ +5ͻx?&d2=f̙İ*:~DH8B8!'+LWPД~.P=g493Bϭ&O'Qiu#֮${4H$L #)MSJ:ڢRyќ|{z=(2uI]G,^ܞP/^6_鬫E<^g?[QK۰S_?b8J;::XS+vi^W\)^fs^kR #R)r{hZ^NÎ=iԹ%:{4P$4J=!*dČD2X0I ̄֟{'/}3pիINPJ EvÝK w>{z1Z6`YeGÛoxW6@>gcO.^è^.ez!% =NW9ٓsY"'T˃ixt%ärf"O˘:*|Drv7fŬ%FMau |* /e<=clxtx{m8̵k1sH$;ˆrB8ؼ~鱗&pH xu(+ APے\j. !DiQ5)sg31cL%n]q9Lb8XX,F,GJx\.L"S-L)3 UՐn5òLzA$ ܛ j*H0ݽ5va&>5ow+.--  . 0t- ߟC<V]|/C$qڜ[r&iǎ >;kji&P]XϿ|rCy0j 3kc8]9_i=^tU5hhekg<߯5kֲa4x)PץuHB"DcwE%5֐ :"F&.q1xuD"l._r -`mΜs WUH$m Kls뺃X s3n )яnB6GĸQQ׈ӈ*Z*$مׇ驼6A$n-FcGTT7jc*2Xy7ljOc]2>HEWO/aG$R Lk 1OYc|xU}pw>F{; w /e~=ƍ{x%k?Q0d{_l]wX"`}6w 6)ߟCS̟:L xX0f|A4݅3ƦI% #bBr Ǣ({ͦ~zcRAՠA4]k( Kw a YܥL֜ Q=joKɷGK`Y ssA>BI׈dNTE%f*as{X"qEc&SS]Wݿ'zp$̾ EҌ+b e2H BU&*))tDi%k"03[h4'^݂b'lӟr)I>ğ}v. _0H};OUQ;՗N*KJ*ٳ/wb3y 0ƒ>)fj M1;c)Ӛi`qC#kc?c9{H"d n, 01&`*(B!{cu63x38wٞ[[o/xQPׯӽ~B!'6NiXRľ"`73@ 2uGN_:IjSR0M/HU8H )+(Da`$CXM1n>.9Y)7 ^ʭ l W .b"/i* iU\֮^F&oof=ǶB ? FK?sd$WUsC isiI:UI "Eڍ`UAI[sI5o*) P$Dj6*d"ABZ9.+_fDMs|nfhHi5`ZimJ$bE**R(BEQLLSɬUjJ -a½ɤ_LI<(zI e'!m{t=y/ ىԩBR~vjK8Y,[˧*ӈ#bi$ZbD%> }*%^A:AYOXS5ip"H{Fy0lhOin\iVeY6UUQUQP{EI%Tm.a]KGuIϣNg]}4 w>+| C3fN)G3)}k$_nsa νX!GUWӛS3k$ yDd=n`"RZU>m=6!7鉙j %誠ԧReLegqRUUu UGѵ=;Y<y!0̔͞ly,f!QՔKh()YD L#`(S=:.OkW%q=?ՖF| b|չҼyIװ{NǼar}E; )BE-]Tݴ:)N_СUwuɊf)ɤ~iE+ ~Bw)KUi(G^vKfFtl"0 yo^5?ULIY:P)=KJE&g ETTLE wHҀ,$t1SJ: `]]4q/wr%]ÿ}رj#°ꧨK; 5H}i\/\d:U該-cEZ\75w(^_xJ9zNq g=a==aПYv꙼<^o;h=㉌{%gR-VPU5"**ԤUA/m/T'hnyysJ] _1.v}>Bx!⛋ l޼ Q+k.`޾lqUdSͷ7͚*ut}`ތ2g"+dzmB@b ^v^7q}K%I?RQr'ߤ*>ڃxrFsړ$AmwsPx᭏  rġ1t.yocq?`wih!ޔ7z;=a0xh= Osj*m{ z#>H"`2K|9XG`F} }ʺWO?[wo?YKEU-*G%z[|ۙ1s8]/ʆӎאtŕL㧣dJ_ݥ {4nۆjL9qR$E6Adj$UfΒ,EĂD&CdV)%RDQUT)1M"T̸ UI]>ɂu6ﱯձr%ZI uWkjP'Oxスj\'t$ 04@QG-4uK1JEׄ^z2{hy9D&Sm{9`exns8N:wW0mL=3<eD}}~?BJz&Q艦6zqߕ`yx⩧yŗI$sQdzGRV^A4U6݆̄D%0Ŭ,;V +"S T5eEybYZ?ʥ 7M:?XC(6-#lkfanڄlmkؕSR 9 e|CEq7ӥξ˨qùG02~MӘ0*ҵ/D X—θNL֕ܚ$`Q'dQɤB\sO=Iݨ 2,#g KJBN)%>O]<===hi2g2=ɠn_ ՞ IME{8,ؗky|`޲(LԐ PRi<*"a&,וդۘ~r٨--|Fl~`Qt }tmE{c3c0"\`y wC R~XcVJɭ11cd~tzDΔ;x9V +_xQ&sW2ڐBWdiD£CgX^n {M׮^r[\.z|_dsԜKՏbђ=|`q UWex[76 e_N27XPK/I2]*2% mDJEUQDUMT:wyo&_Ew][]bl.mmT**ه[o}:i.l~n$-'H"` Y]\J~:9,_׭^z5}anM9S&*N0>`Xq<t(]w{7|%"-,:~g˯BFI3=" LT !19%L5u#g5\A]RF,!)eߣ1asL2 i=,I*Գ)RK (TUT+G!s(䰫4ÒRbzlYý7t b<>`n؀\sSBG űC hXݎ޼|"` Y]v9pk' U_Y+_`i Ӯ*֕FVh,p*:ܒĩӉQŶ&x(gwiU䶐$IAy=>Z1N*8+1}glk (( "U5E*~9c+1KCU>_]]Y3n tY9QV6c6{3)TxXe!34vLW Zkܹ ¢y)}~Mq]綻pׯcc;dK::Og~]BГ5ܸzCE^}.V6s g,\nÝ0%]QIfZ<(Fʃ6aQT JOYb RɂXP\rE}n6d>A`fe ^a)P5A 1ʋ^[[Kk[;#M||^7xC6/-Y :5nݺzs-aUwP;TbX]`=]~iV$͉a !%pֲO?㧿5oJw(º^z5DԏRI̫Ko y-9^\ɰ SfKb{u6BԍϿM}W)3x}ժXWʝ˔Ivyߟ}v%Ə?%66PY]˲\Ĉ1--u-f@T&ԕ(A<ݿ!翿wɄs3i@ΟV=Fw/ڃF]?y: ~%ࡁ4evk\n>)`)/_ꫯ.Vn%H)áP_4:a_4`mwa0u||6%eqy_-c -lA9 i+W}08i$YV aBWIY^C:D1ι|@Nv:@dTM!eEd.# `؉D#y?i(}Neȭ}eڭU6lK+M3TUFVQifXPa}Ϙ_~u6oaԄ}4c>xRr]tqZs3?n;>ڞxYھx=6;?w?7|s)-++w` @"+kKf麅rRMS*mՐRqKdQUPTDKݱl Y߹ f ϗ(~"e9 1 XO>[oʹ1gA -L(S&f تt@ᘓNEKYv$Ɇ3`#&SA]%T&NVmqn&0 Ί"t+Tv zg%fJKA1VLժ2װ,2_CBwTRja{_v^/_>L:Uنu+Ji0˝-9-@+uYUfyYY\B4%8%>}zUM:%IW0Vj*z*9z%vug3A~~xwiknvnpKA)'7c9DlΜB@:v=Kpهu VX;9I4DV!/SC~yCLOUn>- kȀyuAk[+y73gw i. VA\ .YFf$- iMLdYEz"ì"m~ \Ldm=1J|:S>PYB^}d؟"TZ{UlظZ. nAA밋.[Y6{6^mc>ŮZD2"m0K E3ANuZ]\bȱ{ʹ 1:QaVC_v^|z9~?d "g^&Y!3_8SrCȸ٠ f-\*e)ʜHN}VMt8e?:˺2eu$*=U}P2G] 8ͺ/_ đLI\wZKa;dE7eFuvRҴe5 i&?W$J{!9;q^<`_H)qZ>e4q=j/??0ĉ_JXe&|AuCPW[MH}YJX+NBx.ђ` eHtBr~Brh^h~ZN%ͺ=r0'f`iVfa}dgoLEa;yH&2hHN9L]WD"bȊ`xc# =>}b]:[ms 6t¯Ϯ?ƄvJJK23 (\cdLc;zmсdfyηO̯oǽ{Cp0s9 ^NK׹𼳨 *I* ~18Hθ.<âåZSb̹V4T1 9gA*8xrC+YRn(DYM]X~>TUE4zaY-ے2~IyțN+@:P]M>r-\K|WG}T ߥלp~ӠO\s5mEʳ /&%紼7G]_{ٌ; ojf?naBMpr>'䔮qt=4mm}Hb p.{M6U :z N\` ÆK|wg'M[ˣ_6B^>~7LOVT əv˼^/}6G_y\ V||\0$/X0o6{Ӧ>hǸڞtG?e_ {/\2e_kDg!,$)˖! %L>k?^䊫Ï?S/Pi5l.`Z>` CGKSUTUMgq&'wP6V[zלVTy 'MĦ>̭xE;_Z[_@OTҬ+׋g[X؏d)TrJ֓X>%4uƈƲuO]v"|~=|뙳|:"uJ @4ohu;ef2QT UӨ)NH4=m` )ͪ1F w=NPil]S\,M8쨟qċespZ~ǰK+MӸG+ha*샻k|Y?,/ qZ9+6z]*7po%i9xwhoYE=>r :1C4:5 QTXp+~~zy0aT5"\.LaHe0LuJ~6Mtq>MӤqFZ|b̌F7]8+v ٺ2;wvܫI`5oeӅ^<{*\GXet2TPTpk 1Cb Qg*;y׷55qw1a4&Mg[UX rRVy Us܄%Ʋ\泵 g BoF{w:btf롕FJVxnRJ+tK/GGgTx,*r缿( ~\ >[C8@eFz}G'<5x<3EZ}ذ9olOk%mp]רQo Xh6:1WW;;VcVʻq&\ÕW}i3ihTJ5f u3Zܧ悕MU *LQUwZmk3g{e],%ef/vG䷜c^t8i=*=L.<p\N&>KXER$(Y쯸dRCGor闠*5~>7Gӯ rrP~A1t=$NDhXϲ/;Ǧe)R;j 2]ؖضu[LdWł?l{.,4X.θjiTIh*Lը )v!y9_+_J(tȠZ-'N6__1oRq_wsq$ET+JVLjBu]!!ON!޻kc?%7c~9' }Vr'{隊sa*AP*DGeZH– hr ț6¦cdgT[E歼; 5 |1Ys 1> Sݽ FT{QE¾^,A,!\_´2KB0Y*(Y'L쳶HbA[BsvYB!<u^ ma_(uW 2_o~ġCݮoټٱ nH ߀c/&}AAzf{}(WP@` JBٕ(2pD.@< "˦B+(ܞ:iRWɜ!uuLs5%:MdTU[ƨ#3ʏKSrۥ)]ԖzU`j|9zVVF֒C_DK 1Lm[бabPmڴ̹TѾm-}ȮN[I~M+W%.7I W,?ʠk8<&N`çPH)?v?t~;ʴ2iF[cr.S[@I6yoȹYv5r1[Uħs߭fX/z*!KYV-*z( .ph=3NZDM:mWUnUu5'Qں9PTXb /4`͟ ηQ˗a%{ 5P߳6/~] ]<A<5SIXs-g0"-L,3R9XJv]4*Nߋ@Nx qyiO8xlӾ"Etǘ%c]uy$RïENW8hWxfǰͺ}W/loFqA`0eXӡ xD"A9$E"ʭR#PH,$M$3nc:9'hG~{+.,bq'9?2bDڙɸT%YzNJw_7uۡ/_3B)IV~hEMu.= aS "4Pvظ͹߿+"Eb1uR2nYIEw4!kT}f +4]gibA+]/ 71[ e %l+[l Vpqa:Ċv5q)XPu`w<//D"T+]>Zg~c M/+!w`v庘#Fz/v☆7t_H?QRo8=X"+m].v/`_Ͽ3>T!9u2<^'O͒2LVeٗ$nU!s䯓3a Ot13M6Oo[o-AZJ34_i&3`f0 ?EwbÆ۬$r cf4 øn\.WV'pwAd*T^筨1v7\~"`%oݒsa!]`KLJywU+׬Y_`dF!X4>j@yFH&ŚLY2}.ᩰRQ*z 뚹?bǟL*Ϟ!Y#+u,Xy-p9J&{ rt']]]TTTn_^V'{CMM 9~?xOv  X_zk pKrڞQ,H?nzTUcӶN2[ມAqCP#(r,je,%,μ76Ȟycݚ5v2}ށ5ӗBiG|nsoՑA+ Tie&_.lv㠃]{-.+n&p`0XpL!-+`SćD<>BAeM}]93K 8r#N>#K?WpG-'>̶mMx<^?8{" (PD/M] +w,7zH,"sM@/(mW=+}AƠ27!ښe(EwMLyR!0O? P$u}D"x^nwK*8w)}>].v%kfp/`54T_CM:-GFJ䑿<Ï>Fgg'P /=Î:s-#J&y=V|]&Lk,l@mUڞJeP6Y!Jy@#x>3V[a{ziy>\o} -BI:YK8$Z[~\q)np-.F6(qNܹvBԩW:'s91һێU{Ga  8#f@kQ_KƊޒ q}NU> zB{uL /WۢXz&e~{KPU5=K$9L&eˈwt fBN,}(M?>i0D"S)K=Gɑ]`w,?r9Tq3&h >lh3 ~v9~^VIꫯ˯0q4+ˡr>o2k W>h`lưu{ݘMwy9eu 4M'+KYAǩMYҠӃ9hCmyyx.˯c2/X% +mWʹ Qeo] [haqxq=}W<\ riiAO@#%|b&rotV~UR4tG:WskW8!ht (c>f0{892kܪ8=9jE+YNdcacm2 ^e% jwI˻L 8sN8[rirU|tBW{<>A:0h@x98k]Oho]]=Ckob&x߇{DUtCAT N\c Fw2%ϕѱʺ%w#ⱭqRtA>g~ N_~\_ZڽpFW۴wtuJ *7Chc,aI]L\KWь y@22/+˲yiX,Vۙ*H(tX6},̘rG0BcÍEؽg/vރ{D{G'ߓ&Qg]uN|Ml:IU?& @_fd`y2,+2?9B!0059!4[a>.oWNx 6{0؎c'| vɂԞ)Ӈ77yxl Ҽ yKοh6à;" :3֭hok{3LuaffZ񄸜 C'<`>F% {oA$'P:Gp,p^ <#`3Tx Hm{vVøx@1H {.= gOn~ o9o VZQ3`K "_d")z^+둫K׼擧m餮cw1`IkEÊ-3;;\\90n{Uh[k+|*gF5뇵+Zgm?7[]\ cq⤵Ʒ_y0AHU p5r v-n[ Cǝjv\_Nj/ZX44ҰO]Jj6h$AQc+;3za>Qݍ\x9,>f@*N?p3v"и5*&jŲY!~[W? K8絗L2̢KO:KO57ޏ^-wǝwah<~_!D<rŲq^MLUQvH$y9o<߶|Ÿv;ssG"oÅox#zã* Vq%>JobrXt%wln\<$ !ٯٟxX5h: -u_~֜|moCG{[ &J V&,6tB>[ '/繛*>/a,K^|Ɩ/D t+,윔 $0JB"*nv /+wB'rڥ W/n??")gm0M#ؼM|[@falBk*\ryU, Xu/|iXՃ?;_Ƴ_^,]^ x&Qu^< &s#yˁ,]'?ן90y)2ÚlD2[n7DS&$!sZ;{ ;3>ny5l5:XLI筮Dw">ooyV^M Ϗ'd Ko @nD VgPF2[4ʹ'zGcy Zaa3ì-.)gtWؾHM[^] d}>OFȟ|R3)ͦ0S;swMP6mٚ/1j̐b.4ZC?FmS % y2HJ Ħn\x;Ӈ&".!> ]! -E*&x4|qgyYzʂnYJɴg\姿pt"dIq/Yo(\18yaXCI3-' `I&0d 9w}ݚLqʮ=xeo0͊O[ӁG(n'`S:O\Fal0Fx?&ZC *}L"Ak7CKL#$Gӥ p Xo ֥98=3/;d \wU U`LL%ScPDyu2`FjWuɽZjxu6 1jjwT 4.MGPH,4Tmgq6#?߫={x8m|DskY!C>mZ T(Ep*,&y+K3 ^U5y&2}d7(+mYۉK=&H XY$"sNKps^[wC>g0<2׽'0B΀K7^%bWED\G,W!NY@gp^.썧`MkDBUQ˛:R MCشoݼVu@@n ڂA=44$H{+V t,9h-}nwߐbˮ*F>TIv`] cU31J HfϠ,F7Vx +3( V7#R9\F fbUĒ,N%gtKVf\!S{`%J)3f2WErCbd2~~'"-O^k6ړ$fC`Nhld*NfW N*\YfQhAǖͧOoSaPNo pE%51{Bm uݘM#sx4&\- 8/1 %e"$V?[lLǮJuٟ: x0gfgqW}n;o>/v>+@2{ч!?+ ZSqsIMRowFE&2M$ pÖMB{9<Fem @gK[Z8gME)|笙KU/\2"&`,\ׇvgx,X!DJ3tvo/@ o6.];q8T!1:\p}z*x:^'RQ1]f]'.1%M5+D^4֯! aXv-6nXjʤxj%SI<:תU+‘Ggn63YuǺm5 4¯|1@gbj~ؽL&1KxADXtiI8 |-jy1FQ$=zI4}>rdBD:ti=96ouuw޷^o:Ʈ]ꫯb%R+O\ Y^X6;;8G"8#czCO>SS8zplUD?&͠u<t,"¾M>RҮxn<% Z}hj;H`c^jϪN_B2.۽w?>\뙙-˷Kr .\onvLTO}pUW]R&`922ۖQa.{U=13w`=F a:3~0?ڠX5Όs@Xgŋlrtww" AQ.e1c YYrv9*9uZ{AU7;TSSxŗSrĉ=n݊@ (y:n~yބ;v͡=ظ~yE5 !pXԬaRǙд|kok疮o#>5`"²˅f9Gxs:NNP(45Edtqp `d2l߾gy#;xdf4"!,SцqiJ jf&*i97uaBػ'z* ?"}G֮_u7+=@&X;v,E#"|>lذl#"H{qp Tp "M!Ϧ`9OE2ppLV`i2+`IE4TN¿pX>p4d2Ae˗6M`uUuw`3 gjjy&v7yhybY}tsJ0 u,vDdtԪvVho8rV'Xk ayM X:ztJ tm<??HјEBup00}hTnPzUο;h4f8tʔW%@XaOG3zK3Bu]O"krrS\m۶H-R1,n|u*k jҏ/"ooqɥ ρͪS8Z@r8h(R(+`eFo<~d:)^<4uɕh6C'N 혙(Yjj,lrYf cL]V}ţHgRM@7lej}*0\b`e,j #8>Lύd>KqtCRe.`ittJCmd2j;:}%Nf*YZ?Vb*? #JQ+|h hHF*|;y2t^e"'ʘPdl~cҮK,~^jYE@CM%`G23X @R*Wp;#`(}ԻF09RLH/VcϽEQR|k[Et]kX7̱`R5\`UKˋ&_Y (9Js xzx/ qt2^5^ӄeAD:1|pT$IRNqժWUj/zռuVNu'+yvaP:dl&{Dx٪! >}ww~E Ja|*D3vE9dZB~R (2CKVc;n՘ ̞{bB~@L|rՀc0 #ض5pR6\R㚄^Aן&Xy@\sPbf 5hk.*]ױ!Ģ1d2C45At>HaIč'tků݂; GO5ILF+6 8@p(gKbfz[Kk u۶m8mh)N|)}XX2j*mV٩ wrKwX|H]W@4L˕JQh?UӰax#12_Ͽ _#Lcioއ>Tzcc2]]82t@:wW X"I<x7ڼ/I}[ػږǪ~~z݇>h|xVDy|~mm%NlXo0FG _^lcN,+y5 ;[q@z[|QO$,=Xr!j԰#]=' $qoZ"""Y$zAhu<VF2bvI5^<veۻz &= Jw(~xod{9{۲*31ijNr}t95B P} %t)D\j8tM~ֻG_?6 V[ރP[N] ')9gYSSR`"}i0S { f E}54F y6]dTMbtxC"jAInYBkd'`rk"1up' $&0ղ-# "'2܋5c5bvv[GG\NڧaLBjhXV `^yiF !#"Țqy׆B ;H晄[<78ڛv%iqڏ\s[P?8c" o> ,:MNLJe4`fz ,Dw&aNw쌗jEP 3{:y 32Fr-;vU/q>i~d罘LѱTe`c%5==UU(Zkk+o_Wy6 !pk<6^jpFQ58m LB/lDoS 4 :Jn|>Mac\gty F&x&ۧ7ej/&* ܂3:_9LE.SXfc\WV`vlԶYO%IaMBC%wHWΉ9ZcD׈ <ЍBB'@xuu2-0]^#&Y*AU50(>@m(Dy ZN{@hYY*Y eK((ZZJMֶV=M9%œ%rtB*eV`|tCvM׳~8!2~/n?Y3t*UxՋ S'C1>C+'{Ȉ)94@; ,|}B*Gps}9;#a+?GƯ-ұ¡ҐrDwO9BOwASc\(Sq#&Ad<`*[ LVL{)%0񎙝BGW'Y|]mjWvO!Jfb{J,(hXV,7NLSY0ؒ#01wT@º?dD펩7`"D|L 8뮂I\U!Z9Zz ~!Ch]!2ঐ|-D`~>`3$I>` t@ؼm6' 3nN.\}99L pbiƴ̉V`Vq떓9}_Z7[V*A0TNYݲ*lf 5M :NɋIҫ{qt &)E])7 #O_K^1,%XPdyS$"pطs^Dwro`rJPkILMpߣ;q<930R` ?["$dEϧ  ! AQKdڼ9YBUMоd+(TJVaLFB!(滊Ec*͑ I:O%%ϸ֯匜ӌ܉ Z<s wL LC{bߞ4E"hj CdhM $BZ`PK;@I8;_~M݃7lk1 AˤRv\RFcE Y* "OS,E(l 5#eTsF2'j_r3< z:tM+TС3eaZP5xS6^YTw]qσA 4gfYᱫGS~J P0(xVrρ$Ԅ%0˟]5c5;K7rI̾KgVׁXR-M3XMXveCδ4]@0N{@kNj0<2 95?mm 0w'17&mI&%* `*&$l!Kc$ %0ٺ`&5 8a9dL`ǡZt2tHy^o/3r3qx? ErBQN,>/xXk KX5`yMBp˃9 N 0 A+t""[ Q^3) dF+k6U̖`W!D8H6͋yHDH3qt؄H'voQ+,Id:S:V&3lStL09u+u8?~b9OH5!CDlA UqDXv/n>^AKt|ǿƮҿk]t6嘘]I$b)@ա 4k&@%1x,G⥨3Yfkr8חܘ}S `d#ߍ&tRY*E3,M`uճ»,sjEJdê}͵7gw"ܹKN}d沫(̺4.x96/9˧J'0,I0L F^k݅l1սqXӳ KfA@) d!çj ! "#A6ǻp罏 ƷIr~:gW,5*aWDM"Ǹ7MLx#vee;3r6\ 0:6~~ Tfl`ɭei3xT prD)xPā .Y˟$aUv=|`v>?'#ϫ̮"Y&tD:Y mpo5pFqVEgQ:vhǣ= X|`C5]X:MB)E)Z9/KƼHjyaXYX2ЏY$I0Ơ(2 |>)Y4$VIl̯?5=^4/y&$+e2+969$3-A>`)ʨa ,Q?h61kPA* Bp(39e7`bƎoJK:W1 j^v//гtdX,\Nex,uNĐ&('d=`mE™CI$7D426;KV zcO8 wMO,aht#P6$ЍW0G ҁefG^}n>H!aMΚؕ0B|Ow^dH2g?D&a!g*v&9pGkЗ L%{ V(ʲ$4v罏 LKhXy<C."8::$UK"!A>Q,{Itd3T$|5!LESon9ẋU gq,h Kzڳwdt 'IbhVs ?B&A: 7`L’0&Q+uk͗UQ oz@yҰl9ϿHϗ->Nκ %l݂zfAd *RD \4٩ @Q9gXsssBz C~3`nP8/,]TrM/Ga5ilD̬$tUU S3Ep1jEٽbFQ9ghXE\SZ9hh+EQ E1ѭ+vۿҶm$"3LBy~fS&۪(fڗZ3޲Ӫ)9?o'+zMl w}i|Zѵ4 ,hXk[i㌠uOA*dY!úK*-(P*T.0uɢQí K,<96Ak{+j =;KH1VՉ9L)ha0t<@M"179vor{{wy*B2aV,Sxo<`y!N0 \vZÚ?ҁ[_߇t*Bt(9]Qd (d~y LrN~_Ɓa">e|}zrZ22+ȉD\Pӝ<>@Q;ܼ͌iXde;`X ]:cM$oWG/>UɎf\aX!0`tt HMfQl͓'277'YMBb Tߊ,n L\j˯6ӽ>i&a5ϊJ`)"u 0%{K=~]NnH ^Wu]hzB,sPni ಭ\r<7k>i32yb 3V6g^g{LhV0/ȯ暂8ph$ea97gm(tg||/&!t*@KQqG`Ʀ!)A~Y6eY.u?,Q$M),X|X\Jy?ludoe׭ڄrY|dtE F95V=]PÔ@+ X~MPx%Il.] !.rr%n.r=KtBѪXγՊ'$',utxf]h[4Z#A,[U jxeج]:&3D\1Cn=K+b$I#&!9+B!&[k~˔LVKZѤ7dKӫ VØFlZAǍhft|g 7 -n"X s4 w|_z*(nH$ìm,ӌ|"`@"!R!8 Xp'WT!DG<~1K}atlJ 뷠wWdOE^x^0isaY>,kWC }Zݫ/eX+Ge* "6Wy=aMGlԆ`Pޒ$aױgqv9lK4&ɒ!xqT@uFQJ[DZkX=êcXv]y-) ȨIjqOs®6@m1+W)"pa$!8'WkѿcL6޸% _3|Ap/)Aob?t3|T*߱Ĉ%5x+s 73<3ὗ_fʆY)k8"l҆-XUkKpILOݓo۶-Zŋ"W n,301igy)gWfHBܐmhȨzCP?ʆa^8;Eta@96vOπ )26mX%V-9 ڃ)Xj%b>Hv×jտbP\J9A'eGLʁTFpbbP4*U^Â7 LB/n ݁ %p 0%PV 3-E8+0"t 6Yc*w Xr~J{מ\vЯd>VUDe$ hjҕLC;`01ɚhHg@uLiT^%24^&K`Ѻ3R^V#R+=INAs}-==XdS3*vރ؅!3~vdM+`}H$Icp&lƆU- IT$}}}ŒvڋXOG*1Z1{Q658=hX uhg2!ӪШNPUr ir \Uop+|6\@VAl\r($u3Puuu>~,{ɨv_uUy Ra ˾3K6)ĬKH8!дP߈%Iש:)eDֆ4E&'ponlA `m؛4Bs$8$,&O7G^I('eHu:;0K=TuUCu4}MUB@7w"9/dd` Up YBW7t 䤽vNW;: pUaX/ ʔdjm˒\e)SdTuh$8Z>X9:DkW!xW+_}6.!7| zzz͉X\@:v+146zl8OY=;>E&-`n!ԆwKXrcEYp(vdR1a,Ns~?zz.g3i Դ㺺߿{%n "++rð#hHn##~5T]_aY-} pS/cDfOdʉeS`SfyzM n `4:yyୗ tEQclt ##PUWff:LƜS^Ԑe43s\a,cQ* L e? mBɓIXv-)l^Mo|cFߢ>aba|l## ёuUVOx.{Kbvd=MhBMXLTٴ#χ@S8܌gfTall.2o~'ҷBP1h⬓׷4=ˠ4rѼ1,h`ep!3`G:Vɩ)(>K{l#22csQ##W~;0O )EQ wdtMCssod&_=2@1,kV%dSHX`"D"Iimiಥ}MFPٹ'?Ȉjs+l*d-1OnLXz.`DdQɌԒaqe * VYFO$HgO"-sT4cr3PEďzc He;ʒl.Q@F3QjXڄZJ=e*LEeK⸮i'@,⑇~p]a 9#|4M?055]::X|X%װ2?XCjygXL̰VBECGg'z{z\Ui}cvf%PiG' b4ff HIOhF`Dw^ B:;S=O`}Hgu]5?fggUTQ h)D͇eLA.YhVͻIoh@e??$a =](>U!1=5_wٳ'^и-:'DkFoPwHD ~E=U&LT*#=;`nqIxu $ΰ+F+&+qa|l G ;Nᑑ__JzeF,I( Xh$MݫNщNDIA2U[ouWTՁS8dm.jQh ެ{L@N^ꪪbbbc#cHgƋƢ7]_P` Fܧ{*1 E@ESuF&'^nF[U~X}qg -sԔ?"J ^ݫ,Ƙ)HvIFM;`T2moX@9̴pHg2/>#_-cZpmLha:$$*H%Qڅd_D_S=e[5sIhuTU4hsٛ|m}u@ Y2A~0X!7Z51`eX<ЃN5=3{<xPfcL-3-᠌z2փ4FHM $5]X,c;? R$۵垻qΗhcZ7,QzX :L!7]Bnx-nupq|ە]%Q0.3X*;eNT.[{v䂟yNnYhU X XyݞWX TzCc)@Zd6L`TK8^xafjVRe}ZӴ5Aʪa82КS.LG2hsP`o1̎e7N˟H/Ӛd5 z5a1Ƹ2TYn: Ы V;,J0*uJ]PưdcJ6/44^`GzLDy,J(0v@enLn䘝E,8gZNֆ `fu 48!"β΍N@%P9̿nUo&ቫW&1V1m&;sèxl`W7 Uj,4LEU"3Ǵ@U4VJB5^u:ؑMBKrŰV"pAeF`U?&aaY;$8ЫzUUpbSdӰD:C:,/`eҰJ:&F&)t `ƏQ V%AQ#8&`V]SjV݁U$Vt] &'h\ xsY@NQC/0ƐavŘN$ݎMјɮ)D$ ^YdCFSz$ǀ^ o )׻ -?==Ȓ\r LNo&/p(Na1^AUU~Zidž^U`GUPB*b8:::'ǹɲ ٩nþGC=v**y E!" V5*, xlWU~UeV$ @Q|,333nn=tӐZ@ek "cxbC*Bo"8Ԏ zGճ^%jDlcrrkMZ@RDnG9TzaM趲X,T:@V68+0;7x<UӼ G'y bRfU͵5=? 1qVg |Bgg'Jכ\r]gsF=0%/W}cnI8|tQ,ɢ,PaaNok:*zWy& yZ[JȳލܝAYdp9 M8*Jσ<;p '3]wP1bLyg>q$1FZ %ۓ3P5ʼC|Dh9V \qsv.} }~.K_@Ū{gFg։6 (U%áG8~pACpKqA 'EJ(pBB;326Lٻ]yz-C:|{?Ik__7̠Tt&, p-zޭƗ:+;[=bRƫl`M"j\z%DB bK*hrcP~L7R5$/>< nIbR9 HN77n+) 0J/$ʌ:BTy^׮_#UUV7xmU?NEdh玗2H+ Zq8ʬt7_sTfV h1z<9_.:r;wp8/L+OK`eTU"^PqϠI&5] >uZo<:(tooGH`SJU'?: fsqN~~Zh\L".W,GQ4`)h{{{ʕ+8~@D؇2gQUtkkkShb[u,d4ڃjzr:4e"X5 *JN"QMTQ_U:<x̴ … K...~u"g |t6wwwz%Z@P`L* iP.]ZY__Vծq&~Ή>J=t:̩*kG 6 KBdRAܹs/]xquyyysN85I珿g~:2#pX lQF1%u]{sJ)VIm3E]8N_wץϻvp8B5nʡ+1LVLX6bѼ'1J(e9Ls4b6:dq\Vϥ/ Y 1"s~0L MY\s'&0352tr>q(!zߧMAA P\|^aVVPq X~d]5M8@x…dRE-(0E}ļ*f3XHI*J<6CxX5-P+Y/ Nnb<ƭtT2Xc«*lb|<Yl^ֺ.JU9&`.†j#{Y&RCT)S.sA lUqXrXQ-K;@*nL`*|a T: +0g_eIq py.KxКkXcXRU\WJlQ8Vq+rUH)t,*)|[GPu3Wn -Vc`AS_mTR5,NsM_#51aTE;gvc;P[,4TL%W⨬bv4l,ARW>@YB  E'"Z@YV6V'(2lid%QT&%[Z"` ,@f7YAfyZCZAu%+ &'6B*ă.*%!bNB'Pwێ+*;#_X~% 1ٽn/lc uC(9K/tݙJ ek EH!@䁥` ,6PځJX&bAaRV(/4ަ4cTIENDB`aqemu-0.9.2/resources/icons/samba.png000066400000000000000000000411421272330227200175520ustar00rootroot00000000000000PNG  IHDR>agAMA7tEXtSoftwareAdobe ImageReadyqe<AIDATxb?( F`db!G###b124 P̀ݒMY??|yEo3<{vɓ }aÞP:lF&99@ vO211E$"H) 6XU| c7rg*1 ~~fi&&%@ @lT';3| Ȗd`: a2#f`S *z ^ ݠ ďY؀ {`dx'=,`EpA @(Fn X`eG>, G:eÄJ ?aqkm@&M? 5Hx<:l , ߯a=_('2#MEX=0 eb-pbopdC,Alnn~~Hۀ!z"*>|D>f}!He`Hs !?_ 6  /Od8>!011<>h 0/_'n hP&>P )68dzAC$ Pă0(A Eb̃ ϟCP-`x `ΗR.LIG_;P b@J@ j ߀R^+Nן?3}j0Y l.όi2/- bvïXe`b yf 4 P`'0?@d P;4Au &?5L0 Cfa @nX3Xc {IP.%aaDDzX·=H!aԃ (kKP%*,xZd_a`22ddg`*ffa&8gecceecddvF ;d߿5 @<9TX)h0c-+0l@$A "|2љwq6 AӦC9SIj9=W|=l3sњJ 7H,H&]'/-( I @d1oћVwlh]8I֚~4@:؝""x>~_!W OſЈ ,L<< T\70hTU8y4: @M W@w_ 4C~+hP%-Za?lWER"@L@?3|k` ?E뿺03ܽ{5PBL@4 b4:XDàHcbd>*A#]?&&?1Hz%h3g <0CF">mW R;:I^|l{&_Bgp(@Gk@4+LL_PXJ=l [# mLL? qkY[;ζ)])H ޘ =7Qs?<?~=?`|2bZbR,@=` 7]ꓖ@Q=1Ꚃ?]ZBl z ~P|ǏRRn (A PЪ T 40=> ch?aoSxO[Rڡ`Dr>5A_`/vv-lA!Q!aQPSb/I`X *=89;W-@Q5 3{[9A@`DZUX##Dw uO!s5 1% :XqaE ŒDs  01zU&w?23`/#/NFVEl@J+jw4`"~)?X}61} kVB@FiE$Q$.‹+ ^PhYU^M3ӴF4ʵ}>JE SU*E(Pd{|]81ض ~tTS <)zP( 2cgG˴ڨkXɗ>NjxER,i1:ߑ5k0_+ 十5NՇy(R >~$c+C-45f ,#*^ FSS{W?3/0WR 8_8nuȝtB%vtn%@70OZ-)ͮan/1j @]]Z$KD`j#ϟ?u>0p88!-e`;}<LL]Љ@Csp2d) X \>ypVPuà ,4zAU0"VZ'2 ,@wqsrG<@XXCڙgBb6C6(!| 0| tde/vyu%ՂJ{wګ@TI:_XX 聿Hs}Hc`PCy3SWcL>IJ3v89@u78gPϟ2|x wg8 4P%K8 ËZj &!`4E>o~fÏ,(+< R]KT)@ ssZ|y/-zh5ca ?lmj NAqPP'AZPTE/1Ptֆ^DAPi3vD#Zd<;Y;{]SS]$䦹;6m̳E!;m)F&V&(,VMJq#F(Wp1s? M0\a0 4W`"hdX*|r o\ETA Xϟ~zAF!` /F>??li.?3'oY@ z^AERh+z؁ 3;- lpb V@ D_klۥ+UbGxSx"(H zv֗9"xCr a2yM QEK1ŀ{k#ydh*>ޣ#{o`ZMS>%ᎂM[lJQs^~(/`9 HNYvyC0HABj&00Hhpxpad5Om!6¸NGv>0fϭ[M@=jk*Q)/$V6o!boBj#73SؚΙsϹWMDiu ϕ5[to .`m).|XEN&' )1b}HvsoyV[4x[o`a "\M1EPU@O!iM ߨ*yĉ^T_9rĞ/k]xvS-/@0)dϟؤ m> 4 a&URMƊ| }_E|'oz CE$ Ѧ]gwA0^w3\_:/w(lq8;іBo!iǏenH;[2#90ZeS,cٷ-g}[˲W[⫤ǽ?K`:o XqqssrqV~A2) i`MC&zNqޟAjjF=  /kչ$t_,.iz, fK*KOv DiI\OI.sNO gJ >pa`c3F9^V82œ=z'?3 v0>י% g%^ai2 *?3㷏 _~|w| < 은z^'xصdrnn`+z :L 2jr2AXX4Gu!WUBBRܝDgf.]$\KJ#jmnlgv7 `ǣ& X9 W8 'bL.`Zy[?6?k`ƢA?8Ur\fm!hx~Nv@=!H?c ]pptN)[Y(>!;'J5fp2ELգ%3ϋ œ8%<I"u[! gֶ;(yp)rE\XFfK0/pfN;ű@K6\Fly.OvO60sf{:Zj,LX݁u~dmDP^>bׇeaWMnm-~$SR~ pC%E QXwϦH Fs*A7H,aZ!c W|X :nRѱеKǼX(Anݨ[ μfSd(g$cK)KVlq<\wwLExe $"~4 M{[w$S .]A(ۈͧP5?Rz(n7d P`uXԔ 'uMvM'Nb]tmԡF0 4M;FT*A*Ak,2r<` va(30좉5jPJś¡^[ڻ,I.RpL‘yE`'O0os~"?.WIĘ&2L|xᆰff/@M!~Uz&<&4XwBN ];1] 9֢ڎQR%mP΀:eKŨ*ޑ:+^E?t )[՜ Op3i0"',ka+!_oُ? 0gu4+IY,GP4^%/EopbόD$H|(L#'0pÄ sjZ7m) hCj (JF GcstaR3y~bG> Fa]>Ě; hw?/_3|zl.e  5﷫ ,C~&D;Ts301:L(&4D1 ) K36ZN5r#Z> H1pY$y:̀2vRXB=+AiLԤ'?4 N:=?Q@eɅ|1k`{G8d^3|^78 ݶIaF[s}.*!'f<#S0ZŚDwpAId * BI^VN;7@hfk1&E Ui OW=,EDE%]!h5UP 2A#ƺA?n| /Nh)3M36#p I ~M r-+@p(0[ 7DPIXob RBw3}?* e,#cly79AQv%ϳ>AzU -JM)$'"Na`v8?a ?uLz_"d~|5zPw=EƛÀuA|? `H5ΝHge @QQuc$#d g7ػA='̍cg2B_ E)37?'` 23`t 61,!0`oao@>0) )10r0#u0;  m+ x6.,,H͞@ {P*P]r(g.A 4=V3!(%Ri%oCRDK|]Hd2+fPljWr:`5?`ވ0pKe;E,5~P" *Z#mKm2̂66x V' ()[@%RL߾~fLXGXظx_c`l1A3'Ҥ_\X"oxP Xwp'Ұ2Rؐ0H0HQ+Y DTTHP'Y[EBr> l3-/ !º@Fh ;}B|߀ 0Fh!Д; Q~\?r+R> S/_ f?a$j#`y..^ANNyȘ5 o]@Œ4U߇_ A?h"@"T~NJ X?Rw1Xzc`<+(-l м ?.!,@3N?rq+p3ފ)3s>hQ3B#;-r   ʼyD`e冴p9Pjp X?vt c'@v:)X%AW@W6iX~o_o;"_ b_* s l"gF#Kݏk3o~oAg?23|g7a99%jʀ@ERR F@ڵ 1 % ~z?C#Uۘn`ztvg; 4jAJleoZ.)7p Kc7 Ot&Y`UG(2Eh'^;!w6ou*]/Eg![ocG+z6S`;<+qvdPW^KHĄ te?KZvb,!(QY/7&W.Dm;i'?[6rn/Mϟx()e:ږKr$#82(Q Vl"9,7hnnq?r@o`|wpwPZ;x uބ?`;15GbR%T87HFO(-LL2R 0V|QJr5-Qp4#/ C!Fu[5:iAg|3^ ّ˿%m8/ytmHD ,_>~x[w0:9`W3 ,?7ԙP'3CِeZ`k2>CIABJAUYnDdJcX> >} N ""!@l?bpw7MC 3i3A { +0H~!a"n`JTbv9"" FXbf=]=r Oܹz4 w3{ 䠡eBa`+z ݥpAD~2|`&GJah??x|ܬ7( @ZIAA~`cV`fbf z _dx /׏X?c`s(aм> _`)Wᇰ$O ?@8 ;;/A˾@@]~ %?@Ud mFа/h;QgDr#)̥Bzew?1|ׯ ~/e::|x(bX sCj6o0(C-$,a'PCPzpur JlkŅEbA\Dhms;0T!2^hG& ʿ{l 0x  #lwbeDDF- N`o 4N @1W7Ȁ"@-Rqqgn"-JHQJ ȮQ#jK 3)-('jz?dRdH Ȯ0~~8>abbzDbP,B~ 4 :VtO?ABrʓ5$ @AQTTezJ8z|aKo޼ax[`+&'dz @VƟ (EQ@|z222 ۷ÜWG rK%P/ҠR < SCZ3 ʼz#X"c@AGwAGx :hlBZZ@ιaaa5$Pm||,礚 @LZ 9/ ĶQ@Dh :LR= 0a ȝ Y n%X15ZӾXK (%uf@=[q̿@NmSdbfcPUTb7ÐDA ؉+ / r6\Π,) sG`xx1 ;';n sR@Q@( J%8\gn= r 33D>[/F^ :M@3qT GM8L;Aۛ_  66br@L@ȝ@ckݢO| \AdedГeh*c{û?R3j2z339 ?@:ן~;'x7͗/_]9Dc;7V>;.@=ׇ^2 9666 } = 1PC=@'ċTXly]8 `0,@wP$fPrׯa ` E%z&&?~>zAWrq}P 9몀}%Ab k3 W >#!w`Cg 90$A-r;Ȳp6O2|y޽79vM~>(?q)a J2*0\|ֻw/޾} Z@@g233ȑ FFJ .Gmhŋ  p߿}@敲DVlA{un&ܟ?2;v\ `m Jc>{ ߸#J35 J?ϯ{euto}ЁtՋPم^A GɃiǎٶP2##99t~U42twۥK33p }‰ѻ wdو?֭KW/\8z'BOsrK0Css:LX (bСQ(q75bPUU/t8֯_?1}بz>Txa6`ׯzڄ_R2@d؀E?^NⅎQMAIIP޽nM?|xLؠmm~ t`S@l   S`PW`G`,K_~*z w{ F*N( k(\Q3@ N;Z"Fn e ++ˠŠp7|sUASS,CCCaQK@I+,#Έv11#D`I&MmTm, MpttY9~23?B @,Ð&oDŽvl]8țgϵk@&VSuoB; g#.3د? At_f8,WWA]TJC-@ú{RO=ȱ1B0#f@jiJ03txp# ** ?X u:b0eNfw>`K_D~9xOL yi!hoKgvɴMd nx53%fm eb).(DYOtϧO 2~ ,l!L ? Mݽ)>i?7FmDhl #O cXdl`t(/Czb",.mPdВS3[-4X@ 6(Qr2ڡ ~F`k \s)KU0x? $("_'x_v' ЧOe!K`nL,l :?C2< ]| TL \{e?LIE<{b E?233+7h /Y~X@L{Aw߽o8d0ABt/Uи8h(~ooo͛7tg߯?{13pcA ?WdXzofc `bdߢ@ _|{ hp0PNNF meof>F{g`|) ç~>TH 3@}/AS)Ag@r#Û{|n20LWxߖ98 ^Oɰ @!sa h$SLP;/ 1{gCfP1|hlͰ8sd=y_] DIENDB`aqemu-0.9.2/resources/icons/serial-port.png000066400000000000000000000367361272330227200207450ustar00rootroot00000000000000PNG  IHDR,,y}ubKGD pHYsVV1tIME6$1 IDATx{UTmn @+$L&%\}"tw\4(+E_$**, $= @HBn3[OwU{z{|?LMwu]NyΩ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0:`촶>Q+čDby7wܣu]_ f@3bR.Thii9Uw]]][ӧO644$<@+0@>{l2?iɠs̘1)^"@[MPDY![J꺾r[{MD;^f8,ˈٳj*kӁ"X,%":Z5˲x<~~--->݄"Z+z {,:Xlk&TʪB\LDN=ʎSZ[[WR80,L>=Adb4 FD7޽/"z ?T0' !^pmcb`'666>IDT !/\<^Ev!zhe2 \ !DD/ !Q@H1E)5KAKDJPxD"8Ž(X Mn!Qb:V!R":Ǿ.ݽ{w B,gn$G|U?rӦMo - ~rJwwgYJP(u \MD&niik"B=(ho!Č_kl"ֶN8CgnX-B,!VSo$J---5)m \)8&{c]]]_H$;9͛S7M4ܙpZ\ypY?rq VkAkkk+H,ƃ N%l2OWx6mzK!*?W5M[8oh˖-Õ8^WW-BsF n,Xi~" !zL$pS54S<͛SpJ<>_0cƌJDӴy;)Z_tWWjx|͂ł>CȞ^_E"tX x #MqNDb 2)٬ Z3q% ɵ}MN)eN [kBlF s:k+ sݕp8<0^'%hЍվvTx]RkE#WU=yo߾q'D{|nUCW&V=BOk"65= ^qncsmezߣ{E,qNsxL;*x.q`Ynnd~hЯTP^q^e V,&CG>} &1C.װI---'w:?1,X;dn6yNk*g7nܘAEM @ʳQJT,&R/\ϟ"X%eG?_c4`1칮^/U:wJ)@K&R=!͍U,{<> !UhiiWǺߩuKxdB\gW,Y#(rwqdb$z|j7o; <;U.^ Ts< ;OlذA,Ɖ=-E֏TIR@X"xZND?$_϶,g\pV%Wzxw2}k' ne}ؤ[ZZΫ1ϟ?KJ48YZJyM5D^iӦ+lixCAWWW-Z MRkkkNq ͇w|EDWwww UVY.jmm}@քO׭[o-v#NKI^ŵcXmVp8|x mѪ6)tuuX`1cR!}U:":9H\3=Yns;pCqRmƍ`1R M$ROVhsiۏ̔H$~il߀aIJs57nv1zx.p>b%ׯ_ mmmNp!S|VeYlܸq&=BuD6J'HtW:o޼i}P)5[1 /RD/x^BF*QCp3"XD$=^"RzYآwsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal;O=0l!Tu\*XU4M+,zu˖-|򓟴TXND"8N>h(u_NQ K-` ;}Ewʲ Ϩ[Tu_U! ցtNh 5]ʤ\룸5tŭ^ey >ظF[Zj q+7q@Wu_͂u snai}qj[EE5[QV#õ+c: kցc}ĭPUrG2ױ`̟?@WN 5[UhhxYkY&u aohqb e/8nU8=zXF2\~m}RJvwR&XMDW9?q> !A Mff }uvbq̲$ zAxU*sE,GN:G)l4L찔"qh5&%A#lx*LS!P a " /Z&Z~a9ή;򐲢uW+U}Yʕ++VdTE]T68Be*NE]8Lty#XIA&zLpfii&%–%dٳk$S2sE~+{V( zt 3 u 6} !N˞ÖĥfsHPS3Ga=m@Uza $M2wt'+ՉpwcnqoT,[l> \4wݿ_VGGmgU ~)_)#XSAH6B(bX9Qb8+!69^qe~` ܪ M\JtbEQx QӢ@̽>TM5lkld *-m۶{.+-[v E]TNToү]~m*j&&\DΕвĎ8ݏXA$&:󄼁V]<+ͽ4r h&AeQV X );S,/+#^Hj}L.V#+UVdM>h#Z5 Wr Dճ*5F-,˲$Xcpn˽庆TO[& !N& ;;;p}@OS+XPͱ,kR J "4[UvVZBY aAؿ5=zL]Z7-*VFD֑5QBn+#+V-V+37e[Zi[ 3 iqL{L(+1Z17\i+s-\R5Ȫ4Oo)ʯxlقe F@'tvv91L68~5ſBgRy睯~ix]vt]ې➎>}'|=˲u WݾcUj{ж8S$ˬ SUSMR9Vi]ݰǩJf~9"9Vruw)=6\r}/ۛV ; y-}+p^GFvǨ,d ,˂i#VӴrJY;::Biݡ~(0;::CD+clM=TDw4OQ7*䮻ڻbŊ_*.r*Jb]b%Zq+[e{ c>I^et,€em(WQA1W鲥i* odŤyjʞ*kYUXjx}i KUBiD,RV}\G^IqMda_5lKThcV^Y aUuAs\1Ưf%ZEWyW1Joo!kK !,+5;5TJ&NDFC^904!{q6ĂƸ03֘XDhN3Mel)1|J-L֟R)XP. :>=0*+_pjmg_ɂʭ ; g}30WndYq !:+Jr?zgq u9o>@chH)2 bVVs~?nxDSD!i13]DߦR]na`.U*/4c\x(ߺ*UV7{I$~:0MXsI gÃXRU[eEq,Tbҥ +6f!t V]]hʕ+_ڽR{<:7--Z$9t?, 1.{{#Dg@~C,Ei TF+)øCf׼B&^\nI,|REOƭSC\gGY %M|7%‡H0Ї=}6]a3#a`uLdYj6DÕ ѽ?@rz]5?VkWWAyBx;^~`pUg왆)E^4idL`MA¢4 pP)5!G OgN !Đ8P. z +_O,\0|8-0U Q=Y Rx|gEB8RȼzG)4pJe][3;<ߥqEgF"5C22 5Ym(K6hr,)A4iNǙ֬XOI ,0t*svMQ Y^ gQhR2EEu Xk3;-,n3{>8Hn?˚ºi?\'ǚޯk!8T -[+ ĝпbQbӨ񎎎:;;fo\rI)WK)J)iZfw)Q{4 *@3d(G0PHI ~Na_9  >ԅkAM1Oa-4}Z cz=; 5 $~[BGQևdp6 #4?tJHu FMĭŜ4md;;;e˖]3Y 0?rM>YD3d潫+SXAKRo !>S#i~eUA##00!b"\,+`gYfPe]SEkXI>Vd.8 ㋯'!'&{,{_Ce^4 o3,h(dP Rs+,ދ?J~zoPa-?SMeݞ]$&]x=@#Sr-KI&+~|[y:z4=syBO !RJB@f# 6\Jc*NKCvqh`EW| (r֋}7`59+lL)` /TLPx3,6㒄k!¿aRew`1R&n<+EkqZQN*idžg^ۆWRE\x_GTPF $%p;pJq+ gOK1"RyZlٲ>]J4͸@{{a TATi]ן4 CӴaxjfƭ8nuk2&OLYC2w7#&ad31zhЁz[CgucQ]K6畉[ٗ$"M-.m YSJƭ@s$0!bZ 61fZ$n$`*KqvL^]tՕAVBt ㎧ (zzzRRΊ1R9}JxP׬ؓƼ>30"SgcX΄V&VkYgC",4[B!^Ys412/Hs VK`Q,-V"b՘;^zqBIM K¸f,hUqUilB1x_]60uԛj؞oz*5Dw ^V,>lVzc߱:0wIw˜eec.|Kv=ʇ,+wuzƒT_dv =SThe5s2בpZs3bќ(9E+O ]?hU)<9ϵ.꺎p8\5M!ctNZ`5+5Ί]& ΰgo𲌪;0>+?3Pv@.M^LgC%4繈vdErε1ގMBɷtBͤ̾L;.gE.W3L勒S݄*lfa "%V#RP ꢮf(Z;kX+8fkX5W0g1zWb81фa[9GEPAp:lǭ , X31+7K23)>i8: %+\MQ-#CvAwKcJ{ք4Gq;#p+{>c[UvtL Mʫ <~ VDV,xypFMVoe~y]!Gvb)r)ӎ9ɝs CgC1"΢lӳٔv`]"Ӡ `{i}uZFCq>󗾌HO#=vcn^}(sMȔG_ؗ},1R}ǭz˺JƮ\ V]êNBjS͹=n/N iϸi( #;$<ȍ ܲAe1rbe+ezZ;ud*fZFFzD$U \H{r=vXN2e>ޛy*+r UCZ*cv+&XUr :D"5IMn,nl(C^lZvaS pmA9z!C?;N4h*+^CI?@دx+RǞ3` 92mBu s`MVٺ 1+:S"Z*cv0^xaa: 0^>{T,rhJ6 mK1t+ep1P5wH{\Kdqݭ>Ms/#!<4(HB^g GXGVu_˰pDj#EârGR;e6 ־cwA=_ؕCv.^Pn^~>4yN7\a{ĭَ&h@q;2Y{vbќX<ᷙK ƛݿT,&(lӤu8ƺ|2hr=SxW28[ib^|jBCN,q Q bOeoUyqb_Vet+"Z-D(3j;dmaE9 ¢)²C[.ܵ'"8L)_4*eapaz^3nރ $sbe҅U 2U+9wŇ ɪ3ʪihe[YIVUI@`QQB :( A,X#39iثUۉˉ01;=ۇ +_okD_XRnn|1/&`pprD^k)|qgV0لu"²9a(m)|~nn,H)4 q+ {YYg]zi`Erdk3܏HZ"xN;ɲpN/%svנ{ MaicG(l1jYxb^]s~Pbڵ/`JW"if+6U|cZ!V#ِӃ6GMx taQJZ]O7Ki}6K8ip*L 5k!<>Ycg&Ž8VJMD1ŭ-jX1{2c\RzhѢ6nPB8BAԚ$zn2e"LƐ@i!JU?&BpXh `.,pu1 rÆ >%<)zt R%g+17~CB GHyVY`BPB8}VEHxV2iISٟ- M>1 ʘc nx-a 2V. s{ŭ,=dXBa 3%[L~ٸ&?kcTp>V^H/`s:rӊI  ;-b"ޠ JŒz>~ > $?77>\[U,\_Q vebh"Nh:XLbnA# ~a}և%tr,[3hB+SeXw ڙ$Kq0YD5`Sq+BRՑDHl'0M.pm(>h[a?[$4%VpēqDRu8H9E'J[jh}IauZޢZ$VY.zaoE˛y<]liZGWVܪ–cc1naMh+K}ʮ VI~_j/qq+f-V _8 ~bq3d 2sVz2Ivǭj`9]Zĭ_ >y'qlݱ-D,_p oQi++r &c*k}ǭ sLs"nv>.̨˺?/~[" V+6BDZƭVTe˱s,nUiuy͈Hɺ'ȂxvT'B VeRՍ3ot?UȂKBl;K_b q+ͭc[B˱K.5`_@m [4QPPQ  V1nդ7g~LUn믿nyE8k֬9Si'_lXY->'O[xADw܊J\x'돻S"S|5"X{{X*Z+A~"M?etgFUTbӪ* VQ|fT?ekLqRIw{{`}@j{X͗|I5 bTKY5 B9 z$I c¦[ijj:e̙)nm,X?FӴL`*.M/\p Ei8O@DMDqvmB(.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$^X̳IENDB`aqemu-0.9.2/resources/icons/vnc.png000066400000000000000000000212521272330227200172550ustar00rootroot00000000000000PNG  IHDR,,tFsBITUF pHYsE5E5|WtEXtSoftwarewww.inkscape.org<XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/!IDATx]g`E݄14)TQ)"B"D)"RTE E:H|((HGEAzR|? /ޭoM̜9wνw4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@~B>ҹj _q A%|6H먤Rq|1LC#/eA+dU?$]h,GEH (g>O*"_kiw5<[7]FUz"mս@!dEMZ! ?6Ȫ\w:쫉XeD N bmbpl8C^vY,MJ)Ux]XG?$SP:`OwG؅?g}&jP{RA "{Ù ]DZ)% ۿ8a',*TSsv((pʉkr"]=}k:0.34-مTI3fp(ȿ Ѵ<,x*R8|(p%ՄjjlMB x˩4-߰B2|fI(l8aiy]X;gDJ7_NX_*,Ը->>RRs\8Y%?YX9^1ha IIy1Qwjc1_`3vbE0'?؋M1el~<. VNIzŋ؁={1+pi{va8: .>a!^[q1))a,hi {ʿU/c䢼6Db1ލD|¼:c<%SL`3C%v#љf Pp Bi8qITЏ/H-ªgSߡ#foZ ͠+OPYU1cg(\+uۺP>cIQJKh5[}m *m&\,C>~lvVnyK/i*ϗ::)`ޡT^YmJ ;JG&x_A%5WV{P:3zG0!ˈ7%&8b{rI dtZ:L\ľ0^L$ .*NjϹ:AZgdʠWÏLƓUX_Q %l.>"_^ ' ^EEf~}}aVa ͗5.'2 $(*hJ"nrkVWͳsGUXMBINsp"vk3Jvcp8l^XB2>㫤(|t-1zb.ם9>K5^pvf~s(<5 HfзO˷ WDNQ,hAS*,eDEbYQܕTbt6[>aj&.5ֱ ir`)K Gh> ?ªI`3SYVbY}b4H#kpީp7MgH1Sg(;)^Fz7K*EcxRP`:PW 2rO`]meNj-b9V k-E1  C s PQD3őWURb59`2FN䕀L2,3w |T,|SO"-(0 Kv fP'2"(Gq<|“ ^6:}HP(,4JTZ)9bYa> W,e1Icso Z.DYE:(fP7YTq{WQt d]ZQ\f n.6?K @%{ UȦJіQXmi]ClGHOd P{UZeh @>drBFaCf0G|RH.w_4kn ^ E.Ŀ)w &Z7Kk/ןlY_3Ⱥ$H+0 #C5fp٠>(ACs>A$b  W"!($TKH PjUIh?3K0MT#=(i73 'D1Ⱥti }aWnM޷z?7뇴ZH m dH1 zJj FQJPiلU6nfP ejrГ2,m$߁jQ@52ֱ nUYθj3bYR OO(/ݾff}uXx>ej;fp(OJ=) (,,8쀰fQ"5:Sʫf @8 uلU6hu3|rj)zY3R=-6Õn',y`&2T^4*c*)d\QXgk֑aU2tlj j{ &d OUsfdj&  RzaRaV?zry Fa{R)q åfT/dVa؄U,ca dnaZ\fH`Ai\ju[+"6a",??Z7}ŲPl'2Jkػ|ݪևW#HMF}/c Ro <4bnrjلqfa7VEGbٵ3Y)&s1لՃRfP7҇yae5&հs7<hv肶hH/*J2r):z7ڠ)OXjs؄UC$6Mnj`7Mő%wa1vo%=cՑMs +MWOP c6bc00; 7 1L. 1]PZN\Š/ܚdEhne}qң_0zMZQM|rKOjwp"5a%n y5=wLT`y7{QNRGqo '#ћJfo^V=2MXsȸM4q*+9 1 g `7+T/ K΄ 8 8Ġ3}m'"]tixm|b(f+>C/HkޭaV8e`֧&SISrƠ.2J^|sy.k-T4Z59V:jM0MX 1H%5B_@Ę8ˬE@qr ,\WDS$f j "O"֢ Ƌ8$0P6/l4L_roj9wE$eVIQ]BszÜt`JU,srw2^4z dLFW7|HkK IVV|)8QY~G7$/h8'D]T72Kn?va)#{'Fdw0xnfq Nm5i޹zz.aB373 ;HZaa ,zJ .M4dCgD,u"9/2T_: [>*yɍ,6MKhGOQ]+VFa f硑ӔĖu,DdACDw P=jKuLh4wr`#&^Q9/)<^8k$tuSNMv^XiQa p;{a"oPiͅg{M}LoPvҵk0 p"xVXUh{O Y찃!S^MWYD5l=[ai*)-Mw"j&ne>VIauDotUocae h _Fo%r0 5 KXk7ֳT_*1 Շ5:g I/D-/cʊ"(B)rOYf,dIMps#//՛L~va(le5tߠ?3vzqe} VH*pQna4YGdJ8;)o!G ҷ %]Y42*(#?#D"ܹ̓b4aGmV}kHāxX:O\4jbVdX /YlaN{Vb4M#_E̩(laH)aH~a΅(=GyP{p۰x]XD5Bp ֽe0+,2*CR*%g% a1.HM.I ja$(fԘW2{OX5&(ad/5: (*##W*ׄEV#Ŕs։,KI)h8kVVWdFoIpoP GyDYܼ%aT4x‚ 5Ϥjj㕰B3S",QXLE&!,i3%$Z) Q맄MXXAߝv/+5U%,Oz U_n7YDR2rZ,yҀaeHq9 ,[SXfu{`Ĺ/y"b5rWJHe9(ݰR9l4$$3|!Q1<JW#-yxMQUeiEjq%0k5V o=¢GE`"NV ݈T~]J @{|ޥ;~I;[X[g9b K/wJ5` #0S}aH )ay| _Zq_XOR}{D IaU;"eU Ku,˭=-u_XFZl&k(yL5"4we7/b<M^9gyBԩG!Tj659 mE|s"r u2>6˪}N\_地*Q=4_t2ۂw(M`ִ]0i*6}Gyȋ ]HHI+d]~[3R,RWᐬ"w2r %'g|iqU{q;K5RG_T2XC2d *JR4a?WM9j]%a-L`J  )(rCAQIqHh.sIe2 4/Fz KS{r^:JQ0[o/b4 n߃n$J.V [j V$1ODfo^E&r5KpGۛr+hKȓCq\k_%jqr$-v j UUANlXa.B1#*M S$n_?@P]o%߅8hl Go8[Q)}D{!D>o' c%X_#za?kG0LIT(>Ã\n?l{Ek%|=`|?ja$`fb96c6cLP<6`8fb9`/G!hJx_\_GQ 8*^ZxQb p1P7>ib1U"Mf7:% hLTL( @74Fy``].@>%!Z^(Fh*4AeO\EbݬIENDB`aqemu-0.9.2/resources/os_icons/000077500000000000000000000000001272330227200164605ustar00rootroot00000000000000aqemu-0.9.2/resources/os_icons/alt.png000066400000000000000000000045721272330227200177560ustar00rootroot00000000000000PNG  IHDR@@PLTE>n K>(@H td Ͳ!϶A@ȫ~ٺr5. nkhXNm!²nҖZ|^RmZ Y3 F:^o&2$}-j~B ʺv.5cJF^s~ Rr ̓4Yibq? "$*,jEEE,MZ&'&ͪbR vj*222¦9%^f*/2*^R"~ ZL &*~jrnNVvƫ^V2ºvZ##">??vf>ѴΦD:*& ~Vh`,/,^rNfoƮ*βKKGB~~vގR SF zzz¦9BEjV b.qBj{AһRRPJZb۽! :J:b> 6>fpv&;1hiin v ]^]"%|y澂Sp|X|6JV*:@ƞqplb͘&  ,FPNRQs] :2885W+!|h z $"rvv.l.4Q]N Ƹ^~"FNN?6ӴNB"䉬n^ ܾ޺:x lH F* n: /&*6:XXW U߈o.KM^3<6A%-lU0Q:8z p$TGJS:'lSa_*C3FI28X/_2=@orU ̳gƉb1crRSF;6tpC8qu7< rpuw">&ksp,EƶA%珤@7`Ӫ[k*p;9 T+&> Da0$ `-wBU3Ӷk LA 3u"%GIoUثmp( 8 b@8=%Ux5x#I^c \0xnYu޸,jfmf+GGIb%OMJΆ ZOB*m\D"]Yb([?hnJ, ŷ &B3ߋ吇$R*"T*XS,gQA  v t8=+m3/mr-긅pCYΞ8!E#=einϞEWp8V6Oy(Hx/#|ϋ|9~;ȉ$¢`ah4d)KS.0vi`8\hV˝i/^-"$ObJlH!݅خ8ܔDM,̍ʒ$8YHBdu !9}^A<@l,=`u==s ! ڵĢޢROiUU7\joz}vn^[rp5X(< җ[$UByX(g')m6 l@uSXx\!^FB&dC !N22 ˸Q vSlhW#| x(`&"Qn9]'܊OCD!;< @$p\6 6La0L8Ӊ!=C]PUK7[UI*WoӟlNd9N#jOOo.2 7xwwwDӝjnuh͵'X)r?pP7~iIENDB`aqemu-0.9.2/resources/os_icons/aptosid.png000066400000000000000000000164711272330227200206420ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME 9fIDATx^{VEǿfsME.jbfi IBGERKK2tJ-T =*@E䮲n^ߚ3Κuy7|Yk<3̳ (J9`x $%*:&Jo@:}%׀w1Dz`׸\PF{=SOέ>w0x3λ8bp5uT.G@#ؓ} B!~ YVA u9  |T?zD6B wԑnG'Pyb \8̻ ٫h)|O;?BADZ*q3HP8qÀyY6P6Q^Q|lvW 37!.5N ^]7"8 ~ l|8 h,UlIJqquf|[IzwNg8ͽskkQwfZG^4z6"r508]=D Tn@8}(o!R;Jǿ:z:hv\G3jܞ.hUpp bYuHp.UT#BKJY}EHic܉ QE,|?Ch5jˢ|m#>'XwнUꌹ}8~'utѼ|p6IX!,FzTZݾ叴M#q/;e#|>:?FZz 2FDiDЈ#WP5i#}yڨz*he8| 0W׌-H(}sw~0 .) Jo)I5-o!]i1 ]cl=SjHM[-DZϓt+8k4iEH(~z B!=Q:~/i8$Gs េr"i9q;%l)?GVH9q/c"zGG 6֡-dg8GqI:"Khp:nv7IAC-7zi#rRNLy#m@v1j:~G>4Ÿ u,}9i;%&9F#H~:q,HZ6dD0>XK/1s>˛Uu~)g}Z * q e:<\g^E:-v$b79B5(?F!j:>.P5C!UGP"m^xB ok\»~ɣ5ZZF%A/d FcpRJE7dh^lB]B5X_7w$!DA-SὍnG{a \L98Ƣu?M%Iu{h!i.<DZ۴ .;<}xj|;MrpNXحOnJkcPTm w'44r_>Z)&$@rpN*Bz GۥQx6eXhk?s[W2"Vij7I3~ c(ӇQ|6|onGH23XDCs6!Kiw>HFJ!9)F7%O 1M$`5H_ԙ+˞(gBy4ކJ1~ 2<9g5R)4ׯ"[ #Ԑ00B%4"e2NDV X>^3!n&FXCPP#o`"r }9@.B$"b4OFZhtnBn:AjV?a9LW$B2hyE'{-]5aLEE (:nRM-޻'2\f1/c?Hy)"c¶IAf{'Ȏ RBKC@!p 1Jg,r06Q6k}rC\e.݂ZV'!A0S>c"e!jBmB4Bס#y؎Ϩy=m% s!OFEm\O=:$A9Kɟc ZD2h)֧f!Mt3TǬBb2[FAg_cu|$c>6j[`e<~h)wb rEd!68%/4O]+AY9} =ϐ"4(m5D+]3QzӑЈ4kI5"=C/ 9BOIJ|-!Ѭ*hd3>_NۡQ9 k6c#Zj%7 #Q!D*7k+%HF01ZrF " 73Zw+ݼuhYk*$@nVhaWDe|6_OFΈFhfi0,4 K!<^Д;jw\'QBϞ=0 ƆRN>t iH~,^(r-h z3sKFP#Z.E_>hœD:=Tj ]8GtR,A 3ЬBRC\ .?~ɴs;Z MC/q~+ZbT_{ hW`0O c"H(!A;znhٌloE*^ +%{mA]GTwt; cq]V=슸8Lk(PfcY+:j_",+u-;ףg4]4gs"j߻oǧ54)ȉ?Iy>|!ݽ_G^#i ZERjh^4rMB4z%!!ҩԮRX{V-2vpRaQިK'}O QaĶy ͇b U|bhV6})8<8y9)lvAQ 3O4эBF=dGԎ7#~ؽx٘r!!MDܼҞe%RNFנY8姱^n7"ޥߤ#:?-eBӐ:5"9%6WZ_dFHu9 *G ڹKüMInGlkwCu0B-3"# H˽ߟqzjoCƩבM#c7cvbTu|ڽsnEXzv+YUc5}{=>4aLd9/|o@[_: -댓 BK*:>GMFeptbh4)nZkd߀ݤ e|Q441lU!c:F YӦ HRktC+)w1Ұ!hQwg5n0Ut~L>W<2Q髐Jw RTG<ƶF7l /{7UBq~mx-9WcAwIENDB`aqemu-0.9.2/resources/os_icons/arch.png000066400000000000000000000112701272330227200201040ustar00rootroot00000000000000PNG  IHDR>asRGBbKGDC pHYsxtIME  Hd8IDATx^iu~zHڈ%c PLH`c?`lfblA ('% K%)S &,61rw;wS=3oӧϜ 0`z<^f`}Nҙ:Iy=%nN5qf-z~:طto`:`-fGue+XgCZ;u07CNcOx[6},rIEst zRu.]xw%D(Ky,I $,0%k2\O/,B8x:IOp@THǁe@ߍ=; r*Ɣw40j"0ɮ' )_syֱ38U'鶽t0@`@un޿qFu府zʄm@ئ3f v#]ئ?*tFإ@,0qZtq0+\'ٍt$)Nݡ6l<'n}[/A1|ٕ e\9 &'`ݺu5* ~6G\^)koOKLmʑ###c^KYH2}LU &k G"Lۻti ۭ  쩓,)aWXW+Wd[/ uIMXoAm"\Tu®0NeTP溺rL>N8:]+ 'X6%z4Qy ܫtN=M]L Ur@m tdZ@O7wʊD_kZ9>'-V8<2i tI: v21)% :X "$1Oz2 ~؃{U|`Эe I:w֭[Wn<dxp&EP(6 7;Զ{P h;I'yeu!n5.^#eҥ;N8OwEW&uGt:h$`0~'z=RvVMt0ń@r3Ӿ׵:Iw42mH ŭyeP:޿7FFE +Ҩ&KM= Mף Y`GNz50T{j vEQsPLHKnCA+F yQ$=aYi m 1񢗪t \ %$]a^F]PhZ=Q*WUYJ5{e7U?]S߂΋ԣ,~4rkR]ь!2)b8Ta]rxŚRPknxB ?ǧ oZ)A@'[aa9 ܉ "_(}|٠x;ا{VGU OSMhiE jGU:Iwbe9mS B6 @@xX'鷁&֚8Z|dc 1&n)`VDlA1 ڽ:I/0qWA}X\tF`۩ 5`Ow5Nʊ!۴-BYeh#Naݚj HnvBc؁4pNҊ|hϡy,]i"A@vj |O'.PnB-٤L_)(ȓ/pmπM=W0вp+01^F@wH*E _NW0P?652b/xMWG nJ1 GkL1P& 뙏~N,2=NO= ,Pe*A#! ,{[ Y)`JΉwSK:8N*;j@XTɾ̱FXTF-f_pV}i'E&f '-]|"u?5`1A u UЗ3%5[~.-t X`^_pZ'pOܚDW)Fz^H^"B\ı/!2Z)=^RJ4΅1Z=]( a)E$EpȕIXZD/z}CQ~T6` 6+ %;5*T܎-63Pf+ZV<[+)e,00ft(NSșズExXCSFso ?&Uj^Ji<›3в%v/L3Юeݢ+jgZiKlz+_{w,pH5v9VOS__T0\+6GpIENDB`aqemu-0.9.2/resources/os_icons/bodhi.png000066400000000000000000000167751272330227200202730ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYs  IDATx՛y]}?.n͛3pS4E-ǖQZI'M.)E-&E6I6:#-uJ,Q%NJNg8qF$ER7w~ G:k_V.[mÊ:}|~u+EAf,CZm L o $rcKuX; ' KDBֿ PTA`MI s v$z\~⥗t(}{~Z=;O /=MybF6aۇ9~2o "l"vvZ"91&b2AჇ}3{T| OiIVK J5|<9~2<,i$wak ~zeX:_ƺ| WLy"M7s9}LN s7-=ͯXY3vȇ w40M{6- ,4yFfXYJyiFg9:ܳ ?c9">3Ox-t+s?O\:4ѻǰ݉檾[t"ծ3ReafYX넒9k)io~y(#[Sg: F2vLs[ _չKw$bM6M 40 2ɻw%LESb<'/rRÀ8!/rB/(ȴ]" @Zg4C?y7:Ӻi 0 -1L4lB8Bau`2\HLzg4H Ȳ SK )Gt6YJSǹ,YC:y㞟&jhK&NO1d@.W*P]B| aHM)6&$yXJ!#P( F;)N8mc_f33(#LNq2[p;\ b(@nОC 0>Os(Z\iՙͷx̋xn 0nk(6 \&”]cd4 0m 3O1*7@Qo gzQKT#JH)DRJ8AJV(݉^KW;V'#ӿzo4޶ؖ<|C0W8}u.ci&9oҔ6(_]t<#4WZrx1WOiE<6\j}8qyI=CH(̶̂*hP,8±4qel#̝סxwv0 )%#pV86JJKXWH+)a38G 6?K#I&e3!%r|ߣ g<_e^ma[0l˲f%evs۶0c,7Ǥ -;mEA (B'jYUmbi"i,]#s*eFh4'! 렵$LunH}eC4֩/o"Ξ" YXH\LӤZ ,#Q: 4_:*a!v݋,ʢE"ibSV8r,-3reiXnN$B.y,˜FIS.-\8! cK& h!K+xXl,K(nB C'eZR|Ql9DQ'tOjn"ŖC0H1MEQfy:\,Z)=4_b%5P@ĦۦUh8a$̔-,թ/_ıfȝ`b|+Se&F`YH[v@ a W!XB{a=<iZFڲLQ8ZS3Q <-5=/6;,yN.e`|Ge۽yZR[DߠyU"-DQ>۱rk+ۼ5 sضMj! ,$B`FYE;P36J;0.{vyú7dc2XТZ x Vv0Xj-ؘef{T 41IHZs3-d>G#D*tڥ}h~WY_aa4*4{4 iu[:&ӏv+X"e--F1F'h-'!&#ŒfDfD\Y"2V6W[gXXf;QA&l,, ĈJ{z先lN@tHLȴQ){k>E0 hnQKWԐ4<Ck!tarEb[9Nϝ!nyhHZȜ,` 3AD)2Td|ƹoq±:m,뒦iX]W6 A2Ĕ7rY1Q۶Nc4 <Z#LQJ=V+,t=Ss^d9Q"sQ&m^ 2u Jm^eqMQ Uo⓮i'&{FepLnu]d!z{n|rWaZUlFبp QIDclhVL u=IPKУAAeĥk;HIȅ, (r"ϋkM(*б*hZ[*ܲ He\KD>Ie҇pC]z0[@H-ZYᢄfysWfy$)ݺB,D15*Ʈ-хc7yy x`cY&CFVjVX)ZcfAYC;oZ|AǬ}80LO@u O.u؝{v#H*3Al vNZN;za˸GT诺rۍ p/l~lPny@'pC \%q;#ZFjӞP1 PB|FCS{%g5&5Ltx[4BKA~2{U5|H'KQ2YqkfDX 1Ŗ. nP0Q$}ny*s!-VuR?M!n6UҸͭ,*7ɲd|]҃c5¨2iE4ii1 LWo%7QrFXTO#p3{Ȼ$y7`Yt_ʎ>JxBR > W1\B:ÌLm[ D8b-/^}X[ܹ^M6oۏ0:2]׃B8tj% 3,vS9k^cT2 Y 6(]q۶̜=pJJya^?6S! ҬE]\H\jN.`x,.^ajwB%Ut{+##7v 'q`!^XBkm'׃ =z?<aQWvALȞabW)LT! Tɩ>G$C^W28{uojՃe s|b 6`⣢61s$lNG1:5Iv<|9pNդ룡JP&5w[ b6r=Օe.sul,`?߇J@Z_Yr3w,yV+ 6"3O"V.󼒾"KB ld4D Ɯ^}ːim{YPUL#[y UdFv(+;vs-na.BΡ}EIҦt2IG&~G,Gqcg߁;s 34ۭ>?2ڪAC=HJ[ Na,Ce@7Cw'n{J哇!9RdiFbupTi/ږ1ǰOѩs\+N04 <ۖl<@`L2=շ#]SV-rvl?]06> ΄#wi>,$iZS' QJ"M3շ 8 Q]H~.f"(qqFF\ƞݎ8}g/aLϳ:ϡF@!yyFFpkw0>:)1dHZM2;z`J'PJ2D Q}Y:mzU9җ;><H) :nYe <GM$YYs3̞ZʵA0>;&B_zsru8‹/߁={01!BVQJÐDe~ ]Kcjj uE brfRD/~={w0+Cܒ q8/ D;.JK,Bz5LAVKK<߷ z#TJEi^ Cr_ud?S uWFf+Ki;YJ= c%-nfM9?1:2C=H㯑1 *U->=w77dM{?+&{_yY@E Wm4Y_-P~p~$̩rGxe%KQDi>8LcXbc?1s7?&yLa؋בYIC8*c EF ,# st5Vk9^{tuj/ ?}C~-irӟAWIΑYOJuKQDk("c*I|ӶU s$&#tW*7HÂJ>,/xv\l?v={oI% _>{]ѩ.I&l]GpE[]VkmPFQCe]leYT),E) omRnK*BI$Bv:+Kp*A:4z)f^zI342>v `]gwX &0)6Rr׫\o$yo2ںڍ,)k|} 2[#kO2?*3[{և/~I_`{σñJ:k4|3BP7j:s $jS)J _in@Ϳ /)3Orr_} A['/:WΟ]?N Rsޤƹu^L‡<*=wT IS[Yv, Kǰ^}|O,X:y>|Ar$U לZ=׾93tONdtH7ĵVuwdƱ<7EQ~")>pog≟o‘{;l}{Ƽ!.DLnvzb88.wL%B4ET{>Oq9ʜ~?qc'_{4[21.?i"}ީ:~(1o磈&6 RWemŻ_>M3v)̫K/0?0O4xzk <'M6_^94)'vCchL߸ 0N9+62tC >yŋx};<7#ѼpY"]!N?T@[&r7XNٟl!T6'j;>Dr{>qs t\,j 틧ȣZ}zFG M`ne;\[p^>#E2IENDB`aqemu-0.9.2/resources/os_icons/calculate.png000066400000000000000000000130351272330227200211250ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   iTXtCommentIDATxyt՝?ՒZ%˖lI vlp8dN&xo2 < sfY`#L$ 18v`ٖl ےekV{-w(u[$KϹn]֯~^AyGyGyGyGyGyGy\$ߍA03eƕ"O@Mpc KQUD"4N`y@lܹۍ7I"eN x5z^~LD6vRTX_G SzinR~a5s.I<ӧ}M$ITgzeRPP@f(NP(D[skFf0|I?9ѯ6 IGcI, 44R>EG 9F48^S׊LtEu?+y% QUp8LD"lշqOʍ"$PT+*<w<ذIsoOFnzz{<=\=۠jr%׮%~<ӈA&YAğ-;^w#`gH%DsLPu&7. @!eNHRG7sV}IZ/ȯ=R΁SQ\3'EyPxx.S\>%Y?oױm z#GXrgzŬ=\YG-}7Ǐ?ﱂE? k?fqǝ\\"b6 GvAڛQ]U/_{YK}}=! r͇捤R)| 24:Rjp:0 ߄. -PGg#1$7-g>{*JI&ݱ-9봵QvBe#ΙE__ԍ=LeY23bGpwT;ҖsWETOr=Ǟ~ [m9mu?:2~_&ګϞ /,ˢ[onڇ_߼̴:PYW˓CrJ%e!t%CRíRCC4MӜ.#GؓkqipUe|[E G9c io=[n<;zh&U/\ y׌}˫7ubw$ÃI'j,z"]t7|Bq@m\uGpݤ-eTa2^8R*N6$i/U/ه_яbYK r-V,Zv8ìA"}Cۻ}ԅӧPTw[ߖ ?60O.}~eE!Bo03*46NyVmi;w$׿W,_=M8XerL˲rEȦiSe(v{t2ax<ܚ}"&<h[m2bŹTq3önzO 8~n~AwWX$$`w(:{صs'Nta+H +lݶ 3(0MIlZgN@4TUղ+K((519.FZOoyUڻA>e$~2hNǑ&nv oX*?s3,Jx*ݩ.` bK#4r}KB%z4Zʹ2V^,\~Bj`;U͙5W/`Ga:¬Yqp=,Z7`AIνNTϨ`7UUUBP9c'XzQQP.4Sc17@uM5+(,qOb&_~ߓɤ%i US|FJwN޲g6I˱N7pl78){b'Rc=t4O3Ɂ}Z|O D"q 71NcK9U%\ 4%4> UK;՗+RdTJaV&O֯bk^DA-rEɐi$Z*ٱ߀w.K6Չ缝v2O|F=Iid ҙ ʸ{Rй<%0 Qsu]m6x n_1ěNLOA¥6"&,u\ʱ_wU;4eO:D[!8 Ô0T-@8/'HBʘYW+/IԓږM&9[IRR)2̨JHd$C5oa!]EsVm )ˇ:rt/Z+P-4=(,UϾ#[W܎៌ĩEBuugUCrFmdFFKYN;$a Vl9rVPhfȅˋ|!Qe!ˤgPX+\}" %,dT2E&,bEsޒQ]{O8^xcI/n*=ihĻsC*lIg(œs)t&eZ\{dn, \1UK1KM}`"|S 3]P3 dO/18oĆMfLjtEŶ-T?X >HʌZzv*PTl@IcE'iHvSu;'9LE ݇LcÈpddb "$ɷXE4&Ncu:dQzw!wލ]rk432W UĶ'gAQ14 itة~cKxH$x & Π(C<\{VٶmEc/42/b7=݅|L,Uƻ2:+ xXcۭ9+]E苾=*Tdߏ"HRh.qNDxCC5$m FIST0d&`UĩWP4&#w%G-c%rpNcN9p75}}9cZwa|hB40NtV\2|ա_";7Buy)Jnᖗ>=v|QJgD/:iDCF=q9Uh"25(m?w @T\f;zv֔Ito0]Rh>xGX ؅!ʫ4H Y[hQ]a/C?u7Ace̅(eSebGev`P?^s{oyGyGyGyGyGyGy[\";#IENDB`aqemu-0.9.2/resources/os_icons/centos.png000066400000000000000000000056661272330227200204760ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs15>tEXtSoftwarewww.inkscape.org< 3IDATxśpUǿnZZ$ x:j8zB+7R#z'/Zt)"zXZs_9S Q@%m6wIt~g:}}>쾥!VP@sύx]kRFO!$g_r~2~2(%7-1:ea ֹ>-4*(>-4ѹ%I" \!as2ǔ4D6Ӣx5> EF"'SBRYx_hPSz([ o^M!b0@A\y<'Y *mk ]=aL``\*SR:g薸>p3ˮ@Rx93!]->RXpw:eIymN]YUފT/Ph;Ϸ#0 χKS `A|LHy1Xwywh{*to_%h<||_/?zOܛMe A~㳘ێY Z/w7w^B8EP\6(׮}}eM_izZ}ptC;1q1p%P #~M(x%D%Ď3 Otj"!"i(^3^MchV")K:^KlGSkr 1p3_=aW%3SYI _D u;OGWJ^q9,SWpt˯N^T7Y^\xet ea}\p5/nvm7$Qëy/}YIT0TKhG.AG:oXM Lvpi9Ok ^MoO?JJE0H@0}&ڨ2H8qq7hMv&;, \{7Kw޸ptG2 ϱdZg5V}6~:3B$O{2oc@Ӫ%@6[r Ξ/ ?!=~ǘU ٬ߨ~&>g$j=MTfJꑉح8NdaP::o9&ДNHwP]}-́ki_%[S (Bf}&AaC5q/28N'Ғ UJJUY<ބë$_(]8x5|;,PBє-EE!3SUE 5;5aZ6}T6uSRm6㛵u+=q~P_RX ۬V3'fF#pν)} FPB( euY"n)j" P}(%^Ilڄ# Jհ: &}E k-at L9]6=+ +³^ŽIG`h"(u>lX WM[qgVV ~ 6#UP c__nז1TV6GSWqoĠ ?>s J?䯃i6*)p;.++udPe!f:!zaCo͊`۰-CKf)vShC7ߊ t6;pslsͰ"xkTCbxχ-0 † 46W…!z=p mnnOM*wCJL*u`3 HKSkB!ʠdK0޸Km^Ftzf#k6/ ßx%J_ƛF&6e”5f3w(<!kzXS2hϞ  KJMԁx.zYioBԔcIVj$6a)vJ騮D}Ux{U 5W$ 5mUtcwJ{~@a@> `)Eߡҁ*|eL}|g(]IB  T yo08jB$$\:ĽZ<H2X@ @j4Y.hx5r$P=a$db(JI"G kդ9MTV6B['|G-wA8GmԤ$4'NmKAvA8'լ%$NBMZB(6}pZ,-gwYጱVŢgϞ;I YAN}73~ᔏ`R(R^$EZ'="tŴ6pk~,FUҹxWr߯nHA:\_g Vg7pk |w@ĕQ$,1D`*E5Oaui}%K# m\glODB$@Vguɀp4žq%pRT-4$?h<ݕ}y~wxnY>3cgU oq m\ P.b".eKdDA IENDB`aqemu-0.9.2/resources/os_icons/chakra.png000066400000000000000000000147101272330227200204220ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   iTXtCommentCIDATxy$W}?/דּ9{ցV6M+eCbi!7Ml]sy1t`3B4fGs}TWUV^/sȪ>F7_ċ|{ nnnnnnnnn4xQƵ&N'fJEx_JO Z:_,m>q5:UlO784J gX4dG7V<.M理"\G˔7_{Їڿcm6!$n` L\r&=E !ÔZ@P@ ]][x5oȞ@?~MH"0s6*1rl7c&eLgɑqR$]~_+_x_'-g[]%m d,6bFǪ,9k]?ا+g5 G7ș*Ãyx |Q &A|-_LO06Y'MtjPQ|Ǎnx/`M\ub3Lsٱ/z n pyaJF< Qk U_b$|_FQ$xoncqK0L0A_ x'AnT<|NU}wJ?(`\{0̋[ CoW2[0nBncOOOQmj>}hwG\7}sI_{M"xݕcjXmp;@&!8zAqvAPIIˆgy8sGn%C=+p^vn,cMLX &>bRv{dt rPqs?><ӆO y۶F^H.B~7mP0i Pu"ULb +BAm4Fhڪޜ*b4M_UծPk x"dᡪ*,xYU>]H.ꅬ{.q,?T1EUe֊88dB+5Mkl*M-SeהKeE28x.{ FPoswAlwu @6֋Z4Mв}X1HY6@#R'6ledcشO0' ^Vgcߥޣջn~G7_2}c/C gX'{i!6!j%AcnX+yw˳-taҲ{N N(e'5^2ҩ{d;kl(~97n M-˫:%-TBYgJvJ.]߂lߎ.iy MT:@+vkVS2v^ Jۀ-TA#|^3xacfmQvulMǵ],eS"gX}O;Aןpt, KO5]]dj<$SbnyZ/HؖE!08l+XiZ(D\^o~W z]:zF} E!&mf` L6Z7w봜Ӎ0W<.i]3Y>4S]1lՏWPi& -6`k˂j'˷DW$eChՕ{RخPhzj s(ɮ&旿7_ C=:A6{8vQEV-ȑ WWoe'a1>;_oЈzQP䐪T- Vemiƙ=vbAͫf>gX*. ༛#}Xznim8.Rv\vݔ.}oD:G)f֜1 ^u??2{kO: Sp\oGeY% IOdrA.DŽ>qvVӲ5HСky.ykä7^ N$qg[_D'0lQH:4H!0;&=^9 `=h,=%@%J3Y4Ѿ=\~sUL#h̫&zo^SCWͫfϘn`63N-5crTٔc BB*s 1dcA}dslZrf^YO&LWӶy'Pktgz, 7(Ps=r4MjjGw~5C'WƊ[u"RV+pMF_^AmdFB?N9:Aj̹m.? );+k\awh4ۢ3Xib"8:ڸx|M@/ka&ÄES4!m v 3/ z]/ /Z#ŏ!j2W&4 fcRz[>Xdƞq[82Zt:$+]hxz'ƪG;S aѯj.뺐JfU9 5їWWMJT0])Aʬi6ĉ S8f ] cպfVAns81P5*r]$.=.ht\s@״-9u`&P7uh \EKlۡh'/6lcI>hbF-P)a̖=?Y/t %JŲ11/0hhS29i%OqiԽ-7M%A djnn˚>EumoVڄ_I0K>O) l5 Jut%oKbM0UMcKKʬ [}y+6{`}k6J&,, gZ`TP1(8:[R N֠0,iyXИXHRad(jFEPmH(Ȥӛ3I0dK9KnP.㮄 n,(LX/^ޒ Ô6'ԂjF*EvOt31/ >AIΛm2MlgV7V8^1%/g{a0 8;А 'e̛[xQ"ϓ,0 ܢO*GSw(,-9o[⎦j8Y+ƛ"^3MQz:υK74]!wq1E5B LB!J0p LsE0^z%Jk(\5,\8[ :o˫isV kzS>}natv٢.V8z`I#Xښ1E*aiS1 Za&Sܡ׋WZĵDMPeOzJ1^3*@&#́oNޤ Bv 9ؐWܐYO-+씷UyÞեb7/]kꎛC vģ{s1 n,yF{ы]7 l;īxXǝ azd&N[*= 1T OdcUoz}^ؚGOBMhx &1J"u )%5LAV7Bml]!}~'˼vt'0AnyRh$ضJWVw4dk&ެ{:tAS Sz+4\[2''0:<02(84 N[QU82 7ڒ!xA+n5kkx{(EF֡3JuErݶwJph\痄N2҂\<|4nd9d/3U(dxȚwutB=RH'R)K.HR.O)@Z$RxeXqE*^̩Z9V.I>Zo/^s;䚃b U FWHk A{՛Ʌ lRKpN٤x6gfS|ACDQu~5&)LEI]N+UӬ-MDlž!U$ĉB(($MS4%LqKؠ0VU4RjRmt׏)k53S45>?<>&34TfFj6 b/TJd孭Uzs{l.$iv}sv0m?6B jFQ:}K/ Vo/oeXMBU`8\UD]@h~L-on.f>3i2?LTU](Q&u^79|J #;o{%wfDs(B^[*,uYXZvQ, U*`đ@^E+/u>9-TH*`i :릆B\kS'͑ou\ _p[/9<)FR0h59MJ *k0C"P১S~1LPuJvv,OLOQR o5l4.b2_?6I}\DU592W bu;VMi*=yǪ *-r5wĈiO5 qu2MTxG \h..w> h^7b1h BbRk*z*G&OxgCIOF3) $<7tdon}s/ Mإg؞};]@161pVγs)9wJ0,Z妽ݛ :O>xǗl{N b?apKlY>ʌt=ZXy-0 ծcq:&<8S̸3߇]L\1ٸ1B 7W'lJ!sNFY Ucط##wM>0:^W͝`rlᦈcuH;ljɈg49>.d`kgOxAu1޴m;>rǝE+a81'O;4ߺa/fTr+ ftP$]puozcz^9ƕėosw~%޽i|j'C٫ Mp). }z ct­>zP`WMqmWw||ۤڶ BiXt9%[)c(">(Wb1ubx0;上'T"sWEGdj"ՕSJD:PDfB Խ&=o]zwy@Bż98ΑkmwޓۺۺۺۺۺۺۺۺۺL<bIENDB`aqemu-0.9.2/resources/os_icons/clearos.png000066400000000000000000000135111272330227200206170ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   iTXtCommentIDATx{\W?s=F#Y2CC^6@e/EU(PlI돭2ֲdf^ 1v0`˖%Y4ͳ?;ӚJV~qzjjjjjv>vӮw6j\( ̖TSsmŵu{ucaxoʼn7>}qKO nyo7>7\mTks5?/]΂0TW83vH^Yo骏}wsgz8T=aZ 7vP ׋_{" H~͛?Н7~w~{wF4u1͈5!g:qT.}KUY>Qቓ{IgWluJ_џ};s>WJJA8Bz^FWpUj6^K\O?_:/U+@~=p[M y^M+)'Wnke0U z*rD~G늯F;#ᇎxa 63|W]* :Q dc`Rr?n'+t _ױNG?}}xC+,3E HOfL#R3#QryGdd|z()Yk5}KI+APxu5t] y+vFO~?}6RJ4Bͤ-pZ3P])׏ xkaZal1RjxG#"*Y>r$y_]|v( C\,gv[8AV8)Tz $ 4]g40 :!1PN1nFzH!kڕgg=<]C[zy{<2M@XZ 76"P(C3 R}C*}}_֏'SMRORm% )7 'W q@ t|i^'7o>q5\QRJepmMoK]*H.`LمtYN 49:$gf3U9C6ɅqJnX3&KM;/Nu<㞥鼒$h21iz+iDE;e-#$"/ 9Q?,M')ʦꕙm: \>h!*륩7oz|W/K{g3oDatx8u'_#ĖYBetLMǖYHczrp(ifN*(.^; fr^Ux\(6B~`&i(Ֆ-]]K݂+tJ +QKBrc檳- O gw!&naiMXeZa2[JUAJ]>zωgw8jɉۚN- t3R&~W)m[yuBp|$5݀ <2;O "+gN- !LۇnBǥNU1H`uyH\/OWZU7;?⥭Y=O If+ЅCIP -l_s\C#DHqT-v0d%c^p|x]d͎f`!T\ IV(yB&Ʊk-;u%|bխ9@3hBR81IB,[LSrZNUk6"26t;[oZPE:: tB#gvA4`g$ǫ !MN6z'//xT$c*%&l0~Z9uM! BMC9!15{Ltj əܽ f#,*)R xycXGɺe]`űu{ۏ^RЕ;>.h:dJ- B^ -l,R!ct`uvn (9wox.{)e$ 1trza3GH.ݼoC̕&JsSM>7.#@D."4-:–5b~(w-C)|Dk##UxB̚{7}.{ .*+F06?51r\5|3iܠ&@ 0ED#x:1rIAW܅>( 'f)C= }7mHa7d#L-r,/MK!7Wf,=BLnXiu.]ΟkN1dqrtω0 ĞrMWY5Bj&woxP+IbMاO6RaDKږhiK7$Нm23;XqI}t- T# 9Y'0,/ǰuf={Mf|l Tܺe5<׆2FK8i;g+$ \Lj`SLu0J*c&+{R^d(U&~.2ѳop˚{î9vOv/ wBjpiHF*@țYȫRta:/hK8 &Zw)u!;^$TA6[غyWҭ Y; QRJ|G)ƑZe(kѢbᒺ[f&Δ5" )y6oN>f.qtIF*NᥓFXm?z%~~)|?QY, #)%ЧAڎ5 Z^-FuJ:`qt3SsF~⒂;s$#$Ǫ%NK%ANti%%ppT1pcǝkan9繪W⧇@-сaJPM&pt%aW|Z#VyUouȑoH# G(H5ͫ> ;Ҭ3;B0pC~\j+Ы^)]T3FEK3x c hF/:Ǫ%3-z塠.‰o͝YpXK^[[[iCf+MINˋ5"#g:x%kE =!KZZ_\'g1b|=::I.%/u/n.Lsr`qmݗEƧKD u0N~/Q6n-Csrn'ڙ7< B'VGuj?>ME loYϵ胳c-Mz찁әDO}]wt5vac*ja@ԵN#e`h۳Y?CI6Lܬ6ۇ`C~2y?>$g7/yo;}ܵ.nKk$[ᵹ-MG|]({Ƽuvm~ `8-}ϧS(z ad5w~om)؅¯`uj4iʕp1 Ri+朋u[7!^XhiW(,Br]O}!_P==w|W6]M[^zNz S{O,L00 B{k10M׸ {$9h$YÉܕz>ﻗUgVB$EC]K5Nih-Z lrIYVt,~&7ȥN R̸Y[n廧H?75 #;:,|]fleG8}t  D3B,IJ-VY!ZAV2e1 efʃ(}.OlzmJ _fUŎpW1~lu}I5ضT!cKTXq,*bw[i#4/B>Ehnvh\o]/]V=eP0*&{yrf)hI&i*ifHc[Lt8xKm-B>7l$zRoZs0m[ 傃ك'>lr)swL&Ĥ8VO P &D.MIGrI-4# d3LUҔul/C\v8AllvS3 fI͍s-WO.옴|+@Kv !B̂fJ ϩ'$Y.`?xB3(F|{YgesCwW FQrdhzPnԥ-%W!F >rIENDB`aqemu-0.9.2/resources/os_icons/damnsmalllinux.png000066400000000000000000000267341272330227200222320ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME IYtEXtCommentCreated with The GIMPd%n IDATxy\U?ںzKξf "0lI AWpqP7:?4N@D!(HIP IȾt:^u?=շnUw^pܧ*Օ[.=Uu!l"}G$4`20B Dn8 wv+@("..PTTD}}=555QXXEUUt]' iooȑ#8pGb^^^C@z`10]4e„ viL6 &PVVaaILQRW$aΝl۶ 6~z:_k p 0\ BMʎ;VXTCZ u*++s/^?ǃ易~?MR* I[[---477qLH rR`4+W裏e!129ic,X5\Caa!PTTGӴ45paϾ}8pg5%{SRH+#n:% p_khhp~;@ @yy9eee~TU0za:t;w}vv}R ۍaʕW"L~a) Jp 1e /O~QQQAUU)Kx_˗͍i>b^//?8֭K|';a\uU<3\wuեs9 ֯_O$IEAuu5M޶(,hG]}DQ^/%%%^^^Mz̚5[o8tx衇x'PUn7#Gd֬Y)d{d29rHPO),,$zSj***p\}r_i\r%DQV^}nx nᆓ0ErQ\\̜9sxJIE~~>{ 4mH}CCCp8L(BQ<L4Wqc޼yl۶O-]ŋ+SU L<˗S*fB80m  pgEkjj"  tww3{~#$OS{WU>O/giSN[o% P(ʀ+R0K7F*hll$  Rw1czOvS^^qPqƥ? 1|FozpBƏo=0#F(b.Tעa?!pM7Dg3f̀S 3ֱ(Yp}`&f\PWWG$!aΜ97nq 7PXXo[m | 0sZ[r@@I5MS+**RėW^yI;{# }N",Y\0YjU-W_aD" 6cC1\JqgӧcNJ*Q]]-D뮻Nv+Vcoɒ%.K⋢… EEEV466B7 $P;e,]3ĻiiBU29:묓|~~>ӦMIycRmKDrZ˕d@ PEdW\qT{|>д*,PJm8H*MzuʣP& [nI({Ɍo9m%0iҤ&=X K-x_h7򼚦2y&L&UM^N.8 *<:gOkB48"R}{ΚgV^ͦMطopE '$5{xI#Ft;ۏd;Π\@9d#$>&I~a'֡CxGo g4&߯L :;uHwj,[n'0dj`0x<' 0=D;޽{ v+//wLipao~-*+j ¼:@.O-1_w]Fu\\/KCޝ ב#Gسgϱ$f]60W6^vguF"jjjRlU:$ $%Y=9qnqW/O~P9QS CҰ.x/@7@7a.)BwrgNff%|<Ol/UaXY_zυ$r%u]/MbURREuj|>|>_>~ǬS-UIԄ]HpBWQ@UPTk.s>>~ghkk㮻J' gӯTp 6aÆ>Z$ SeB~~~Z}B!"op^a|~S )&w' 'H~Y )||A!_3{:D"cr|o͛Y|yІataZ"މ d&#pm۶*s%IΗ^/7nUCl;auI@S@5@S)p,rN^|ԉ=x$ Xb1e+2r^EbH)>zQx<냷AYYYF- 7>1jfpǕ&ztH LXvbÿ́ wtt/f͚rn\.)17c6j6D_PM<߳g~d.'{<uKr gn襉,DmRܯR]q_XAccct$ݻyW;(YU"R9 d<ϗq, .((Hj4l&QbWIjA_wq̙ӻSyWXz Z?R͖.@Y|ns?cøq0a@ +{<9S% Q׫DgND$l!zRaZ[[3YjnnNxOh2c/Y;ȕ[{h4\^D"֭[y1bG6F0 [6}g.Z0TЄ)EQ o SD"rQٽ{7G951-¬%iY9)=jb`GɆ~ɚ:򱚦cۋlzu$JR#SY>KM nͺTǫœz}!Y* ^l[a!C2L~TA$Κ܋A;Vu&\v,}p4Du`G02 ƌ j]O,,Яl[A`U1žK5|n@# }}9+lK5c?Hz_a fV̆Z;hW\Q?5G8_w,0TpiPp;ywG2Ws?:4rWcvfdU6eO))Ҙ9уdY6So]<9ВΏo/YnspQϙϵЋ\yBin.QV34w>yq~m]9Ys-ZbI#ֿ%l@U `?( zXp,73ǻSRZ`肎.í[$+7${$gz>?w-c"Qz| `L-=npBe0_m־>h#|= psEgX1zWϘ1C+PάC}3e."JKKٽ{w-zȏ1 rW[ x`ʔ) p\TWW3aJKKˇPB>}:f͢Tۻ}U[D^oCv 4O;s嗧-d\JR)[2Xd.ޕQWWGuu5@GغS[[K8ѣc-6D~N2%-ʈPTyٸ7p oo)QJ8Ɔ`08{61`J  yꩧx衇XvU3N6m0Qȟ 0|Op8k榛n׿5wqǏV3`9s&z+]tbǎǴd}${lAA`h4:m\fF(Ff%~$U_ve8 5cTvt''o㦛n:.` !̓O>ɮz'/c袏xcܸq#yK46$(,P Fߍ9brRe M?׊.EBl%MbkĿ|. >r4[oeXLzőjxNMuBlbK~^|q޹s{?Oّb_>)_bBl-WKU"Ω{~qbU\6Elk{_B*j@UUi3E3GJ[ ())Q/ʼn:2{ X?ZU|\wGy_G3; mpA!Fw{'~{j=|AyTMUjasd2ݮ˓Y$bfP8W`.x@QU5#fl} V j;T.MxkHtRxӗze`eatntuueX޲  4IDAT,P@g<թ4Ͼ^Ȧ׾ų>oƃ_.@5Dud?.Xd2i/-ysmw7 d])|a#hG/|KfN= y},v5J7o}+mO=gLgzs.B!4`)Wܽe@u}fLLKl 6,*@tعd/_ 6cf&; ֖SG%_o/ܟM$>cGhnn$?!e 0xGyk2ʷQJ tO/.)0m^*^cU[ Ymg1ip%n-[ƳO=5縲~ `.Wy'8p6Fs YN-v=77Rly^4WS)\c6,?7u}x eᘋ *` =*eEJ_>ͦsKO`yZVBx;-i֗MU3[U1u>W6R@Q{bl܏SrS푖@kiAl}R .< !R/--]'PIw2i\"vѯH5dN?AB[U4-A!^l.;tVz]Nz/5n`G9v#m* Jz 5u=4"=zm/m P=]uF M3&}~>[Q*B3ax.=q`m<OtAQٱ΢GJ78xn=tĉlٕB^$.v BD`;Z1u)N^\2od;Ĭ.=_unm0uTM'+ Oi'<ى!ؾ_'2f0hEl 6bxǃ(==cӸ/p:>*8UY~Gix<1u"| "9 ˵8<FS}VmL˶@o0(mמ<\6Nly!e%2f[n=u}zZIv@XaX,f я <ճ7}9i_7oO>yx<2WP3,<BYmY$Ie<6)^9|r9 . jzMsկ  61<hD"a+0s P @ p8o&"ɑ=`b̙RsiA~Kpt a~wPvK S78A9j(px<566g$Â)󳆇_q5d&EC~SUh44{ փ0 y\zD!͛^zi.ѥ^ox3F.VBVxu@4Il @j@$H)ⱕ:Xg71c >Lss3ͩCHұa٫j"0SGImA!& 1TQ(|k( {:ujZm{ʲ2Yj1D%T'۽iq4[`@C]HV>)Srq)3<-4lfLi{HIv14@ tX{ ު">Fɉ}f›s ei b{q WO8ةaM5d#* $]> +蠣#UNTЊbֈJw.?xׁYMw2" P/i[X'8:,!9ˏ[y[+c*VߧR]`){9޴vBm[_7޼_`S[X ,(.G{^|.P;urs? =!Yb#aymz/ng3AqU ;#p'=$;E7kk*bXol:^vUl%W p.b= o; x;Yi6d+1î¶K_R {3q(*.!嗈׳~,:?>X?T C)p1 \^5<ڏρ3ǀ"{Zg/ғOqr04ѭhL&\ʼP_ߞ'1}]KoTAl? Z ̌l-{p1ST!CsDG艦4Mwx=te? 0Ӵ0kTGQU]DKED4~6Z:;1 >v,ïP PM%K,ӓ3/E$bZn˳jV%CoZ(->/%-*?`'˒y+IE:=bN1OAp1XYD)%={Ơ5v𡡠2~El Y2ř1+;,,Uzr\\g6m?>zM-h6@ؓ&ɢe.9MveavIP\>`Mہˌ%4, R e9XIENDB`aqemu-0.9.2/resources/os_icons/debian.png000066400000000000000000000144411272330227200204140ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME '{lIDATx^}\ey{fΙM" %Kdg6D "o*-yjdg6AVmъ>}Phk"*է J_0{fË4U!C33?f̞3/|fv~9K,q(CR~+jU-u,-t)ؑΥ5K9@ʟ.f[chdm\n̗)ȷBZEoDMTK2>OgrC楻7۔:ӱ2JJv.-7Hn()Dn5,JpI32?d'9E|fRϞ6=ȢPGS'!@$$+ 7IJn@cSz9ɸcO|zo: ͸.1XA^Ӊ!pY+ AʭIV"!H ya[7J8>8p_@' 6rc/j)=t.ў>&/+-' dlDF҃g;`|FkP/TBD=%*-kc;ܨ5$ R(GYh6Jn*'j'[0thjCoH j'{[+Jv!XgIBk@Ʋ^aylz3ql`z#%k?|0ګS[$9ƵQ%sG8v_*B_#N/.ٵ`3 A@QB%HЬgjzITc.65[dv0Q%;\lEVl{tm] ԵpuE,K GҺhw} ]ѬL+ ޴ C/>uW :=. C$?dOX oʺb&T93<|A K?ߧ&7+YLzwUJJ 4{3:D~=\Т~ · . #f6Ū#J4˺758d!15Ʉd.IwPeQjecxK< f2slSрY~j'[)NE+[>+iWoK^;w)DGĦN*כDxoSgb4;YV ݘ^|-c^x9wK7Bԟ0GԸ6H̚jѧt!Nm'UIf]zYoxNWLf45tcJ) *$ 0&G+?V8Dˈ6SD|c,S/wҳm PJΆ_HO-~)N*o#O}qRB# $?J_κ7olC+7shA2ޖ?fXRD:űshF͒ xD-=gdUc ~d 6cI:=FF/vlWF3y^IΗ)6[Ϫ#Q D5+0ZNJyF`@'TȍytigsH7>^֍I"SRm& ֍ _\D3`2.Jf*J8@$/T: CHUsd_apFJ$s+ eЙ@ӛV L4^zUpeR; rr |Գ+k;c^w1.L ~S0+#m*c VŜx\v{f[# |`N@tЛKw_U+Z;կ" _fz Gm2M@}3#Έ=d> ozjJ~r_kԁ`dD7p{kl;^.hkKG'^I}=) Aflc /MO#hg Kp 5';=| ¯U_*hkK\%AtZSel䴨Uz9D9х"djr<+amHf:azcFqO ')ֶAG  1={H誽AȔ^/?JqI FT(}ouJp,ƿ#ΑozFyzg<ڗ:H!]xo4*u {Aad[ܛ[ ,S{jLYckO'vdZxkjBoogJ/%@;wXg.F]|ZCW ×$c{`]G-/wB_عqsR^!ح] 3 Vꁴع>O3XHʵc[wTO7HT/,W XKPq4;˷SQ *`?\r-(Y7ve/=e5u|(ٹ7cJ] z_fhoTJRjëov-^ %8!FFdʝ[O5pZWT\u q+6+AONqO+YXc N( )$sxع(~' UwVȪ^KpSH ~85+coXA%$Heb,'uHj$c$w9z|81F@@ y$+wbH9#Pd{Wp .dr&oL0yGp3h.̸b}$vZAྫྷ[W/;űWA~8? #ᄹJ@.`!hʂ@|Џ>0()8"p V .uA-Rt^XkH].p9Y0SQe (M& /2)t~|% c ܓHEvOro9hPq1!6x49xdҘgg #0{nN/Z6 82D<*t>XC DI19=!^oKM1};FInŏ5A15Lfdp7,3bU0ɵ£q FlNdJV""&X7;Xub W9r/;Y]NuR9]R & P y4)%挮)@-/95٩K)ݻv *tM5sOP XC%zCW [qIn@R-]Nűr$/zrKL`CB(Y>={+u͎XG==72/ZAPAH='[LNf3kV\[/MϚ %M,7H%gA+R^Pxݠ Hrux|t]=5z4(كoa3QI;7 KCftۇ. +D|̙hX.|KF]b,@W$ʰvȬҙ \ MM'AYIX%:gΛ8vo ou &+́;{bf^XYpnwH怒&!Fh0j'?k+Q+3O9PjyPo xBL0'_(Y ̫&`2pIO@$ Z}(O[5cpL&o.1;m0_ zfY>hO5뼭{װD F`;1 d/_)ޫ<ڂݹW,(hPA&ˉQ쳿XX Рd6ɵ`P'N%KЄyF9%2J%ELZ$P~Y^*--&ίn/'k_[[0E r J)M`15s N&CCz+k! *n_-߾+̢VɌعcFa# 9]O֌7|ODuCFؾ"JZ&'"D̎f%Xw70@˰acIENDB`aqemu-0.9.2/resources/os_icons/dragonfly.png000066400000000000000000000107361272330227200211620ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   iTXtCommentYIDATxy|Tǿwrg}&3! BEYnU>B-AP[-(XO[)VU啊P"(UDDdQdf2c@R|2νw3< DUTQEUTQEUTQEUTQx\ޓ%l/s)+" `oDzj"oGߞא2\~WGKI:MDi7ٽtz)wK/-&_ҢJbK$6s]K*)Q9>X @b|,=z'A>Oo'93= ׍pf nQ9/?/QtM}WySg^ze6mF(?M0,Հh0f1[߯0xuzA9 .<˾*qlF ǂct?Z7Om%m`kьQ-lxͳ3ajV ʫ,un_x=~JB;ndei@v .Møu8~9LŀK,6 U|܁n'E? GˢEkkib,&1.Xa0na㱨XUK*KCXUx,*)۬4øtA7qEF w>EqsҨ@/zR'KVL:OSWʿye;g:p4Alq\0i(y9kW͖zH\5+!+z_cU:tǎa:wðaÿ&= iӺctMaS#챨x,Z-pmlXW/'&/46d?2^EcѪCJjClaideB^]4[Rd٪V\pFYi ߣ33GOcVCzwN-dg[h{uvanraS+q"qƋDmgo2T!.3O4`5pzwZ!lj%v jFB`'CTYj.>@ өe=(bIVַk:;wfзjmcT}M-G%u EH U27N֮Ej&9~&cvSb-l$rmk)HZ`v?vUxpڃ<6'e/>=99yf38t3OЦkfl aTmUK-d/5t%z , xb"k`U kTFA)9˗GѧwܹO⸢^zaK!%o[~AL2I.#FzPe<Ԃ k뻨ow$Qɰ;uIHJy۹k$$%'^G{3'\ߡ]TY7 E#N(ԤHrAss#LKbb<6{]M)䭷tՕ\u[:|Ew,,!ٸyح o[j^cN(R!_:AY(2mJآ.&DL2I r/ڎﮑ2dg\t'+I2r*_5Q"J@{5IrAƎ#Ge#ӥyrlǂr6nzN:O{3'@/ (S[n1Ɂ[1ȀAeMO;Fzn|gl$cǍ7\te%n u7\4ܓ'dmzY.ux}Ug΂IHJȂ/ʶ>X_+fNN(r~֩de 9r,_Lf<2]nֵvٙ X\S۶`]<¾wW_9`6yhڴ)qqq$$$p8l9*|4Cg{o[ZVJqq1:ySXr*-;Zh;*7t6 6P|,7b[U\4<@2ʬ#֝8> t&]{^MYE#m4 ' ]d,Ñ-J( ~*lm-C@Jλ~ %P y(S0RxVJgNfCan:j19ɶWec').)¼|+H0hT- v0$#57q^GmlVUxA׬W# Q u4Uбźsr:i!% ҚӮm ޸eqsټi;UdddЦMZjEbb"NNXLFՋg} }qf Jg PRRLQQ1撝˯P$H1zt_Ұn]e/i Cڂ/JdW?uY?? W/yCz%hp s5UÇ"kݷKܷ42y] GO1p6aԩddϪռ$L&Y24#'rfۭn 32C1}vjNۿ̉ڥ%+ܓi;n'#$ ziǸ,r/xm _,;n%W羫x2`Pi$w8FAo޼+VrJi>na55kYJߡ*•kOל%w1rHڷvńKJy]8R/]eQӣgIHH@U#+>}dfl;>]vS:7}Nqq)hzՀ FL]~٥qOw[݉Q]Yk`9ϛK&ڹy Ҳ0]Ε5ңF囕m1ȣylydFctÄ9kQ޹]uV=&:[vTϻ]߲źy X,(efeYh)[^mfzt}+>}M^mJt=v󬢰YJ_zn Da#aǹ "y'hlo\CXG10_&(P&q|3ǁNg4t4TN$L0E yt\JĀ3`ofEA7nqr.DA7Ԡaa4Pҝ6 I(膒ˮ3H-펎 L` zUvܹ=a 4Jϣ^_c@Op5*&^㉍nHYN*IpGA7|Qբzv,WmGUTQEUT?@ޥ~IENDB`aqemu-0.9.2/resources/os_icons/fedora.png000066400000000000000000000320261272330227200204310ustar00rootroot00000000000000PNG  IHDR>asBIT|dtEXtSoftwarewww.inkscape.org< IDATxy|]U^'ɜI$-R Ef@ eAdRQD bWT"pѪR2 *B۴i$9əϰ35P}+{ΚgBJϩ5g P Q `zv#!( !My.BB4^UUwۀfgLr) /&''I)OBI%wJ)_.++{ }Ri5`1pg ! !ΐRM$H)-++sW@3E)eBwfrQ4$mYYc@O.@gK)oNBEJ4h(B G(1*TSSYAMU9H )e"(v0&~ i 8_J]!A8QG;:zٱ7e$"PsQVRB}m%s̼M9Lp,*>ISUK)]1/%*v奷G.MkkIX+w\NN:lK7(*vȍO> 8CJybv>C'7l/m䕍a \-OeC9Vq|i,R>&X-wݏ(gv. I"hq7 aok.qOWJ)BT:>O1:ɷk Ӊ?7=M@NۗAc}cX,zo2eo'jA/2w<&No)CI!W3| { 4fq9g8q@1 !;ǖ6A_(2eK)wQ^|pRVZBYi . UU Exx3 71? #\!;VGpxIZ}8UJg!B|ӯ#oLPUQFZ&6P_SCu e% AňDcQ|H a%C/o߭@(q ?$~tyTUV`4ݵk׿-X`};}\HJ!m{vOi63ެ%%B0)@sx*+ܸ@ ?&02؇wO0(g&mpf3:867x\ٶmUK,y4g֋ߐRq=N4I K+ʙPi̜2IQ]YN,   18g?#{_a' t틹cmjb,Z 1p/ʻ faQK\2q< fNa&Lj ?bpda?# ?O$jfXA e+\JuIRʶ̙3tA\T)7?ha (u MoC0wF3kB  20wG0]J2%1_VZ'sK9l$JKO8>y/ I̞:&L/os< J)k濽7à/1e%.fM l  Ǯ$̞3.9s]Hі.|EZ^rh=`i8UUM_˗?Ocpi!eqqη#aK̖y,:h͓ƃ!_H4J:z񱫣A(zapix MM|ki(!酐?_лv@,fd +xf8P y<W :묧%oR7Uf7q kERW13]qa 7D1}#}ti{{g/}ÜI-Ro=𭛾OMج2@@aP 6'F؃m_²3,q*Xn)W\q?WR+cغOOP8Ϧe41^>l 2 `|[ =[--8s՛\ƌw #gdK_~_ZX,.2;VT ]͟ΗV~3FcDM0}# `G{6cٙ 8Msx/.bW1{ U`fxi`Il|2^hU/f^_Y^ʊcSyB=@%c`O oavM-2stK\%Gws)L57`4a:.G,=Wj's-gPHJyQUU.CN75sOsNeb=E3FaoۓO2OXwVGYi)<~a@@g>903 O [ں_3ի?[h @r|~ֿՓZ9eTV+ >!tv Q10`;$*.8dV4&k8{fƟذS]uW><~kB%f ﶲ'm?F7_|2!#>ݽwcwBlnx=͒Vk)~Ɣ{[@-`X4={-?tW]_^f(b 0#~0t 0=$Ls>1+:2QwM]JA%+KW0u46POcc } P̓][o!EK#} t1Ef͚Kݼ\)6!\c(4Uey͹,?r1a%J<228|C#xyo{f^sJ3>7v?G^$&l&wJJap0uDJ6 yjaIYQN6P(ԕ-\3z:Ɣ%+8* U(A]}ݍo4mǬY{>1/N>w'y^7nPF;äjv6 d쩤'W=PӖyW>ipRn;BHf4Mϝ@EDpD(qG18;8'sV.?!MSBUU$ԸU8jv6X(54+_?zr\H{yhGY̎T]$& ŠB,'D!Qsw7,85w.#,KNzw&# ^C9:7^Ÿ?7OgϞ>Ha.2 ãW(Q}~me$BGO5Nd|;3^*[kr[[ZS{ESQ ho/olB\{gœL"5|f"!Ѥ?QD" #xG(QSH}M]n<Ī@l If)󈻂L0R?<-^P3Ӥd˵^xː5vnF(RJBah5!ݗ+HgLYԃ4ah4[&6W:޻ -͋q͐=R aJ`}-ϛfϜ9s"=5lk30XHɩGhI*(Qm}< `3ia<K:iĖ ?]Hi'wYZA퉘NnmXJJJJNm8ɜ+SZLgr,O*DBS hrDlABa1p4;Q i*N7(>Ciz9+n7 Kod !D #D(BoFkآ5=v , m~_ޯ(JDW>}]bu^y: 9w^\.̉6$T%CŐR GCBB R* Ls\nb0`[JєݠTl0qK, Cվb`$ʭmDST(hX,A bj`| u (u,ƦeO7H]2'~{M0\@jP1v{iVWP]Υ H)' $aA1f 7f;I2?\9]rwy9(- 麶jIn$:$L&7K1 W6p$uJVCd)( 4տnTڟzv> E5dTKGXN]"U5 @7(F]|2|6~$Ȅ O0 pkpD!T Qt 1]&-61U ֻWCE5TPRYE.M<ƚMmkc[07S*aѷ>bOvU2$>-Iv䜤MC۰dj*ӆ`"@JiAYēgAӁ0q]G &ײ9bF>E.`ns~}S9z2n|/$YyIí\@[i/-Lͣp60߬C&ז7NqsTS^C_<GcilA3?$,+6JkR$)%*fսaњ砇xؿ zA<@(0 G;(͔?e'`Pr1,&THKH􀱙Oc/̋3Yy vrhXRwTڼ:?%56Ϗj6yKJ zЧ\,rK,tش"?EO i̐N TSepH8$2cڙ">ĥp9sDK_N*2}a Hu >S ]ťhpp03\EtxF SS->@bj夏ކoϋ9i&?@IO}RRMdg96v8HSN; @'TWmm@<ɺ+SgJ KL[Esz~o, o@O.f˗-MD"ۼy5Moe]#P 4uxPI<݃YvG`{kc҈d,HeF+Hdu6@e5O5d=(%~ug8aΤ1㤡i!Q6/\:S*_N3, 1@ Q^cS4WVnjssY6s 4ki_ˤz=H4DmCllպoQMŇ0қ0>/*s?  D@ 2K@8D+aJxv@6m;  E`'eegL9j䤇)Ncqv@(&TtL^1~=Ešvbd1'#y{ӦM%2!N2Crtؽ*"/w3#HIFo Ls0ӱ)/؃05O)UUU󟿆|miDIF 0=fE[^Av4, ow[`-Iq %έM@ p!w!4Oݶ h=B}"]`BTrϬRbPPfN_u`0,Z1l,hI P$4T:}TZm` y73pK[؄5 G4ų)br]w-g@R:56g* A&4@fж PR%9d`|=]{K%IFB"W*mr6vLOEJC<6~8orh;w1 K)  HKbj9S#0G `H%- ;wWr&]M!J$cl&@B b<>[j)?&]&cq =!ݕ0/Lﺌ&;Mln&|Օ=g`vttt|xz)Pv_3mP^e-ٸig5C?}6c_/NhiM\pᖲ=COI~Ҳ%($i@B:+a8f|:M()4\ IL;p.兝0SEg5=[m'w~ߴry<;~nQmq͸'p0+k GZ@_X}%`˻M]}!mH[^>c^mg矓&7 茣-o~~2f @HI #g&˱4O9.{lH;nY)}}nm E{ wr/++۾d)Sooo;nc$P$C%Ӿz~f>`At<*&w#%oo%ڼ/K`) gp/VZ~)e1%X &qayQf-5X_ʳSO6(PBP2qgMQ1ީfe'45kεiƍ|-`TXGy4 ""Wt@X2}14j>Ŵ Ӗ.>܃g,0@8~cr︆jp8Kס17C^s)iQ<̣@@΢8dy|+Fv.>(֮ZS_2)麰W( SnrYvw֭[nǎ@?q;cAH)HZg=Uj (+4=k2\~ggvM ta|tϪ0%sZٹꫯ~,7R^W! GtHMp94@&gk>}!ڬ̳k̽|G `b0論>Hd/Z'ZψdFH3\ [\=</pR0q?g /<}Mk 1^+0 ;#CFX}H=ìfZ[57f<8XPJ~7pީGZʡ~_4),$ يzyM[ɣJX"5 xcmd˦]y楴؉ARGF$Q֦As?e~"w}^|Oh_oGh2-jP%R H % E*x; yygX9'I)7+02nYrdfܓ磫7zO4 q?馛^Dc)eXՕ-2, # 8x)JXVbvn^흎a~5+h{Yosw7P !l3gMU%xdu@_{z7N`XI~\$OӼ̛ŷ3#OJI$Ckƅ"QaFPB|x}`,ANO9+ؼq#Vfd&0g3W?Ch .8ZKmy<ώ+W޾vڍdmJ.;ϟzgKpqKBcv8#22"DQb :{ڭv@'5W϶PPyh֬T&3 0[T8a ELkۯf MkϮX_Z?^6Ro=K.MZϟFTU+2ek{{<XLJ:w._ix8<y;;xoҋ/ 6O3[ھkC>7dܒϚJ}|s(wDF_&'vЬby!!R !,W7k*N:l>C x3Hjgs+)Y3r)̚֌TUm)FL (  Oaߺu%W dKBJI<m3첻ns # 7ȏ҄l@6vMAvpK8ԣp^"7n\饗 SI$5;?2kv 6Lw̗Gno&ax3t,.]y_\qr۶jժh˸>S B7[g^{k~[z+X;40uȬS/@粒M#pK8%̙nk׮};'ڦ4?,z]< !|>_Ǎg]v!_oG_;Rv@7vZ]MnzM&͘¼S9d,N< ̛yv6jooxj͚5lG3Ik7h,Άw[y{nGĜ.TMR7٩zC26.C. j*0gz fLaRcq3h4m۶xGFf^?WƧH{w>`ܸq444 /ڪUӓv?b^>dC=4N{fƌ$_ 1݇G?-j>9@!ZZZ^#8Yf--++׺ΫHJ$1788xzvٺu'ܭ;o?u2SCY$asRGBbKGD pHYs  tIME  !M!iTXtCommentCreated with The GIMPm IDATx^y%}}3 !Z$EIfI˶-%YI1$UlU\+b%rUErQ1-'(3$R$($AX`v9?Nh'珜^O~g~¿YخoOϦxoCzV-/ }uAVz vbպZ[33ҤndY&kXkjTUQU'ek~_ÿ)p7Ֆպ~K?P4ɓ'zb61Fߺ}X;p*+ӓ2uba`~,$IY]]5PI|N~wwEjx''1*iLjhf{}9K;PpvHeʔ u%\ʳWr6IM9{c0h$kkkf4Ncb&XD1F(7QUNsI*5"{(r{g8UuouFgYݮniښ~gmoFW쨖U \a1Q`'N7VmP]θ;/\bV|P""KKKraeYXX<7iFι(MHDb}iDƘXDbUXD O1Fygq{kuQY[qEQ(ZkK C7??ﶷ&Iϟ~uzri ؄;^ND>Ȁ10Fe£"Vb]B tn-WHVRpղ*WU:8sDz(M{7͸hD%I$Q51IljaI(JD$bcL\#jENUXysUBDrkmaɭ0ƘBU k+sYe l6yꩧ{z!3|!V}W.GŶ?, , Yki7^C F|`]}|&©SDU)Gj%"H$&I҈81&M$Q4FEDQcU(eU,"J8}8U-@ϝs>S ;&Dw:("b<GDtr^}Vy' h5јJ/rK7& y) ,`AGSe8'iZ^]fqenN36hnv_ں/*ט> b~2@j\U@MٌE$241iMicQ$iHq3c>14?pСnhv1ɡCJk67F۷oϟߌ<\U10r UuC8˲Z;;;~ooŲA~EUi:N4oZlijQZV'9E$qc:Iw;k3~wN8eMf}L@։"r֭>Sv={Wa0G8 v0p848Fi-k1,c~t>})?B1hgo~ϮycFi (ZjVEӉ4miNd.I(sݴјOzG>}ɓ'8FUޫ̘uKHw>"Td"1׮]ۼrgyWKڽ(EQsx<ǣhd{f45FQZ x޶]|<<Q^h-77 :{mٔm` 넘`@0 m $gDdhhH@)TfJs~dyG 7*vqm$w'S=>K~ƹ'tP/J^!I {؝FWߠ%}4\2mt::O6( G2f<ČH6±H^nA>G}?ɏ\~G_;KIk,"ÇG{ޓ E)֥~"xΒ]}RH*LJ0QIb$Nfif1F4=hՊG{+p4 ӕC?Pq|?;x ކ*Y&-hρ4N: B~_S~$|4t۔^[YL66l8 $c2t˯7zwsfy5 =( l.߫K?<_w/ ~G~tӉ1+睁ۛ0 TC n#MNcs!6xF N=Ϡ*G;:+7f'ڱ*>l5c{ݾ20faT~ &Qc! (´ZĉDI_":_ 8AȆ` @wboA~ Kd/o3z294ҿysh:@*l!w-BmC )T#AR!2r2fcs"Yg YG!J9zd8*,n! GD&ҙ,CpVIʕy\' Mvcju6+ th?AN;Qpp@1Hs3a󩯃ҶO`9V^\] %~O?F)#J NC]Mޣ백:W._&;{NQ8N1);u78:v+@>[_3ޯTS8Pd99r%Dэ$#enQ0^8BCJ,+2N@W2x8UA_ 0HmmN uTwvß3 ^IbbL!qD7xR?K!6K[+: [[o`^nn181ֲܳNR@tҔ򲼰}i_OTNq|cޙǴ(݀Z$"bH{D2uNߋ[=JٜZZxi~Z5BJ(%Z<ۗLdz=VѭhQL)r}^DA\.x'ꯢ?"-{$\Uw9[z6~s?F# S_fưp6\>ϳD>,?15SrޢgJ6jC5,B[,g<[ Y GhQ08z?9EEJCJP>,'pµz$B$^@(ȪբsQw.O=w/sԃ?+s(,D݅ꇥ-`ܺln;;(X|Q`P l?5Q6U`/,xdo07LМI)3*Ȁ#GZ{׮$ -U/@FBa=y$1I[)ڞc?E9U+$; ] n;DH!ZHʛ}g2 o$ ݼhx3F ZI3u3*`19ZX\Qg-[7ϓIx7D&KǎiWD~(Z)cJkמ[9sv[QԷH D`=Xka9ϒ{dzGmbxUEmQ_5v~޹e&c-5Zkke}=DDQ 'Ɯ5$ GW)6`>?|e~ S_Gˇx/0U}ZD*+ e_}NjpQ3Mc)T^|+oqnj`RB9`PE+WWQ<`*H i=~ISe$ Q=#? A-Lw$ ޠ|Z(%/ºI$W*[\Zb1yy{0S ](k5!A5k pk.dc>LsN{)%aR v:=,>_ & R9`76{کStS}Ÿ$E'Y}PDf):ڏpKPtq%G 僴3;@\@oAH a}BKFp-s&j1+o+o'8Q-ꍵ5a/,} t?P$1Gz8K'OjmtjFpJRabBD_}uf2 pIBHp/U|шxn(U>cAĄQ8-/,Q@ uT0܊x䈔TAg U"<ԅ3:m6"^\D]/+G2B]J˯=[@Y }|-ƃ>†X0zs=sS$O/^;"MBwM5 ܧw@SUu??O{d9lć@F#1Uש(X~&j((MO"I_>[PG c"W<**G ޵ĀG=;<@v{S h-ͧ@ۛp/ۣz=qN˕ρ?v`4WimT' L GY}'2/?Z9sF{{do_ѿWhEAN9 AL)geXj./D&$@ ùCWT1#wʜO\4qy7e%MIVW)vvVYʿ@aڄ ~ q3~lol4>I5Mi=,8s?~#Ͽ9=5PY~V Qa"2WۯիN;wlcokڑ#m%$203ŨS{0 Aą>(B% PPm*MPqCRQrbRY:QEY@EmnǬw]߃~v`oF?{=^`@,?`kk,WF鼐Z;r 1 +U?Q(͛vhݼ9>★'HX[AHu#X;cP(j0jpqeЏ.e۹ *B0omadѢT Wfei4H ^QmvLpCR%ígmy}ho;n`wvvw03>a)fiq8t,gƧ?e62f=vDr_7#0qDŽ׬(:i=5m>G>B2=0I+W #Q'$@U&]QP 6Z6ւPj_,`t-A dgCˡ䫎jWt:JbL *E#ѐ׷^~ [Ev`ov{`www0B2 ߷=ș3=__^4}1UVm`GUQsU Ƌc1Q׾OMfn߹aMTSJ/Ƅ?1IVD<^%D9(iJ4R-" WJNbZ:BZ#}&Sr!x aH~/[sᆰ~ IDAT~?jGw{YǸc<CQDr0Ǐz'O9tH^;gkŮU(7h1$I"QW8jEq~3?ާ7$>~n>F;u YJ>8D "]fP,CCDl#LEjLiȡ*Y.`L[ ,HI2kyO8[I?V>,-~ F6i9㬝8ɓtc~ 󋿈x;?1M\ 4>"*[L$1&VFE-8O~Navn&J++Z #zZ5F*9͐| Asɲ0g C F.I-EŀDm:AK~g-nM dO~'|$meiD8sΔ*p #jkDQT6>rwFW$kk=>"kmP5 @Ԇ!j򏳐q?A!rxTW̢^+RvjaSP:_:P[0 8S/B"4IPcWW9CԩXKaN|rw~n4y+b2ϗg: nn ,8AY^s4]qVK֖>я/|ahj9Ǫf~Ko z[ƘVk}Sb+{ϫ4QUt۸Q Ĺ!3 d.C$!:40x 1W?/cuuAS|2+̖X0^w"Ӟ .j NHPakA~'X8yx?s|hff}m.Pdij#ȃ˿1M2Ӈ?MoHEv]|h)mQkC$:Q"EB,I?Ƀ;Pu2Cx|G{1"rP q ^}}UVG LQpY>LMZvUd(s &P? fHJh.eak^F{eAGߏܸN|y@C{Ңll0gگ?CM4DQ>/Z.7&P"UMD$UզsO|{キeC-vwU܃'{p"^-'Jp ޡ.G Iem-W7[翉0C -aH*Z9r! a%\Yk~ydnxq==hmml&`o ls\\=1]åocx ګqѣGxlFQLy[t7b1moum-*Zvh0~)pi4L]&1A9bR0 Gʾy9A= ϐ-p#|^{ A23&RZ"(w R+a_t&{@+) Q6pB( M%h㌁8:GK±cmlхn9õ!bB-lDZ3 v<&mQU>~kZ-ij$I\EDj|ܹsǍ1 o[Kz=䯽8yNE}8DCc$F܈Нm:x "@k|U&L0SYY׷U?cP$7P/ 4CazD ;;O$IS!nRT+"DCu}hh9FL x7Lq(֖jQ>zыOco`Zm"MPZxL M$_M:o7neМ{9$t)4-ъL<}A7|UkfA)h;P'b%DI.QDga.qKn- 38&.P7IqY,-IMO>}ϓO>"_rwBm!4I{ w: _ 7QsHQ·aHҞ {p΍[·iS.>^H%5,J8 Yt~9Blz'„cdαuԮhQT1Ƅ81 @̭177'{2x vUX·y@|̙{ccȶZ s߅ 7`ˉ&``zMƾ zUɣ06Z͊,߂TGxwƔ'>jbu~Sw[D}*7PcW P2ԗjdQk=uUZD9>]ifɓ'OqZk+U]@E{;vЩSڀoߖ0?gp;hV`z4GOrg9 S{o{a6u W/]CBLxc [\M߲-7"NY3RJ!,Fepd.0wHt:Nay_NlbzOkpg婖. AOm9qXM~_%4oڛ/:x~_ݽ66WoytXrp9jI:@u}f>h? n%xRM1jS9 %,TbwK(vwþE^!s\-W׉[vɡC& px *'@v07~Q-,>n"ypYC$$-to[_~}yؼ{{_pY@2$@wY"m"6J?q@]U0e.̘v1W,/vuV%dKat(n80'{z#K% P)ⅅ9(g#yb6hq(q3x\2n_oo^_::ȡ ||9<: n+~GFA 1u,/?3˲d5<>>71ɐ;wr4;R\@DO^ԍPƯ/,x:x!xib j 1x:~2l\߾fZ%+`ϔO\}I :vU= gg Y.FTv77$qLJ4@Nơ!X%#V)c9hmmml6ZtFx$!xA1 c~6ut&loAA1,^C/IG5LUN7?8]Y|)'˒ =Q05!rz]6CzqKʳ@W۫r=8ly#D˾0}~bVj1i )| HKu,Vp%y`e-&j!I+dcC?Q`$,EatM'_0}w#Bv7gpu1 <#W%cD: T'5|8S`sLkK'"s H*˺9W]9aɾf2 ~u@Uz 7+ATj?e 0p(w![>$Z-x\ZHa 2ReUA~] U9)G03HZs0Qa{KҳcrP}m[hxR*J Rcq4RpS+I0Krf;)UV_z@V^gE:̺'@<||NijӁl`><[鄕QB<@$!/ !R.|CyS!j): Nap;|yfA+BUB#B26P~7㭵h9%y Cd@MyT x*@4)#~/)+QaYkimZW=pM#sEBn6ި2} =}}$Oz=1>㥵U%`Aqخ_o}#w!f `nVx-)3 J⾡ WL4<%r\2Vzc 4 M#lĠj`&Hł׷cBhciRkb Qf{;~˖w]ğ_|7Nqi]a֧,...*&Kim͍y7. xVzBX6^%Vٴx8:~6gPA A5KA+ Yҏ`Rޖe|"]pdW`WLaխPTXXXN!/l|i͹ԧh6H.O h6\训i6ٴؼ.AB( 6YJw ~C^6[c߲t.7 c]ya^a$hTka]q&M&$p6VW"}vZ>OCC5^b՘F_'ӷ}rfش= l7۶#Kgd"զnuJRNgU"p9tҠ%E$l6Vk9s2r94؉8qk׮%Ӌa6,3$pg%}eӕى>Nߎ u`ؖyn0;vpឯB$'E@R3zǏ_ pVΛԛn;wtRhAL'2ZHFsg59Ю!&v"eE`+eϦLV`ԫM/RV{鬤w(?~u@`]"պ,,WikM/,,T*[?i>+)jqwNki P+#h;Фf":-vo50໴Lf_~0֡Ns-.o>w! @za \2vp$pN_SGϟ?;??@{Q^je?BBkưgno$ T(nM ,:im؇8kGl2ܝnG vqx)(<742.]l6|j#AGٙ:|Pe GhjXm{) 1,VІ${X=v1+j`t'K$?b:@.L%S4>7^zS:okz ^ o=x "+Xh9Mc N$$[kS QSY0}ς%V}7~KtؿNg)o'9`W)ϧgHW9 2)W"\R%P;'@{vr&Tko^^`#ןiFbr޴5ІIEXhFhGl~7vVv̾Nl MZ}')>^a@a–E# 3kkk'O|Zt$pXRԀjRY;uԥ\})5,4Lڀ87ƮFaIDAThMk:!Hw*7̔ϒVIn+{=]_G/V- Ta¢6\*Nzt r-|T .{W৿- [F+nukh[4D+;$Fw1fOl]Ky.R{nHdq.%LCt>H4^-V UKȓO>)fLpkUo{̙71"P&DBC"NRo,=8A:A(Tv%vR@}вX b&ϯHH;2`}kk/z~(Bэ L]a02h6WfŋWII4+MRѽ{_JwZ"- H@3h;$YӖPc+q i'@˚nFl: Xlc[_˘055ѵ:ajzϭkp# `H̙ ^z饗^=wD)E*;tnSPk8NۙMAw ƅmw* *&|#0̀7IzOZ=}'<ؾ]#yT*z!hCךV6pUN8qbmmmtЬDa;|С`pvOd7'QbMAPxg1L7@i&iZ4 W! ժ%6`G\063yx[7x[&BD 5 ͆ |/~+P- ļ+#G<1?? Xľbzu/wpGgff_z饋SSS\oo&2405{8*Y錃xBWWtV">~ZgiqYʳݳ}%>HmPPVr=b}až!L-\/p9pw}],wTpkmO\.g9C) Cg "t+((ĽRIdL&#݈nШ` M6 <7l>[Ν`o=c` OH@ߐ 5Fй"Ӎ.^}5+/VVZ;444499iDDFvΉ*kv۪J"zmHg ;3`'bVl U6jg֕ I-xw]<[پH ~.i\%[ %/ժŁǎǰe;innёx={<|]wIPO;Ͻ`_4P0@ B&:w7L[ EAarLRP)oj2[?ګz*Иby) "2ic ot=>L/AdB&2 7kkkװ F/a@Vۆ[! >C _ ;wyw_gRFLRz CZ'Ax[W@X"(a0MDLbZ4qZ'|Pmw*v2#G[췳xr6/b͏M0   _z'|7|e$vncS~d]~10w4+PmRM RBt՗*ǿy3 BbhL>) aC[PAo #c6Ŗ–m[w XJDRPvV2%CW<4ƹ<ߍh;[!H4AVJ)?oL!]cDs\y-$ftt{$$gH`Qh8Y[w䈋WoQ$ѱ9K#0U.l-Iatbd00"]%E (%D]F@bXVKi$Qz(ޚR+a+oϟ'U+’~Ud !ĝ:Fok?Gguy 8`g3w1%79'!ފ1t#`5OJ+V]iqiY)oK|HhMPבF  aN>/O<_};wI [' I:1O~޽{( 1{77DB.kUS9 崀)66Em#D X@wNkf:$- 5bec4&67nA!s?O{~1D)ri&??rd?Rwdw!@AE|#\C=u_${eךg$'dG[s&h%r? +queH@TB}B=/ML -e%ޚzTU|0?7\h>s0$?Ss=33s ~;ǯc?~[dxQj~~~433ÇMh?O#";\W\\mZԖXzq M$`K^\'FRէ9.OEMr[wR:55P*x{ٟ[a:~7$M&i/^Z,G8p=F#|juXЧc1?+[.]w8-&Fl+iT"xHKv7YD[v)E&_|mW#GxرcO`as#@6Uϟ.tu ٻ{JkGXh>tIYu sv5:)Nn+zS$VCMxt]@bRJx|Ǒ*9=)WoG-Ѕ*`}ۗ~rѣ3u~ Dɽ^vryXٻgɗJ2xKǞD Ŏh, 舯Ni؞V$};nNb#, w&`s:sڙ4i?NH( "BK[Kr䉟]/~jzM%{2dpz\jZcjjb滺wr ~# 9IUm*{ ih)8{m;I;ZVĶNK&N˦i5Dk}iRb`6(>OwW"䭙J?(E.tm5]GsO=w/J?W#[ RoZV[^^W׋v6;d,PYu}e4HBM&mA0iJYC9.'WV{駟N\@˂;}?|hL6gϾ uuf0-2'2^ FТ؇2kw& M[ 21(.--Ut7kؔ(> ,,|\!?;a7D9!Ī(va廗ɣG>e`9|/^|lN{޻0<6n|R}ijا+{Ѿv>Ilv+HMXSդ9(AI q9Pq3}m?HTDJSre^W[o#??rSO=4Ͼ;&|$1֍r…;z{e߁{~3(NKSt7W6lC׌u#?zujA8@5@%(j̶$nu7զu54?Ow~y'jF1Q6p0›zX<O=kc ۍÇCiZW43>,.GU6VYB8 DucziM$HMؠRk_A{Q[KH>AѵC0{gΜy!m?!'ccp2;??\.oɓCq~=Lu|atRJ9CSٱ6}L }i$|t;jؿ0$+@C+slF嗧ˑ'~vرcmqq7Xu_u~&.|XV.'Ajuujj˗r݇3w| RܶTs ]Z%0A }76@vPaq0 MbS xҿkgb QwVrl!84 vPJ_dmvf*_O=~gf*A>\d#I4ԗNlT*;^z~]*qC3/hvl+hVc0*HVPk@A] ecEZ7-VMibW.N&IG&zPQ~J~_~<`C|rppxd -cmّܵk<|0# יc]!FXFlUyC(e*1IZd_JK( j(G0'(vvM) ~Razrм65)'9K._wSSS`^ 﫟Q@m2y]X8" }|~|```W'o3^3ҋ/`Brkh"D+zu:fx"KUX wtnˣ&9'Dd[w333:5ZU*_% NX)65=ydph3<Ga[ T=C te @DYT*@7ѕ D)Lujui]"@"}' #$rbIy6? :\s7祿[oՙ_NMM=j| g_}Qhb-W`YJ 1wN^:8_c.N;wO\Cz?|YEiU3H_C6>:ܻc946*K TNy͒* , AnI,9D !j#[%׷Hhb.W`>sayH>,-]o+IS;;tiu>t~p&7 !V##Dۗ&JҡBpww_jn&e4eKt XC%b ьUR (&Ihֵ:`.5eiMWkSSٙZuLr<ʹi@x AnM$g|Bty@!0 *h\0rt+E_],b t)+}(E-P AXTКZLV[UkkٵՕ(j^h^k=K FKO;xG >|<) %hu}!潭;.$Ȅ1>UcȆzzј?$ߺrV]?ҵs>r]V >)mqFq>d"lV>`;{N^.;'wF!k"|3\|7EW_0v :"Y %DpR%o6̾l߁j;l~v4<]$| .#E'Fo~_ lȂO4.ܬ!~_ ۅ0XK6IENDB`aqemu-0.9.2/resources/os_icons/frugalware.png000066400000000000000000000246641272330227200213410ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYsttfxtEXtSoftwarewww.inkscape.org< IDATxI-IZUuuᶻiS, 5 l0HްBbcoX #Y{ma!{a0@ Y)wg9‹poo^xg= XV TJ$Td.2ʖvlRnc[bGHn~_?8A@R&ѿŤVjFa@"\w|/O|6Ow695)8xzp7`2 Oi8@dbPXr-\L,d/؏c L),@N}{ppI*9eJ*4a|u˟*_$Uܿ{xή !w$דJ84LbbNOI܀;bF8Ot J0њCc?l=^I vO}Rѯ)Nyt @mse'i0C%!mOdJdF xbsj?] Zt 6"CrjٿxiAҌp! pr!zh0Mx!`pq/쒤td:%M}<QU((&+,kTM `iGeYU=J!7-]e}? OK>8ix`2tOQ2q4*b]-җYK7583鈴TV/E}-%qw 㔋i )6q,LyєwMv:G G= 0f<>c9a fSMLJHKq&eYEP 8BV^)JI0bguJTbOhSp9Duoi z.CA!B)Q`; \Y EB jq)L Pۜ9ҊŞ_1j{~:ӀT*NN1B9t9vLR)LgL2 XsASĂܯA^N8J*RrU\0:(֨1sĖ=`L=0 NF!ë 2k $}hq8t96 4a43T`f?̌;;Xj╪ܝlmF08&!*9?Y ? BZCa/drxa$LxdmÁCFL30 ĶM9! B T J|U[u]}XΫ%}[e&DGAW~^NxCfW ݮ&A!JΦqiĘ a r!/}YTm#7*bU6_=/\+kҼ$Ob)y4 x4 C\CZ0ƘV w ȈB[9TEl&ۤO)+ ֤OZAz6u@;q\_t\;C=~! A'3G! B, UdfqU6@3 (Bɔ8 q9 i"֧5zan.o۶9pq#2aB؎"6搉CΕ(sRc+╕"">_$ PZ cL>`d~SmX}-.=CP2Mی@ aCd0۪Z-!lrG/>,U3$$Qt\#|ŗIjqgİeNs};ܻq\_t\KDpcZΘ3dI6eYzIYV@Jr,2M C#Nbfc>/r:o]-|RX",_g^wnS8H >ajLs,ǶEa {8[a!$C;\LgZW߹ _8¼yw.{L= &8(@d*x.G磈7?cpw~pq5Ÿc7 ʲEr!R%)^che[\#(5I۲H#RLoePRO9yʰC>Q)qVzsZ么zߓiB8n\4AHEfQCJ.^ԑx1\_] Rn'Q>9¥iJ8ސ(\,BC)A&dJBeX-?8=/06a&kM8@i2o88_$Obm׊1Ғ>On J= w:|yEmU>Y!E~10T˿#ayލ=eJiJWR>.Pn+s(hf.QP:-*@ʔ( pLY(n'O; \Np\3z斮`Q ^7 (Ð>GSg|z"75"`oYL|#LĶEˀ&U Ӕ8AXbwpzkߩ6i$*n2~˲zm]7g2Da l\Tr&׼6B<;g-죃'|_}^RuMp>`:nЙl" R,rŲ28W*dAT>ooW#(3JP_Sw89yHq]h8m[-JTDaHtCY-r6-c38"V"0K H)I6KnU*ڃj[7;?蹠 wweFfXgTI(rzc-Lˏ lGEn ,Ч)IJcdn>4ն)q^Udkv-Wgt<\g4VHW | i^[SHm=03 7+Wa4M0zQM9"* a;MOD Y\,YOReKxH2Pn*}sܖx 2q],UD$.gp1R:FxVF:Sl? \ݿWXzKY l I#]FJKNY}<ЬK6um`6>vlULh*:tԲYP'7xkO.! L W ^ ,3C2IJ"*k{Xl%=c1A',X~&p 1?V{g 9ܔnW));r%g_ͣ yit;.8Ha,FG|^>v#v{}?$(QPvDpKUKu82l]yu뗺->XXfHZyʔ0 C:_׾Y_u-8vOmV"gR .v.J*pDaY ÿj,/!AB+2d*')W̾Xs_}Ԅ?o>=Q4ڗyJX/)~e<.7ɇwkS&Rxw9u1] s GMQ5 Dzv˽U[9l7S(঱R+rQ+Vdq-<`:Ӷ2Nn7:jOӔ01.(, jf|Z` jdvmDRKQX юn,\-S rvI/CiDT21l6=+b\j֟<.hZخ;I| `#hQ.\"ѳP]u-]"gHUVFئuGVp}uaYEϊ4 <˅BLR(F!Zm3:R%3}`UsJ?m;6)g abi[6[#laAi|JT(n u|0LᒉXOI)*ht;]$*av+fLmXi>!I%#?ZX-yqls[3qS>r¬Rt]&V$rvPXscU0r9ޗ\1yOL#ౌ=e#JA=Ŷf;*Z+`8OPF\J$!Iμ˖F߾Z@G|P5sl-mĶ JM (0V0.B:iܲ8m)<,}6v\4bv1Ѱ,TOf JÄJR}/ +P r3|64Ϯ>v\xBP6ML7Ge~`/x;%]C+BgGWEoY&fs _GJ EDװOTi;Ege0٠J[c׳1 'xNӱմk9@shytPaaw@<{5^m lGml-bq[H.E56Z !eAl._Ӱv1a"7*mz\;2%G0R΍Pr2jq:n|1Gn.U5P2E)It?߬%+䨤h'91(ԓedɒeS:햁ƂN(`HwG(b6 UֿeŰxG*-Z_ ?e#wA!_ ֖~^n,&}WoAG޳b퐷۲ fSr\@_eʵT*ۃ&p"RyH 6ox#|VVP( ;˻8 8s%/}8oqr,ȸByZxy)]Dɭ wy\1vs[+m&K-[7ue/8ISHop1 I4:D".K )RdPԂicVIU1T ir{*!Bt0 kwipIERO?Ei-ل Ds]m2 o~!\zV8qn`E&ā6fuPrUQʥJGemQ0: ' d2%c{w'/ʽ~Tiexf'8@L$lOGf?e VFw*px 㸜6ǻ--ZyYGFԧywWelzIeDX^3w[4 òtLx>N/x(|0RP_ П>@d{g> =2 1m&s̓QNs0@ 4 rpx?a]<{/Q4F?JFl[ 4{8ͽ`NBpB>^ǜEU]*e X&$98p@{xp" Ƴ( M´0㓷~DqBD uBC,ˆ@*_rlP`6ʒw.9zsa?_cmvw`.Q2EF:-db=´ۙӴ>ޠ2ψpZ} ew8 \ aTSE/fpa1Aog( f5П ,ZC#:vz|ahu秄sF~\33fKq6㡌u])^4, kqb{-Z( lF03:߉1mN>g|F4`c 00.סr^r car5geh05l@\Se4M,8&B,E; M"`v]$FVwbZ&qBFӀ,$y>C&i# `Hg -32]?԰ȑڗ@XFn)i8R}FC(<P8 cf+.?\(NB~x6@>0A0lt?wYo uɛLYv& `ڠ2M; [-z`F039}aZ>{CPY2#FY&;838j(Ѣ"LIնݖ?>:ضStUoF/O#DKJ!v&67e8R[I +p6#dS?~ɽ0l;dgCI,L0%o?4s,FWx]K_, ˷(Lm1W}i-@ܼpl@\PT8H]tB02vc>}T*f~$MruZ^5hryFW`iH%@h:fe:N OBBlۣߙ |ۀzi3 a,Z]"cBd-{z}lJR&r8_w^;a4XkK.Ǐ(0 ظi+sFep(ZwQRx;fD;-n7zN6sqM&|ks|Η{]$&@_Ol!ؼ &y xb.M"01-?lhHkt3" gل׹LbL?B-*faBHL`q{̮@|2^[W&bdc2R)=fb`]O柿CE00"j?QMSyYvZ\6.Bz\a 8ޛ鍟Y]M9F>J{12uZo|w}a!Лї37m betr W_~SͶ˓HD!Iu|( SBa* 8翀 uH>N2-2~BЧꕨp> ~/YȮEiA(!CPE-*TK&b(r`` Гf3ERIEQDEI:FO ibN1lviX=vBR,R)$wp(A]K ߝK_OwNgَk\FXjXNX$Y?;D<-ub} FSȞ)1phps ljtx :[&w7{6Fti1u*Q>B4Q9t&8l39Fz1LBnze9G ?#d+ih1|jpkȹtMѽ>_u-lþ-40Jsxz KG&͜]IENDB`aqemu-0.9.2/resources/os_icons/fuduntu.png000066400000000000000000000063351272330227200206670ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   pIDATxmpTyܗ}  !2u08$4m4SN?7%i鷦mHc\cě.F Y E~XIHzٽhFr}<مPB *TPB *T;GR9Ob]{84MWLKk#Y~-7=ZF{=nڿ0F-Xk\1_)G۹Kɓqd2rBXȿ[zϫIdy'?}?.G#cي/6T-@A uSgҟOhgoyp/ f]в o J (q7G"/֚ќK.;N.0lBOp}U`:TjKUޚhϿ gFR2=C۟yUP7- i,erNSx+^n t 3N_D.+.Ёt:͵I)G hqsZtz(MP(]bDe!bg$- u4^A,C[V4m`&-Jd2IMtK%՛`4XYFq _ovR ݱqD!DA\2kf-X6W &r@ܿk|aGo~ҩ #Di;y;{cRN;+cn+bBJ*5΃zt{ɥR)^bJ}c.+maßu-u׮t6RSgYfLDG%+6UmG۫p?^NK3׏(fczC'-?G9._aӷ(!J#,E4%>$M%#^V^֧w-:)}iͲҶG&eYkSjAUkD!bQւxu3iF A;=op)m`Zv|MS  8OnN?W5.fYƅ`z{? ׎%w m.HZ+F]IjpB㺵oDOw.hӽBHlC}>=tᗺ{ϸ~?Ӑ]0pqy=F ipIJ֊TsO[/螽GƘw!/ 0xZ֚ 6H֢ȥ+μB2@ /LW^.gq/flrqMm+|R"tpq]I&`0]Ges[*u@d" VHբQ+/:94tusf2M0ZX]M7Fɐhp"c@='POdesHDT"u1sPJcq+85Z@ۿ" DMi]*J]~bV7-ae +ݱ_o'`˞ hU@Y6V=uj~s}]^@:/f.ц;Mh1}MQ6c+W/ w=P`<抸,*eslL`&X$f
abKGD pHYs  tIME tEXtCommentCreated with The GIMPd%n IDATxit\u&sTfH$JhY۲[w;~Im$ՙtNβ;sN3NN 6t,%׷eDCi\]We Du/ _`h @%to^_:AoLD"3sO|Ӈ~t?_yx|N| ^9Oن" f C9{{_ճVͦWqs|{WI0-l۶%i3Q hER4 Du&>H-"LPHq"~O  oq~ǿAPV9qwf-Pz$ 3BnaBj~uF ?qt&$_'mV!$ h.>#k/_8~h4jp m YHJ08ԇ7i*~wQ2g9$ot'-"0&x!% )t/w֧~秾fPza#7Zy[/ g0~~OFL&+0`ۗQECШ8Vi@׀TZק,%r$ (MHXS $B k_[޻^'/GpxDP{3޽/}~cp(5P j5JdJlPuj@A0L:lN!ur$RMov8:lO+w%H%-8^f AZn'O ?w_R/UH;xrHX3vF`~9u&?y x fgH-LDQn#== ٬B*TkqVP5e_` m&j<A6zQA))қ?OݕL>_Jaj*HMfMc 8΂Ow}@4 8Qh~ ?3*kXVJ3L**p+,Saȡ H~{R޽{qI?J2b Jcp#SyϦ\Ux{_e*\1JuDTǏb$ Y `H?Do`B.h©q_UsiB&,ATT$ 2!_T*b`UA'9נI{pY /:P*'K(.,``cp P#h.N)TE̜>|lQ$@* Av;a:hE)k"+-\pU  %ڏ*DnXӡ=Pط`f-PH&) .#Rp50XHiի`R՗ǐ˥dq cXK'F`:R)&D?ɿ s{B+=%׭ % VFry- pxX7 ЅADT+~)0ȦTEnc~Aan.FPP0%ޡ | ˦4tS" Adoޟ~^_9]5t}:`:G]38"SX##kAI߫  2 _D:1 *B{p8Gǹ>TT$ANW44B( " x>M7{yRd^hs ӢtAc,nMNV5Q$<'@_D[ĕP ) ,(07;ix1?.BR]VX*2uvfP g*W k|O ,:|:0- SDaz2V(PtB) .$H9Mg\ľYI͟' [ʕ"xT|dR:)B̜T\C΀@t@HF 7>+z5a[/GE.[Q@j'%@!P !ҩ?9YubvZѕ3m RTCX(@e'+~yJ##@2iĀJ0Rp\BFPJVs9-$ 9($Z9niyll޵63S&  %uL!]+Qm˱JC*Cq[X?z/Y%KmSBɓ AH ?M6 ̩SGgO::KOIB(mnیDv#>4!֡q~[@\ߟ 2|mS!L~g|➟:wGLMMQZr]`gRW_m3c-D|BQ RZp v0%$A\hx@b׾E2Z8qblx܁/D1+lܠex$n}/F62T@NΔWJQ \f;^T9JB* ؽ{7y/pB~u$l899b dj4 iX3 \wB6eQAHp(eY6q'~ϫjunq*eZkFDת  }QP*%I1@g]d1#Ǎ+7?}߳r,&&&֭[V;w&ӤT*_mlz?H:8vlU5 \U t²ͥZ@0C+ʠ&@5DBt=6ۻiK&nH&Inc`n!â;*L n9[6X~Kgz [y)[sZC޺m7WK)CT$aB*[n{n.iWn "5 )%4^p$̔@_8/4(LI^*5X4(th[`B f==lڔLUN)9hNu~ހUV J* Lׯ[x{(Bo Z%5M^޷盷 ]% ,%"LċϽG&sePJT==kTJ]E ^.p@R=\c, &fD^\!9C B`d+apۭx2yu^aVsssu 8qj5:=3]}֍$, &cB9H7dspv6mPXS\ CL 0<  S  zeaK;_ua]U`׌(&i-$,3YX_{{JR*WiTJ%  ^AV pz"r1T b @xJyc16~ pA-bICqcH@tͪ,*l%_ecaPf$Q 8M;J"Y.Պ̲ ]EV8tn~&\;$;vc@*A( $Eh8>08Vڄ0: Jc"\D⁓-*' + ,SXT@c@6N{uY!$}/*/cLj$"vhiekAf^`H' mHDpQ^8WzRIP\UFD`@)h"oow_{j@B/.QZ&^4]'M<] !~jM6Ʌ/h|o叽}#4,(Ő"A.Rwm`fz=}=X?2|>PRI5k|_"%h%nv[֝oGUۗIb(@7^s RB<rN;c 8u\EED)EƏ?En2-DAJ3Ȥ,3 PwDQ135r6&ŢBB@@`W"n5*JA-^ kH VbOB\!*"Zqph4yd&2y|89Ll:#u#0L(JExH& =IhB@s(:RTTUb`'Fh`%t%ynb&Z(Ӏ (SpnSJUo ٺuRʆL)FS_ ) PPMP\v=X& Je@Tr=y mD/'P?d3#;y %s|ohzSgTFD"`0e Ȉ:u(B)9WatoţvW a I[mpT*V)C) i @#DajZ3)R<(rA]άkw>afM ~*7Ui;{|ˊ a0y| 4uky7Լن$&&&Y8 BxRJ4N:7y6l-r / fSG&Ǝb'm$`#+^G"}jB2 h#hWQ911!x08.mx֟eȄegp~QVӽIkn:PH?"n=׭S]V>r``SQ>5J?IDAT=qBHD )`7pBE(~g?_4鑀[Hxm}$' |w sNҨVz~O`1l`n4E(QǺy'Ia3B:!@7"8p@j5ۿ'[k@.ɸ%,.x2I7{q):5R0& ɃG_&.pAgR) n=KS ;9;Y俍 KصeO)04=8;^'NBOJRwǾGBꄐc{(\c?kϹKX[oK+;y{ȥ%ݾp-ߞ'-أ,ΥLw;)dSSgv0q4 Նg{l5* :tޟL$q[p|WLn`9߾#[?<'$#p Mb\P 6\LXa|ti5BHR:a=l]zCTqkqSRN5&E[aCCzqo} Q CkS-Qdrٹ52!D)ڶJU^Tl\#ۛ]{"Hbض]?c.dJЁ9{Y#7\FqaL=ר@DJ J{0 ]BH@R$5MkX SN]ޣc^ #whׇB!Y\Tpj%Hp/_T/B& "cjfM6ɗ^ziU鮋B뮹Jw}c$-;1)\&<7st6߿x47w\{ce-,̟m% Ӏb='O!M ! N2 k' uQsiN[ ^GUۊϖYsVnR{{{UTH&4a9 e S=CNpTB)EMmKn#j9.-y֬%% x:W; :>{C3NMǑcR)lJARi<@(tÏ<=LT,4iZնm7ڴiyn`"Gq!so lի:Ǽ ,` ,_`}8<~ [ځ$zsuxJ<'yv6=&sM*eB!ܶmߵkץu7]#TId{zѿTP嬿JLvis/4pïqjHt`!|P`G$}~MmiV,N&M7zR( lo>9c{2K$ mռlV*3E.z{MlC ^ ;p(#е$\ו?͇y{?K)c hd2`ddd$M׿{yIL$ytS9"*6{~.(3#p}CP܋|A P-`~0E'\_LMb-- 6ZN %_D\ }ش@2uy:c@/zLk:V97u}`^>j UB!T|B~\ 3_T&h)t:l޼9Pc{D~3uHHsِh%yɥ]sX|lu>:?R0̹vSBذ>$d50?;Rى' ̞?~ fn~4 Λֿiõ=:i0*ݰ18G_HOhAE:Ne)E9ef~1 xq?Ta pND0 "06'^mIeYRbj%;ox}:ȥBMr=(L3pfȢ5k%i:0]isg_ܿn1Zr:B|XK{xQcx(Y@67JmkQw?Jt1V,˹HvtV=Id͓CT7t|%KӤnK`ɠ& ڗ\`[}g>cz$TD ]B FNU(L2( \^uJ7x=8OvpER TG*A.G@Ypb;]h>j`9B`eݾmJVUϾx'1P12JQP>+8} b0 @¿|;7z ~|]׫eyI^P}5 f"J7>JkOڬ~ڒi[;^)LaTس4:smK?R HRzI#DZc]6Qpdbl#5R&󌱒d2F e ~dM׽yDg B0K-}u]@-\^ &M"^z(F_Wo^JE܅>< %%>3?qKJ)Qn@) è۶6m s*+1MȥP@]7`' ӴX*rY72,ȵJ"Kzkviwq|Q1am[`. D%=<9C`[&l@c A=|σM{-[iVR"FGGɇSLJ(Ӛ~) F"XML*ihX,po;b#86y Cye!EFPl=, J8˕Jw.xcV'.dv`bb 1 PBAIX9+NS_1 I&`t9y뮽!_녰4 L#)0 .WK8;No" ,rq<LC@ABC :j:{s DK>3 $ҒiU4ݖ,H69Gw-S+LiVUkWC8 vMdݷ7jD+Ռ6/67k4MkضfrUhxE\4 j-{V \6?lݠّJ/Շj;|s% i`LSm 0M ;B_i888ݏ 𝶔n)VoF#Ho~9yݰ*h;mzG.aYyR.gzz&g$V[|VwoI'M`:q`섇ʘ:JX&eaP<֮ɀ(ZiRp(@#$,C>F(\!jNy=>~ɦoY}iEBH1Vuݱm#zM~566&_͛}cޑ˘p59|WظalFx,ضXlx #7@hp ERa~ס1uYȇS)J1@JJyH%f"z=|M=BVPV[Vf^ 0 CRJIw"29yǎͷ@>Bq@R`:LKaPh,u.?<~|QTj.щ99< !e)48(d`>r)apx .|(2pGT|Lϔ1={޽>Y.ϕ:|}˄2ccYVP(B y`֭9/zهu%A$@z}VlC*D$] ff!t!!2 yCi{*uPREۦ )C &O*DYfH/Tl:!ɡ=4M`ZΫ\._w`{aaaz |7:5MsLmێތA^pB:,3/|~g6ga%t0FF"H9[PBBh||m[/\5 T(%0DBRA)3h{JR~ UJikgv,MVRh~~^!G<];oyiYQFe&(xBi:h) [ RQ)cc[9R*z38~r޽}FZo f\#>Ht ~ ZƼ;r])eࡗ2u kx WP2hJ;tDžxǠRR$_Jd|$ BB`q8vb_?zq!Dz xBHeyeR+BRJ?tx+SS'~x/߶3)EE[nRŊ(g#ݺ9 @iq9l<;Z,ΔFǥmԛhoFJZy"ι*XQ!=?c{*h&~d<2T93PRIȦշ0X(UkG&&SGN+66̓jͧsyWףd޽ZT2=KqR7ܹs oٴqUi- @I!%sㇳ3'N͝G<hOЬߠ{W6Dg@C {(s9jZJZZI;9xUa$XV.ceRJ.OAꟼ W cX.`!kWDdn7o7hwo^_^輧u_Jۍ-z0Eesgi~._fsm^g_ "\JY(SV 4 MSe[kc{gD@}\$9<&[cv'^w" |XqY :缐RJ)DZFvh+d2b<38 D4"j_,al&*6hyXa匱RQjKK]\\SkUNS6zVeYjkm{? z("tp`Y_v(`5BcNoK8P/V+eJ:sGD4H" R["b0+y9Br5QQ;OTJf27]4%~~o=p3~wN<q;_Z8u@wE]x,BўIENDB`aqemu-0.9.2/resources/os_icons/gnewsense.png000066400000000000000000000055631272330227200211750ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYs   iTXtComment IDATx[lyg.%"\"C%U8˶pEqsHMEa@b?yH ?IعڱlŖ%˒,Heɽpvwfv0]-/xvfw;߁6h6h6 q-?&cRZc8(j8H"X ~ 8ߣ3r"O 7?Yd0B8J3``'@QEp3mc4n$}7.KǤ=i9*dwoL/P mr$/x*xM+} k&dGNjuc5U#˒v9d{sm*YU</ޭxU][f&Qh CXQHX j Vnf m"mFM(S$ZYdbGGL;eL骿Ǧ/sˇC'+LM"_9Ͽ3] \!6HCmպ+AS9|/J 褕= kӳW#?=883}UHbcbmcFȱ5N٤S@|[`ƃtkKsCr{sS5=S LfGf ] rmg{9Sƫb ٴ]g{eL# N< qi'ꤓ%4P+3cu~Lbݜ`pRa'z"YZq<kggT`W1-Z% дK'˂l }oI&WFiJ%WZq,o)DSeòc|Shɕ8:t 8YP:Nnj#z$hˉG6^BHve4Mkk^ukZcC=ɝ(Fדr7y=Wp~bU2k5 5}YM(zؤ\B{jn8׫{=0K48il'2NP v;5p$2ysruaphߗqyO9y̘ V2ZQ]FCZ5HɎ^tbs&wS{. xsH*\FrA_Pa6A9^ԷAmnyw:#ț/2> 3#L cyuѲF ̠u:Iw2WH&gl)lۚ34\kў4.!a ]Q|Y:㯐˝іI^TuM[Л$|=z\MDziDJL[طͨJ)BGL$&Du S/E/.r|TpHJ#ǒKh)ޓi4|a >FƱjSGWNWgo/ONkNpzҭB}p R,FwbJ@2Wkat-zqI#˝{о/ela7lÆ[1Vfs ~oqcRRr.Sީ|~t^#4n/1JlaWK*N`TIftwfoVL@_x/~Xg0~ Bv:5Ǝ.;<0Q_gi7e $VpϭՄ'EpAyo[\8|(/hX@nگ aǛans,ˬkWWE@}_AY@6'`Zj_454A8AAB kielmT%‘H >dcph؄#Qanh罝|kJ6-[[y Hpw7&}lOiM] rVQ6f*g|Rܦ{5eZoR[>4%_T*XppD Ėؐлk:ETOHƞ+gZDlbCzJy8ޕ_]P v?Ėyr4V9O 5a:a֛ 4K՛]<®՟]Twu V?,cGDxpzA#9o\fK|##<=qݘtnR}f W?8~ UhW*})i]`5w&eT2IRq uvh^ R/w5#D$R ]Sn׍\4|[p~pJnT-TҵzmFmFmтxW jIENDB`aqemu-0.9.2/resources/os_icons/knoppix.png000066400000000000000000000042611272330227200206610ustar00rootroot00000000000000PNG  IHDR@@PLTE  - !# &'%H.%=?`dDhdAcdbegdlgUoi@qj;sj6hjgsjNikhlkcwm3lnkyp.Ř}͘yǦkéxǛ Ȩ=o̫̫ ë/q rЮ֮tʰ"ֳд״ Ų[òhȭݹʾϺͻͥѴѺҵ퍰xtRNS@fbKGDH pHYs  mIDATXs;_nj6_/U0 _Cɝ;6α,%KJM)M}mVej&*lMMF&H]fRmcKg>y~w(1U f(rpZ4CP~ $w/޷9[r(&FP3 ~r63lCf q%^f|gftwq6@21XtqOiEF&u趗?ޤ_oGP Ǟ|56} QU  P| g!"7nll|uFr^`A 1J} !~|m&FJKP/RݟHY'?K$R8IbZo'q<ګD Ud&Fm/d qj\$"-q@j=_e?zʺ2ϤocY@xiCu8.#]rEH T1"e\ؚf̤`398=_L'0+5P qL (+'>UҌʺ`(3xNP1hEs11Ju 0Y,t]qRr. ncJ2njU q'S`0x&%*AxUT ;xL)&r8]+ˈW2|lxD> EFN|SFq;_/ྂq6k5siW8^ i3 ].I =ZXHQ= "36+mE&i^dzNJ# $ZM2JJQoQ|* ޵wBpY2T%KyŠvw"rne!WKzqD@so~_ٹs[mYeuZ]5+>]yUF'׶/~֭XRLO_QE쪽8IENDB`aqemu-0.9.2/resources/os_icons/knoppix_v2.png000066400000000000000000000503611272330227200212720ustar00rootroot00000000000000PNG  IHDRzP}sRGBbKGD pHYs  tIME 8"^ IDATx^y|\řsNZ.Y%۲%y7b$$$!27L&3sN7L273C}5`0`mْm.zsQ}Z-yېsS]N=o%~?Sb)pD `n;Q!AOwPx7$>158gJ/R~(&:JrQ"uDž"#e냊9A:+Ho>Bq` 0/ !]Iii5k3j4"`rr2/䚦!tJ)%j2 ǘ/..:ܷow 7;rS=g?. \ n_8q5qEζ``Yaaq]ee켌rr!--ӉIJ,HQF`xx񱎾#Gf|i鬷nwߋ/> QN /PDII3}h85 cM  Js~$et ko盦y9ϯYR[[G}rs}BJ Ĵbqhi9ž=~ovXQ1{[KK[omB (h^D=(]RDt 2l2p.1 E]а4{Ŋu|.,K4ƣg&!4!uPU=ol}***y_l#!srL.%rqpO/Y@xH !UP7X|͚ 8`x\"gJӅ]0~/4{lwwx'DITkP2#JH:y;A 2Q2`;3EzzFUWݸ0ϬZ͛/#//x'v)Xݻ^z=>؃8/@9pp7g Dt\< ܏^%>2 xRvͷ/np8 EZDnBhttt䓏οOL=sna:gt!`q+=C*gEq+(}=h(ɱ%90%sy_Y˷nMhTʏ{O65MP≇y'{[8V+Q~5N }#VB n}%ֈsȓ@3jVWxɥ^u. IKA²$+VN!M>_ȑCLU<`(S GqT&tDwʦA^L[n׭;߿m^v5BhH p8D C'`@Svkf6:t}~]XkRӮKJu-!MC+6\Wv5&e3lgT,T3䡼P)it5("E )v?P%UPTTWV6닫Vu0rxxP!jjj9x'|:ò,q 0 hoo!;;9t]'=@/i199A(vBt#X,vEM{{ iiCAA `@OEl::Zu2ڎh˰'˚ZWx~9om=j6jYVpFPR0hATFMC*Q|90І]Bs952P"^Z(57Gkj]sun?yp#>_jgll9>|<<z.iۅ㥽˅כFss#UU5x^Z["e5aGؾ\n'CdfDhc|lk6["'hoo!RTTʑ#MWÇp< 00GQQ --8nrr8| ոۏi:]B4YU5.z¥w ;|',|X%KR"jQL%~8|..ʬ vszvtJs?yaPp-o֭xa b1u4D$.m7z<<]וT{ٽ{M{";'4]GZDg)+a,Z , Qp:2Pu)38SmuYKĵLN$ hg}G_ORd<̱&Yǟstx5,J¨9=|ʯ;”W 1R9y~sӦ-!Ѩ%-K X9IPTvGeg^7M .O<{GN^&EEE\.,KbMXYF_f2r6ڛKR(//XOڎF\.wi]y:T b5.TL'tpGQ <(ETPBiB?'︰ Jgc)ē'碸X,~*4M¢"8tEVp8OӅPsK=W W~Ѧݦ ! |TVQ>YlPcn *C8NEQSB`AGk S|'F__>0񸟒Rbݡ" iʤ?HmmYjBaR8NY^^/\599)9.y2Qmcgc(ye]~k QޱGfVpPy",V?o7U`s"&vʜ95bIVJijIAA;vƲez*m!,) Ðcc]@[zzF0VP:WR Bu8dj]({TC4!ĘXo}7uRhROO7;vǫr45?'L-ONN1 ]O&p8tǘ?aنMl]ei,WNN򡡁=hh3'|>A&\_BМ(/M t+ UO??ن!hi9+>IUufDA܌3$#GZ|q:nPS]CYI`!\.!7k Gۘl]rg,j: fJw:&74EL%̽n::u]2M~*>" ̩~0Lth_U)..&K/' 2fK,EOOvb=x<4MÒݔsb%nܴiKB`{'CN09ځm(e {%\y*"!DeY//tӧ\_ĥi9'2 FGٽ{B@ @jndffo399I}}=fUw\N7W]ysΥF?>M]ױ,sJhHr6^ʜymmGMNG>&~B!Y <B빨\SR̿o+ CbBuphl>%Krn6n6n&MyY9o;3[n;K/}q拙O&ʌ@e'y[ԍ N(J}e <7uG}*,$PJ<w}7կes#p]w۫Wss37x衇)^(iA!"KΙS-n_ٶV+yv5ɻ(7>Np5j[Z•٘ O#q\N'sluΝ~^//=pәMshTի7-[^M<ۑu=J>.lBKIe~rK\8 XѺ󷬹/?x\)_9@ F  < ljDcx^FFGFSR:~(HBׅ[J|Q$4Utk(כ([WΝ(U3>_ff$~DȤs^@aZSC8yy>㫛k;T>uj(#g(1B8BvŊk/zӉrp\LӤ "u%Ws}V[VP=%].+ |hi@&2/M.[n\*`ScQ s-8J (_аc]thDݞRz%u <_b-[[G׍&66p=lJ{)2204+?,})@G6}j֝wWߢ(lQt=gf@Q }K\yWtww/Ng2˲) (;z8He#{qM ܰt/N3eمaryX7l21~VsB Yj9&!DLt]c֬*9kVXEiooIͤM"ˁ__@ j(g)e…K͞=cgW+2p%'n4uuu>(er$Yin ]ahX*>=4Hs;n|60FN܄U5iiw̳dllkO+[=/{JL<}LؾWӦAӴ ˲/˖)<hl|PxbYbٺn'&,sLc2 Ec .9~蚆7D Fb֠rKDղ{-@N2R%\X,v׶mϞ'őbϣ&A(.ގJ40e|zٕH'IKKqhq͇w}>sب=nZn1.Zzw q:pis^27ɶI^IYeeBڸOS]SIzz:na֭?L"&#}3e:jH(HJ^J!<jX;͸[l|%& Dx<␝nX/8ZrnMz!4To`֒uwQpLS0Hhܤkx:ya_+`^I.>/HnƷٽyyɰa͚jaO^_| iZOtvvQWNj####uvI tIF6FPd^o~C5Ji022aXLLL$9WcŪw?g%%CgeDRo᪯}j>w"\>3̐?Ȳb>RnPώ~6W̩̼ʇ!LW%5bK)_'98.Dp7 mE)ɩ@Go9h}B*/^ٳ4 Ow"''˲k׭'n˂I5bJ6ػw/^ϗkDJdqqwuu|crr")]!`JVW2`: *VZ^KKjjj1 o>pQ] 77/Yo܌ $UNd.]²eKپ};?abIlW=\c6?>vG#B7.d{غ΂Kx'bYR~+^~%;&tDֆ ]~k7k7iiiN"Ά!hjjbxx+q eN3+/+'+w53eeD*? -.7yynBд׭[Ǻu[Lղ,͛G80 Ó!޴cpyx~ 3)*JJBHq8[\rvF3wjy`j6~Y*vHIbI4YB\tũ#3== W|ƽXyL'.1A{G X" Μsr9kX,W^NkK+Kٳg18 m{G *+),(Lۄ dfPQQǣzH$g0[^t&AN.R q 7.^Xl*iYPPPDUt]v~BBA%:'oi:_r!/rVcc#$  rXlI2,0 GYܩ2zN0] Ki쳏ӿaa-u* !0 ݻpyRZZӣlI8MR [ |5 JZ5`iiynIIy]vv:e%[Ɓ{DyU -0EL3nyE_s'%IuKZx^ 0 is"(hPO$AJPioo~_޾T"G"ax!V-KX+egl|9B(\y deL{6Ӕb 0M&! ݅.y {*m.Abв ;;2'񸤬, T0`f6md;_P(|ȓ.31e rK& 8W\yGM̟Ɏ23azW|y֮[}\w %5d͚ (/eINdlld?,XhtBLE?S!T hKM[Q5p٥ 6lb/]pto244ix޶;G흯PQQqE,z'H#tQ-ik;zz wEJ̝YH~|lt=ՓTJɂ.Dwv* Ծw'>DEYY9XtG==D -2̮CJZsxHl mm],YLJ0^cϲ+W% TtBPIPMLBTVVgmpL4:rӄv{4\vC#ã'}0Gb y{/fxxH$2CJ9ןeΜXҶ &v283m4M.=$sx_2:z !D$\r1ysN^ V|ZLg!+ˍN.<= 홛-x<872A IDAT^K04ɻxlظxߢ;Qaw6A ~RJ.^H7_5X,\*cs6칀iIlORJ(n҄1Mq.'߮0E\$\2QL;N~?-䝝u$^_@56ꗦ\Ç[0J)z=df%B7|2}(mmIS[IzT\iIJIwwʺ!+; {J@u 躮O_ۊ—JAAס함A+L(-d!ծvg[8ta}itwu'5mP04-6񜮗2MΎI0 60i`f3eY'mz{~wW7ed{"]DW|&74;4֭$fA`0MbR AifU0d՟gCJIQq7o394M@ ?qV ;RJua'~k44,aɒpq6jeƷQ2FGSJK摙ǣ/ 7܌}+"+q||@`ҟW…˒˲ 77.Jzz:xDMMu4MnKOS7сi Jihh`Vy .#3୷vaY&5 # ! (m T^Fǃ Ά &òLrss Hww+]]-4j0$éGvΝ3ͳ$ 3Sm|.\…  -]:JJJhv|],cۮ4|e3rSr̹ݖ$mNnn}#S8 K^n9/ZM} Zd/ E*U2Fii^ᡞuJ:NT/̶c$abA\.!?* 433vqpآ7_5W⢹w)-l7 P\\4t4 GFFiρ B@EE%AaQ!hԹxxx-5|'++p*9udjjҷz Ӕu[oYKףl($hm=<^]=S)릫*"J411(YYMq/\@aA 8!MMV S~uѫ׋]٨h "==#a+;s'o~Kͫ۾ʮwws4A,!i{Ƙp'@QQM˓0`߾IeLJXz#%%q=1uH(xx}};-Kn8z||^orE9oz!z`0d ̅^MEŬ/a?Bq+$N0xNӝ;B! 066c6lz QC#&^O.m<-Ter8$ _I]6|ĸ ${ j0<ym`eZZ-t KsF!0,X0Ḧ ʎ>df01 ;v@Sisj}t;#Xކ$FtФ롷W9Pғ9dgI,]ё3x˔- ]WA}v/b&?$YYُ#MWQP:}PvlF i`99y83~^z-?822΅n%`LhH}G^~هiڢۉZk!~1UՁ%/k\lpݴ!--̉ CFF.':/jcxB B3)%ѨkoBt\.;66k'>܎`3*(6()?v>曯p *)J*g[a;g!)t(ʆ5̯]iyB~cha ~YY9o1K(BKԆ_CŜ_C%Aʱg?G r[ٻ E`Æ 9<́^ l1KX4J`2Ț5Qtf}괾^{\.7lj:›o^z- َr>:Nx[v0q]0}T[o˅gΜ-6t !NK2 ,)(ڵYf%}룴4+"/:qX6lۃa z7݅Ess*mBuF3@kNKGz3YڵΡS1O|ZBm9L3}_˲x7(UrT ̙ଈmtӏO/ dS^}wzquo}ʷ݌r\(|݃?o0<<(Jٵ-|m&Xv=Dif{&ӊ?l6:2JgGǴAcug$/Q[[OfEdddO$cٰ9ھ{gGPG'izattx<&B\r5K4r>(Xv=z\.22?a!Yl鴐i,cddU6`DL6mBee5'k{/0'u Tx2 {Q\~ R:sIÁޥ')mB<_\r_΃>OO=ҤL}N3^~9rW^yQS{9ҶB`i`9e@(E9P9%'Gj(ųgNKjvsx']β,MsL[:npP(Hmm4 r9]u2ζmӟeѢEӒ D#q23Xz]r"ɇ3g>H)aOYu݇OVM 6ut ,`))ʙH(\ᎎ։ Xte%K5^^EuI)q:xt=|6TNg=x<b_oϿm۳,]ԻP.oR|J]>9Иuxlpuӟ&++mis1 \Bt#2"PeסijiLJJJujIoiOO7.y撖TM_/6Ed!L< Je`䩻3SJácvNK ;u!Z[[G[Qm=.R= 5(kL=@acޟT|Y~>MӅeY2W_G$ ;;˒86w1gˠQJ|s"K,HD̬LVT`4 `VE9USH-@1܎IrӺXX<zxP>0'H6TҠ ̘f>\.k׮Dz q4 M s}?T"HaDyzGQCO֢B ,+XoD"YˊJ jRCV25N('$  EDqb1F vm/]0LM;d\X"Lf V)4MKj9n9&P*J)$.#Hs,){sd6QH4# GCǙ!gt-tw܄妠0Ɇ ?}>;w:[yۍq$ʶށ^Enw*C LZԧ[o :db3atwkHO&== Q(sq{|8X,Jw+yPZ9PS i08YDX=*LLI$ 1Mx<18Nb1]@H놁U(NG]DHw SLYV#Yq&;!^zy&`DB#ĢØVXh+ h +WDž\J4:I~Z~>| |:mB;Qވ鯓Xe3+OJ 5M=BYWrͷb޼:]4]h=_8FVv'+&'!V"[yrCpx`#5 .{HDm4G/*IG '4á317*laIrkI8 +ruU'knp2!p-4bگ+=_guо#l\Z?ε$RlZT,Cf^6{:@:X,:v}?[!oi#1eY"}v^ye1o1::D4%nb+x))+n@?Cqx)!fA4gxGNuTԖue[@z-K, 122`XtFJfBE>twB^>"vAT`gb 4-BII%Yr=B{pu?/vW]^˒e?1$vCI52PKL$- )L4eƓ6 d&PR w0a6Yز-ےei%kޯ?]ײ3h$yϽ|Ϲ .Bv84544+gw/!d]v4'FǑxdPUH΅z؝炰u\Tcoxiqqf)C B . ]j?krݽrQ8#ay` 5 zB8YIDAT4&l_KOEy)`!u.$$2ϣrjjr`K?nK^Rb2I8uZR;bIREĵo)g˖F 6vM gZx߿ڒu@D9u{ ݈xX=3Y`CLWCUR e7wt)4a>k&c!i ]#Mb~P0d"|!aiZ-bh(#oK2=HTww/ozz| ܆0̝g!]y>K^Crɢg~ۃ12ZVL<~7;:)--1IRJA0@) AGG)y?%YMG6i ܰBlzÀ\7ؓtucx"(n _,l!jv"%|f/m>MkpgmIiCPoVĢY&KDkglDB>ݒؾ׷mEBs=tA#i/!Du.2u~s]{oo_YYEϗ_QPTAZ^WTgcm; <ϝ_O./ COn#NqJzsL[ ZXri]gl^VcT 04It=Fm:pṳPRáquЁ'äHTHX*`Yg"r=*6n޳գ@2 R&)gR@Hfah8lr\2o.,l"ܾj5ZO7y1:EXQi" لR4(-4oؑ]0>(CӔ!~Rɧ٣v 8qtv3܅Lӽ CX!nS:J{XΉ 6ywn C~7mUUٴf 3pUkøIrs;ܜ/'>3JqɤAbc, MM5 yRҟ\S=Mg/t .\œ;tt y05 kퟠ /uUӨ~ΞmaR_fBjbbZ56~0{˯Akk @zrjD, v!6D}eV"v2enGe+]%rxQ? tÃXCq;Iɏ%{IhY[HrU{x}LkXFqb\bO&G 3i#j%e  n}Ębo(/COs&"/gPSlg&OԶzc;q$b\Q Ϗ_io3/O[fÍNe\Ô54wo csqrk]c b&2Id2w$Nأ?mn>Df \X(v%Bv7 yn/" #7{ҳ.[GT! .3VG칝pEz|KVܩVUJKX|%S84erYRXד8Ey)))jcLOOX{vkfK|D'Yzb Y.nQUYAnꅪz*D#m;9=v$)0HpE4HFxN1iO", TjQ hE@]]0 =p!oBȢ6+(ڼj/p^ ,*+CW KZc.(Ѩ@ݝt1666088pbbbGϜ9/¤W\VˬI.Y%w9@q}}Cڵ@0F)xEntv[4Rt]㱱X,::9994991 WӴD"yloDUWYc4t8! q"*k @ӧ 55 jb\E,6q`fddhEN#jo2qe1;66&ja>$[<Czn$҄lՈix"YhQ U#|a Yց| ɶ6;ɔBf0x6$/.|O  !d= xi9(WфL1n@{@I$z8y SBQ%"1t._GX2mEy`9HO.G^RVKN"v~#?fy,l}fH팫Em3mMqk| 4Jёw͘!ԉ.q=Nj6b^7Nuެ\&H%v }v$Xi}@j/Oz$1ŗ Hp%Զ 6.:Ysv>vff*c4Rzl#4ֵpe.e^cGk8!$\h; =:aVk'KOT_v]iӏ5,koDԳZ^$5di/kFB^~e|yB8ˈ֑ *!.f׈IY)[utK%RG5l-|>qKΙ ЀL.pH{?&mRGA i[H-fB#V vֆos@xi _;:gLAO9؂|B^@*G(;v&" UdyڜH,ҋAa!]NYviH~xn'.̿y}Br2$s̮` x=L!ӄ{ L"r1DXUȜ1D[,?^4W7)h=DNdq,O++? b!1܆W6i׵#[~ ׯBBz9I0@.W5y{7qq5Ј`F\̬mO:!T^=f+k&c!ˆJ)Ud;3_/]e {IENDB`aqemu-0.9.2/resources/os_icons/kubuntu.png000066400000000000000000000207241272330227200206700ustar00rootroot00000000000000PNG  IHDR'sRGBbKGD pHYs  tIME (Dh IDATx^y|Td@ !* ($AQ jj+.غD" ڟڪOmU! *Nš}o^d'˼w9sϽ^X`,T2PD4ZH-UBكnTn9aB tXCQ^E#.p1qA Pi|TTG)U_U%Omߋpb%0l dб;"]Q}a>w.nNȋu"GaͱSfo 㧨dݹmHQo$#R^y_Wi'3Bs3pϻ%vW| È~ zyJp:V,)e@gWfw _"a/2opIт%'4_ҏv^]u.Qh67Bat@'Y"ǝvܲ.m`h3_&%L}d;ưI;-/n J& &ɷ1.zz8m %+5|qeP"cć@uo!>RӒiGb2w_zp'mt<Ώ|oW)y9Dr?Ѥ/T3陑ʾ#uQTD;Mp&1PPv /$$Ud*))nu0{ ̑{`$~AQD.8p[mw: ʞFMm[{M<.fb֘,N%x\""x^J5A@%d^ζpI>rA$'y49l);+׀;~3TQDA}E%y4H Po3ALڝ=S|6AH$ 5ߠ`5T>βL |2$`epigIV?P^$_PƧ+A2Up 7;I⡠&eWD6y:SC/| P4)\BC4s!!k%l]44C|&W⑋0{*e?ǒ6b3GJ (O$+M 'f~ou8Do+^AɍgoU3veϝ)1reQ4.tHb7;<hxkg$ }UЇ.ڪab9qԻ3Q;ob'r攆L hN>NE):eẠ0xɮpb }xCv=Z'nN" PDeN冓Htߞ_ ES!D A?N* ׏ˎ4OsB*>o3?KOD/0Iރ\/"7 U{IBn>5^|ʬqy!))vmBV -߂( `ܹt7b btZ"Ck\5u_p}2yc쩬gǡ8 L(Ǒ_w&A#pI 'SLf/H/L/^I7CUya {+_]ϡZ쩬DCU~<{o#",ܰ:_l5=J { &o.2a9O\htdl<} nŅ'pTURo*^Wj7LfD懢}85@ *^0l$7\PX6͛:N-Uve#V^.mIgpbT>SqUva+ G@TQyiY &n{? QwTfb󮒝i1ٝ÷P K4S4V`}b.D= |V

bzw/V7Sl&EtU'N*(vu;i@tjON<.}qOᴇ?`7\*޴?Mr{cHV8Tǁ: N4("BzNs`7+"Cu!⌂Cd_%ES`>P߈>+{+.Mw{ ?zn_ήDش{gZ p%aP'^N `) #~%E-xTvmQp sgqSUk""\4"+G9 -ZPPk0vۤm+6;)Y$upۈە!< x~+cS>ԨTT7A𚬹e#:msBj 2~`W>ѩA*/>SQo(jL~t4V✇e)mQ&ITD*>%xU6U~18:0N,= %3e6$?-&>ʣX"lV|u8\9#,:߿ZʷtOm=Hd;Lp7~uY?:W 9YVNʜ0&p  2^=dxl(a_e=OW yҝU]vPL~ݷ}R; h8\Y z8 FJw Xe`yV:$=`F쫬t[@ 5cfrVo[ލ²&,#qv~}ptdųpDz[I$hr`8/#h斀ǏvUζqmzqčhm #BIUK m9Gw/Is}8)G%PFpkY7DUp'G*'̨4 k["Ul;P櫚EUsJ2pN_1.3'i\-q!$ŴaݹlTO.ٳ"~U~>u.6|c0U)^yf^^j};ޞ<6`sT 2o C#$zuДU~O{;᝭ddVZ6u>X_*Xy V" rRvg~wPr5mKW;zFbM{+`Up~`jtLkw NS;w& P,t]֫aoU{xim9^HqEb oфʶŎRQv:oRe$<Ԏħ{JuMe/0. g ѬOjga|v|hK0 ݰ@hW#HN2{zH{Bx9p ~=gΚq!%m m7=M:Ѽ^eOzeĽA{W[$0*3N%'fq7xi~ gZ:Mc ۣk#V>X>5>d# I*?`2$˃5Lcg[<Ŕ4W>ˠ$gGh di+ȉZ;LۦSW l[*jhr+17MbP!]BU&=>nO[h<&mKm%{c{)ިgĆj[2ȿթ QI}wAu$"Z?ͻ7fnVS>:niDZl}c0>}z02 |d`Sgb>ʫnm]ϝEQeL؍w8,ܰE;:eqY{wJz2%3o KG>\kbua~n|hIqѯkrtMQ4Xs |߂->HC<2BD.',\?إ쩏vs/b[)T;w8vADL;D"TAϐslx`%.kXI$|/kxsCs#|u/S~2/@ÝADPWOO  =%3{JЦ&Zl*=.F ֶ̀b~ ס8 9Ԫ %ix\\,b-s築YXC0z}zk}l()=]qr[>GAPLEgztm~ W;, #|0 !O8 v0~NN*(omϳk)QQp5^USWI}%ã22 -opz|7* m~N&r9?ä PL˭^ Gd8V %^+e;9wgfO'gw'.esp1 p<9Aq:Lٱ0B)waW5`;?n|qWr|n&}x`?9+(z >:ߟ|1:p権*UY9 {amp[pUq*Eˆ7'@dŹׂr="xp?>iɴ?gu ?ϑ?rш \xQf0w6[GBtSǠ|Zm$ő"D}UNb>t زiܯ(Seܗ[dpmEZ.I+BUQUOkd]ơE3q*1<>g$'\n|hTʉ`)":ž#u>iu)["Wj[ZT{cᤂ㸌| ?.APb Cu9*b!8SWJ)'vkvVƨ?>sO`5'5z^d/qb|N8SyLx`"{Nr8 ~^N- Б:\?{?im~c]#";j PZT{:Ș>]X9{LD[攇VʐQa*7ї3vǯlf4AƒŹvBw.:dz"'m pƀe f|fdxH2x(WSE{`q ; J(ePC֟wnYcqR_gq +ҷdG JVBQ|Q RSIĀdMS3:;\m!>a*ssRWm~_| b  .NX-uhabKGD pHYs  tIME [PtEXtCommentCreated with The GIMPd%n IDATx}w|dY3@ ! V*G7CIK*J-Y3< V$y2 w@F?[/0ay;:&2d iL H㮴/ 3" V< RRFn@*:4&HɎpO9y:0 P]kW <,iL4MK>n3*f (>&vǻMm`2Zʋ Cxl'Jg.|h2" diX̲9#b]]]G6i{G0Lv`<6=ʻZmfbq]?"c0{ۃ} #|4y,0N4BbQ@H.㿉Ag@ IXS@{h  p\qi" AR`4P(E"$I"&*>M$as%zW$r6O 96p1 |a`~bw~pi t7a,W5-ӚrI XZ&K%2D  1A{0 $ 4ED< ;bhW9P{ InFki3"h K$>^apo1KqG/*FkʉMeN5 +IDx(ǽXIW^Q3$MJwyF  Wi.h59A !֙/wfq.*0}}M/<,J'$I+[V/u7@)@KT"QV"C#`JgTIC`A2%e^l@pv˗M :( Ց@єPes^!/. vN7ixu9CM{/wߚ:zA"`Pz:A|,c< xarFyJTR>O.Shury3f.^Kԁce7 %q?{ Bۼ(PC2QT q/P$#7rͬ7?ҴD6z;=T֛1uyP0DQf"GɊ`5};j9qxSEOHoi׭[p;֗:ٷGhպd\-w~ާ.mT&MCGwWџT*L3.zd D 0xu9#z`Y}iba.*`\޷~Ŷ[/G&Aa^rk i =}'? MQp 8Wf~ 5Щ+d,lhhnxhL7Xs|(Ϭ;>tvYD^w4bwH)P)@ @`y2T+Z MɕX09eJP8c}vn_;|AJ`yʿ Y2b!"SfS@9vH\I%Ѩ#dT.M%^^TsuTRoߵ `b82 Xn]_LpZڽ{b!#C.B[|<b?nB-И5 Q"䥅sKm*0i9lu"a ߺ~#"`\[T& "y^}6Pr8ƔQcق+0*AԹV3H>p)^t+ʅg"d<u= U,+h !W? Fu":^[c,KD:O(&BB!L @93m{dWzbl⋊$i?5>Hв'Ol= g#s A"WuyCNs#4p$u@`3XlʽJ$%JhF94&x_. g &X6"7]R}ù*g&j>keg w\m6wպX?tpֵb`_ $MO;vv(dQ|Ke,P2:r8g[T]_nڊ咬\GQq=_Ƞ+Cʤec d%{wY[ɤ0q_"mz,`ZBoeKJ, ? S¢'wlXތ %[T*srniGVS5t\<=*;>8 p`&)6kՊ5fp؁X@)Fet}ȳzgNV]믫r^qqhF A <o dquyl>w|w-N'&h={׃֚YRBrg][i <M9k O+,ߪ1QS]h4٥kJJl=ٮn;cljaw<3ӥiq"%$p忐(#0t,@;!TZ#\(& *5R]Zõh:;_!"0źy.\7Zl r?6{#JȌݯfX)@+xkuFDV \=$4׊W|w?^>K \宷?'+,%Sa9AX$CPEK,Ր/5BɌϴ{o,*B:} ?+SrHVZXeDo/,-y;>ן˯g /C ?0 J(Q==mM:2G#¢єaqJ*,nTWB4: $ \Q4y\p즋˾h^7VT$Tm_)Zx^+/zM>HM@/'o>OD 11?teg BMSQI:ȚR~>Yt$r1:^t:,I}~’o{Z#[sҜ[[oQXb(ؑ[1_&gjA{lw,פ9@X{ ҳ~/936V31p~+G0Xc\(U 21:4!ɋa$ W=mfLm4+PN4Ծwy}a:פqrSߟ q}-O<9ÿ;@m]䏚{{p]c쏈cI`T %ӟA@Bjf3= 8`0k6lc {18|q@`vfG@CBbcp Eb Z):sY`aRCdT %aة̳scW. 9wzN =CݱsFu&S3zUjb ݋aw/3吳<38$z>w]l,kjZ+VZ4mT-S2AbC:8TB=*S9VRc7TJT/p1-QɏK&7Q ("Ea2i!0@1l5304A^ĂO t+Dy 9 Μ{][7pL&LX*hr GM`JeE%f#"HȓL W'xeDW0Xqn*p쨣ykʯzvq%8$?.]~kќ 8{t$59r՚F"SV-y2w4Zͥ]D^  lN##q]p;L%0@e:uփ>[X׈`X/Ԙ2.H"?0 pb`yۇ/;2t]N 7ϚNә29#(kRp*TjA>)5rYW奧?QL&͸cUJ@"H;=/oUJVJD$@i/`fh/~;xfPqe<@_g5~ME5@*%f9YKYrJi*! LL4DI0l@RO G/l śt>(Ske-D$= i &1 ˾RepPhFZD8 .F1w Zwew_8:K(䏗nBmw['P~~`5E5k D\-C*kX1nYbGoŃ}IS~ +We:_^`8sNQKo@B0Z (j[<&T;8ɝskP*rĀЈpz}&CrWO-dwZ3Fx1J-tsdވT:}sG XU֖冯/YB2^ S ZPYf)*\ ~\L:@G!8?tAgn`xџ&\@>n. o_pa\o8ϬCK-0JTYҧe"IDAT 0oE b4s qÎ;8lsAIQ.`'],_gUU5wk%soh\Y#LT*ɚJQ4{p6_RQB1č,iVvWw콟;[-ֆH"edO78=D|{DrHvB /~h29=fsMFG3!E!"-nr׿Ʒ:tG`[ lݼ1G#Ȋ mkEMV?GqiυBAVκ-θz7g gpBAoupfn9s/UNHXxь˳ٷܪp _4AISPٵ%ůKeq6 vCz .Kk8cq3p~[R'J<{3Me`*kCQ[mnl a㝐@=7V+WȲ>e?<|vA41:wNs}*NHK+& Z;#8dщ tlD e7OI5\*cxi?rC8,՛!&8nOgu%r C\,X+.pi1_e)4b-)X":/}C۸e>c(? sg~ 7S$|>d++0 E#]GqHVZ6" tu~]Q{;<͟㼜S|6Q9#oP*{ꉺNȮl$"lW#j[O Fy#>0urA~OFa(rv#p9dUB!'_k‡2kXK^1 yJ:lS/C[!9I`09d'oT׌Lڼ%=d@:a^H8iO >qtrϺl.H˷t;η{$Qa48yΡ5TCwF*^>cP3j?7sroYnќ7{VH,Bϴ{4x*o%yK8!$\[hnA\hS @@T@K zpo~ic,FsW~C*&(]>Z@fCnN~ݳ=e9FEq'^)ďn|tFeV=wjŵ}R\?d??" S!8cE?x'[Rb6^P[ې8O6Ç=[4gF2Lƍ"ڥ Q׮R1xz<ξZ P8r ]e&zMG 珷KsppSP<9vgO;Oq/m f8C~AWHS"sWoaB @㛞\[v-vfYw:SސHpnVsf| Mtv~'޽'b>mtR\pnDLDT^a32TkyeVa^񷎑17CN)J}[c->9f"K4++rt:%xŚy_ob蝨k 5>.ݪM^~M|fְyw?i`Q)uVH2#9N ` bnjneQT QrPNJ_p! .*FՄP @^Dd0 &NCDyœ4>GpXD+g/6Fu[6??`e`Ø/22Aobd+^@h2>4:Jrfx5hH&HUU&m9r/!Yϗx?Yr=7 Np T׶TϦ (_7#P#ql(R(jCmt֢\L.Z-C j2j0~@gcw~GXbg6n[g(N`=n{#(gPp?s; 9 :`lGslКV)yJO0ģ8*x70*L< q7~\z颯t ?~֏HHAxbqSo||poz@ ļG;[6<!$h0A4EGI:;w xdW$3r<0'(q4vv[uk MC\ "w ~HL 狆<,[d@wW "V**T#BD) &c(!MS@ ${qGÎE(|0 ' dkw?޲ܴa套.U).ti":= ϑř!0qd3盅2\u{2pR0Ѕ 3)\sL=*(g$$j7' (0(0 I|1ę~Y<|`{ٶk~W=pL Hs#oY i,/C_vW7yzvCFa"XpR!geR=D fhHfF/z!yJ)z: `Hi8(z5 ;ϬE2y}#67/鳏PDJl4J2oRW"z֬?p~O?yq@g ^l󳃹R$\9vnhRjr8XEY"JځA:@.eW^ǹ5^-Xqu3*#%!^= n(Y`,Π|VEY?D`^wEG b w\:MӼn6= W+!*6xJ P{`O7$c5 0MH(Ho@ ˿ X{ŜyV#GًKb!xAB!1$-]+_3 ͣk1@`*ĘX"CIx ձ-w:j,Lpoނgs% KKG2GZێV((*̝S4G}7wn}7钲: @"+dO֢8cy"FDsA`6G~tfI|m}o B8,m<*iwT ewH%ɬP(>}DRbEN}ZF.=˂rC> A4G9;r J$(>kk@!NiT:zp}9gh>1i+!3) 뛜}nwmpُƹ .<n")wT z!N[dB22iR(dk=,k ւа9 5z#Oq0e*|%k~p54+" P> WF7%!ʆ UH4.\+.T8ٛq cs7i`ru!7ۏԬ_'o]g)IENDB`aqemu-0.9.2/resources/os_icons/lubuntu.png000066400000000000000000000070611272330227200206700ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs   IDATx{|Tƿg.'d&WB!@HQP "hh*+jaxݖŮEeuERTD+K =!!939G`̙I73go9yA@@@FMEʹfc- )Bh_Y;Nj;iUoqR &Hl$5i3c3>QdrbE0d~ggKe,$:ׂ$ɉ2:IdH-t輂ReF.H z+z$8=xOcm~[S^nzOT*_ It#ߝhx#+J᫟1QapgVŲNã!aUy}D_JH`DլC8S`it|0▖Iq٬*"ly8ƒT9_EʠJe{HP1kx ' ChUǧ(Ue|Vh\w%‘[:Cp:'tDBSpE2hDUcﷀ/GT֝q1<55C/ash W&!y-bNAEJqCcxT7-vټ fr҂]job}!teJV(%+'0g|%._!m߬<-ٜno:#^XgwWUqo>ȒdEj4ashX^)X0v>ŢEcY7?wFrur5ʋD'&Sj,Krc\&ɝN-?V.jAlag5Yw_HpWF8mwѹ&n("<7'ƑŲl>hahذt$V4 ~ef4NJGl㓧3^ǔ-7Lu6-Zh%2-LT]5;YGmηz[&4Kd~cʁ^YO%QOB$ܚ٘WDOLPϥ(s дnM v6{֝Y =/n~9e;g{#W~"l_rnu lgսn5V}r6T\옐u%H3uC4@vr +gs{C Tq;F Nskgm9de v_chv pK }vO b=nyα䒕x#/ޟSkUR A*U6781 "'2duN:Qaݖ&+nCn.{4Wm'*9VBnt''{*_?f)k/XbWf'ɰ[{zQP0`wDY1"aVX93sGf3ϾW E=:vOyU]t@qݧz-Ao#^ @\x3>(׌sUF:^}8gX!"e ݘBr{sZMVWǡ &AAy Gkz|BNXBUY[թESBExip"CS%mU9?rUzykrU?=>yHc]$RTlGKt\T^5Iԓ5*7i-Fz=SWX_oQl1+FOFOV* ^zT L.>$=R n%/_V}Mf%W}9vVw?Ʀc,/H,zmHYCQ{R[HFUI2FrS1n rlhLb;>o+>\d$:N7d1sjїPp\y mЬ;-5e,5ܼ7W(+@qke>txCK[Y[ɯwthT'[Dt-F~ ^"eI%wXw̾>sKId %23+/[D__W˜*QEmFVk If=0#L0&A])z⣂zڶ څ!D;     nT?JIENDB`aqemu-0.9.2/resources/os_icons/lunar.png000066400000000000000000000244051272330227200203140ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYsodtIME 0p IDATx}w|T3gnnzOHP$@ҫ)vb\/wT ("H &IȦn6&!b&pg>g9{̙ygޙy< @o#ճA;3H;1@ @N" "#N]+.=3p07̋{A 8Pdl&Wϳ΋X`Xɝq']+3n'Vni]@,W$p.r?v{aH`{<<<<<.\.oټg_Ο?.]fmܸfѣcjjjF& zF @"@"@ @&"Np K= s}!&: ~ LT | ÇBކ  E !`_ G0 _`4hRkhhJ"* & A2dȶ{Uظq#z)k/߆hѢ'Or2*Hd{@cGVYp(颠\-؄6 s~Q)JF (Jj(J[ddo?+࣏>?!`x^{aHpp0 F``  Ǚ-PXlNT08'J!alr&%@B-P(RDPٿSL9ZC`x@dlHШKJBBCB/ l?W "pɔB+uJ%P( a00wr89X|9-[!@k|Rl,%Ӧ} ,=Z[0ENhxx8 _ lun5/ϥڏN`o)l5ըrTTVO&k蕒 yذmȑ#8pa㫯8P\@U_?a#00 H~8QkǷJXM6XF%[{Z\w RN C\… E) ykر W`駟ܼyOif2f*JbZpp`r,N6bϰ[ W&l  ɁSBZ =|ŊKfmn"11?v0a‹o^*+Y-j2:F'8v xy %t ""Tp9_#>;v`ʔ)xq|a_R]]]z+1'uJ}fΜL&32 C^Ahhh(ӧkĉtڨQG~u)lڴ/ٳV7u|8oUs8ӧ?U[[hkٮhTWW7<͛_MNN HW ko"GGiʕ+kvz~ѢGfFD5gܩӦmܸqa6|e%K鞒b@Y,bp8Dôi&NwӰ0U X)z/ @qX,gؼykMynݺ5K=z͚%iii/5jפIzgdKqqΝ֯_iSUŸqs HI)p-KKMڕ1"oܹoΝuԕ?4--^5ѱt;ts@~~~۶\QK$ƒ,9sfH$\E8?,V(Hh`` mFn^|afT͟?L&aXށ#$$pʔ))<xۯ7?~a ƞ |Bҥ${ …!-mk4b,_g۶)K$V گGGGΝ;p‡d}_a'~W_}u>Ի-1kxj6\&'%;jSp/,/}N0!SNZj^+<O<1$11BaC6mmcСC ?0b2fOTs(aM# B(Ųx<#U۷匌qӦ=ydn M&б!C >]cEqFDDI&^pC&OCk$8CC3 ?k.ߪbe˾6)ڹsgĉM鴅O+ۇa({+.EP0Eom#247p1O>N62G_~e{8zhw}={HNhvh%h||6tFTJo|4B*AMhh"$$DiX~83&L0j-lٳ&̛7ׯ|駩֭{dr}}-G CX4?zx!ddÙ3q(+*:9$%%#[W 'yEx2N,+l6xg Cs&%%{׮lOQ.]J!u9tڵ ;zP 1bϧW+)?齐gLy?_fB]}gj1p#%3R{t`Sn>VFށn/U+||>|}}Cuuϯ h4Vڵ+}s%g϶dBR\u%رcOw:x[007c.X;VJ `A*y`8bb>kuxQ?w]yx@(B,Z)\N!2$ԧo_&,,BhhÇoS_?Ǝ^^^CBB'= L7yn-Zw(,ë`tFX?Q]kn;u  ~;{۾?6"Cl׮xpDL<%@mhAӵJ=}|3!~~~H$D"H$X$c=kL&Y~vL3/N5j3!dVzz:4xmU%K@e@@A( 22"8.'P!/asB;ubA J)J]p\74ڤ`|}``m۶m9r$tޝWo[ll,BDDZ#Q  ŴU yc333:V+1jf3L&,KfE)kZ@IzN`ѣGp8|}}ijj*]h‚?Rɏ?8f޽~q)EEEDY,n8uKGFp\w@ gϞ~ )++O8 Ჲ2DEEV_=>UVn999v^r:ϗҀ `Q@(F{ urPHKKjJMM8t=zXKlB꯴߰6nB@Y?s \>>>+ E\N)0[Ct@X_8`3Ol#J.ATtVPJu&7\cbM.f/2y<qş222.^  X;y=rƌkvwfOF=|܃l6;rؐaW9k5-q 7TO[$u@$V}y(ؘ5ãC8t:u]BBڭ[=J= UUYjr_pTTT^*JzT0RPTlZ@:0-z^&"sy_:Wz:u2}`A/ \Nw‰rr ply3UןqF<~8sQdffIIIp:2F:V\ Þйswzf+Ok!7Lff朗_~Fh$?|=tf+,:`8NR(A. !w:M~ ( 6'T PHKeeVV...!{yW^[t)R &<7@7lQeeC=tZLСCV՛ ^w;vESz3h':I)4fHDB%D@ all FYTBOصkƏcDiiM6e>|8^(q&i2?`0$2tl*.9D_ Ԗ9޹~ץJYkh,b;t8.\RCϏr~maHHpw: y9Y|mΝ3VR$R~RBDxj۷:ԸqƑ#GDigyfKYY!#O:6kG?lv@anw:^rR@iA˅fڶ(&kב# vRzߐ!Clr&??/_gN1NL~oSq+WT*R yy9~=vU?w:?&GQ&3{$5R . s'e7%-ob*֭C?ѪѯJF m m:p0>bW!u `:p0 l6ƶYdQӉH￿?ͳz J)oܹ/^|kkk=*'A{7jAg K;^ 8`ٰ0ڶGFՄ߄'|R~D޽/++0LBR |`'2v!H$P(0p8Zp8p8p(j T]lQXf4|>. 6 zw렀BAgύ|/U*UGueBt2'|K T&_ DSnЭXKDGG#$$>>>@~~>QSS*F8fMks&ZZ>cPPBCCx$$$6+++Cee% jVkBY KSz)|ccczLHHH$Hej1|HWxήRc1MM7nf͚TB(YYY͡}bjfkmРqwG voݪ%NgsX,0ő#G ~aĈHMMłVEEEۇ͛7.$4{8rCޫW/PJ'O<͉'JN' ѝ:!!.Nw}Ö&U*יp.1~ltJ@pÉo0~xlbعs't:3fq"|-phT5"۷y*ְa0yd;}̙3Oȑ#7Qb9D"Q`Ϟ=dԨQO?M=|𢠠uuu.߿\ƛS.RRR[liGa& v<J ne){ؾ};P^vM e?nJMSL ٌ۷c`߿?R)rsso)n!1lfm0cƌ (..ӧOV0W/zcU_}'H0Wl2j(WmmܹsZp9Pihֻ^}`p"O8'F۠q78o_ "}0`XP(D"iV a7ٳ',<<|>{̙37(}Z 8qR!&&Q4#F*įl-hj f#BUfnGII62~?!c̚5 ߿ Gҷo_@FFf`0PD¼&eǬA@#"hhDXX[YfHoF-!, uyxCATe``D"6mZNX呡 PXgZ7 HCa_A A@ 08>*F2 F󛏏OC RzH$1 v Gk<645h4f9N1^4-m]l6[p8rb1Z-W/ҷ,n%BZhZ8΢rԩ%@|\ R*PjRR?C7Ű0XjhZPJ/ m>ou^frr{{=8x_ *SFD^5e/QUڸ5i՘=*z -SAYR$Fub=v؝!ְ~B\k^oV*Fd*\3bòVI` _h^N<ؠȶZJ% R;<<# # :( KHȎ{ᅳ>V{EkW~Ͼ}5448kjjJCƁ-H*: |P(PSSbygg{g+mMMӳ"<#I ìiS`5PUUjK@@ql{***@97p=UUUjj 6z$~Ιؘ(rTVVjҗ^z~op,_C~~~\NʨgvO F JYrZYU}gNh(yرJ\*-}b%È bZz7̜?OVBΝ^ 0cƌ#"">(--gDlR翵 aaڬ9xpx磤ht:@I 힆v'=tyIDATO? 0aJ@PVTTDiDp e[/,@ /^ʺ:t 5_|4Nno|w0ajܸq%uuuSL&fWjGȁ};Ew¦?iٳh~Aa3O.4B;wKV`ڣ{wԹ >fVo#|H]dgg"ZzZXE湷?~8N\N i x<6B1v2Bb뭌Mo_zn׋~w=СKee C,ܻ\`A ©#R|{7B(,,@aa!&b5kwo? ,ʕ+Mƌ=QU7ư'$| ? $ ;v| PTT t?ڵ\8Fu?i|PN81H,!# < Y'NO蜂 #"$yyy(,*r9;FUHwd|ǜ|1}zن YjVf)! iO@ah5V 1'wA/Ξ=KI݅ $Sc+VEïlglݺƍ;%9Μ jN޻R{AR7( 4Ͽ2lFN>Cϝ;Gj sT}m8!D}̙6աW⳷%Kbrҍvs4KϿO?TW=~}=wEqQ.\EEER:> );Gc͚58gۿ~xxK#"POaߥw_,xfvIFAa!JJKiyy9p^YdɎ>ljUbMP$B} 6n:',ZOKFEEhKD[W蠠.{?=~<xwpBZ6p ^)ݟ_WUU f"##iDD  L&CUu zӞ;f PPDEEr98v; oO߰a |v-&5Ξ*عs'&Nغu␐LQ[·|-o^icq3i*fϙA555555 kҥxyy~1o7СwX~=͛:yrܿSS)2@DBBB'N}8xp8p;7/ };7ⴣ5 B P(0Ao1k?!M<{6}V v]bŒ\6;PKdR)!hpp 5*dgb@Y]^:p0 Jz"s Eb4QȨ:+U)S?|N{,wN~;ݻ۲e% e~|>RR___H}} /1T:#T f lV+$^^H  V FZ VFMj5h4 @V뛖Թs%uKr7%VP ((RJ0L"ŒZVx{{7mHb1y00lR\.8vXm6X-VXm6L& j4^b7jjj) ޽`͘݋#Gzp;{n3|999QZ6Z,TtV >v@CH ݎl6Ws8|VSxxJ.ܼyW4??ZhիWk>t^fk4~NNyƌOWVVF#5>wL&X,X,H$/9u8 ɚ3fT۲r7 @rss=\.>tqх1WWGGmnrwc_9s'<<<:' p, Dyrc- kUr agAMAܲ IDATx{]?ޙ4/k$YF?p8؁$ !9I`Ɂ ' 8E✅l &S5zC̝۵ԣU]}q$KgvWUwW~U}G4)Eg-vob!O~@7p:x!)?7ki`#@ 29GL^[oPRc >os҅'s1xjf!]IaT~Z`)XON{_Qo$f(>p PUoS/]I (HN N._K*=<')n_a0!Yh㫒PN.>ZQoC#1 XkR)H/qJ_apĐy>, NRn~ƁӜgdҿz3b?BqlJU|SI9ErQr w _u/ Դ['{koIVi8h汬wy-X:NzW:7_ϴRmuޅ!c"mۮv๵P^hU?_-zjk^ֿR:šh,-a -9-,iOZqK TE7 CCh=ߑV҉ereCKn8-z)ϛ4g~UT2FICCWmn__VX|߶%΂OW{oƛnG~gE|c1<`$SǴmNS21|9jy C\ X\t'|ۆef1}O>Y˿aV)GdD_VQ=O<bbuX1h]z%n>YO혏 M2(?F̕W A$P~vGff3믘Rϯ|,g:$KvccR&tmBgKp5݆WC,r N[u7]\&dRomUUkHPSH%4вڛSV@Dgx=&"x]R^CXm^I~o*nFn]:۷aݫt \wm :5ϑ P?/2J Qw]{x/%?vڍ*5I%b929J,̝m Z*zS%_~Zf.G-&Fn@d~J1DŘpŶwgA9 ``ߥO߾҇mXmT?6&"S|ܪV $˪|zI/5@1?(r |"eq`[YfPAeTy| > %{dKg0?%)WbÁt`TyE`y˥[ж.WWOtj)FE|v]ʕ!E?s:'@U X"X ( &Z8FZR*ٯsȞd{~7%r7/,t*hYbdY0QJ[UYM9 AgM6iӏlo?p:UMtR^%T).T5p*5 v\]mJTa![mq -m]iȠ8]qd~G뷫HPi+3%VS y$ >-\1@j1@)Aro@koBWFl+wJYB$ 摭iW p˺UZ؈W$ծSAWC#l!6ؙNTXVrXŠ %y];‰ѽT?I@]jgIyS"+Nq[{\'ujh1K|/T䇁ʬZPal/>^^Ѫ_8 W_6}N`JUzIkuķ+d50pA$,^e&gwJ]o Tqe|WwJGܔ̯rH^ֹk;5c&֘WZV \ w N-Lv) _WX#S'PCHIGp>~H?vt/>]-7ۘ.NԖFU]͖y6o SfZ}UԑQ9]cOMspr316YV h  d^Y1TSBTfn) V$:J_O膷Eo`)KY)w`w*̵%Of"9D965MsD&1T_ pM UlfdѾ^O9R囤AR ̺+w$8=c3sت|g5x֘ J)vg2BRVxLrX[p?rmOVnwr f̧9Wk5=8WnKXEWaW N 7b2 9V⭥g>6,r[//fnFKQ~[k[%Ga@™9 4?"uL+\n3ʤss $0JAQj|+7(,5u|Am]t Ȝ=K@D1J7Vt6VTSvprȽD>WH!\G+x-K2 K<~ xiQ/pe],YT3^; vؙrյ1Q M(9RNbn`t_z'?O7 NYEdUDF@;Bp % 9$ _nLcO)-{ L rS_tdȴg{CE>_`Q u#l )+ w hoOtwIKʶ;I/P5'OkVS@xOba~&:J @@ mOxܺ12{sl+7C9yP`"xOq&J2Гi >m+^AX ˔ N}pC5:taչO/̛Y&:9xi) A [Ow;@$pCNY|=ko11YNn} YFk%m BIg(쬞r)f/r7Udu=H2Cytb+Mw)+ږ3nUIe9t52J|+vjsdn^-"!p `X×%ȐJ$P-< RaB 2Jvd] k!NjOX(oI*LCM#̍( D@\'t'MvUk3 .*Bۚ]:djhP!A:RWg Ta 9]E]B'8QJ(u fMX-zĖ|>?_|ځ(.^uoߴ2Kua->6Fs00$X @ƒU@KpDipjFsnd4ШCN&e 1jyeەNxE?peٙ?p)D8ɭx˦Lw 91]UE hg2e~#Pi9 yS3ۂ d4j|51b06enquk߯vڛOҊ)r)6pV1$wJMl#Q2fl+psdZjPZA8azxn(\0*\|1|r-DxI.AEADqC[`DŽdP[~hNa#nHI9T]`ˏ~o|?#Ha{`5\E.E/th?"?\דJ'2z1+AhJWy^ڨ òn*wdOܢ-4Oj%#RDqC=eJENd)x_G\0 E+ _ peɱD* P&Rfk(RR{Ί/\BP@tk_^c5p~Ȧ(|zh?Rz~)b*AqyJn`zYK./9dPI2 0T# ѱK]wIx4(hD(LX;#/n712onc.an+%;G *S}IIwo]z9˯ޡe V/?pKp`;%?xDnV@piz9#=Iwq߽]Os Uf pg!9jRc A"znvRNMr8){ V +ʣ T RYUQMn}b1H}+rtɒ xۂk~c}X;X"p\_,g[`bl&< ;{gO'9)v(d5Ws0K`)0L?Yyȓ`W. DN |l ~~}:pjrG?_/˶T ~"7؁ω99:K~Uj'6rmy[7yЄLo$.L@%"P\"RSƵ.J.J8o?Lej|&_ b\]ͷm m#zvpFT {Q]M%+ Q`OɄ!(l /_SL2 GHm72v-oh ޸n\{ VLNUzU*K^7#QNr7%w,~d+~(s,fȰ7<=>s336#4gf:jIZOdVۿs hmwKnZ-Wd'/,ZEy̢) ~9Hn6OjC)GN "Q HФd~V_{! </~~-/a1n[1 xadZ3J?D=/:1*,$–A(4*g$1=HB||XJ)1T5_˪ão-HvYGN`S:*L^CfU?)=تO yse a'w<KW^V꜠NK xDyA]*;T%) /z(_C?JLwW320]s[#,yq-ڗA `*Šgb;P{ C$Ͽm S?"Tf$nn5bw̾(;}AA#3d IDAT2E.u{6a%eG]*[*+w _5e[w)CZ,ܖgӰLlʟ.inecM2B&܉Q?ڑn*>㉛3"ؗF%ZpޒAƀ60Լ5KbA]YO싎F@x(@꺛xmBM4QJGepYuSNbQZᾥ`.Wh?ӨJ O2u?)-qw@٧]UŀVWb un'5.̞ Ƌ?7sz}Z)'@7jԻ0K2뮳 C 1/O〮geC ƁaW ޸~C` ϑIPܰ\Ƶ~G{v]PPV΋cGY: }y-5qG?K)K@Mc '=6=piOꛮa$t[+mjfm*2[eyQF͙&,RGsDj9^~q;)?ӳnwTRQ,|o%F's 0qc/zߟ#%A X\ SCuuU,[}=SsLN<4AUE%a }oPb23В\zӚKG/ĐOm&fΗm]DGN䜘zr1qÅD(px-Qgwaja0`HppMMMNbw_[_9ɍH׸/MΝ 8Zc5C|K R埍 :trPǸ&\.o12;EaRr-ĢO ONItMKwTtxJcæM3tFc% w1eguֱ(P* xt_,/'и'?s&b:PÒCBĤtÏəYyslZnjlr[]&᎙o ҭ—vtAl~{)r[S?aၱfpLdOVBWG,k]_4Yk]D$YXIש"5X-1)\Kwbq*zŁ=4b}a^Q5]#noOΗ !z!(-t(o&Q|7G2ð>梓\,*);!uD5콥y^6`Qa b+J9Cn:f_\%߮Nd{U6.e\}#TɃ3TE6gvB\ ;3L=G;UŹ{AzY>z86*gg8qܽWRwck''K 8}Q&73[*51pWF/oMqOV/lo{^:}7Jf y3yxcZqK;pJO\m  $L)[n'.$!AJ Y^:%gQRTd6jyb] b*kgW?ܱBoݍ~m{LOu>= 𐝕@8!+BgG7Mx?FfY`g~+k++w5vs2n2R8B@д, [X䮔Ӝ;{χQB$( 쑚iqH`ʿ=;<tLCRo?&7>\Li.pU|*iX KK'/*]4WikkP7nj`3SXXE* RS3ʆťܿn%TcQWLm$, gªYW>&7(7&gb8 nx~J=G Fpyj ][SGaxBU*ܛ27#Gt>K|M`9b9x|hͽ>&lj3hB`S 7>*UIQamyB!{ à;JmM݄0BpR |9R^kX| B C\R:uHFuLTƛ͒S^kXv|Ex1ȨIk{ S0tNV%1Ǐ v-'a#T$0MǯjD}$:*3èH<&!#fB |b[mq"Q#zZLNq6RJ{h >4 Z:mGJKӜx&l0 (@cHdղS2GS{H7bv;CGeF0g =#?uǶb"g[ڸДҊjA[H!X4d =3?]Eȁ$GwUU:v*}5d#*SWEsŶGwǶ9r? wn!~/eTFv+5x hޜGu._Ph4D-<>֓cQηk|u)/+Fz1fm#!:̤b5}k莠_|g? ,;īWRsbb[xؚԄ* Vm,k5/Om-|a!jZtΛAA<>YgfqkVKO<Npn&o~zvZq'5({ | rW2_x`Zs6/>t]og[hi4M▅eű-(U1 2d?͗δ'屪3\+54!z4ŅAʗ-eeܽlɔcqEGIENDB`aqemu-0.9.2/resources/os_icons/mandriva.png000066400000000000000000000304541272330227200207750ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME 64}u IDATx^]w~)mge^DPأ]cԈ$ )h4k4bE#VLbBDD^˲9̽{ݻE]>ƽ33y{Sf.AdAdAdAdAdAdAʒ͕I:H)4xѹ%}ce =Ȼ;myoM`.0 Ya:+!k^:@tg#]nQ=sxA А㊜IE=]ѓqNP^^GɩxNa@SĐ:-#AsWUϝL%X"Wr{SWeTdL24vyIWK$qf{s EpeuRbD`K/iC%(yoТq ̞=b{$2c&<Ԝ)``Ivg`IDmXon_B0bC> 1T.٫wQ\ER/'l^L~)@̜D~39zpI{_y=Hĉ`]Qv_LvO  Brݦ{ d/ŋ%yP}ŶK ȏErgIHĵ|U'l:wŊ̌䖟B>;@%QptھJхtuz?x~}zkJc#a@}K]{L $ b03|حCřzLs1^tLVF߻qCWYQp c^# w&|_"xPHdyh<-edwvC/{ /;W߹7Y"%ϛUo>jpυ`KC>KdP_ֳzwrCo X<7-),/roMs=VM2D@Û-Ae8CTmavC}豷!L %n_0N>}+{pF"^KwJnSR2`O|);N`W -7C??߶<@y]n_oU4$rGͣE) T|UU-68@&íFJ{uxΕP_w5~P]YlZF 6lꢔ&M9#6N'ry%LG@ dh$hX=_?}Z,{.ңe.ٻ)ӏ%i;0MI`U7ߜ>Rb3;p[@*A*˱Q~ am=(~Ol.-K*~}xy.ًrrr{ [BoVcHs73l·qy-"b.mI8 fJuZLzfxD@cT{31$;|N6G`0\U4E\...G ;57<劰af_i^HɛCH͟' 8So+Yˡ`$p\.+Ȭ"5Ra^~Xr­$ZBZK~3fqL?4cƻzum:C-J-=N{/7|3zp, CJʥ ĆA;ν3ly߆;q 1*(>.(H`*UTc[u$BX!3Z@ˬ|˭<rO$JɗvG`ff*pkow =vI&aUуoyRMs_6DM7o~ǒ]w)/|_]ܜ<XX+1U ,Xv:5Q'6wbDxPxV~h-6?eȐ+d:Tf/$ STg gȣK5U:t*;vYfW2̐ xf-:UD! @ۨGJV.y>˓0̿3UH$SfD`| $ElI*eD߶A S^&ғ]Pw D٧wϾ5 tk0qDỌdZ복Zh$2bOsǝH8ugK4 bm-Wώ!c'AɗJVJXq^ojG~xv/%pl^[r{*\{+[Ö={\OeG /ؿ\!~GaqYel޼ӧO'DsZk#"ׁp )66|b[m&#!]!.$`{u/ϷC~)-?q+/Fvs2*I4[EW׏ҹ5=F2e 3[2 4e" t^`p 92 U [vSGl6|Nhqt4ۇ}iO9'YJ ˯xjO9v. =:d njJeiuǭ On۶uFW?* ]]SBwH~nOiJgk+@՜ ?쯻S_h_I輱<:ɓ K!%#K>=IHa句 cެEhoа!Ribh ω'/t&ӒȗwGZTLstV}Y{gf7v;W3g#5`*ff]goަgF`ԩx饗WW @E hvTFG(//Gyy9ӸOTV+LD̉/^驣teK a%Έ*I faXoOoշ,"_?%3/M5u_WT\W]yW\ %cu% (8`ƌ}Fvj@yN0DsGByy9V`hh1Mcon88`Q0Kj'8 I-vG|wtNǖQ帐0]lR sFApvo-SJf^mhA%kPkz߳=ZX"m.8ťWܴ˘i(`t3b'ʊHj/ם~+++ '+ǽ5k'XK&5)6N$?(}nMg?:1i2" #z= s0GÁWoM .boLg3Hᵄ H XCH&d)S~''k0&KVPm:Ϛ`) Ƶ%r Chrmt.!HME >-Å TjKH4l|ђ@> }~;4)n&HfRagZy<hir^OFSrix|8禶~]-zG!$HM˃birGFs ]O?,Rѩ7OQ3VZjfZ;]#Ȟ ESyo#"IܡmsKC~w_-љ9I VBR1扑PWM-[jQ2;BozJ(Dqnc‡Q$kRܙgzOVH#֨z1|%ЦƦ~S0~:3J)!JݪYC,jlsŸ/a#["~PuڿHf{ I&|)M]H,JK+ >HiK\ PB^@=aCZZ7v_S]~ _O# f+ޒ'NJ'`p[^m~-x ZNMh/)c@Q֪ TW;{xD<mafbuդ>[<8ߗ",$.#jL,q$Ӳ\>b) uP1Wt,ƅĸ>YɧHŬYNƆhWB_,ڼ2lufm}Gy] WNQ=_Y?n{v[;ʮ9iCH~>lڞvTUv[pWXG~3k@$>ke[)5fw}>vH ;1L^+Eŋ'oQv4nTh?_ f5oyǐZݡ#bթE|%L8{ƕwsrȢֆho,=m/Ry;;|li~K'Umȷ DN' %’lT2ٳsyɑ#%caFDg "AD|;u貴`~^Rc' F(bW̙3eJXxqU+ u:.Ršoڗ#KgUC2.l@[w:awlk!RHTo07, ! Bg&$RB(gY;&u\aʲ :ΩPs^MB VUU-bZyɧpO?2{./n9^N)|Bj:&(Fdpbl"=Qۥd;/Cu4a~Q0ֈ'1?Zjyt x;%M Vy<8vVC 2  GS8'WuU']^k')(l䳓.| lpl$RG , DK*W;` [/Y\/}CfYAvOI$0:v]#E!BB]UHfdX!xSr&^zennjlU|T#Ў|!۶OlOma?8]bESGإY­$\؋WvGT<dQabJVᬓZ޳ ^&)_bȗ0 kevv)W*Aul MMMĮ<zakO^=]_:[b/=$C>?sw} 7;Ӛכm% P6՞zqJZFΦVvM&f"(4C(f+[ݥ85ٳ裏{.ˈ*~P;}~"Y:/!3ҋ :Œ'MLvyTOkbUY k^e~G|Mۘ>Ymmf@ϥkxoJ\-y-xkkP}tKcv,PWč7h+"̊3ɷdc2l-v=1[Ktƾs͒BrdE[Tր) 8p7m3}s٘6mtS%'v`HUtQn㞻¿ws3Bp l2s|GB4-^l̖'!o:L>3XBS?v5 +eх{v;Z?xlץD~D}Lu%\\m kweSj4,.ʥ- yʁV կ~;jJ0G&(fiL ( !FLxi=E*$$$G[Ombb##[򂙙IWz*#Õݡ#R_!% WzzC{dau~esWCD@̧Y^˷3V^Pza(\ 5fK '&'R/ |2f/cluq@, أ"Fl32E'#/@ Yudc'sI0cMT}os"[L!Ն {aGcz[3}e׉{F YyϽX/~:w[wP(% @;$ǽ`D yDO O1{aҞE߮O .rӐel`@ǥP3>k^MQM9XV8)jDi0!]vfϞP>˨R@jr](T[W` @R}HKC0REv j(`96q2 :J2Q|x멋֏WI g">#_# HC[Iإc"(:X?nOx6#k3!!#R%"Ԫ^i!Ч4)\\,)"|iԩSeoM]qo~E0<*!UUt@Kv_ȶ'AR S j$)+b˫FEʼn5!X!  D# 6t̬ @cG-΅jl Hɍvؽ?^}K.<~kkP4hm9g`ӉE"srCt܄"l>6Ř P'x$$wTRkKv&rIk+.)De9ZS|9@HG>>oG-JrTiD0R 4E!ׅ؅]v(S:qoGZ~gvšUwqG vOStܢ7R I3!#rCJFL*j6_ϨL4)>ݒ3sob! ׊Ėul'|ȖZF, R-w` 0qIs$9u:J&'u J,Ms 8xo +SX^N.}5 ;3|̰YlRM˘9Ë/gDV HP=DQ4$Qee $(bQ搒=zԨpAys@c._`Oݵ1~, . @9ߚңO@[XAr33"& {CYJUqH0/^ 䳽1CB2t[1:El-(RLvKB2)\l% fFؠ)ЀMg)-QIaa!acɶعҥlPը604dX~G{m"QJ2H,7~UqUWuGruŸGʔ]zF{х H2aW̪]h[ؔƐz=Qixy+uBZ61/I? " lv-k/"'XQRFz&*ZxUW= * +g/ЩN ʂ vdINt6N1@5\Z( q8b/W.UFejwH}cQ_y&5wC<53c/֌Z{a )mei Т eS [!v";0l|IDATjgFm6{HݫG:@ [n,ad5x]3QNSIa[~0@BFg(//w3r϶g$"H"ZOn| Q9>Q`mE/X!%vnT im\'TI(hBg5>oSX;%D`DLvgg~${\NwOر>!DPB>2syRW\z⪠D#s!A,)H[uLm}uTSɏ  P"ESQ/u3[h[?_D, n?}2?7>IUlG},pC-"`:ʝkA(2_e$'LV PUѵ`%D[FiR|9W\X [/%C בcf$$J6GFF65 faXBlmuSpP-e۞ ìu]-R}M) 5 P+يQ Vp&c=3@aˣtj`jif0Y*R`foT{ݏ,?|=b~ q3wN^u;4,xSDf15[Hl'iX`8 57=]D*qsްVح"*ҿMWIi$a%h!?nA%#8I}C)P_R p 1_ךn {ucҤIؼysaҤIxqwUd`NS BkхM?[tѲOT{,B)g;Ѓu!)=ɒ8:m[#$x0ES e_w0a~f#Y2xƦkD5bhѦE ?zHǗtuFTBG?)ilegݯY͛Q^^ޭkK ,nwl/9=zBG?IkfG*I!>$`e?W=ԃjJ>GO)ä&׺4ËG5?fi- CHAA~_iISMt@3>ʁ °M~MW bԇާtn"~7uj16R*%N/l *+ytˤ@{aa*A*,(*(kB!CG YY2zm,PXX֢>9ѩ7+gjB\fJ 3]('kGʝvSFK ˲[[fsw}CVl:P}>E\&4:g3tEquޮlrfXm`6%մv~ og *PA+<dh6 vµU%s ˢQmM,k&:fSW4#$r<4A* BX#PUK| fj]I)Vm>B+Nyb7#aHYDXֺB{}^\w1ȭŨHGOM`}e#ޡiL/ W_Yo^_{>}:/_XJ4o 7) mHl:Ρ(f ^]*[``= iɜ8q6^8k@Cz:v uuӏ7xwϹOf]Rr1 dBK ;j2B=_w}=֑cIns~vip~?ZH_m3]_]x{R!Y~rwmv1g[Q|ne|kC2C`Ϟ=Χ }X#ۛldmq#93IF-f4oU+WO->D#* rdzE+vK+>~9ALSp8 (/` ^,%fd徝[{hh} b \w}x?!2ܢޜ"r DDK EaD핑֮] 5=7[ĉX??Z3Wi׭I6ޱ0bnb+Gzॅ>j?dF#y 8 >\[V;ϥ'R"QYqȬYo0ẏcDGkα"͚H6fh*3'~g=:-B"0F>RR6p~[!*s $t*S գ.."c'PUXJJ0Grcְ4%8S$Q`kՎ8ϛOpO#fbV0q t2|`ֽ^3agS +W'pW EZu DEz ],]bt3~,$~&%G2Ma' \ `bٱAB : #K+'?Q F\=_nPQVQK}eDڄ#m[U:uDRR04dǞ~bz `` ``W¡;vm+`Ua@>>Vr]Ð޷O ,T(0 /W5ޭQW=XZQUoQ1e2G< _tPaMUGl S0,Bl$p$=d8O93󻖔KETllEef1o5|Xr\q裥|ILJt1 lFUG vǾ,o*r:+iTTehaK;3L re$(иT;n 6zyY{BGULw{Xxq<7XgƇeHl;O?{]}uĜGĄC yt$]hΊn/KPҥ PQQs=Q r#e *{\MC`Q(^kZ`I2#!$KJIQBC)xP~h1-ΡYn|X |_ ^"%>oj rCMK̇~{o͚C;G M{7A6H֠R1ŒoiݎyR䣥=rWЗ Չk_2Dw]@RY'j&$H%Afy }r#Č3QYeJV-I4G MTT&*?nj~~REվ[Uy'm ]78/A3O^rTSQ״9ŊJ~ DG`m0aF@Jnf@=$ׁ^d2 Ն[F}*~to&z߫ox QkTi-ڰn6Gv_ͨ{ϳ #rOє,Hd1T/)Eo#`5lE0#UZd\`]RP^~:z"bN?]{I)p8TwOXՇ ҷʳ1shʵʨGS($='`+[QY9ֆ0o<s Ml]=zQGQ 1uᙻJ/=eAdAdAdAdAdAdAdAdAdAdA= 3mdYIENDB`aqemu-0.9.2/resources/os_icons/mepis.png000066400000000000000000000217371272330227200203150ustar00rootroot00000000000000PNG  IHDR>asRGBbKGDC pHYs  tIME w IDATx^w|߳teYm1lB'ʗJ$ԐoB ~b0.c+3?t+ ffggyfv (.DYPl_=l?LX(*N&@вT@Z/ǀ7Gop4C`P$ B+0!(Ҍ8*`p9%q?~\ !4'O͔CTVoujò'EG'DGf!(9UMi_1JJhg: -e#Q\5ɬ|$;u:Bd˗TOt*M= 0(.3R9>˞fg Nc|Ҋe=m,nP o_Uo/NͮGdں7  f} _:B,fڼ˟%/52s?@BP6jWj/SFQUǰ]x*0رi\P-Rǝ. v/'c"()3W)%JZ 5SX}ϲiAHu@3vGehBhߺ 1sNOPJ5%u%]i\UFnX3H% aJIܺHӤmrHeu)6",3J LyR6 cgn@hN0 @(D֢юFB[V0bҁ(+xf!4[J$֕Wk>d PvD;jQx+Q_VC 7x衭T]@) Rv(IgzGLD<@ )5z:ףĝ@X3fe@<&w n#ل_ ધ>"=ϊi --HJ!ep zZEy+a{ŚBiCQWR $نWڭ=[[E [ )ޡIK*L"fJ ]cԈrF/fX)UeAJ=x=B3-"QPgPMljlgæ6nmC`:3C/ c:)nͯhNR/tb0"&3caꄑ}تM"DctEbttEOY||P>ȶn`vKŕLv΃ JeHZR'R Ӕ gLX1t ]\,s7 ) x89Ŵ+V xЄ@׵ѕ40P;ݏZ7V葕`ONZ0pSlb躆sij c]Ba;:hP1%JƗ9=+HcSr KJvIGCf%򒕞M'QJQYVeg'ɗvC#h mDZuя8ZYڥ@Y!ֵqy >D(4_[.p^Cwxx<&O"*SJu؇HqJeJ?Ngİ2]=tɳbM76[B:F-5Ki%V3cFs8ieA0̓/|Ɩ|ތa>CwcT)b'[k.) PO6PJaZەo9jRZ^O'+eks;/ )o+JW8J8W* }>^ɼٓ](]K%ΣYOxFΛ$-$p'qg8bRow\||!W>'fZXVϮ*R`2>{ϒg.cnAuΜxsx⑦AB?v VIq s _Kz)6th^x_Vo5R UdvŠikK5e,.~'h8玫Ne*}%O 8Pim:8-TtTi1npf&֥/?kk6lJ) 9pVqP`e( dv74n$@^/Ǟ{P'>oB4lm澿ȩ9 )]׌ ғ* v7>4}K,[){g%ZpS_]wk6lށMLK5;yJ!>&O@[헞ԼuF'u%%ʥ34O9d[_{ y*d(`f.}z78`ivJ!,8pwVxytʽL_yXdJHXQ@Odl(w\J1mhmϧ^x^]Jʚ/DQy-_rwu5U9qTBG$= WDaIDŒSkP'Mmѽ<Ea/xއɱë8=sS$+S?`ttduL %yw?1rֵף?^e(C39AK$!Sٺl{P,)O}1AW8̝ C\},XqEq+E)/K2Ei{7A)EYIHnx[|q^?6K?\3wA`٧-B߆oM?2NewmH}8)%w1>O_ QRz?ԩ1I.[JQ"AHwI d2^ϾΦ_R /+lHQN:@ctSBptWt/S,b5LWGjo>_v14?LsM{kÐxR)nXly.`XF)׬oUvY!/>RbfMO,YR=,t<}I$3WyĚ1gd9)(5<~r ܗL>[Jc0cLS_)ttRFiI\,K2~l-%7nB}E}`$,[.`tm5,JP8ء`g.Q*,e'ҔîtǢ',ba_lz:::hjnckS *SJ=r8+~c T=*!^ K7en"C$HiQ=@vF:;R-WJA{56 דK.\uC\Hr'ňaаpu9+Egg7mM }TV#lUB?NZzcͺ u1whlj%_RWJ)6y<E~fܙtq8]qY^ +)N`ܼd @I+;Lk[ˌ.+H$LsK: ]3l3o)NJkٟz69[9u-[rC){~D2C),˲WhίxiRo^H%K˜e/y*>)Xkʁ!@k9ۊ!%m5 ]O뗾u ϓ.Jl՗waou1kTgT2p@@$t`k{ )%"?\{!e%;tz(/MK7MH$@A[[XgeVϛneI~?y% ~UD, p$PW;5DRx=:^i4{T~|ER(০zXZzW8Bcskc@i/6ٕ7nL-EQ#G׻@ya1t)k ӨP6n@cm}2i@JɌ&s7i]PEUUeiP'_l 5u u[`1u52mR**+Jon"XN89Ex v5-]*Ś:r{o1 B׺z͝s?zmTV&ZC0siI1rF18`=ң[n{Sx<o>1L3ɇ5s8p$c@4CcTtg-V FO/wtvJ17pHPS]/k/tW"y2aO7%=>Lå睆FqeysKu\^)+70󜕔R ٧slSKO>t}' [xT_@4;h3Pu2O['ORK룮Ɠ9#ZO>v>Nza1O'`Gxi‘hUU\~"_|b;䣸%wd9"7l͝m߿_~K(Ӵ<~ N<"eC57 9aPkxT+|5.W,J9| =gѱ{ck.#X8Xă E 0cI46nI;1(BⱧ_fӖM;s'é;sEgp~sң(ʲXYQ߁籃Ojv gn\DއKocPҧz>N*18;oI0ݝױmw;{бk%iH~u@>^ggAGӕy?铹ŔLźC׹r{)~9\uxtH$Jmp~s,/K9ƹ??v ` ] P~+N8JQJkKN?cȚauL:1MBhp82 `RZ.Ipr].irpѷNΪ(ޢ+/:?s3s}OlZ!׫ah4.&~vGYBt nNR&qg'6ȇk"!ޏ7P Y7jsSW3>t+Rwr%3wsM)Űrnbjku=G8wX!<<tMˋL}A!@0Og٩ ((..W]E],)Rys}zAϼ:?僃NaP biǰ@Ph\˔IwLOB 7[ֶvշ=+̢pEgCO:}Yj-% ({|]wN( (‘(sŭ]_?NًKnW׬i'.<^}^{@bӴS;@=C`Q 5;øsCH))OjPi;|B@$ J)^^_z菇#±0'sa{(WG' ۞s=囧WNc%}Z!=&hY O/;k+b,Z6|HT+B3=rnp&юf:7 mteH'Hht6uMDy;K VP9v>!Ҿ֍۷ 4!t0R(2#(DI{R(lxC%kl@XF|6G`֍FIXnQ9v"-6N%M9aK(>H۳W$n`U?İ;"P9J~JhMÊvhŒ-` +IL5pbW pS[AٲY #g. @L4K<dŽ)RVLw+`M.x_:B.]AC J)4 ܾuKU<t-pSrLKF$ 3(+&s+(`=\ԉuҺC%͈^Ρǰ.ۚg!͈fԈu\LY OFEcˁA6OoBiv= $RG UgzѲ~Ҍ FvL<+&P^ _P ՜&l`w`C9IENDB`aqemu-0.9.2/resources/os_icons/minix.png000066400000000000000000000162211272330227200203140ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs  $IDATxy|Tsf_$IH-l" j7xՊ}v.u+y,O" Ȧ! BB2Y,gj;d>s:}m'DI$DI$DI$DI$DI$DgpOWm[J\'.Et6b0&#~Fdל V oN:;:;Z-ru 7%hLKR:;;4x0Epd߹+^k. F`UW  4EQpسhjn3yEh4F׽j֐GAH9GK=+ G7!v}tZtR Xh4:::xN Gq3uFY%pG"s鮏5k@WWu`KaX(3j&Oqnlo* 0HyVlq1fZTU/5'93NvUK~*"( T8$I +,҃D"atvv2fsFV 'HFBӧOvNjVPUFR01lbq36 E#Ҋ妲N Ȕp!=Zk!u9(ltf5))\.lc}﫯X|O0~n) ڝ茩=rL -v{]x2M-B :-fv'Gfqdؾm;mᅽeANnιv:ŦGiiieB #ndo @_ܶLHGgrPF2hoo'aЈBd_c& %\.7FL+-EO `0`ϴc2Pj^/iisQxNE*,}w#NΔ ƣѨ?.0{,9G4 DLAQ)=j4 $Ҋ,]֢;e 4#-ͤ DyHMBKnN. ɉcpV1mmmvm;ȵ^CM1}';%*Dkh>~gsŸ՝`3O3sf1˗/f4فA/)UI8&ŒlC Fmttq `M%??lZ_wnf/KY@z;?` tF84َ>*ABQxؿ?nz=~ga߾}:m۷yfiqdb܂#?H4Z[*7^'Q0F-L&z Y(X &$u3?@4$EQGL)g9[vk' bʹRQQc鄽>*0eEm6r!"uZt\n$4G*H@54{߅f#+#ɊJcذaZ y Z)..bpY3P(Ėo3}3l_9Z=/0mmtuuΑj5K~>-59'kr8&#Z"c0TEN ͑ZRD6lVts ==UT}7v,ϟ9=-AI?rsV#Ut: FzF:at4p  GC}=4E ХZh5ĔD,%tZXHj7ZYɰ$?d2Ѩ1׏?@RVvƦF]~o{\D#;h$BKw']mn<)é8p@`0& +q7,7PA$bp8 -D4 O8A&;g9B(J|sβ! 8()){W?+ no֭cܸq )@V#I^h4/FQdY} OEErDE$Ae$>C,d2!2& {nNB~7֌lz+C nPWJcS#JȇoFpO ´S?pr։.ٽO4U-JO'jގ7E-⡺1(?#cC1Ɲ?>!t:X^tT&MCj<F;#-- K '|#atZHow Sjc%ѥDU~4"NҡUES݄B!2@8C[{G Ig, Șm7wbJ()DaO0x`\~jp$VS+hRLQb F-:204ԟ8qFJ DWgz>AZ EXQUVAZ1[DL^#~{dl&ØfeȐ!TVVgw rvkm¨R PO}V8nwWW :]0h}s1XSZ$ʑhu )JFJ Gf̋(8vG T@IRtzz~JJ>d2rW_ԩS#G!*=lgGN;rDyy9F r#a;=(a?ZT+UXv-[n);~jV v @^c}%"-Ö8KޥwPDGXMQ{JOZk-Y/f^s h"Ob{D>bva+kFgL<}}b}e@K[?ܜ>Isc&OnB$'O6؈N2( {H-,[o%ˑEcGLY~%b1jhg3o_>6o̞=VR'XSS}'FLNvc\H{e^gQ]};vk6䫿M-b͋/KkYfquW'd:Da4F/ Y/.7W.qP8z䘘}%b.pٲm'?/=(-; jW #vn,F.J~ܼt͛?#w.D8$j*+ħKDU=#~{oӫWٗ^ Wqm/^=ў>c_\ﻏ g#2G9Z]_d =~n3L`IV.wBbYz祪 I4d`ӦMv'p"i-wpVu/c|CX,F !edYjt2-H&C"zZ+}O:~! mN~,GK,aɒ%fcX6ZOA @`00XVRlG چuZSgrnﱓ$ фh.If~?>_7e !#AƑCGȑ#tBȢ^%޶(J"7rz$I`r p66wo 9tgT +{^(?t l6sьxt)$]*: 2i)vdYq$I#oUA9bپm;k^xNjj*1&{|\gV?ZZYq(W\=9 NjĂuGEkShsz*n}"ҲbhaX_E(ٽO\pA"1@-qZTV dλ!"J8(?1}4s.6/>q!bӖwE&:$F /DL:YX^ӟ~΄F(jWV#GFEl32lظ^lܸLj"_{ZQ`DBVh"^{5A= :Ьt!;]l8pٻ:Hܵp2h4.\H^^V8Ѧ-G}T|f_:kТS+tdo3&QYUɪAq^ŽVZ7x9s栊Qt9.]ʤ'~%ּ+VW1~8FE=3qz׏Fxn*5 }_D[rurSn-L;7t/XgEbha6;_"_@ /f_zxg[ &O AC3_KQW1ι{EIY%YeK!۱pq #p#lH` H ;6| %˔ N%=3;;QGWyGY[ꪯW_] X]]ūxi++Fr3)Q^:AWnB0s~B&Tݢ9 03#`uu333`fPTFwx;g: *8~z&]~]։P}B0s@" &&HTGGGի(J($HEQ8$It|ş4Ǖst@D?e>D/zW;t/..b~~DKFwjGQDIMD'InjҰ <B=ysDBkՎB_b⢐R~ZR I[Nq[s^Kq8n)!!y, y|7v=FD}/>‚{xxJf4FGG3kUV7u. ̵n3ov\sJ~s.D$Hf(E Rþ0=ObM@u[abjjCiN>3@j J*N)%FfzFzZ<AyW U,?=99 tc3.G[ SW8|GXIXUUz|0 ."O.,,|txx# X^^\ǼO vߩT*@;gϞU5(Ppxx]!IA !0<3K.yR*nɐchhT*&* GQDq %IkҥKIDg{W=+PǨj͛7E ^Z(^xp5\|@*^^1cM144Yw}8wEQjz\~hmnn˗/caaS};Yecee* qLIrpp0wppCCC|5axucywn^Q_q אg||W\EQjժW͛!W<oH-Gv֔N:V{ju35l)LܡGuBj5R3/...m~~फ" $h1Dp Tq9fixK\ظ*0S@_Z T=,TJ pJLZ`!pwٳH:;אָX^^(=G0Āl"1N*X0%Qa2sd0\[[V[-%od6y2 x"3cn6^\a=6L^ _J2wK.!Iloo3_2ߞz/aV6iL`ύa6\9 ]sl=1`U^e2"s2BT°KS'7y |uĭ?G3 fff(c~E?h4ڦѲ<f0(3PPwi&@e9NQ uAJ1V ;cر10.1i)"+hhBuZMS}-C:2L_B%;C,x E[VCvvv?{…NbfgL&10gjdq׈̦7JEL{S+1t !)5jARh;Q]#]t=Ƥr &wH3e#I5<3?cΦ&<\ph4o4oZ,"KN @JdEVZV F(@BP?H`s1*ܖN)s%cYl1K| "dv&@h$<2{/ymmjΉ$DCw]~/.\pF3랴Fzt!偈]̹JV5 #vE\f& Kq hI,*!urvkF q ArpuH䭏b?;cV0!FGG188h(FF[8D)mg폣Q=2 !0<i!P{رb;yq|Vï/1D*JmH)ߑ$eZw4Ds;p&õʗ\y y iKһvxaLBgC X¤Ɣ`P@ H :"YC@k˒ӱd ETB JAB6CD\EH.ү:3e65N `o.< A6D}$I I\<$M/RDގ+ш+ڸYX7~. ]Yj|D@R{ ! a@Ř?;1NDj/ojب> 큅 `,QCa<8S@0+nHd5Wʳ؉VP gM0&m xFIx۔eEAqmm͉W2#],|:V-U ьRMC3X-K->ځ@)PaCq ߏXFXWФOe(9A@E qi͸4 1` FX{VO›Z:Sg"v?{G%) (J3?9kg7偷`zꪵ1]n5y(D t"c?;ߊKo@O_K//\}CWW'-Ep wߊ{߁pmt9kWq<э=|wIs'|'2c &nҹR^ߓבX*( Hm^ \gV㙂Wƕ?$Qk~ #[w 5G1^6>? $jS¸b0n/úהX,"C"L ދ7c8t{tKlyׇ[rڽ;z4'\*&BCtQAw/^je&M~+Q0}iQ [0۴f\c5FAT^YShdx$0^Δf0^͐$ݴ`oz?}XF78~Ąul7z k9fID풐Rvw"\l (RHc#hk2 lK&8HRD*!<43+L'1 "TNI4`o|?. j"$R",^}&W̰.xN` &GwBӀiD>dCmB`+"W׳DeJځ 3^=ϓRaRʲ~$qܵG~au}7 5qlIN h9+@%1/8y" \ę~ (s ʄ*$(F'#<0罥\.HJ~@{i)lRٴ3͋șPI0#mat!"9 ^3(x_=ʜ%U믹 ˃dmԁ⎑7;vOZluI[ H̅#ѫ|ӍFee"*(ZR{q? qʥH=Aj\|M ,.- ,]12HpDdgV}dW])EoH%B,X~+էPwPJdQ`(b {(ܪ/7?[%I CV} _=Oqq]̌jO6/ RC5zΩK?AyD3q,|[kDl_$\▁wMOirY0sB% ¦pdEDwi:z\SíJ=4IZ'?.ʋp6Ax_.0 b$)K>fe] 8h647`֦eyO[(2 B~Ee;Q}e2]}j ؋/i;igd;V Y%}uG@X%H9 C4=g[ķqUCreCfTn>jKj- VX6\F,݅jl>0g % aRV."D >Ew=Rv/ vT0UTm( iܥtM(5&Rͤ ]CpȬv FSs>®55rz Umʵ 3#o)e*t駋R@>EitOw>ĩ%bo@}wcYo]% ց>6=r,wÉIrttɩ%pI8L ]6-p!Rad)!x9t&у!Lfo i1v0/iBǰw͔S ApIbH eغ0p ào+N:"M~miX%[Зd+*XCͯ06[#\N(`k ezC +ՐL^Y8 CQ9NpW5xmo ȦYs&~CNd'&|O VJ"G`g6ݑdlN2uO.`$܄+426T"Ԣ4JF& 1? Hq`d!m vP%6Գ"'6 )TfS#HfHq{ _q&޽#4e-8-,u؎jlWQ 0-]屇ь2ͩ$"RjSR̞)20S,IL"Xҁ@NBy»0Fu<{Mq*!o{$ :0V22"bb,)xp(bIzwn z +MI(%)YZvuq W$)q|FA,JOE%BPPMvԔNFDDDBP$h6{Bl08R0 (m1%uܪ,.S &  $2q XC5k eP!Rc1 IaVdtZ?;I4q,偷`8{Hqo!n99iU!DS)%:FAjkqz#ϼIcw*ۦBz\pu(1f݋A&> - cm( "OC v5H59NLQ0&=y S%M e[jElUWq4ގꆞ .[/}xB9F) 8]ÚsrWzM|N@ f[ (y>;NL^Ae5! vv?Ʃ,Q$x33jkg]09p *AVŬ AL&e\} _m7FJ?/`uYԓ}HJ2!?79"-pvϝp d1a/C,Ζ/li`[6][0"4 n6w^)!8惃v02^w] ukRX"`N?Sf5ugVO^BuO&z0_<1^J1" S}&`=w(ns/, 3U:-oc,V~ 17z{"h37O4D}. Cuu5Tw%G(0LZI"|}1|_Vu^F'%=3@s~mᛷt6Ҙ9sfcggUٺ}WOT,[0-θ@ ;O#xrD0_Mkm}'%DƤ/9A=kznPjAs`uuH)\,|ppeV2 ̏<_[~ zzUn&oS/O<bv~a^>֗ 53/}?H`H$TY[ᷰT D҈|pS[*ifff滋 mmm0h_AC@qas^, VQ0q<;<1Z?>9lI)5R !qB-wB4Ns؇Y{OD30nc˨"i3&36JXYY,0';hssr~Y-ӈ:8()6ج, (Prg-Oѵ;ш+d];yӮvL`۔54:nVy ɤ ^m @~ٙ4ǩPP+SSS[ZZ )<44Dϟ*=c<8~0߽e#m)ӏk[pAgoli±A+ήr*!e; wYF-a[|@_S+2 :SM%ê2ax8uҜ?똚ŋ?W$) v6`1ZGg~E[0#Z+AB#x3]8,El0즜@|J#rR#p[FLjhg[4;&k Vm>\b7b BXDǴfg_; M~QHDxl213Ixdn,Q,eZ/7oޜϫ*011akL Ȁ<;pPo!XWI[9s.Pʻ@NZ5+q(k@>11rd7\jS}>I̛O]4077%e̼VU^[[#fƅ rSp؛13\o\y8aa ֳVg{̔Z q\B8@]p3CKLEoK7H${ߊESJ' 4/--arr2Z__""fz̘IGiG` Gk^7籶=4.ESBXױSJ %̎7ѿDhVTK,qҋ2sxӅà?~"tlVVCE<>>N_i"s)P)fuB(9("T`8ijC(G'p X^^fz}hPP [ɼǽcG_R.(k׮:7͖iڝi ⸄酗4v.188x+ܸqxww͛(*N/ۘ`ffkkky&&&&*WõZqqT"O}*W177T*]z=<ccc<::JR 9{j9lܹscDQ6ahhCCC(( 쫾U\oxxjCq7G8~WET*eJ( :v2_Fa:77$'֦08h6j5xBbbRDA7z='DT=^avv<gu(&? |4Ij6z= "!aH@~> WB`@ݑIϿ2cmm>ce:EѼrJJyfnOee˜%)eAJ0s PDzZ"rzm:M^m҄H}6UoNOOW;fpƍ͛7{BDW=o^#Ll8_,IENDB`aqemu-0.9.2/resources/os_icons/netbsd.png000066400000000000000000000256251272330227200204570ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  :5btEXtCommentCreated with The GIMPd%n IDATx}yxՕVUW7[bKnf $Lf&3xdBސf0qX2 lwvZVսߒJ-F}]˽ιs) E)JQR(E)JQR(E)JQR}Dc11)&],:ڙVB@eIH"ꐝf20zJY@@ ߙGG3pܴ]mwGsEHaRvhW)6QBvM֚Dgh @3#%Z{8(sM@D|Ыca|47f7?ݣXÿtb ך<ihTdz?xSGS*3<}wWzz( 6`ȔNF@c;ڸNktH:䶄N4PD3h1Dt9<2aDB'0>#b>~$Ѹ*`'V|](P˫09d#NeEjZݐaCj hv׼]LV珕#{cY ?ܳ-"7e^&PBְ!5)N/os,ʑ钯ȧd#M;i$LPPFv}zA;~Z&}u]kR?յ|-F+S5 ,şa3((۲S}{oDz?HyyynElnnnzo.0}r/r>GhLL$*IF]N)ӥ=uҟ~v'$g@֬Y㜜ctƍioC0CQɨҞ=h}{!-l0A'"WK 9>Ƕ+PɓKeYCO= _B\~>0DҢwnooutG1} !",Ow$z{{̼/77wɓ?x.ſģPϘd:N:텊Dkew5 %jD+t/M @+Fuk܇g!IL9qŋ~kvv3f{-Xcy_vƗI槏E"p#HdБo}'|>_[AAo߾T}|9ǓTtsy'R#~M\ʫgC :>AgAھ/TUtk./vƻQx2*=ppٟFj;#F`ЙU|s_$:ѕwNF sݻp7mzBΝL8}hcqějQavN1 HUUU… lqvݫz۾uulӾxƓo(]`| \5}%@*((̼A^~]hXX' մ21 \1R0ŋR%[UU$I5>{pQ\E] I[_7vlcE>xRշ m\-ӯvA]{{GaiuCZl7E4> c PSSӼpeYNSUեjސlM_']`Yا}s=mX?}|O ѬS$c|EMeg9]QRRB~ ߿]͑oLfYq5B;=G7VjCkf37|]oEӱs8gΜeY(b퉚Ƒt-a(NK^C$ukF/$*Kї*b5G:5UkJ{go^AՏ9m|wyC?D"H$҄aQ?)Y΢tW~sdv0CDA 5Y隣]z_K~9 C7N=ٰe7&~.80,,,p7P%9֭[_Ҩps x89x~3N1Q"> T||q3'|\1Zccc{ww999k`ڴiرcG( J!6~0^ۯI*2e%b SL]$Ue%'N(j]䇙hG峍%fEitvvj.k嗗bœJέۭ9I"-Yc%%%BIk+//?!0?ai1R_l]Q fϞ=pZh8a)`)fIicMEEEwB$IddٽYךbheS𡉏-]#$  T)C P/|E^'? /<`?&I(tƘfIBY%)0螃n㏻0|.--B ,I2BDbW[[?֭n/:!BHoDq c`u0Zu]Gvmٲ< 1m.W>ba  vq?\ B3%7xCeO@ӣEIn2(,,]TT4̨ s$WC:YGaHB.B(JˤREQ.^r% e˖khh~?>EZX0^oANN6-+.W%{z'&r,^ft"--N>x(zeΝϕuXkD  mAcWyig&90}NF:,XNʺB_ͫCOד s5n:w,`"aK/tY^^-H$0 GSSSšCP}!I_ עE,_iUUgX{q_VWW7:/ƍ2d/ҽ---aw߭`ynSS6lx1^Iǣ~߼/++k1Hc=]wuk^^ íO=oC'771cƌI%%%K.$1DV #؆ 6 L9O`h}!F9X~]Pfg`y2ΐlo'FHp0\*#]xU u?I<Ԟ03c²."8dP]]]oYYY'*++š QH'NK'mݺ1`}}}G9ùsIE-:th\!w kX~X:8h"5k\ݞNQ?C1}MMMp8k?x]g^Yfͭ?DtRD ##y½eK p P֘l\Mp[@4=o겊 g4QJi565Q`֭D"zٗxHB֊紶0F64nǎfQYU1ǯ sǬ 'W?䓏4+nc+jKB$ 0'gQc_m>Y0IaMLɁlIg)oPA5@\2$D9(8a'ʲR\\;/^Hɱ_3P}lSU#G5 ~GM>0T`jওj~lٲ噆{Y7pOLJjSZ"`=W:eTeyt/F&`h| [  Ln/l[w6'vߟNFUr}nF DlaU&;nsiJWUuOl0ʼn.}ݵ{s1 0Q;i@[ybXƍlHi@X$ˀ.4Z߷cT\`S@Slj0-:*sOUҌ 2* @l ӿi>9Y!˲1 rCpGӴa+ kBK>{xӦMOj@3;, )kg,X&,0P ݡ#T"Z 'cv]e* H9V5??FltD03ǖ6%v[O444Z14eʔiַn|=.&𾇸6p i8ͬ @ݻ_d %222r> ҨzyT[wŎȲqsHw͚\+N; M-pFCCONs*1C&_HH4\oسgOlRZG:M$z Vh;ee<~$U.͢K*olO.=t3xxIԫ |]+_q ~uf6+_`WmY} $>wo'wtښ]6c~/'8OHRq^zu%%%Mv:ފ|L~ogvvWGK۽K.ytv{ O |szUN :cd_ 1_kξ a Mp*óɠ>_#r}o3+L%N]7xR`W; ӎz>D3iTxW644TXTTdL6mJaa1cFԩS?~|-[ :D:ׯ_իWוfF(˲{޼yF?mn ItUH$(삱>jI*!׽up2Kꁙfy.0.1II<{:~-%XP.YZϼr"졫 &(v.P00RwA 17lDeeeo4`P?rH`ƍo??i0N5k7p-\ 5=3?ڥ> ŋ$==}67L1t>b_9t^DLl*j$Yb~]7< -+++D~8~e`$L(W݂ͬ@I*GS~{mu0'NxԩSVTT|dNs~_(((rʛ&P+_֟'`ui@~'f ޽ъ+/s ]AV}[U&q~B"]P":stzuXk`d4KV;x w󯲄3g^_QQъs35`/z꩚իW}Μ9̜pLdi&,IK555Xhrwi򨆆]Yi{km<rBZ7l jk4c:Uixt "Ӝ3N]o0nMP$2Ў7|GY*ϰl5M3K|jZ)IҢajNiyyy6îI(*̹߳^>eC2s%L-@ NI z:NMpqt]xsOTU#ȵP--[*- ɲ^|\?RZZPUUbָ!Xv('PI-].#I1ݺudYǏܹF8#D%emHP&(gñО7ʆy] hb$8eqfn;nZa7Naȅ$'ǭxvdY5:vŊ stյֶuM:˗ IDATZg3433J>h4GUsFDn7%v~`|Ev]Ul&믿~X2vA.dÖwM,rH+MEH$ Τcݺu7l[Ȣm۶]pf0(7xe۶mk   s,SbX|fT+_tt@E-%_IHKIZM+bn !$kvݜB =-^/h-ק:78t}Xڽ14jR&lDO'uatyWR<⺖1hK)mSU5W4:|pH);R<75leUne8b[_YY rrr^w>!6Ji4m$M$YQBI-n;4% 7:8㫹]%q­LO,!dff jPeMVA_lPpZ7fܢͼ~o+O9dE/S 髮+V4r~ԻF}EgM\b!QxM.Eެ?;#F㹈13$J)u]2 CeY*a] 4ۻ*++;>h"VzܸqW|ɒ4b\񚚚z뭺X,/]4㢋.31Iu0 ;cNQNJN !BtXhѣǏO~zQX6>1' 3 kۖ ~ .rngNi;j"~?/yYۧy&w;be暼Kxv7y>).M%ס.æXN+m9Z2Q  K4*dpU/v:'L0%333vpvƦ&뱌ɣB֎$p: Ip8Hمb,]}DP>Lx {8z]f\<>U0-l"{y'B!,#۩sMщB\?7`2 } ./M!~ůC0(ocW㫈ttb$r.eWԚ5G|bY.ɐVe.9yˑhvU,37b0N\ffIiLg&0XHB0chd/60LL&.1Ԋ_5 *0XTtXO|t{[È fzb$$bъ%SẎ g:1XGE,V2L̜MjR\Z+^,Ŭ\O0Td$KficLS$ yЩ[~*dq"Yw2ף5R ߛ[EGz8nrLR1%,ˣ5d 6& gr ֮]ji2%] r:ΰ}>8ř?1gp' v Se(O^y׾objhc{ !p8Z1<}#i -D"[XxĴelJ 1dffv(2tzhY8Ee @x㍝HdX%KVB148DR`iiܸqkKHSSSs;- qSM6Fyϟ?Y 0Ii1(..Ӈ$zv'DCCCeE@S`h@^{-ZO3grEQxMR`a4i.WU.2•4Ƙؼy ZO;wWxL2c2e.PElRMMM曩Sm۶=z3g.u\Es>i@8ӧOtK,Zt:ժJ DҌ;@tǎOPJ>}"SfKcut!ˊqTTTT`sK ҆I&)&@ZZZnyyyy, Mi)1 Yf Nqwy-p'_O\TTt1iii9555p uܹsg)C,cI<Šl0 8Gܤo@IIL?C˿ ~{o$1L5ʲv 0XWHR;Dglh֎8N յǜ8LKKkw:c~ر?)Akn7!)c|T>I`A7NWJ}c'Nwr`p"H+{d> >+}5c8H,X!VN0ʻwS{@a-(E)JQR(E)JQR(E)JQR2=ã!#IENDB`aqemu-0.9.2/resources/os_icons/novell.png000066400000000000000000000014371272330227200204720ustar00rootroot00000000000000PNG  IHDRabwLM?`PLTEU[GM*2qv8?ci$#Pj pHYsHHFk> vpAgabhIDAThY0 EQϙimЁ@xxk-rʷ İTX`C3~Z ~$Pl$ʅVBh֮uhR( D@x7TWh6 B*BqA:BG(# %DP@ dώwpZ~4{m!_%0A[&NE]  @7B S1*ȄG "Yv2CA"(A$vsO`/JNnH8 kAlB&RHQ$P %ȑ |ڂ\PFt 샶 &a 'u![#@Q[ D' Hᘀ V8*Z&> |žPvo Nx':;/v60x !Yj1x`6M 'l*#@xfl߿r|%;.&--t_⹞[P'LfPF_*i()%tEXtcreate-date2009-09-18T22:37:36+04:00%tEXtmodify-date2007-10-10T02:15:41+04:00<%yIENDB`aqemu-0.9.2/resources/os_icons/openbsd.png000066400000000000000000000057571272330227200206360ustar00rootroot00000000000000PNG  IHDR@@PLTE      " %(&!$$),% $%#*&-(3+9++,00--.,:2222:375'H4 26?:7!C6981C9999@: J: N9H@ B@4F@*M@L@BA:FB&AA?BAFOE TG]EOH'HJLYL!SP.SP4aNPPH[Q+bQ-UT5{1H@H2/WRMK=FTN@H?NV^XQ^We˪KzcZ_̱Si\˴IֲQdȸY̸aξXſqټY˿mٽafɾӿgbOWoMȂ`o`jW\nbi}uovpklk[iov~dw݁lpw}jvd~~{nhzv{s}x~jTPotRNS@fbKGDH pHYs  ~IDATXW}XS>1C@TP`C7NdUuD@G؊bDM:nA@BP6Xð  a!3`O 97G#(<=w~_5w%xM@7G7lLA18dހ\ ,4X:soζ7AcvH '$DžΥNAeh@6,*Óט&u(nkg%H^n\kMMy~'z8Uc֘->kZ~mmM~>owww1'LFY@=*W{:˲܄ɯD} LSZiJ'UdYAk~ W%c)cK~>YK9hE0J%SQ.D, 3/.hK2#&%`"8Yr̛ߛCFPǸIK;{pup6q%f?֭鼘1 j?- rfLT:@骓14b_oKS;zێI'hqj:T~CK5z[y+B4AꖩW=+O:2,֒Z1o.g#vDёB=qN,' -f_!P1H#Ĕi3|;N"GU\bŬ 73 ChUIs^'NN!#B /1B}2 ƨ]a? wyku: 0ƗE1? A 5goN>ÁtH)|S2L*" U*Hr%3o{;bmgKI2ȘV̂q~!U?8sm0d;msl8|zM_*ĴoX(Z *YFV5އ\HIpZ_vvT,>R_?"Y92 {$p8оkEg&[U| $~Lk(.eC Y 1cƢ "ݱ6ҝ&JO ҵ @J1!H1znӧ3zGڠn0$݅ 8 caa,[!Hn=kg RwCh>(L?h6$}Q2H d\[%Yo@'mh*ZS#=L 2VS$ B}dKw^/Oz[O9{dl)DBkmk˛* l=_=SӭV> .u5[{bٞ(4j/x>YTť/9V Kqd< |˰89$!u$O&6-=Ȯ9_Q'Ғ5m| b-(r{cAV)﵋͛'-^"lvR~YcH6y4u.jɤٞڲJ6j"^,xl5ݻHssGKuU6 ?C>X\077/?p턄;# 3z0*4$v*u\pU<_Gꊏy:R?Ik`V^B;asRGBbKGD pHYs  tIME f! IDATx^{|UIRL ܋$@x!AY/4 u]wf&LB@!3i۪"ri M&3Iy&3ݾ_WyNGt^+WO|̾$̪>xDضhWSI&zBq۵AqvEgD*B2{ FW#Qd.y# EG!ÞlhtfZ쒇/@vӎXqx/TDouQs"mEH0_8|`$d1đ?IEKZT|b$uiZG"NZLOݿ7/t7B wQ32JQqb" D^}\W ff#p^h|bc6EJLJ5 ŌJ0L(|h 0HBXqL9s@7:w85Mu W׶4^0HvD;_+'j`?3|õE=+B+@HdYSeM)&1df &q%>ֲ7g~I&zuzn7P}g4<@2{ķln.:cyVZ/SQc)-8-OnrN> |e8)3&f77ȦK&;Ke)ڢmN&zGzOu?495-5/~4y #ooL߂իW 4>i&;KҔej :cV1zH 4i>[ZïI!þxˍE&dlGs`!VtL3k1\%XI~x=2k'':ER{t nߔ^ q`p░G. i_/,/&n|>tP}w>}*'נ?[Ze)|oi_SCZW5 ;gW0jcxIĊɫBYo7/q afmٵ;&?XS@?&1Lxɕ/IYs28󘠿x ,=GHfg|ȰR SodF@ۼJ^3|G)U;4Շ0ٽ2qȐ+X8>^U^B/<%Piʪfcicם)"lBA5,O D&|kRʪl_>rl˜Caa:2"xa_50KxbH6BrTK6{^hd2%Db94eU'fVfqxA ag/-! dwXx<ÆatD;4eUs?Z/ W ̟m-(#yW-6[؛Hz{ &so 9)JteUٱMfHO54zLU-|p_bC5uOd/%2P==u"b.,2..j ^rt| {n0c6cr{ݰ2= ה>@0X}ՈMp4.qMh9 *0d{DA|Zy_gq%T$zU~x5p%cvI| Y0zI[rlI^8 ńPUnq~954z|I6p E2 Mm43cM䆇+Yw&.Էc5J R%T _0tߑٿ54@ZVb*P63Kb/je)f50=]J=$vlv/0 .< R/ԅSL8Jr.1 0݇'~]h5㙕C}0ݛ";.X/Y3? ) Pb Ϯ`sj3q&̦YO>p˓+3 Uɂ NuHf"`%*5~L]$~8u;' cNp0u\E&m۾pϭdz.&oSH`8{d7V4wzvW9e_-tW0H ڌM8ܣH }O }8_ʢ RuQO~ tf6ZK':%#A%-6l X)Yv©/6W+4x|- tO165zа7sxf)"WS.c. ,`6 ay/cݴ}lI J6`JXgr@SH#Dûӣu/>&Iatlλ ma̟zבP6SNlٖO,Yz%[6|.hqyؙL\vx鶜hyPƛoylI85ҕ[Fm9]?S@>DLκx](sGSaeڊ, ؒn.7xLyC^EZ@3>x3ntѕ*y!Atv`oX Fp9 QTE摴W&3ipflhSdE ߚdX}U]rp e4pcC]%YǻO8zB8#I)Iې쌞憷X ?zgseconpwQQMɘ-^g/y|jc 1n4plhHYs~8t[ϴ-CΜ US~5g5) Lo P;ĒQ YPj%KO~.JXW<@'en9fǦ/#90_f=!0ī/ O:\̶iutiOgYI~]ͥJ<9ǂTnk}<^|y*PJ=j쵇]NKڏ74oW%@oggu{}Fܞsl.W<+;n{.qoO ךLĂa/I1Ԣ;q _Jy>m8H3nammm ]ߩҨWML!鶇?5{A~&`XOJX {p|%k>nϳïVd7 Z3دsYT]UܞgJڐ ~W^EkVhʬ&Ro9w?)K|^I*u _Ȍw0;rchf+PmmyoX0%t+E-]|I3..eU{QzM<\d6 t\x#|hhp83;8*x^ɤہ GVVJ9y"S˴-<|7yz!X%8(r&|-w|o鶼[w%{(,46J 䎉GLZ#5h v.r=뎺n6_O-+0ČMhA0zᰓ*pnК<L l +%htLǔɪv]-w*e8rfpx+ƕeό/;s~2;[f/n.b'ntTCkx6sКws,hv_KN$)5PPd5}#yi%:P; z1>ko#!k,{] 9+{\b0`^+d Vt{i0L_Q"x2†-";V7n?vVg3otN)!v8܌ǡ:e ]5Иܹ#n0 D˴="ўW ;*` p_du`;& mnv6I>X#]5zvg4i3%}3Xo!hV)j32Bg[G"7]8ȹ%P yU](6c#>M ۧ#mK6G.}mcp DTgY|diCl)ƇSk3(^prgN ؎8b Y(5c,|S@YfY]7R Mt{*IQjRcF L[8&\z.Y4 KpZ3(7rp ~X ,` K}Bx隦u6TlB;&kmJ4(5jsGٿ"08Gp(,&pWFzrמ_:2il4WkT[ML\l$m$@wSeV;nTpЦG''0W r #2#Y t 6juރO_` u$@]@=|bEQ`Np÷"п[mcKe?']C7KD߷.kz^Y.M4sOZU2fր-z_G4 >%ϋyq,.f\:(9w>uoM?U,X%WLG:o`"ߒDHk$쵉X2TDe$ao.z!/Ry]ClhӕyxsdZ#>/M ^5Q¾Tc_~]d%S- gio[Îyc@;JOӸw 4Z)/{T]=乃9w.ð kNĐXSQxu{U'G>l x{t)|ϕQnfb&˻}7V%uPc0q 5MCn}㯁*;O3ULD'pM û0?%({iM玄XsM 7?f68aޙM^Ë&kؒ] hLo WXf3f]pRq>K‹ OcU^(4_%?= H,;&<'t;}TuiYOswE *֪E׺Q$LvcVj`dv|UBj)zcNOZ?Mg-i+Ƨ G[3(%FozbMǂ;C t-Oze/{^UBĥ-IENDB`aqemu-0.9.2/resources/os_icons/pclinuxos.png000066400000000000000000000234621272330227200212210ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME ):4 IDATx^y|gf~oa_ DA jKZ}KW}Wj}[W[[j+n(TE@A0BBHrי9?k;7$a|y3gs9z衇o/.QJ`@w!0(| p Ā0e( b>d@ź7ĐQ% AAQ /3 ! FDMTU|EUE9;(ݸ_lkȸ4OjT`20`12T 0X&ȿg}W*z$둒Hwȧo>k+  ?̸&fqyl[|bX.(i5`E\=BlZ|F,Zu%'PNyoqg]$DB(EIF $5@$4M!ZUr_~+6.vשcu}.|FCB 4 h=c4Jkv 6Gz 7x ٻVDsQNH,KE\>)}?f,,8?Ӆ4M8i#T&jbڷrHc:F$Du8q3q 7AZ[*{w˗[qF7txgTS%G8_BMvq@Xh=x-E\LM'"p0|ʐ7j h\~l[.fN5?&}DWaĢA4:L8~rb~FްX4k` pM `^V}Wm~GxG:t 5ɦ ,v]-:t`Yc:UmU_g PetxA(*5?Lݪ'zߡ*.H`c֬|#-~2b~Mt]o yЉaj`?zQvUא9g$c#4t -#~9cQ3 +˄E?Oa-C_ewܣx2ʇPT EJ4Qx>zu54}*8mRJhyehSױIHD9"arcI$`-lƷwp:͗)4q*"뤱r,'$4WK9F!%Kn&kc)7qͲ-ߤ:SDӺX8Q8?uBe&ݓQB[:T5}&osBq^ .`Ji@!l΂I' ka{h=|fPl:!^El-b /s6a)=avb;E4%B0x,N*N'4:(NKwμAe.ծڝO8{R7@7SKbFCviu 3-{t$+$SmgSN@ )6"D-'6I.2dkw!)i,Q2W*m;5.,~ôlD*7Ѹ ǰ"٭j vMLӥm$CwX3To=B2egrH嵭c1cM4}XhN~(N_pJt23N҈"R1cmo5[V"%-=I=;(7OCkfop0KWkiB7 cM(?H+>;kЀ=5`F6n#ԗICӪ:>h%6\م`Ē ApwM^j}IXC#@&ߕQ`=ݶbдlC:5/E'oBmaZÈ6Hi=zBHf4nD5''>k? ӓG0]S%T@ϟ )yPBQf4xv222|hlmwi7ihND0(v3zBd_y09spgY`{v}ɣ(Hk&V"xs Zil\ N߾}1[m(M6NgĉEMM | 1YYY${.YPg}6RJ^/?я뮻 w4iG&++`0Ȏ;X|9MMmWL6"Gee%֭}N7z~, `˗cm[Ypڴi̘18RX,ҥKy[۷/W]u躎iH)QYf (**?iuv r!@Q4;aL:/ǃaI&_~]= eիW?u" x I8ZVY.oҦ葯-WUUNg&TZmP\|ݛ?s=p84 UUIlmx^8bٲe\|ńa-Z2lw3{l GnEAJ,ٳg3n8f͚E],7M3M0=X*8PnV ' 00`5ǃ԰pBTU/l̙3~z׋O<[oEmm-pg*z=,YҥKٜ4墺{s:t(7x#`EQ(//gѢEl۶;fϞMqq1wy'p7r5pw3n8L$ rWS^޲Q{2n8EfѢE=MxWX`A2=É'i\2{^B'6hhh`…9CpYgcѷo_^/'|۷'TWWfBfRj}{1"-=xp-'f„ \.<555^R&$4MrD{ӧ'󚛛ҥKmHKTSwu@UU9묳2d]t3grQQQѣݼysR L'++ H7O:H=j d"nqiw8xޤs8\}I(++c555:?!myX,F$AӴ䵄ɿ^/Æ _{ۍqHr%'aqddd{p$@ ֭m'9^qƱi&^/ndzdlSO=ܹsl3-mx)406 Z7N'>X,Ɛ!Cx饗 ?R z(¾}o0jRinfx3gkZW{9F #Zvyt\ϟy=\&MDII /"999nN>#|>kCCmQ]]M 4MN'}e…̙3&L`%KZq- k{+~!OlgkaرuI(n EQB$\k.K 2|>4xd͹馛Xf  O?mp:hm"(np8L,Oo3Ϥw&{<#,_EzD' y-(E^eW,|>@>}ЧOUUU{L8wy)%pχaС)[|IŶJ楹|UUZ&_|OF 3>mhoA?4͛73fCJɶmۘ8q"RJƌC޽ٵS &O)L4zO~( zjx?'( irmFTWWӷo_LB[\uUɪ0 @uꨫ;.ǏG4 k"mūp ]6HSn/%Od%nC=ihFff&~aO9ui"N9'u_45)YM7SRR<ŋVw˖-8x-kia }:ӧOoqH38O> 9]XXܹs/geݺu4G("<u*`!TWWW'x;w${z,]49I?+2Beee+eeeٳRuFvMiiiN8'vZ&LJii)۷oON)r-RQQM7ݔ[r%wy'TVV z̟? UAmm-wFN~7|nV>dDJKK?>i[B ]X#9q8H7_|"e ~s|NEh׀ar{ `O4Von C4R4LE wl4ӊy͆uGBbch9\T'v)'3[ lc:Ϡe~sq?BRPd巙~hބ[pCΒyvAz8Dxr 0S i$NZ] - `;RX,*KR8@u0:rXD݂R(l@J| qO%1ÎU)A<4H٢ĢM ;~q@Cq]Aqy XG_\;yfD8ܶBшE"Ѱ $_lm6ΑtNt8\1=tcf;xiMJd !TBR)%Cڟj+:V cmx~&)5'H-BS8D[T4{=$i;6 T##jph@k!h]5aϚzh~igUe,y=tAe~"-lm'H.Rau/RT#& +z:2=tUEaGxu:U7lY .mׂDcpvꡫQ>|##jh>= )>o7RuHSH)gpIOc1f*%N"5'i6N=E>~C9mCP3r Nr=tB:6!\n>m%}z!{j' HΒ}#Zbۉ&)\h 0iz$΂x.!M )miWiϫ_2&&RsZjxGOEKc20;>o9ۍX pG{iHU/# :AΜ@IcyRi=GQ\~z=C[>D !b'*׏ QN>0m+Tx(eک6|5~`]=AiW-H)?~]t '_7c{v3Hׂ~yY}[5Cׯ}O64YT#B/~n=XŧX' 2G`)ICݱ#U b8"01R#AXvٖ)Vݜ4#ٺvgt;)DX9wj@S~=$n?Y߂\ؖq\ F$߂*3Xv `K0j1wzIVؕ/ n m&5{ _"։]&-|*$-GQޯP_OCR C+bUn.>)8W9MBJ$@1jwa;po3%늅V}nS Jp20c+X'cϰ>7ָEsxo%ŸMnGg2r"0˦ep %#_f:GLXtD nIDAT!w~@@ƥp4ʮhD?Si<Zm0UJc0HJxXݸ |q= 3WvXR6,MȦM(1?4*6_,|YR-$}eD9fzdz nܓ/}HiEks5VC~s:k[:3~+~+ A8?5"D 6AްHYBߴ"A*:nZ~mܹ5?F)ȦZH8Ɯ?B_+?oڶ.w^ZrμF [$Ecb?ގl:L Fm$ V2/MہtmffŸkr~I2P=-s&='kٹ./ޑW[lBg2gќӝ3SLV].:DJuDV`Ǩ܌D6BFx2\DF"o J(Ծ,G `݃ cbnS &wʐym#ZleǽzuY_C Y 4"lD R"dCB`ѿ_/610+̑ԫ:z K -l'[/ EJ(dO=!wy, 蠻:x6S{zw8p)ʧHFRVmX8^.>]yԦ_#wͅ7 X}\7swBu!NvEH!!ޓz k94۶pp<7+[ϐ)W G8r64v {%6 ;ɽ'Gj^8VeTIGl;!/Epr3eDgG Gb1&Ѐe< )&^*); EC6E"|kV8GB` Q0ѷX{ZԳS:ϥX'dTOj[# ,4"2Y3a k9RyTA%)B:TmXw|h45j69 7dd"yɲDۄDSE=Pwvn#Z#̧3^3.vB(ƣH4p%֡m&cG|C@kT 5jz?A );݈x)ҷ/IENDB`aqemu-0.9.2/resources/os_icons/puppy.png000066400000000000000000000464451272330227200203600ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME $ ^ IDATx^w]U.k4RI H;;Hă8zP=zADQP+JHB{F5;;>wg>k9x߯o9C!?NضN\n]:L&hR[f zc`>0T$-׆jH=f`-Ϧ,$a3'rLݯ˕~ ! }ZTh m=ChD{ɚThtD(r7;xnݐyHރ~InYr6Q6m촅:"^V r\.OjlHLFEK1clÄ ^9s-Z4u:::&ya۶ cjVT*C6lW(eAkŊ3V=!Zkzv֕hK|[o!? `kƘroʔ)k_?.5kV PJIZ )e_q}ƍ^zwy[?t+Ou:SJkuZk.ZkZiZiTkR*6VZJ /xiSO=Q!m֮\.'Ţ?sRؚy$Ve\?Ep0BI,p? 1$> :^ۺg͚[z@kkz7GOK)8s!r&G.[ DhAPJqtJ):/VRqC).͏'N rW"$Z/2ZjYs"BĽ+V yGnA/_|c={$8`k#J{x˲Vvtt~M6}bsa 曛yM{o8V.8mb8{믿~ݗG.֢Z">Cj;x\k-œ- N<į!X.-ZT6JXC.ƵpT1폕R<"99q|ppqƚeY,nx:f@vpK:=ȷm7pwYgyTu;7ӅRJ- 89aEqEQqEPvҥK˖eu̳pa[dNZG_f[4^vp:@sMlRJnp9\Q.w4b7ǎ;>E'J)9"60iٰaCJqmvqXyVREI:8`c}{9s`2CJ!<8 080 0a^j<00P_|O?=TT_@k֯Xb($ZkVUu6~UFi!Ѝ1.\k͛7|~C22M@ 917a!}?}?.1mޏ㧐`1d{PBXhlʔ) ߇,r*2 qR0 HFQAGQAj^GJ%VPT,pժU݃ ,= /% hՙH~z \:F|!scxEB)}_=}}w%mS3< (^syZqXc}~ [C4I->0Ht@}w?gY4i"c,UN@Jq! }?aV jX,bR|P(|ƔGsN>ͭ\J#Mgf:)B9w"-(qsUW]u׌3s9 !bC9Q(1"A!VrGQ#k]ͶZ[xpiHn:pqǝ^4mڴ0cLD388C 0(0}?jA^*JP*ppp0 "muttl* aʢ7%cq䴩GZu` OR8}Z*s.vJ0 ٖaz>}UAt!O<眧q,0QAz.*T*\.(յJ)H)a۶Ѓu0l #0G}q7w̓D &ŀ zV*X,e˖`hh(b)ڶmضB>`ʆOӷlR&UbBi~rd?*2Y1? "z9 ""EHa((j.X@syB~!/ɏkV"c@J8g ,Ds,ke.s@ڔB&>,B44?VJ%(AT ްT*E0ij, eYm|޶ !`1 h>|< If12c2"cHO T*Oؔ]o{OEFt1/oevp]w(shLEa@w}(жm iaT$~FC?Zr9(JAX ޠX,rz˲Վh=q A.2 VhzW)%82/=FD0$͏X/ AZ&B}BA 0j587~RʶH`l k\q+h~0~EYkZPVJ -[Bc m"cLQuݪ?lѢEyrYnK)%gn&M7$)h 0 ᴝZkvG1VnECCCuU^y[oUT*B)5~R1Enl~HpM7zߠVRq#Bc_jJp`` ͏XP2J)ضMOL0a ZfM1 iX!/IRsDO|Td~jjj" CUJ#-RJ$9j |@&Mʾꫧ&'гsΥ֚g~PG(#Ik}_jԌS9zS%~۶μ#`,H2bҥK?9؆EwWZk2Xm6v\O~YrDr9{{{T$(ιRJ)Yqc1LPSkڤKJ5R'sqRkM&?3~?O{~qU@h)g}yHv'd')JJ) +h27 8B_ o!b&Lp=ϳ}׵ZMX1ɤfHbH)-۶RZ+qmk-̸J_l{Ke' !dliLlH !xM0^j581DLkhYE^Px'| ]vٕ;$ %2, Tm-Dugӎ0 jg1RZƥZuRf{+E#S垥_T* 0*"K10}!΍Z `[nݗU{72@wQ{``` c_j=y$7ɶmF@+0ln $"H`^Zϲכsl<ֽgy#k'soֹ|Փ&qYC>&_^Zk˲HŵN\g ^ CrxOX-[|aժU;" ,?OCG@Oj*$^gw &2yy]Z\DuJ.(p"Q0X6`1q4$97m;yASDlQ (U۶4~_^4wi‰'Fw}7xJ< Sp%ڮc<2M/]]]QTr/_~X\G3dy땅 .m}ߓR2eߎ@&!HT!}HBe"sa{y'NqSSODQyM;q,*NN Deʛ%hn Lsy]|wR)5T*~3$=i5ge0fj'!āʶm ?>xDQJ)5f6NMRj,K)HMm5$Rq)) I~_$j/)R9SDZj"QT8Cb6-SFMV%?~„ s=-[p˟9UCCC9:s9׿acB|`B8㔭І/iA)ΓR[d8egߑ${,]gm|>ӮD2GDQDA '7 Ð4??"J"i4358( C=IYk=fU5qXai9g+W<^_)S/2/}C18udxle WWUBfיL'<쳷k'`leYs̅ӦMҨ\.'s|f_~(&٣T*np՘O12D C(r80Zh@[[xrgd4{^{s8B d: rڵs,G !ӰdɌ ymmm+8),8t'45 (ٓ_ՄJ"'cuݴh۶aٲe}F @uQ;wP&@cLr9[Teqӟ 4acba$}zYY8Co8qbDZ]VsJ)!J2JJiqΝ8iӦM6/T*׮]r|hEfʤ̒n;0P?uY_/MdoVF9QLPJvn>m'-QrOsoٲe?}џ}c;Nfz,c<9mڴ:y. }$:Fw*6Ft:GqL" ~裏~1)ŒfO!Y- 11zʔ)[̙n!6)BZk[g}O:餵-(B%Tgu](3@蜈@@3M=Qո0ь5:Z2}tPO>G8> 뭷\)&R .? $_l)cYM6mre?f۶RZGvw~Mr] ;I~h@;d ,KˤiDoe 9s9{쵎Ʋ,5<<ydx 8-~6H{& |yez-[פ$T*WZ+v{eppRX" & #B1d,V^p%yL'StZZ3+5ԔcZk溮˹&@P8ԙ4wH9%_8lveuQO, :V=о+WƺX` xiWJ \*G@*JnV[RӮq900ud͚52ob8ʕ?~gd*BҫXհm;],ble"{+iRXD99ˀ62 !)w o IDAT96Ҝr^ߑٕЭ$sֿHR0})]Vǁ)ЦL)) 1Hͽ6 6cZJiۃ1vv]w0cF $=a,#/rOc 8wj٭-3-$IzsxoߖoC˗g p%HSb,ԛH֢Wjcb@6BX/yo6a„WD2;EY6n1` ! Z=2lMmY(~Яө\!օnniޘz>p e,Fcmy-;$~eMuYX>c)E"Їe0HGymaU~6ӟY!@dA4t ]k+',X% tvv>8uT7uL$cT>7MYI`_(91XrϩLTDz,%dGqħ09߸qtMF3tҺTr]WQrFڙ ȜKy^R(lιm[c Ui5%Z9Wh$c`|:@fv]?Ov6K\].'IL%/Μ9khJiRJM#`qqLf%Yn[Ȗ܃OMfm3d='m3CiJfvM8쿍d,d~vC, z>۔a4$3eHMV*x=o`8v̵:Xj{0`b(LJ erжms٦x'1SD q)CIp策.'NVDфΣ%րy˲ɓuu?SŃ(Z kOtA/C kT2iTZu]$R*٠G[)%-SԹI@8myTͭz6fԌٰM&OĐ`@1F kkk'Oz7lpxVb^#)rʯuQGn7jQ49I֤:3;H)y5(1XH=C^crd̽eY 3oK_Z'7̘BCrs>͢SͶ>68izjw/_8FCZ)_~&Zq{R<1mr(E´<9R0<7 )y3/"2Zge '2$mp9df@r9?{lذ NcdfϞ}K iLa|O 8)7u&I2)ՈE X.ӵZ-2K WV*q"G̥^BSޔB߬8@+k`&HZfG b@P{{;m_b===UՓ[1-eYK.䁾||X˦{ |(Ҡ2qkQe%hzLj,J)U(c2@:Zv eH@f-^7.`? LU4M|ZgUV2ҍ BlФMR@S1rDEf ׏P1 @XmKg&´!e髮xGu޻ꪓ8|HyYMQE9~_\--t1|>/ k֬[oY*Amv_ǾPc,4Oxq=cxx8OI*WQ3USCƒxfQ)({2h-kJ{-!Q3c ZKd⋿!m@.KG;rwL\}syzhh3 i|g N hg&)溮R"3۶8I7bGx,6_3A1âNٗ={q;n4`a~n}wttwEkbΘqJR-ӵN&N瞛o}իWO`,(eaZ۹\@P>n%c@!0Ai MҞ1)޼y#wbG{?e,Q۶8./_r%8%+^:ӗY=cF=ИpLe+Vqhh_{{{w]W !f뺖95X:Z9[Kk/YqH"9sf{+ޥE4~􇓯mvіeP(/?4o?9ߨV9MqC̲&^.]Js'1Xd~*^>|ضm1Ɯ~x6UkHE;h)\U^qإ^9s|n۾;8- =#k|8{+H`b)1cR:i .8-t~i-$ɶ~V\T.:f(2h"dԧy睯h>rw2C I/IW>c>v̽ߎP(o{*t$0sva,Bx$Xe͝;O}SGy)en1 MȞպ9a 3AR͚5rQGU,ROh\veFL1ze_,c !HyeY꫿EuDaڴi?c=^R2"9mZ{d3$=uTys{)\yy衇>`Zmi_!4u=?O$M]]]b``h2DR`@~K`54Yq͛+K҇l ›njts:t!sO\{O<~7GQD5؎(*Χzjc=0 s4lH˲Vs='A`I)cL !RMH >da$",^V ȠɂfY-H15pǒ@BN/}r|V\q]}gtttt6J-!,o}__1fUn0d/q0,|ӌ2ND dA 셫VЮ* 6^Z'A"ض$kѯkEDR@-IPO!!%ҦݘdsԔӖeZqb7'瞃-ZTϼMQL.:mw}[o/dN:ah+ygKJqR)חxik2x \Dw;::JҙY|$Bo+ٶ lb ַی3眢dMHӘXҹt⟵錢E=5ݫ܃1Fn\pbҷWczg moRNA$ r]wM>qAxr GT#838Mcʙ& Z#yBB\i~ba y z,e<>횩V 04Qko)e%ڡaөY..9è=?'Y,bY/7`֬Y<8˽`ve|AZ=X,^<<<|QV;1>̹n}O9唵B0|{$ 6 @yGJT*RV,s˖-[$$8GT믿~gV#ӹ\.wY H10_Y]MAԥY1rd֍(C"2Pgu|]s5_7Q'u)T"Iڟ}п Sz蒩S?ZhEb@::Gvzg+ps]z.#m3ƨd` in#N8w[zu %tnv &Ғ&&M$Gt 8\.;{W׬Y|7l!DKkpܲaqޚ8qo낋.viVDtJ3$[J\Z100ߟJq{0nӧO wfQiH$K"IF |?c}o 9P?w"cϟW_ ,Klam\.>O0 CW\y,jH^IC)ܹsٳgI&I(֦M 6ZXb|1eY'(TՎ͛7wx|lR]< `zĉ7WnXch9`6㘙 bBD)e Dt~@Ap(2$;Rjj>300ӱq'k0hnK|H_>r͚5&CȘr3F Jxzwu])e[V(6mܴiS0[lT21i4)!,q?A!C&a߷ P0aciXL~@JI&2btR2&8, ^2a+b!SN9Zz> MnHsUkBK̶mW)~_ʿ_jكQfٖGT?qHniDZ6`e1DZ&ٲF !\D+ٙ@\W\qŃB]0Cuww] 7dMA:n e%JeAg@c :.R^;6mԱyB 3S;"%?/۬ZD1XIf0 IDAT;>P`Ō0"]C4H)Ih݊b^bx 7;O|tq Y&N14_|YKzN&!ublu)e[\njؼysG___}jժo1\);]BpҥKy7]5,,Ii0za53)M94SY"ik@#P4iU8㜳aX,zO=Ԃb8p[:蠍rĉi6ZꊞZ'c k  c+$KR( u<1FQVT [lزeKP[ounGnkN]NC2L`3fo0fzDIytsNGR6l᭄0 {"#hnyHo}SN]V@%1Zk$y CCC[li߲eK{ooo[Rqj󑼳_vK)I8M'~s{dF%$`u:fcZzn B%@FEBSy[@@X ,˵,+A[Z-*[*f_]YmZH Ι0aϟQYI 1-syYIcT*٤u|ܦ ܏P3i#kBJtLՈ Rӹ&2Ѿee{b4PV0 &F-vȸ_|;H 4ocwJIL$:yZ7At\'sHk07YhLЌ5OCB0˲!A[V+@044+M tC7ΞmɻA [f.? ժm4?Y/֔Hڊ x֬g$6aDj MJh\GA!Y5"v\1psA*Jpa``Sh+ Ƙذa-@#nX`7^馛]`ȘnFg%71c-ڭ4M; T43c5!731el Hcl `[J)j5_T ޶|Rqm6m%$w@b0sK/OxM7-8| $'ZДE$-#snzR+2M-n>9e #0b6<<h( +J. CW)zcX'x"1w@dO>˗/kʕ眚Bi]`7ǒ.>%/+Y*VK/+Pt8Zk7\r/mmmbܱ,+zo^~o,5 Ny_j+}kӌYϺJi?^ 4߯T|p%0/kYvi}|MG%*JS\X&x$#ysN:Șo͆t;"2zU*\T熇bѫT* <ιl) M IpIdmf=/+6 0;TH?朓 44$B0U+b=nJ),RJ9RJGjT*r+^X̗J%VDZc#8\kZ=.{) eҸ3f̟??}2Z"E." k ]$"B$ L0GK)-N흿klEǿM\L !A4h,J4l )|]yX_@C-,El{̝H|ݻw9s̜sZΚɚɫOOO$/b0de%wprrrmW0<|yu 7|qg΄looSjsYƘ!97KDs~ftpDasRGBbKGD pHYs  tIME &q IDATx^y\U-vWUg KI l"De_\0 ~323TtfAFqaEG3 l8$N$!{z{^uZU|ާ߻{9?^NzvwfϞ͖-[fs*`GĚ)YU@PR"S .;;wOcUdr"dAD2O}Tu 5)W&;|`Q :5" :^;KQl6K>gOdULc_0w֬dE*"#&oV_D ]|P~Ϟn%+Č1"֟ay5IK&|WSկD'D;::}]Teظj޳bUN}RcƧR#*V#B~]};G|ȮdWfވ )'~p`nM]-P@T""Ormе 5vE&FB=c(GX QTOD.<^ m=="LfE>I6Rg~ 䬨@Awi<'A.4-| \][?-26( @"<'Ѩͫ/j< ^GGUlUVagkIUP5 v$H`œTN"Xa׺a *K$ϖJ-R L]Eq ͅʿnД%" " TD"aJGl6K gJ2~vQU4e5%lAhHs_TRESRP`Zo &dQ( Ξ-@L׫bD*UEHU`U>.< =Lc8Xk ӍMy6Z/ul^lXXL͠۳8ҞIx,j{|LDbLBe:T9Tpc1dTb"tCZebXtP + U1,=y>CFL~B+CDN~AwĔ`B~f@\Zk XyAF;jk$/?Ź*@i% u8JQF JztD+[*QfT"LNjaUMIFE"4<U+xuPkUyu Y{x@޲*vbE(KК7{L7V!D=RXp̠IAl (74nnPՃ-*s>XmGVemqE:Dj"ay.+Yv c8yLiAAޓd/-7W08f5Fb10gX0мR@J4JA, յ_ёT%( PD>jQ``L6U.((Zp1Ls-@#"14|?("\r|Ms*.1` J=ϤR-+i~Ɛ3JJ1dCa ͸2-2_5({.+sE*MMLPLj|D$J@qW(<8|8F@a|<.*$À5D~d|}Y6 C5;@OxE4?-SDL!Ir3}ᱰef_z{4DVv>RF~,GgxC@E$mRz7D4L&{ܫJU,ǬG_;phKv(A_((C8)ZS/<4P *.e@[> J1 ?b_c8дnTCQչl1 I.^\0VfViYLSe׮ mIUMض`:@4$H! R#6K({u`O#X"T*QcmlvjW9U Xݰ.PD[N!a1þL@v_b3x300]QEJ/aǙ oݠ{q:FmŧRin!&@ | +qbn8 UWKɘyd [a?sr¹| ;@Ӎ><\]?Z6Pś:;G 4fO ĹTRUnH"`fnV*JeTeǹ">EhO`qg݀ xp0ٜ gbˊQBc%~$%5Dxqt3(lcfA7~d:F󨭀D"Q[EF"}DFD[-U?schqTN$.$jG] +!­1/AcG2m&+g.PیU⫉$D0p49Y,=f[/48,?S cAP4ϫ.{NW/KE*习TnADN0.:r M9>{eee aN- Ct].M`54km^R:; t籬RO5堠$+jxh$>Hx"\f r% v¡9 9Ö́KX#SپOcDSU4܉$5 ]Riba=D" =?*/YL [;?Y&8ѫgm ֘E[C653%8spKO7džDXk*Ƅ&" =9(9Qlआ-N kV4ZeXl|[.1q O EVrLP"-`dƫx"JRUˇ*@B0c#&TdX*o=[. z(e.˪W I[l,^u;V{2(!8vTReT*Ue,9QS*e h23zW4)m_9.mV.F1PJd`esn&C1uܝ$pj>8c2DH1ַ|Y1=?s ` xAeiYf v7\X*qWҦC ., 䠖_3gR*Ȱ МVsW%˲f`gZNeەql8'PSH-!|Wu=۶mòՠ==FAA,M.tE$X@n`fk(M"ɨ(bҨj"Lz5Ӻ۞Yۮڑq#Ӳsz@$2q ,>nxm"E{?6~@[*D63Z {i e`M# B1,ZiFSdKml1feٿx,B1~脊`qxO&W [Vu8≆[T(1$KʓNBTi#R~<'x/xf&~ K(G ۻhϔ*{C;ݘ^΍av%8!f u>֢̙ؗ33w؉Dmڴq]-17zo/ySw4,سQ._N @&RC IPU,yGŋ'pJؠ}z/udm"]U2>yk5A >c;öz*ݝZU}yCU9C =UU=C7tSqRmm=nbQa|A DnNl>"V0d>@Tx؞mNz@Tm7c:|lzr H&iӦ$uxeY֍7~1Ŋn /o}`X`k^7_=IhYt}aP(EOɮ:)#އ=17ɢ̛7%٬3 >`O>>∥guV7lɧ֭[5D5pry899I1]q-_t\~ΰv&Wl>uГ#>==;ҵɢe暫\qsjk!oʕ]^zYF?G2QIsTI$5J7zB3xqGlg LA{~xujA7]XǙH-,TNCzCT& %BCDC3w}wY#XoZ%vv~>VGy }yOltFִLQݤB^8.r6+/U@ЋX2UeXp+c bqvN>] ===Rvѡ_|K˖-ˎQ ݃Yޯ~)uq+|>:l=gC*9 T2lFV%/W "tJhee='Yk 细F}{6+SUU/2{s'|luy⚾/ܬ[tDZ[Ue˖uZD*[ x3馯6gUс͑먭0F =/ Oh*t?zk#GA[etttnGqL&c;L>\r{[l~dJDxŋ~ S5:AmkNs:;;~d"?\sX#`pye >㶪 ,O`ԈL6MtIcLuQq$J9N[[[_hQ逸vXB bOOOaCX5җwn"Jƫ0jժ&f͚x<o^zU] ";TpjJW\ehKD5T*xWJR""Liљ|~ޣf3;#O,YKo{v[fT[JXp,׷mBcEc̙"vT;nij^]jkk+]s5\~FH(Kiͪd(HDB:L&>N6QTUg գm"$^FͬB/*L[pAq70\Q@[_Tn}yOc "U0>qPmҺwR?y׷EzOyXU[ e_;|i5J. 6XKh zCtj{ *z)PQc*@ ZӿZ#j6ׯotO}8jLH nԣ+Vpo} wUi1lsggAUlv`L&-码o@g_1El*Yv-\p6l@Dogɒ\tE|C²,/qe|=i< }J>PcAl6b>rm !"/w+y wɶmۢn_\w-\{I6nH\~ڵkQU1;N8FK/Y֭q䕆c1"5`lv:0U0Ѱ Vcy"(HО@:+an;qY3gqww$1aÆzJagtpz֬YV"sϫHXJرC_x͛ewRn,!IDAT˲. 6hNF7"vu5l"nTG)ƕ`VqψbHUI$|G?1=fyXD\DeD>IU߫FRjnD"ld9zmzk3 -av CDVMP A+_wun,c,F5P |yh- e P,.Xe˖x ԁbs`>@e]V:ڢ|Pcw\駟uԑf(%T4~!"gj߰E1SEyz"__mkk3lm:gΜ=ЦOU&Ƙ}ke0QWQKp{ͯ;Ku'ؼyKdK.y=w\.P~4<-KDdzĤm`ADEuוym6l:֤38cO~@,+yh0 Yo*QwIGqӦ]홞'I=n/kM~Q[j<;E[5͙L&Gum۶6Qy[/wZ3xUUD.dJٜ&I?WwcD/9X 1沚L46%|ܑ*mm R~d 0u2:5Xs5d2ewcݺu=3f9sVy\-ilFBTu䷴Mc;TuLVꫯ96wDE\Uem3Һ'D 0 Mȋ_ǺϋH_S$ڄ꧀k"^+aԦx&oFiL#B7)?oF)~}Q  _nS0/^O@5!"VI0~ʙ jT`vA=ge /LYeJ\@--LE2y Tdjr0-9~$v[k0TVQiOKƺoO`Hg"S˲Z-᠒=tL6UTݰ۫XUY:PvJzUQDxWfJ.ެgșC3iQ&l-ȝ"Wz2Njf8c_c5:%[[1 sTV {ZpP3Dx`:N?ޡϨ6'"@nDa+{Vl0Ќ137Ⱦ:'-"iʑVոtj^Dv[z` om,sc>6`Rsc%Ċ?Ҕ=]{^4)P1IENDB`aqemu-0.9.2/resources/os_icons/sabayon.png000066400000000000000000000365721272330227200206370ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME 12=Q IDATxydeuYUu=7t4LJQ44^424<$Fo`crfh4 Dn>S }c{[Uu`sڧN {]Zڡ " ?jSQ@8 (;{D/|4;iK좫>P@u &P(("PByʈA߫pa;(P0P $EPG׺l|w;C'|ƿ"EFOPb|:0'o!9-9L~[ 1M)J o<*Ğ'|bREyTd'Zp'V!DJ^f0$^קK@#B{+LB.w3-8>‘j1WxTȘ$d_~1#$`x«_K k@">G $ leZP@<3 ·̐"\ 8P&qByw+2@F+܇P?mj?{b;L≭^3PO*W 毜dF| u`ə'~%Ʊe80001Ky PJЀ)*w8ۻ~@H[W HpqQq !gJC%L1zWw#=B%=%r&̉NCIc# ` ~W2gFHIow& Pp^5X.`1wVr!<3}""w'túz&ќtVTBv?MKx9W`"T#(}$ ُݘxE6B"!Sfp\(rc ǟPwU"F1$aJ5yg:M̔؂, aA/A9XP`OnGO{|c1L41$ TIeaBb*W%Ϥ(%,SfXQ1aƜb4ȓq?ʉm oϙS0)ԫR`6D>+$!c(0: oa| EWJLaa#8"<аs镰{Cy1x}ՌKoVBQF^B8D[{ NsU Fo0G*3bKQ|@5o2֞RDwQ*߇1Ө ؐLKv 1Ϋ CXq\sIվpb1쿎y't3Cz.c| 58jM^Lw1zԛq X">Ji8:ķ9"4lLSꭆ9jXAT-'P Eoy 6׭E&&PY\DPBl1ѶFѶ Xd0Rl$%yK.<ɺedVO8 IfÏiAOo;BDl>P7!3S Ʋ .c[ /'nx(Ou~åk̈́^(:Ga腞. b^߇yw@/!>bW)|bv ڳ%YP'JTbttTe``c yv_Uczz)j2b"tp\s^;*8'mQ<_iq8ln j5?gK Nj )'n9M.o:3g QsϼճHkx/BI,rub1#S.8vD9jJRazzZ&'fBY/מJkgpl5V `[I CJ`Ƞ< ,X )O"|]a' 13j!zK.eѢEMPN»I|HzLm8pZV ~MԞCmԐ PGTAROs )ѣyh=F 6 k3vѾ~N-+VHXZ{Q2UJ;F!CV}"ZU׾E%(m䮟xo}dW H0޼ }B\g^K> ?cǷ2{};+:@̸;_5kv$r6vcnUm۷O''-]]z+A !{ /|CI.gx&Ȑ S +f*QO:Ɨ8dR:΍;54&%vn~?". "f_f:+zYglܫ+:tVïgb*jw^QMlNU·1`3x71#9 98JX*$^%t5 YG(z=:#~oAc\Ο疧DP(h[>q2u+WrکJxa[u}sY?wcsk5F;}cSՈ!3$g$I5qT/(E0YJ\'R!34u(~" [1yI{795g:A\m߉U07׏oi)&իW˒%Kzvfw^|k|*@!,X Fy4 \\g*a8cpD3Xo+< q_K|axwbissI, gu,YDK=8|NRam%gh' G;F? j?+@α?1Inr,3a"D,`+iUz9qӜ»JmI\:[\T"=si"~ ]VxmU.|">Oqm$I:J~7·,dhxD?D)uZMJ kݍ 3yQG翪=2zM_/;QP nD "1[.RV^Z?O7ctb j'2JWKWŶia Fka~?+p:x#jJj^crPpZ@ա7O.u.[L.\xw b; s9r'|\bH R+k须GnK(gr|Fh& ~W]E',+bDB7_aCwؠ@3j~a4BDxlËpn(%o[<9U?^0fIwNɲr6ycV9%gzۊ$b}Z'D?1:+ w>{ؤhY b-0 ,Bo1L6Ӽ#T1~i6}p`rf&YEC#*OcJQqw !GGG^cxxq9щ ;ȈH\Oxas;aJ3 0 ۑBs@ ٵM*:9XȹKE}٠m9yNQ%Vfpv, R.5рض eHnf0&oǎ,> &4ܕ]&#Qj3qag3\=ޏakg=H&Aӳ*[|)͸L8Sk>8{Ypl\l HR77t#ΡZc7嵔%O'bf=1lQX{itfM'6ef՟2AuZ ?"r쵃n^=Z¹Qq=4d6mu"lnjJ}}_*@{h|**ͱi ޫ˺ְ ?:i>UY1]@ <헒̬IR(-xf491CNanۋ{699ɦM~|hk+}V5.9t8L [0DWOV)kZ|B+"Ɨd- &"[IziaIT@DXbaYNnbt:[مK_;\__'8餓F#%b3Aiwsx9h -#@!4Fq94N ).`ؽbTjU(Q5F1 vw;Xf7xc{T)ԮH;Egsy۸PP3y? W-c{lL SPO<̰ŝ$e@rצ:EYzuN;gԩ bQ4)P%%vlYac8"Gov 9*BezmBO1˗ϚP+%;&1\uUjY7Lݤ~0qP "ظ(72w|&raA} 9 ehPD)8>Qw?:6[!6nީ dMvddKv]vmn-3=KBw+E[77NJZDm`NI-Cߠ?)h3*$}¿޵J[KRf.]<-Ue teu֑$ɜ Σ UwKu=ML[=ؙt`2bC%( N1dc֝±l<|g<\ҟ6, B5Fs+ |%$\~t)CCCjpvnvY_v?DJZIN$G9 Pc%e[8-MPa|$-eVEFvZ[a:sٲ:{Iy`'[IZQ'e.iW%ڿ^> (:Ի[g:MmѴAJ(Z`uI>Y]v5}٢^tt+VݮZFz Uϵe=YR4Gxhq!$OcPm h  A8eigF,O͉"߿ZөŻS\/_>'hbf ưQRV6,8Am:q&Z(}Z1==( Qh.v'QPc㽏- ې1lܸj1K/_/In~t^fU%Okɪ*:T*̴v|ALRA$&H$noArWPJL=LM_j;c/]8Blpž@DR~v,WjLOOumhh N6}G$K&Xg/{hc97u_VwwN|6 dl͛7gЩ6ԭ-u}n%Ȱ/Nrpb,mK6L o B<02(?uk(N V#fpvT1[`kSSS'3R!li:$d; d:ݗ2rHm:jn/Mw& ;g6!\.~a;nL'!Y3?0U@R-t&鞰,ܱRukҋmݺBVΏnvVP8"k5Z?KPuR^7= LqzZMs63N5yçS[^aGezzzz)ꔥ Jgz Ug8jK9Ct4,_O Ay_4?Hp.egQIнKC=ęgI\WïUZ}⷗VjX,R,~ViTVjMMM>g+t0/{n'w'hzYJDشiS>UwwJnJz d!1w!3 [kF+kG|~Y*s9lٲjŋ;ջ!A;~^)^ȬP)ѫ Ftaڵ/ 'NCN0r|%\IDATtQqSxS˴0)BS[Qz ;wd޽r)[gR]$ vjrƔcέ\q|e``(PUswuULck8$5I&&& P\q}z>jzǕZȶǹ"pg%e?:Kߏ"ݠ*(l=śts$IfbbJҤ8Ҁ\#I?>0ػw/?f?op*b ,tq=l.qɇ 0odZ9DѸ\ qwؿ?/{ke+]vm9g}v套^]`hᘿ'082pצnAIg5#zwqT4 N*L@c ?>\p۶mn8,݊q5/߫I>Z?{PE/zQۀoogϞٙP;t qߝ‰Ї7FBmrBgOκGMF!pN!R?3O4T:b+VpI'ׇ18Yla_j>O?9atX$>f^}>~nͥ_XR#XD1 -5E}{tw~wذa}srL%\tE}l۶G_xֳwSZ-%:o$:F4k[ӗtT+[50 B@3MGҡ;vM݂ >ǚ5k.ݻ)serwr944cV^MZ|&]tUbsX;HE1Rؗ@ Ț n3SͺB]Zh=opVk={\RG?Q뮦pm6aff2@Fr%1W^ͦM%Ue?87nX,s9'oVgqihsDo%xC+IJϴ (ldaddژ(s%'b_UlR/oyauqtRJSSSl߾|7R*(JO pwYߛ^C&KNyWc$-zk@Wgq-&̝POuqwC{VJ@D(JtM_z*=۷o? )n&n榊$###|K_K/o>ZCA`uU|1ȗW`Hš|@ t_`mBQǶm83BN100k%;20fj\p?z+6l8ZC[@Z%4xi@gK]fF&IJ sO AV]gQUN8ePEIr6k\Kamֳ>絯}-[l.իd o#HnQ(رco}[*wygne_tZ9.߇Ն!6[CpR0OZGBrZY}8M7[U&/ .-~;oxܰ٣~^ǦM[x_u]y9 T͛7׼X -Ai*'v o6w-ޜ˼t1yݏr~.~#(Ͷ C U^`o^) K_U֯_?g=_%~:غu+q7Is%/{(W^y%W^yeDQ$ ]wݱ/JxFlMsop~FTh %_[xQ}ݥO`%eĺѥ(wK^c;KUy?x`*c k֬9&V'I]qg^uoJ':]H=}$T A+J1lC%m!.!6xl2&XzҶP$Wqv_."կr7vF(_5v^:xӛĶm۞Prne]Ɩ-[$']]pJ.dpa]`CՔ 0F<"1I0&6N `ٿ}و1ZP7SS[k㘏|#/ 2Jn#ڏ'[o믿~NYqyQkId6ο1Q4e !G0=JB:0죁Q C5Ήcъ) %aj,rW@&9~u}mNh O}_Lk DUx]b 4M@_xnnZ?UDmqU.-פ\@\Gn:[ר0QbEQ޽{+}*ʜH"G ~;k֬?1\ueijճW.`̓x)eq! (9O!*HV -q>sɵ pT޾>>q駳gϞ~z`llg?\{߿M(*ɒS |$_UVO~8{xvj_~ %Duο1 qׄO ,1,׈nkycۤgIpjȲکRc;]v4~Ν[믿wǧ/]*)Zk9a.j Kȥ?E n%qKi= ~,Eg}#PB ZXliqy]n :LE۶mc͚5tMx$;saާEXuJТqz־1W\NxiClLRopWL`=Fa :uurI&^};P=W3wUV|Ln{^W$ɓFw2u[߇4+.!"젮F&3^q԰c{pxH0 Q>N 1߭˩׋("2?[#*zիWsWp 7&;?C6lpD9cgwιQjUβy]Xa|oj\-称 ~Q'`H'4X#+FL*=Pc@"s`ggR8K)N>d^g>UVaÆ |#GɕzO|j~ӿƯT8N<}/>Sm2'z#ə"a/Qr?;d'5! k@GLﯧ #(1H?RLBGq$M$Q N$cF|uR%\+MqšZwOF,8Fb)`<873r]oްpB$-XWey{A$JPIt`īm7`5#gUe^7ߋjuIecn6_6Ln7lӠr8wGESHF;c?\6Dts'l{h>"&UDTf #JQ9HT8RWQ1]s_1h.@k$ 9N9V-ϰr~&8Pe-]d#NT>˜F(nxҴk4@ F cHZE$aɵxUō_{+m {? $ay&YyDHm$6  \! SWy#fXBğC4!eWFD&?o^])~ v ?s;AATkqXz'MÞ5a^J>ڷ˛Eso0@v< 5"1}@pQ7\7 9!bU#vl>S թ£ EAwNMw?~^3iCG:Dzj!GkRDZzmHe(_ {ǔQxp+g%O 8w3$0>v`̡îG>TB`Ā/o3늞Vpq@rڳy~\")qʳ&0k&lԼ' qܣ=|+lP!b<8_[1G"%d`>T`ctDSPSw|?-<,x3q49\n8]ZatY%%*_ k/},{gj}tr=+$ |0Mn,fF]6q ?ys_3=v)2(gR7ޞt.X^V%BHQs=EծkrݯQ[o]Y*8J8vkG)1 "1 (aHr0,d/9PqL.ʂ&qBUU׵< /ܘy7gR{WηdR-8NHs0fc.V}n'Xy;] |m~﵋ȓ2"?$cQAŠq/`dѢHcO_p}.J26 SDeSLaLF9vf[oӞtf^ZU똠&DUA!L,c8.q#ڥpGI.o8o6|ifxI&&ei]J*?7=wkL:U^ JV 庖:ٌ]zڭ;Jag` ~vާot67nM -AO%F ʺ~w,+kwB e%M QVD|}C .,wn lLSnLM6Ӹ䰉*Yvءgdye+$^r4S 1x4Hx UP%OMs,\%;$ xc]j '{ud^6 Iyϥf_RH-.dUPQZOL҂&%is}{ma|] -4&43D͌űď9XԻOU'gPFD($`1 Rh52{FH<"d_gEJ3^ |ӫή6 a?2C^'IKTv:I#ORzQ(PC(Gy-l^-Fz z{`~ͷ7ax/F{@!^P";/^P`$P }O !X>]jIENDB`aqemu-0.9.2/resources/os_icons/scientific.png000066400000000000000000000132051272330227200213070ustar00rootroot00000000000000PNG  IHDRZZ8AsRGBbKGD pHYs  IDATx\y|T~ldL@YBRJSkX>*RA, "?JE`ŝZ~ VѰ/YLL2f̾@@Xs sw     i2:XN'8 $%!k*+z7bbvvJoDqA@\I桨`_ +Csl`N^4TJ3%G_;v^D V>\N2_89 fK]>&{̲679r b8NJnǫ;HfѷgR.h-%LW;{FGWȩ4ktY6ll qyry|B 0\أtXM}ykib~zvW1WIi2g-%qˍ}cBiA^GFe$ef`2b Nz~T!!>>-- =Fܲ¹Ն>vT)BGt|'>S`3C?FgxYU͜{, յf=N{s|~Cuf:Rű:40.DUEFhx3i]M yޒ*+ 9\:|G|zuxp~26m`Y\{ZjQ[r:%Qȸ))IAE 7J +:׉' C ʗzs\Br Nj'س[AI#BQXŌ_Dxmގ&47Uq;0/Ĝax@(opI% ҄a5tQ004ɍ> Bas@K0Ў#Ξ3a}gQwŁcwGɻfőW_HPS3};6z4MmN<28hБ fK3> LyR 5bQk0ȝt4*??)/3 ;'}\XcXz%)gy̹=?1Qb(R3 fzz9X p[8]L#͗xS 5GRe"vEW)A5 2!.;: ش) 7׃emi0;F6;OZʚR,HXD]re3@*Bht$F= fqI @.7J nJ+—%˼n3О*4g/2;;/`Z"*f΋Òddf[iݚ̘~hpAadaBdNŬ-[Qcg,CvCo5xzTp+-./)/3BaTOOfXFiz4hL׊gW=9s Ǻ55س[mJٻWI'hDF`(]T,>=?s&T^B~(w?~aJFmm-d2^Ab-v\Mՙ͙i5`pўUXljxf?s`|56oCS1ޅSo}3a EGGѪjgpLTkb4eee(++CVV|Ɗ6#B{W~YIɝloy3z0ޯicP{Nʎ[e=}2K 3V?ĥ$CPը…zL--Ey)F3W;܊IÙhz800g[\mw 3Nf= osyG/%6ꖐ74/UK3o<8NHRLuw8֠Es󞻑z)J$RVmj>BFsb }vYcC =oyVm1"76h-[tg݉{ZP-jmWyb|Oӧi&=-:<#QtAc0&&snq=^̰[ɬ+.UDE [q 2^ ZWG}}rEE,u+j۷=kأ%UR)!-I ނA_cֿʊ=u8!54irxY„a#DHc֬d> f0eZ4^}]+m_lTitlNXltI)\zF$T3>-Iq&*J~;Y7b=bgT+|s&e8 ;~C-xC-YUVt@&yW Ma8\ƍYMq(PLJTյfzȝy\fiVgὖ 5,jƋq~~gfm& q{px;l VIĨQp\Ķ_]) b|r+sF=َ%X|ux\wlRʼnt=BX蛷h^}e7`[:55Xtx<"E 5f\~2# ] fHLP$B 2 kG!qB<|.DAfoF KqbK9>O;ޫ/.hP@~(&4 emb`dh:`ƨNJӻqy׽@a!<~{lK'Y=nD 07}IE-j4Zy.W.g066I%K]{1uȰB.7۰xQW\̚g ǟ\/QrqUWO@WWj=/;+Qx<Ǵ1    ` vD^IENDB`aqemu-0.9.2/resources/os_icons/slackware.png000066400000000000000000000410301272330227200211400ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME Wb IDATx^}y]ETmz;B**踢Sp>QqqTFqqPn ;a’ݽ|Tׯt:K'*s\E"^ċߋc|uS7}sS׀&;kw}B-#EB0 e Nff~Z,njQfUO;>mWQ2qKu^g3H )Rx !;wP*V)TC ?Si$l?d0AG4`S\[0_(/,q'c1P@ fȒ`H5ƛx7&  pE8mWB'/, 0u>%"HA墋rɅJJ0@4(Cg7bd5CiRzDҸ4n>Uix?+?/No+ʇY9Fp"C`)K;93P*8`f0 O 0 Y*šu5Y̡߰/@*K#Xw,Z~O>L-/,w#Ip"c Xwz/aO>;GDj4 #"3uyBeSp 'm@Eӽ;7Sv;8,[b{P{'3H=ƽoh=̬5Z''iZ~ +u1iwIg}b")| 1Tt#fb8N!18bHSq8qoد~y]};q"tF:X8RtjL0ϒ)}lbli`f$h3 ^㿹ķn$}N=9ܰ D ,|}'=G3wxa<)6#h͡:/ZOt3'|{/wNu&!GD"֌c_> kNlq0уo}..ȏ dU#x!H9jUx_r[~|:rxͻp]Dkt3KEǿb6*%w/h?f\.TAX%۞L` *`ۇߌZ4i,""AIGG3H([>^; `$ν|Xt_n!AiKc*ÙOf7kDѳ>e=]>6߯OHHpr@$! Dぉ `fLJ.HB8`0J}D)D!NHvb<4gW18!NJU5{_-[ovO _|,ޥc9L+c a{ϱ"被ZQ-{(x[~{;V]gƻ;YV@g^{fm\j81-04&7db:ȃZqq޹ĆF1d $ph"Bش?tЉKeb(w.@mzVKރfnDpI}]E3)\7`SA:>`*KGuDA YU!2&Ъm@PGztW\w]A( P 2Z-p.`875"Ac3H #Ck!4f+rotL:R G>ł03+~;vA8Kc ,7au(z]ER*q8 463q0E(uE}x zgjXT?Ǵ*T!ZY(AJWJxÿ{Fn8Gm9xih֡X3 x>jPZTzGm虶ĩd!:1NC3+ַrui'/,o>;[cWsKy4cY*$L wI, .*%Q*U[B 7@8s Ւą2"^8UXvhXk0?:stΜ-xͱ_!|{e1S1*=dY !}{OEiPEDp jDN2yW /\""TzKu;/ vz:ܥ.@ 3@{GdtCߕFx0WU>3 l4k2 ~_l( ʼn)^=&+yKhs% DwQ6mތ$q"#I_(Ji7:!k1F1a$͐eG)xt3 Rtt2^V j!S 2ב(]%] .ƃ=, zeqWF4zehDowwY"4 AeR8ΐ*,3?O"͕?  )1<$;ߎF;C|fl"KhnV MՇVCHC 3F;̚'5% ꬪH[v8_c!s/wru WX_6d5>7}[@mh5h ռYe>F+A``aތ RQ&BڴL#Ig(ĉFghAZ36}>k#f hnHY["o@1%a0?͌C3@=wқZyLz yt̊@`Niu+P.̪H4(nHS/y9dwo Z%66PllOLv7J(E3HQo&g#HP*1s\dY锑ġ< I܂[&.ras ܀G'9lq? =B,-+)]5vGG,Z8ѣƲwaDz(5Tz#(U j(#kp 8uEe/[D!NLL^i&Φ 'Fd E=0 =BpKH: :s5*34)FLDeNTʮf:k cw6 p;q ?`~2MNXO umГV[7!4nAHYB,PyEx*%ȱ aLR3#B ,dYİI&adZ3U (C+4NVQb3ğ|LQ* }yoMm`oMD$ivfZN _ 7"jlB@z%$QAc똼A$j> I-&{tL$бŎMC3ZZih(62F,ljZWhd$(>Y F: g~ rOn*΂E 퍋ΨK|YQhF;]+R#Ji`0~-^sPkT!i5ڦ|Kh =cb(Pu i\*;fukcVQ+yN[yXNs1ڞf}RwT@`fZe q@$X tOШoAO3z1T *Eϴks Eg;{~wP]|#E<7BV̽>=d1e0qc5O8~|9nIGݦ}+|Aࢻ⣿"f t3Q(@J_Hΐ1BhAHZ%`Ϙ `:vPBHiT+dyB#Sʊ{#Ix7(H(mK2 "գoh֞ZvG9֯Bk}%`u=fdРD!]?F1O~~ؼ}Hb8tQkGPcJifBc !奎 :g/?w 03NKg[ T^sic3`nUe1ݒT#K58ᇽg]o"|a i@e @FL%,ۇ Z+h`k`cz V\5~~x{SOGX@{2<8&٬^|LEjx .zž`!ٲ-uwZmjQL? # y+C_V!BIh42 E`Q+P:Ul' 4J*-X 0[X0,^^l֋AcO3#vھV)N5*$SafcJME"3cȔh_AH .I, oC_x{i:,XBc2SFF# ÉlB||+iffg%\UŐ`43;Qk`ɒ%NyU\,OcT(zbh @0>|u&yL9Vsmg՛y]i7):O? V|{<C[Z1Ͷ%x»Ql e$hffhbJD4Ll$R &LJOlqc_:t܁"Wn HId4VO3)N5D82m=[8m>yp x~SqQᬳL1"S-o-[w?58S1Cي!ab5 idAS3Z3>K -0LA8[!eaFRJ\u?XfL )IUP0y_1vMdh)2eMZKƗ2D@˝T@c yIMG0kIV0%kJ IDAT]wd6 q!qn Cї҄M* %hi|%[bGKm}msGނ87TpP2$*(hcYNLHh-o-rt2fFdY4vM>`S.@MWCh·4DSD p3dJm'u-A,z 83#_%gbpW3oF|&hHFXb}g$x03wFl%@j&@>05|4"@3f6fea81P]/r'`7 .`Yp%ƣV*KJ>w%΂mzlh0࿉Zk]: a,Hm͕zI8`!Xz;Ȳ |J]8DqfX#~ckW֟ɐ+DY3B+LQkQkXh@ U]t\UKgz}Ԅ~!6n\~ϑFSU̺* L.̶T)$Yf~Q>c}k:ybA۶n$Ҙsd+V+>e]%=]e;C aj%]hmTA)wi5w]8'yfY.'q/&q|.U)|׋fq*N#f LɐBKTJcºJ2,ap(ۄ JqwV8鴃pu˰߂QSZrQoW wtl1mXM}bSZ][5[6tN8=T3[ţIbEy|neN4Jp2Y)bެ Z#P01,| 6 Fjq[2 ƣ[̳N>OҍZߪTyH؎,ʾM4)(P*\ŗs5.e$D2c#Xg+ 87$}ڛq]j u쏼y>V< O> Ad@CVRkkYg0w v29ٟ,\T> o)>]{e-S`j$b[(Bk+G3#IẔL=͵ #m[)_b1"a2l)Xp 1X*8/_ws(q]SzHI5kK`2Q h"[{o]k&Wy/8P=DaQMdewbTf7[˜"GkH7KZ `;VBk uۈA]WW_qf.@?JV^=5}, >&# k3BVk, Ij^،34Z)m//y݄|˰f04G~Yj_u\w>]A>Wz0Kš S.uJԫviҲ_3ӔY>e08CCCiD58IF%T,aغvXlsaLPt͆ .G[ݦ_@ :>=3J%Ȳ[ ϭyCؼq-l^{g`~ qaG+z2/ FRQ`F\-MK3=V}L{@F` u! Gׯ_se_WB-YABK U^?b]ׯt8r|Osg~t$YH[e$Bd!_7S8CbQ2Fe|aqd+0+R+2,˞q癹U@ ԵRC(X0YJ΀dM3/b.< >FS#Aç%.a ǾTZ< |0f@lL͓ET`Y^hxu `gf'hNlpu\ꫯ>u]i<[)H5K)Oa$@B F\eHRbFՠ2бlil]Xd =v W?g33?c70cHDZf*4ozWJ=rWOd<9yM"&Mx݋̵PZaB%$6Bk39goi13"ak1'rQZ 袋lٲK<7g JffMxi$_kq!`FvdNLm3K JL· j~8<;a8S+ }Yt=KIZ!]LSkFXlcB..Y gd$&opgBƹ1l jsD< ~򓟌n֮];hѢ_XD`rP[w km-J3{Ȳ!$Ө7b 7%C6fF!(%J: DKfqԼꪫ<[{#$%@@؄Jlf  G! TQ-{cϳcPъRU#9 ҸC 8ž&BeQ eL4M7{SNJ/-vF#/ cɕO03 h Pq5%PYvm\‹`a74akFP >ffE4\\׽oJM~a~_x5-ʲl+ OK!5LPv5[)VHP*8D_Ķ`fdB`+]#hlCv̵Rtܺ}W |^zͫ )[o_gx, ðkfO>,tgfx*ja-}?StR޼yB} K捪1kqY"hl4ȋJ@dRۚ]U'6<<_̹G>{/^+u!<3 l- jf5Ҹ + n,akYjKoXoQWbqjO4 ;‚ ➞TkzVJSVtil^L%<s06ʞv/pq=.CBkRW?w9Q`0L0o޼VJ)j6(SuTw"2zApr؋I\G øt;o2PXqmўX,֥72o>l,_|ηN3%Kp#Z+!Okf40(P6L%4(L>SkP̮T8A{. 8^{- ]`{ p]wBBcfoFwإV$TgcaA Sh,ck} !G' ZqpC97V^W]K-J<rb3]-C %J`H%{OY"Ҥ(lrǍqA)1^ߨ<9ߨ}+_zNc~}I'mBRI)jͅj1bG|AbB7ߠb]+ h[£M{Y }̦<b8/zK.dTwV/\pcj!D8sQ{\/Pr , @#I܀ /#Ҥ8FtjZ5aP( 93W>+i!+R<#P!4,mID`q^XHJ {%cr4# llQZ|_ uRk>|W3`E >%ǙID̐=}#HX!Mi e:Me⨆8RvE F:2f:xv]0]EPH J"w~x0YvgvM1)@WՒbP(\׽w([o}뮛R^ŋ/R*B:5IIH2 !!mIj_ " +q ҵ ś)x*5[*iNYkMW._Rʆ8BnI {.{ A],]AZfVy{o]dfmFH:pihwsf >|ވ.kܺyߛ?s}&9 oxC'۵'i:#I'2x~,R$DB0|0!"F҇pr![]ܖ6)VPl6 KÝÎYkyNoEJiun&!2f^Z6|eM;{~^oo"f~ J8NT(H捵XLa"IآVL|w?-  kw4 xM qqy^]J(-###\z饓~dj0Kָ袋p%{c}R)TRjPRLeiwaCNt#O&%/ásu]-e҅y~R4M'x/.袝 ):qyK/fΜvڴixBu RʲaRѬhiIR ̀Յ} 8BafOG?\4IDžyi"3R5ka)q"qHJH)! hxvoR0TRF!&6cJ H&c 2敮oh Y hfCh%_Hqr]W<ϫFJy-qj />+Bcg'^矏o|}c":;{Ȏ S=0+]I,$# d<@@eXYز@,Z w]#qAOVVu?I+1b1cdF}N(ܵ ڙY!> p7v[ H!gB0a4>DIhc9q!Bw!+t_$,m9?::jlooGX^^Fj0O,--Zbmm '''\.&0 `$vr1u^//w ?ּ$e$ f3uBm3!y [Vݞf$o('011JIDATH !|'i&T0Ew$QO/wHZ[$;fvof-><''gutdONȠ IV*F$)$_7$_x%i eyI)DR$?p @@ -\J?MeFP}cc+R.O gggV ~w:33+˹$IR3(&IR4H2O2%w@̢O? IclldYjZF9>>Ӿٗkee屨ςg+͡P(XٴvIj^NE]\\(MSi1F?88cww 2dȐ!C | lHIENDB`aqemu-0.9.2/resources/os_icons/slackware_v2.png000066400000000000000000000065751272330227200215660ustar00rootroot00000000000000PNG  IHDR@@PLTE#*$/"".&"-&"3&&8*&9**<**B+.K1.>0.C32C12J/2R66696B86G56R36Y6:R6:\4:d=;H?=O:>U5>l8?e6BqBBPAB];Bs9BzFFH>FjFFVJBJvJJhNNQ>NBNJOoBROQoSR_FRHSVV^FVPVtEVJVFZZZ]FZRZxLZKZ^^^Z]vK^S^J`abdNbJb\bxJbNbNbNbZbRbJf`dNfffgNfTfNfffoRfRfVfRfNjjjjRjVj^jZjRjVjVjVjZjekRnVnVngmmnoVnemnnvZn_nfrprvZrbr^rrr~nrfrrvz^vvvxbvjvfvqwoxbzfyyz}n|r~~~~i~x~wjrzrvozyrƆv|z{NJ~z˂~ʆΊ̇ϕƊ‡яƆҚюɎҎʝΎӒӒȢԖԟ֚תĭȶ¿>RntRNS@fbKGDH pHYs   WIDATXÕW [g `Ub x)$1; C&N;1Eպ^( zmQ *? XmLfxp9i4ϲwoomhD͛uuu8m={+xvweYӹoޏ/?ܼgS1 1<\,;ugG;NFA<dYukν2WDz,8ӌ 2'H(ǦIdd kchh쌝y L5o ~r6x4a#/ $";惧?P/26 PI, ,\hZ Ի sBS$A ΰ,Y8^VL.=E=."( eQKV\3vNv+20dZv?5V h7bܾ@0 Cݡ] @_ѥ+TF66|7AB ${}5U Lo7}' !Ww &kj7Zwn,*Wm޼yUU]`M" DQõv#Aܑ VYPH(/,*BxPuܓwGmf Lb/w9h @U4E[a8ʚy0Z 'bP:MȘ)7;'kڴnw8QR OYjj#ٗ87 ہԬ5A,DVT7Ѻ'½/laCe@E`QCqU .<^w{5nIIINN?HCeCq˾]n+APT6 eՌ 5Rt(VE4YvR@S!9| jx3R?LBz_ݿSǭHKC%5`|hR70)R ޺ G[biETj;ܭZUa¸ظ8C\"ܓ&hc9x^E׶i4SHcF{wOX>7aEW"THrCAGTC_33)66 >mX4[`hF,*lGE n_*SŤW5ߛ)TI" E;\_cS[{QzF5c(ɰ Wq~ZHh\wc^* xU,I`#Ts{C[ssg"LhBmMoz62ϫJFɄY523ww.굠 3" z7^` E ArLȤ^/ ~hP"q?IiaEAN.e@ZbQ{ڧY*N,g%*} Ճhwq4VXmv_gV5֖eXyCsɢrH ߤ5kcA74[/lSU*0y3";iuLiu}.,4G}̙-"+Hݥ$9 (HWRgaĠGG_2 CPe'~Rl!w6r&:RI[hUc> a7n-% hP~+!Fi#2R 3qT.KNXu*:RWqBiEH]@P=ݍ+0);bVFqOBT;G޸hfĴ.O# @ .}*RJGFPź<O26P$E6"2X5"(Vv)NDE!XqNAYgGJ;6acfDEVaEIF,$L;%q܆cɵUM FhVZZ[w)b~rsGXjU:&͜>.G<3'/''/onL6ӌ9N` &`7Lgnz{ [kCʫH*QEQ!Bxs).ඥ'&>AeV\ 0j ҌzK 'Ғg~rο"N E 5;*P|[\bN0p4 ʬش 9,(.XRpb-37\}ʴ`2T AI"I`)=u:dj~(Գ(N8)I1J>7rq%!00ݔS>1<$3+; $]`W)(NO6ħ~|iKJ&gWh q>~䔔)S2aj7|sFڸ!g5*5^<|V/5c֌%o;r+o\p;.TI:IENDB`aqemu-0.9.2/resources/os_icons/solaris.png000066400000000000000000000135361272330227200206520ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs  tIME 6IDATx^\e}2g_Umj* Z @ 3@ 3A3 CE HbrA{AAn{@E)!3A &gfw~lB$뵻g}9|y@D>K5TR^/=H/dP%[*{ɶ;o^ȋ@%}Crj}Oݱ-%24m󎤒TIvJIoq/W %2sIIx3؃^UfKw+^rމdJ*|7l\9c_6d?髿iChL]H`J*VTU}Iz/:kFf݄Į+ o)&-$g+G F%]` FTʩׂK@`;tW{C%h:#K J TR1_"夷Z̐Ătdv3bҩfihD%gƛLgtu)-@uͪ$Oa6!Sf;nM2wdI l2#~ 4 Ls~c}A0/:7217[ag>/=:R#-͖Lƽf:Όρ}f&Fc:洖ռ;];x\zTzݕAmT91Aa"frxc%JfNuv}ڻQ/[ĝ(r%r&ʩšFMYB9!&&N3قms_4/[hdHټlщsHzl&U7 cΎ+b*ɘ0~\f:fn 잁d/F1;&y#L%΄31%jn=cR`EG2)'@LoVT.lk$/[nTv}膖!d`Jһ|CWn˖[q_4[6ot4Pfx(-=-ϖF`?/ٓS:fftd zT)rrr2od5Wr2vEX]YV_cHnT 읠2r*)UbK^r2f;gY?~;y9v3Jo &-t~c:/[JvԅAT)#vT~e_ %1Yz\-%˗| r`&4zJ*6N`/˖.OT$Vy#D:T1ƵFl$ElJjpP>@t Of{6.9W 1X L¸Odo^rw0y4[:e+)b͖H:H< TTcgo2Hk7r+RdoD 6%c tf ]g<(,_t0[5ilyڜ Pf\:i&1E?ilwX-kI9e Q )F `4m-h,bIPP *hfC$7RֶT*IoUe.@Bf'ydh^i,]Y}d%UUo{TGi͓DA0ٹ^trصm12muYyW:Cټcj5P4FۢHiwe2:Kc[05 \ȸ~ʍݚc)b # ӯ͋z>9UP۰K0^|C4D7`aS޹&v0-aL$}Xd\7xp*'UJ*d/J[K& HtIێNWo"9sκ^"!E^"mtt\~"iD$63|w w~ݪAȎ7c6 `o𯼅,1걂  ׯO`q*28P0a@^Z_o\;Gq!{a~/ .ޔl~43QpF>oYC ؆^(C.Ośt!4_N gz4sqag!6k\t3 T`šͮq(L,|1ŗY@К':N2ru rjj5 4%)DžQ@|&rdO:N[-lm"ȰЭnw:sxy!_iP kWw( '][`l4"wK]7h6~/6vyָ~:fqq?YgZ7Ѧ;FWC%]nMĪ[G`J,wRl]g7=m0wcJf8*N1nw:CMjg-w,X%i.wQUt!st:,U >G5jߤg .:\<Ch8~g3=58Z5egTT1}7;3E69Xxtb13K  B~?n=藅LhZX|X>պcǍtyL)3㦋UU; K;K]JE%&[Xw(ʀ?i47TeLbqI'n};s>:`["f:eLBg|;N;ͥ^t?ExH`oLY:ßkmeh|<7Sfe(SpZhJ]h4oxIa7s .ٳ@բ zn=Eu-MHI3Q>PK ._tmx%}u'7߳<^۹Nœ ͜5z`lZp MXea'5}+۝^߼ V0kt'p6ta1(ܖJ_;MDуG =f_>.׹V|mRI6LyLӆv6U3OULbY&;+r~fU ݈HzE}+WWn9[GNgjLdM]:;v{&wARb2m ҧ;BI z^ =SQgqtsw52bB]|?wwt~kibƬ|2#Ag+~:wI'Ο'VRs{9֌/ Wf<"vbBuHZܙ7Y4MyMxW),3Yor` l'k9r<=Vƙx$xA}Xm6\G~ftsh(Ә "=^+ok؇&xw-^MtS%Eu|ήLW\bKk2cL{ ?Ϟ/}J,t5vgm:1nw i}<]tT!7PMNmSwifq¢+g4.0ֺZVv%ΐ}L!0 .k8{-6b&>Aڋۇ\n^ k\y)@? &xǺ/ CNq!$ .;݋(\>. .qjFO _,s\V3uplmU4fz௸t9ְ0ã8ͺ5c_O[(MzYKv4@;-~._f-@$RhqFuHg9,8{*$fJI 3Y_$7 YӅMYX`w5*-.;27鰩=d3o*i(͉c2Zdn`[5+2aEP\ag՗pQx¿2Ћ grJy]S GMLLt!y!|q0 &``(EAC@3wBo dhl4żjY0dtccT0f~ U-oӹb&R;h(̚fwy qd.? ~ 7XL'yy9]?4NC6rϰǁC܁Zӟ-t@bKi`G.-`o$X+^3.˃–45SU]6' 5D8 U%Ȩc04qA#@ @';Z}* Iǰ_ "`NV5͓MYd2ExRX|mo!xt솢w Z1?H &pސ-vpn}~81i' aBOi>P1 ]i수BjZP`K5bG]u+,[Sp?7!o(fw]NruָKn0Sٌqp:7 erL>]j6Ig\##4oM{:+ *bJ7I(M?A]|)aEp%t`TbӴ1&bW#Fdmw~#ZL?== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yzByPLTE%*%0'1-)-.484>AHQR]cw|x{}{JuK|KxD}L{RwLyE~MxM{FyN|[VW^Xb\bbidsmgtnnixyst{ɥ͎уЃ}˸ƪЋԎљԛԏӡא׋ҭ֗֐ͳ֞יϻլښַخ׵ڤܤٶڱަܵؿھݭߠޯ' pHYs  ~]IDATh޽Zxtec\֓%]_խ3)XdeUPhv0e[]]:AgQQ,GJc]+˺:7ںSXJTbC%Ms?~Җ-y?gSxA`U5W9 ½Acc@#\G.g4@, bLtu2\ͮ4H˵[@@nv$ƍMUKS%w\x2W5t*>%9vTֵt;g|~%pַv!k܉9Iik>1s )VV~z>w\7(Vzw|>?M:`D5Т0[;&H,>?ז>"+YLoR~xʱXgOl lT'{7w?}r{~VGXw{R9ֈ3WhE=8}^i|;j@U&gZ&;4Vo=}}>ws\m]G%o?-DԱ /`uO{Ocq>I=YcJ5~Gֿtt{<+vK+{{RdiTƎ;ߺ},ʀ$BdXXnxJWȵ]0Xўd)MIư1.@0Dl$Gv%m3mXJnbf7Ch.qa4"xC8z N[?[+~`,6ch+hn绝~)9S8b1ʂZ|LmX[vҗ]0"z?xn=ցƑo=i%z/=S{M'11%bJ|~/l<2>N0 p,\rB!um%QۢW ! WjmimmiqL$[x͘jnq^|%6CDڵl~։;haZ휱Lcvl؉#9{wgmS?yĞߝpn)&;v]t;vޑvyM<ㅝϥ[v>gqFmap<6LV[*Omy-r~)LeOmIabKGD pHYs  tIME O)tEXtCommentCreated with The GIMPd%n IDATxyd}w]}wO\ `p_$IQ)(Z!SJ#V [%QB%R"q} 잾Ϻߕ?ޫWU=pCRudޫ tG}L@564F!i`L1-4Q4Nc:gtK.MC~_&@Y2Ϭi 4Mh(%P2!% H#8h LX3-ԗ@'B13w @}z@wryÆ&gi7[dU$`K`ł/#xBp p:D Nn1|[""D?!dۯqxb4 xPnXMFT}L7?XfS)F3 2*3&`ƦņjkYV[7]d@kH }^ƍ#7qpւs9Nny~-bsJ1D7w< 4/w4OǀQtĹo;gm0|0 !@>t=59^ \<$,>̋/ꐰ11Dx>σg8:_ /^ pL kmSopZ&Xlz\]gO hڌeZY>  ) Z?e ?|D,cS*#|5ñ?y.?ν6s<8vOxn9|ߋ r=A37Rl MZ/2 0F?{3"=Zm VZ+<0əDFx1A0 ^_Pn6oֻFc~1 0EPSǯur;6ykc9ϟ$xuATA.h"?_-@@ Y(]{We^Ww<\,&E 6"?%fJ6 -ᗅ(`8mwόe&tWw~ߥЁAXOBFMl  HO7G aPf#?EVv&ѥ[/{6m ^Wx$RR&#{9X>ȯM޻An 3}5q/jNQ,e) kzM%—!(<7'n5nGBv|c h"}ς q4KE< /&l C]'m[rޱ~ڟp:0/0g$3;D.<%`Mw@SyGIťE DQ`u&: )$.?~a'#|CDF]Ƅeew!QrvZ}EE#BPq \[te@P5܄[l7SPGbͿw|G'$9+w?vʒ%ەM _Q=(x~+nȃ{Kd">;,@ r[;Wi6LZW1T߂]cBodD(g>>#_ښT>rL:DͰIH!bKZ%g(9%Jv]`[yvG:t㳼|5Tn% 9Vl0MR9 X@ͯ1[}`+!ceY吳wg KZXb63E=ԃW J?. 7U.ES3𾕴@` )p->dv/0F&z耍1qVv ic)+6Vry Nrwe WʥLc6ZQ ?i *~_w|w[E~ּ%C D%^kEBw?fCMP1fۗ8أ==|ǘbǖ'4xxqU!!&TgU.9'G.Pt edT6?4&¦Zk m(~?*ϭ- 3nć2KzS4j!~>9jI(f `_069&[aFк+wi0kF|c1 P-㰱 QtdGXP9+G)3>Jsuo}twбag6UΙaRcjH96}DaPA/_}E81f@qWLp-7Eac`^@.É@.3grU ?/zh L 6&[ˍe.n]Y 4&pÇdFO3zX(匡1tQ+\2u >yBPc9~_EUҭEk0&g6(@XDqĀTĩS8Fk#6vn'DPrJfOuXˋ6f/#0!&BXP9%5+#\^ NAG~wodAeQa#ܠR`0`dhv GG2DI+\MߪA'9S9aoV SZP%AK7 恭$ItE@]_#P} NC/"N7gDl׃(w@W^o&&u` ^\I^[{WA)%-]v9fo~/BA5fo3Q6gkAD!w:ҥo O ~ZU 2{`86B]#QUl͆b ^T_8y0 ;E)%Y!ce[K)S jT gsoa+\GX5i%SSypai!xP~Ȕwǁ1oM&]fL~]& Z&b6Ϲsl612V[Fp5kXoZ~s l,"t 5MzE M'\!Thq!Q={~Ɲh#-oSwZ(;眫1iSrJ C# 9C 9N-#7/R j8ʡ`PRuLQ6 ֽ7 ok&@X.>^f q{y+U4z@1!xEO3ٟPyTLE A.'7dnQwB2\$NJ_TXk\fA5ŧsWʼn0jA웫ªao䅍DZ \&ا8n1wK`Kq#Io@W.R"QE Eb'0VxhYyqtŃrPo%6 ..pz4hҌ0Ej:b`4;wrqZP{ÿb=3 20eJj,{LU`#i(m?rŵB/d&arh[)o (/G1=(wmcwpx0 HA1d*7-m6 a #c_Y.2a,7 vjPB"Qy &k k-v0@Z&^vf)GM?E׽c:Zlѫ;h?vI=eƹ\[BN gSiRq<-=bs!&" VUpM0K*ˍ7rr$Kͥ]zPgjk56?~FX#UY cT31aXK@_ ̨ۅ#5(e ;mR#1X㔼D +)9C<0n+߀ZF&!K9am7Y۶sʹt/<Ħ\c.~hrS>|RGtDů\d̺N#hx#L~+hF:/`-̃ژAnA.ILEDWeN Zn|3xe*ruv+ZUo“ +$ :m8qW^ [?*mcwZ㩕'M nF[{ Ջ{,6ϳl ㎥AJA^;Vie&CqlO.ѻ`WZO )n2F8X&oN~["HK;xW |D78#(M>% ].?MK71[xVTg^gFkV;\uUuC|g;B0Q6[*^/i\AYSn("t঒CMLY^pcrqrV "ӡ];Htp7폁}k=]*Yi-mx9k|/D*DdD|"80qy Ӌ#|Mr8|K~-NrjGGSh(BSWX kRZ{35@$N5VN!@e.JN 'Իyʼn0MJ#E'b D=~@\&_0VTEnxtV i&pq&2>lO&suCs]!!IJ2"6bLfL9QLn3R18A^ƥ wkǢMwA(Dzb߂rcgV)kHKĩ=ώ{<(7WxaY9D0b,3sz$E6lVye%Qy-oV$ oO2" E @xMk:UmBBrvVGØȄD&@1c8&>/^'cMzk5t5l?ք*Xm.zUu]0|3ۿcWT#^VHi|Y v3S)-Y?vbwUb"\4!< Y LfpF h.}28/p=q/Ϭ}mnl!69@F)tX1 cB2*ŋz5~{OZ Z){,Z}CzXs1ǩI/m4nf_L5^Hůtٗ?HvZ @hY~髩07`*7Lb !Q|<$,rIK6v2+$Dž(`gtZ nl)GͽA@_WT%2zg)VFo} <2%ҟ3R jlOXRn3@2 r|ЇqBwq,6;idh'B!L}*3kXs ㈨ DZxa{}Я 9ؑibAop=Oܒڄ}32~?Dnrs6^\uY(-%#ۦ& i7M^zs3\7| C-~%i!i`Bòr! J"+"mL]#u?cBӭm.dyJceZ{=}>'4Z+7ް6W;u7%9ag%%vNb4Ulu2H+6C03}dgBn6VE_x[OszK:eI@x Tbt֐(&@@儔q8OPnB"c}tDZRiϾm\r&Do7X̛s,*2A$Hz:хKm-xz1as[8Pf. #?WNr>U&MBA㣄H%P.H!0F> NnGȦ p$#kew *$cmGtnfӦ'Aa@Gv2<+=' R!İ) ʎ 0 z92ȉx%k;>s0#R_]{Jk&?ġ |m3f6HiL]v>76&O}2# q~g/v|p!/VyndR%li3e IDATAZ:9Up8Y`>yyb;ضf]n]ld4| #c@>~@t=NZ!čl5vL@bP;WJ@$v VDJu]9o>?}7:;C3?˝cP>;l-!qqwU?\$+_V R!a4keX6 \S]=3HD$NM#S m 7]NL@ƐX֠n'TTCij795Zt_61Zlxpqfζ1N U!>(DGB$|o'L1ݛ,@)?{_ka'|yhhG:}ZoSR1jOp|3e&1W6MZ$=dHbO )f!? f;*v״p Q2W ?tO]~AvPƾZ9Nsb#XUiF5jFlד'fz?Ϲʫa2*i1o ^|29|?\lD刅&dTFg RR |svĀ~rndz~/(c]IiJ{iL}pfzMڀ\t{C.+?a]4].4^$Y/}זNp}-a<;Dv/x뜩KkOrzEZvܔ)TO̥QFw]u'V;޶KvHGd0nRt|iVı7)-eOߘSزGҦ'Eȹ=g* dTq>'<9ԟg[`@=jOjN^gT[B6E;%,;_kiS 4#8CVqjI۹oLg GP邲c*[UT6>&dw?5yPi~op};B iC hkf99[oB`]7/F&b XhL-N KcбWГ=6:.!+!,2!7Ʌ/sdrߎGfoC5^_٭/sM.6^cuTtߧCAJ(s7pC3QN 3X"q362LXGYcM<+m",!2#`4̠ЂvbD"&Q[;}Fgv9Ibc sOor$gO=c[e4v M/#3\Ww/ZiԟbU[XfYL ]l2&ՠS!qf:{kx+K !~׬-rX)lIXv3TIu>1Y)c?N[*a0C;i$SWꤐ{6pdo#zXF+PhAWq<4rG3ѧ3יޑpXkfuYVKy 4u-6 # ;S~؟k72L6<3/a27]Cv*H-')@JAe$nN-@"8^]-U*0{_;5_a@Rc Č`€ }W8:t;q]G=8{8QlklKk|q] ǐ=N^sgȪn hlz<%>9|bF] H8XL&XmewÉ#hYGcVhG^#JxpBm~@j =xGئD>xm,˫gyv<9)禑ew/èQgmSK_Ko08ǝS0䎤F$+m+CF# {M"΃8= IQKk~/>Ao*KxR?Ü<3_\[;qV};O.}9rp3kR)Slk}32OI_GŲ2!h_[5Md33LH + ' ׎֮7 L:$֦> -,s9ICb8.ك\7t'Fҭ<Ϭ<)XWwVeƹ~֮\l+]&#+.A&*/1aa^)$xD&}ݒƱU)6)gP^! dGw/R3}`~s .5O|S8P<9X;vTs\gyyITM&'{uF7d[QS&-BZ oU7MdZ^J6g'RCU<p t( #ݝ-bZ(|q% `Rt?Aɬ vt4MVj8_{ǗK8*CV9Pc9ˆBNjZxa -8Ŝ[9bV81t/sv>ʫ6Oǭm)F$,ݚ'Em35$&wRVtCl&@V+?E4Ȇ8-T7ƞi0J{`B:z] v3ۤ6d v6އ <@lAxUR‰M&r;aSI$$`-%/>\4Ro ¨tu'B;īš\5']At'F̚ y\<[&qKkp[qqiIT&zZ;B39DtLvOql60잧'A| @'` ď 7j{}<VyJeOD:海I5bϹ j1Uio.b{Ѐh6*W<yȔ5աn `%ı0,"l'gzr}\8yd$/Co@6WIe'J w u-BQEf#wLJhgy.!pp߀NvGik%`5EԊ= @Ho+z[v'젦djZIBH)v= /sL\ܢ]D*<πNs#!(Y:xp'xH5:_ -"XJر7/fNeЁDF/հaD Z7DFcA]5%NASBkOD4,)et.ws ID1sK1<-tP."9=~hvVg9$M%l\#1"chgu-($M~Ch5M%_K]m'_3s_S8T~-2i'SD6qB!׍n[)@^&MF̱OuM$ʌ;9?ĉTiG*y_ܟ*V&csdUy$vzy1bAbT t+q)xcjn*yqrPUP L2IVlaucQ@M`; @!.^. L@4|t 'U&Jtp0s37ɡmdd~jQ3ya6)^xݥPde$G.Vͻ1 *'&+Aʹm~-;V߱N`sQa]־xNZ]HPM:9k,%4 KΐP~ w){8x^};[MiE5ɨu Sdn`fXbU]*O,}7V.&JPdd!_@{SZ0K4 a[ ~қH f@WF3+=aM~EȻ1 'z!–nGHPq]IhZ;۽NҢly Vܐ Ahbǧ-meӞNMAQV Y{(iƝC [3L8^GA t.:ɳ_浭o#ƒL'PH2*ONX6P 6|Kga"A?BWE֪ɀmd`+N^1J6l1Z 6 9{O[(ԣuBL'ߛp w4ʒWe%0MEdyshxT%<]RxJM/h`0YIY4.y9J^Wc5NQST Jj5q٨b^x6lB 3Үm[vyFȫa,8ɞ]?ŸīK  ըYVi{ZW # ˙aG[W,BD! TYND -ԢՎHIv2̠}EEFI`ZtOL`LoTW`l8 W",C2'r-ӕ9]y+p +YB#qvҝ,RF2N< @1;F_,0a1RڿL@GG)7mr#!n!b "O"* Zn( W9Te|GR-g_pcoʖSeԉlj+ܠ[}8_{g8_{5kyFb5^ϩ! (p1Ftj= KZ抍 $FԬ 篙hF v֚7^pǕ-6Wm|FViP6q&z^HGYlxUwc_9R}c*{UJdU{Q뜩}k\D-ؠ5 "ĶgNT%- j5 PGT5"vBHmXV0saeLTMfl&@hQA->-u^lPD1Q@F-ܠlݦLFeiDT 6Oq<_$g)cQNg<30UlO2̐\{՛7ZQ *"/:j"ͨF3Ҋ:F8o_.omdG [P'S 6e|t>9L]R#As=jn6i&= h31olÈ4¦ }}p=c6lZp6LZ,d_7Yk餈Ȥo :L%Zd]^²#<2`, I|)ޠ:5)PF %22ǾM(i1dO3LǦbُr]8_Fg+4MVQ3^B&"^Nx 2VwS3J;7ȫ"~\Q$kc0pmNغg(A+6ަ 1aud'hp.}|/+gKQ}o%lFb7_O˴]`A~e3aK7/d(p`N/MAF@2l=rgEւlFhw]+cY=c N~ҧv=|RJUOr&AFK!qDq995D ՙg)88l]aCk/'DЕ" |.Xg[#f-2L!tFtO*Q͔٘R&4.QRRF([c 4!B8R}t#SkXV/h;q;\|og㖳=drP/3wPa#s2bƽWB"9d֪?ǚ@cRB֍QR[tY=mLBX\4oKr!|9ta| auDٯ"?d5$$ )X%\A ՙc*#3챤3 If9Mr "ZvA]xJ?;/P82ϰ5ô{C K`Y/tJ/֖s%t(hů4/U·mM_.;'?[;77qM$ȗlېuA{Q` 4{G-Ȫ"C9UFINyY060`.?/6mAb *3l0eeȞ)mO?C%\c;O#u*l) 'Y|W<-?-}5B"di2~͖+uKJ ێgzq*Hw6 rHɚ`l_{w ~ڃ`]f by5ƨ} C4BN($. ͯ,^ntg΅=qW39f3mL|X9Q4_N?a'̎ͅYJ[%&W(tɪN(4(T2GɪaI;٦hwIveWObc!.soNbd<Y(R{3f]CAũ\b[P Wof+\iօ؜˰z:OꋺqKV㷩br>JLdUymeq)d֫Z8yMu&xa2UhBG*ǂ eMdpɩ!5F^ e2#3XN"I5:bm6SZPR8Zq9Ѭs̷NS :ΖkP,,V l)/|1򼿚hKE\~NR=_cMe-8ҤO1:k Y k' r91D^ u F`ԉhhE$906 //qPdPE,P紛4~K-ӯoP&yxN҈j`ڤʊʩWFM@Y6W볥>뇼e-Ρ80of=#4M"c=]< '`3$A=4~,ߩǐ񒹒N2(\$6c}~gz"AOWd;-\couftbaB_k.㷖R=^[ ؘZB8{+;Ҵu_ma$Q<bxI5Za]ُ}O69she+ A5k Alzsϐ^>*UM{(VD=(9wԯ~ )^ ytkUdžC6X7BB*_ LaqI0} Zwn%6W _o~kw]}H"W^q'eP$ n 79EOÁg ^|Ύ$"cw &Ae9c-v7O ǗhJ8b:#LB~*D7K=]J ${ MH xIDAT|Mڷ|TF8͞03 ̖fD;K LN=~|dC tvT̤@ i-7E: f[Nvܢ fK4emWX#&:*9,U0{0T5B# ̈́Xhso/ HN;E2ڢ.m23^ }~BDi?^j/ ` ϋI/M(  :%lG{M+(RHH#c-x X O` uO NwƱXnDa8ɟ"3W˦|o[9}EJq(RYJyyٿEEjo&߄X!ƯC,o}Bp4p}*nHrs'!P }"g Ӱ꒏epXCj kHv4pR7i$2Tos,nW|۽E#/?`/l&򗿋Ϟ{tDU{,b#A߱Kid ˒hfST1ň#M<0bk g``kw֚5IY@IyW<-ʗeR+2P8ݦ?Ў^QNO3ԷzZGw Ul{Ƨ> ~G!6!=b4;%,G.qeμe7dfv`",kڹ>Y뛽{!DR昔rm2>(RWENM-})$\7Ed,Ws c$@;GڴK(!^!{9 yLc<§h݃G;ZKXDEXE .sH}t1F$y3~B+K>[EFsno2 O< 2izwE2ⱑ]Ii-$_Op$p&Wop/σ-ݠU hq0KBHĩrPv藪 ~lPBmGw/~SPJiJ!WY];b&Z7c2En;^*'}cSeN!2>K2:|0ZTTۼ`PZ^ <DOW"M\P7d|b>QRA-VM-V;kz4\4O{=G4nW(PT|8y`6t ȸ_&_fFga~Qj7 gL7MkԲ+ihF=l"vVCzM&ٓ5G~EPx桅Ƥ (r QJj?]~N.&y,憣7R~!Py P K pGOzwl>? 6#Tkp%vVW6cuXi|-'~A$‘xj![G69"p?fïI:UsHhIc9!IJF$mb6a zcIع߾l_MfLU:zcDS.59@m'Uil!Fg fp?^QC,ծ6,9VMM66hi"tit}~غcz[Vp<p?p|\_2 p}),aQ#qG׮<e/2<*xhPY ^H. e. Q.zW WWϰldC`*ҫ}'>!p %! MaRMIkn 7B )ԩ&]N*T}fMfޏL3k0п{\lC(;5~~%zcٓ73 Nj-_p a |X& 5O׬0Bc `rj Ppv+@f0mI-50K<Rum2oE֐!yX@vK߯___^)IENDB`aqemu-0.9.2/resources/os_icons/symphony.png000066400000000000000000000233661272330227200210660ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME 9w IDATxYl\Yz*Ydq_EKKRK-gz<C,qp$Ny0Aŀ<$_8ĉNOn[KNk9y8޺uYEEK}o=߁_k_kS-xn8z _6 ]`{_A 8eMxÀ  tn_{*pȀ xˀw 8, "783?w5XS^-}8S_4-~Ƅ)9m@w& 'N1ax  !:M]N@ԃ 76F$/LM1~\s`e V}_,<|MW /DŽ04Lcc:~C9~^i92<6Fo&z.G0/Q11m a#J뎏H`|rSShtWVc<"(R !Ì<͛$A0+/ -uKzTo;vLkɓLLM"maˠ0%%ʶkk C@/٠7/-XSZ_1G7hO8tGrF!Kq8D8jm wn3Y̵5ƕ"iy B2 Ez|G־4 Lxӄ |O ;ƑSohTWxh-/44h&COCN tvv2z88|4tC"t]R)n]Jmd6\X{ 97/@%LBI_; \ vn HGxuy|? ,`QMg2>9I \\qP`g/-!瑳xBA3hk`&"xψɐX2I ϶Df+>@:3pR3mwAh};FG8~ޑL&\.^>|o4}J%2ra97Z] 8k]g )#j@ܟ& Ii^B~\hʫ+{y.}N}K *. նQKKZ˟=C./۶6<Ԁh= c Ky_U@*bK8 d:Uo'B{4kfyF|ӧɌwS`+0 rDqSJjeEk)?t2Y t7c϶9pѿ  eBƫD#a߆d?\z~hyUTӧ}5^@H"tʈ$xX?.Pj}U,U":@țFI0\* W;pP|@8nk~%C>U%aځ'>wޢQRP@zm)mG@v-~MAfc iیwv2*ľ*MOzV0bۻ=^<'O}p(zrڕAT:<1yzhki/1'qVph cWgޖ{Hᗀ)|Vx4 Of/0|='N`D:ڡ#MmA*tj?/~ $$gV!e&h"쫗Cd @z H *_EmIjxÿ@ (%C㴽Q`T5Ps]SmmylfͲ}FR)]Llv`cV0dya]-Rɍ&h<9:58TD&S)SG5Ѻ@ bocVWXbrϓն_5jt2ȣGuοF~nZt߷T`:QM]+X.5{%@7s)KB7~.xǎ̟oVmيAPT[J}?;b~ dsoGezK\k7b֜7#T O::[qlw7mks>BPCȱ1pj.VlE*Ep Ө=CI$a<~ysB4QPcj,nqp 5iNѰOըFMgYLR!#fV"sP?[V;~_'O~8V%q5lCKgGN9PpIµ/ ;7Wߨɻ\yTu"Hצa )EuXGĄ`W}W hc.bϓQTd# NطOH6FXZnON @o+Є;ǎk0` a뺌r?엇uD~eYC<ۖWK<u-i-c`HH& F+=y @ڿSaS~纨GP}(nZ Q5^#"CBsXyx@ oCJss,^og_>^qnEl1XJ1*DjlPg 3 G_fc R:,l&W/J1>]9nF`~ŋryiJyAcNB{{higf¾z)Ek'Vصp._ÇhrPczX-o,A6VD"ڛ1Nt'ñmޕJm`Ě;  `%r IP a_St'fhi]6tcS/a^xsOAW$P *p-1NM,Rq~ S0$of]FpCWGt=Q7 A$b,[d1&#_@=8uߏj9 ]Je7*PKG_#g1s oWAV0Znl .N8Z|‘\¾MxN@i?@`&6Ti$y\_A}qeؘvzmQPHoawnٮ1 pSod~2  ^: FҺDY6x2bǷjT(slQ$SmUG-v(8 X2)3AepoشYB+ЭaG^@9 //SaDWevr5}_r]HHC%by"%x~~:3:g3J$\=q_7P[6*GFhL~u>Y oaWy >: mc-,|:N>/ 5\0uq:uxֳp~mMjj_D-URa1~5nşuv xpKEK<|-n\<Щֵ5ݯ-čʲKvp( mnmA7"@dzrfeiDK Y^⧟[Z[wB0QxW yă[;77ne(txg(3J'ѭaHKK:;ʆ[;~=ǡcdank(L­.G7 07or}otk(ÄdBWEGn#Aܺ |ΟL+}9@R+KpLL:Y`G,*'/B;pE>|} o(a@RUsw n߄glwT߫U֭U+C6D͇gT C0\o%tmb;.*PӰ<~ίFT%k;n(D6"E03XYb)cWL3ʠ`_L3đ5֛iFs_3~'ytr]C^Ay2!U_1xh\kUF<ŜƸ{}XZDrH!پ*BQmhf;~"U>\^ARk4ZmRobܹ lַJȎnwZWl6 T >׮ 򧈫Mmv})9|!(q뷋˽H 9 *`l6Z.7?n$p"HL<Ͱo;>gx =ֳPɠrOHft\iZ/kk,fzPދ (0ȯ@"e w¾zϓKz`gΆ a zL)"|lÚʖłPRSl}Xԗ+RXu1WKJ1ڛ!P*~@/ͣ|yp#Ź9)bբy>yU,6eٌ_xDQOdvk,//+uº;k9'^Rdub,mikIץg}/s6PoIv b6Dg ay>08H3n\Ӆm};s6~sgapeT3^ pق%82*5{~ϖ!TF]Lw ~_8p#nTi?l-P`530ymyC:ؐ3 /Qkko;ʳ,οFGnk# 1 =TCVWWa8xVCt$PObiִy5CZn L gҨY8*Y,X TWPDA!PY!?@ڼ_u=evi&Fz@QJ1燃 Tڎ`;6җz/6_X,ģG3LOifɮ}dX*Y됉 2.fi,,-QOzx.bK`+"A/.kD!cP+Ӻ4(60Qf7o`7@ eaYeB*cU{շ00qKE ʕKOߣh',d?kz,Pp!햅)XN,fdv IZmae!/uLRBb1OXq *] v8?zd!>V0p*`p V{ "K`ڶ@+ؾ . {l [uWg_BPe/>[XX.fkqNUxaj(>yڭdo\%7+zqˠt͙g X>~Jxu` x_Ulec\o>p %)'\F}а.C;nSq pfY6.0MӰ'bW)؋zwEE˱_y_y_[7KN $"K}}}zd[: 9Q䥤(%%)qֳn.&4pEJOˬ߻Kaf¹q-ρ\O`)  G 4k.wIDAT{7 XkAyIOø#%  5pǍ!5L/Ja|-)C<7˘?sx"g^W)L.jyxO|Z_St;9_9qy;~scǰKi* :;h9iS ;yp.hO3Np.Fm)=|Hoݠp06bA},`*`[1[^AeR b*LCllcbg ? ?2l.G\f l*ZVahT+_A>vܙ{ETîk=]kxۍ,Q(& ],y>;pvu5{U9CDS K) >f<718^K<ň}Sz@D*3<)HrFD W[Dmųn%P=w`ʵk|Zs7BыfA3JY 5>Nf)% /# !PRxe)9;Y@@,ߎ? 8O*T\GK54X wb{{e+'k8EVK%;:4P< êX¦9Ja.E%^V o=?^q .pjzf(2-@(@NPn˶Y(mkcղ(.ߎY7|ZzUZ+E!gZ.bc&5Sgշhv܉k݈n)/Wmf֐vMV*ӭ46y"8WJs^;nc]ޘu+7 PzUB`|@CIeqȗeyUhօ5pϵjgMR /gBF_gpᣃrǶiK&}'|8K% 2rDNΣv<;>klY;SKPz-Zc1_vq\rD*q]JbBDٲp ;T4#ߎ?vr6g-h=Kj[wbٞo+##_ZbymBx1:<,5{gfk '|Dw&̺ٺ-h>G,Umr -:)%3'߆:'Uffy)\Z+Z)87QLg&V7\}]/pzKu(ݪbմ^Y XG Q`(5E ϊuqhǿi>@xK@zT/qJ/¡vֿ)hx]o >Llp$;`ճ}Z:$}OasRGBbKGD pHYs  tIME 5QQIDATx^y[u=II^X*٘55 4@ni  'M`d 4& xĄ(]~M .,!hfq36v/hf$wlH=Io4c3w}{}0L0L07L6l %ڪ"sD0]M Y QPQ@+>H6xq[aYy1eL)?%Jފ"&Uy7n"ATCɥS3I.5@ wcA)@w\<7for"4WP@,Qwt`,0 q?@ƤGDT?OI71[tEQ1Ɠꇠ(j+rTp-rdIKA|'""d)+N=Θftsݬo\:U@ WxTH3rTX9.Ii{fxf=UU!5ލ~KV(3zk!4v_;)"NAu~+~_pCwr5՛ٻ9FДN+"dlNFQ c9fZRϵ.!+"s˗ޫʇ 2׆l. {CϨ@.$-=ߕv gp6;rӨWB=M>QqMOx"yn Ez'xM&QJ.հ=DOϬtVu:O֮FP[UCU)sw4%hbryو2 iw4-:YʏhDϊ+^PÊg܀jܒ$NeWw;ʇ0KŚ*3-Ia]zU]ɵ1к$ |nb0?>&VAɦk㫺'h=z1v#3u xEDJQ4ȥS|TiݤCD0΀RM*\:yWkg6B `xꈟKElƚv@wmusÙhvF'&_ZK`ocWUG٪ aG1&MÜs:,̹'aL##@JRfM ٦:ifzVX6Z#MnWYt5_4RT~r/wSElśvDÐG5$)ngb~GJhD.Iw UDwzbPUb{XUz"I{E՞iuu5wWoAE 4]6ы3VI `L:U0LVg?zÊPzAIAED~QFȥK'#rh,jDνЩBAۀZmޱ% g;GV44O *3rtM|DjQ91D}kBb~]9A=@{+/!.I>Ķց♮ 5sf-1@>zBcG " ]HS(>l[am|-'|Qp.|Mp$jR`=iC\kJ_ j r!ū1ȯ8!B۪ f ]˜tQ&tԙhn'uc8C*]^Ύ9Mh_7-&|ڥ!H4qQ?^V;6_vn gb6&( *ہ;^`ho֫"|bpFe,"Kȉ t*߬Uh_76"bPiIVCPW mOHD?3YhoLk`N'֪JW^BRZ Wboy-qÏQEb{&J/>iy|v ɄYD 1M?IFn'4\\& ]vt>-W^Uߓe!2>Jן+VBcB"^Kh%rw){i%Q {!l:dt-i^M[kV #q-߅yHo9 y7 XGWY,cFZ톧|+ ɯ sM_ 1Ch~7=w]D_oQb.y -bmnB D֢VTGA&M<{Vo::>VB~t {;n S>>ͧ&K\W  Xj9ݷ;~5?9@ - &: U%'7*Hujx`DUi}GF~n GZ'ӳ_F "H(BoCՋ݄\ eB`,0][Y~9YF@qz_wy\DenBU NEUY'J;WCUQM"vZ-!YM.ܪ!HU @!E\|"B߿_˰p&3'y `Tm"."\*g 9_~Ml){X~& aB SMz rA"D.0u5v_H(L߷&6&R/pQ5vT/~>AbS=U1N;(Ĵ2OU\۳ɖlPĦ:k#J GD(>yGΞz3Dox 8q L>̓ԊmOV GhUz0f@ѺI""1'"عwJw){&M]Uf,`mzMnbD>n"u#RYՋ/j[}ʷhaB}2c|g9^gt-"=F\HkU1AɫGB-y7_Vo%zŽ}j27f;ERTZ?im6"nbNYM}Tu>3 |qMQIۍ މRkc E7 Tٕ.Vp[ yZ>N vS>囊A[zgW@F^+wn?&\g;A*jPuzkÉ|, fȽE9C-Nؿ} /!rڈ(`b/ڛC"mJAZ%>(ędsN3 |I"#]K"{i9rZAʨ{$?@E╮UV .!mS)bmzB}ݞco!Tgv PÉӃf Xolw`dh1pvXbphn/1CX=9{pvmo"ΖqF)Y D6JA. E+jY!T +s핯 h"!{K}#ӏ,o'%l. Gh-SCe]Vsm#HZW` 6̹Qedqq5 @ CI l릊V<Ҥ#h3^2ş~S݌/>{DX5ua&=ހJU*C0}?*ܰ/E|f ,r71b[5gg $XvjmE"Stp>JYC =Xych_v`CU -\Ԇ*:B ĘCq4?&yQ "VoOCo&ٻ]8{"75sI{`?uEU*@. Si@[A"vB4t}iZ%?= t@ \CQ_!cC=4FUIEvzX88}=k?*nB"pnE3炒18ns>(={h]cYǹh@~u2*݁7bPxw3k5mvCD(<|T*~\ ѱVNZc ږ:`'S{>N,_bN{mN#ru2LW3PizؾA髡V DNMϪ?B }kHT /IGV%%+QxrWAعw)>߰#˜~$ڗT-1[@{i)u kIref~TKc1V/8*V!S)8$}8 g6aѽݴ^Q5}僘*EMtaZ>,pG`1]%ʃ0Edө굫zݣ_yq3x\ۯ=%9;.~(tI;m-ho5P]I&v H. r OU>z:fF1&2^q8*/S~Yh 8=w]D5N+][(<SUd)_0v]'KQx_"*AA}oItʒQlK>Id4Q}/I:!/zkc^ylt_j"C(?SzF~3LWAi3\5 *B"{ɯ\4- Ę{2O|҆?n((S\Ztzq-U/< nc㙮*ѽdl>^1gm&?"c$rA.N8ȢO໕G}[ -(=?܋4Elś6JtLnCn՛ɦ̥5c0?i#Sf@4&ڛEwmC{:lkv~P"jеW9<2]y=7&i]&_wLBq۶" V 3][PU1$nY_rj aҪ\:IMMѕgŰF1Q r5MG"0;;*n C!tM+ 3 sId}Mv"" 6A&2W9H4+7[$:Wa=%gY/}Ml_S&V 3]$M3vɥbbFFK}D !W6|)RN=Q,!=DN[LbgI3ԟPX ;Ŷ`V>K` Q -*b0Y1d44{+XF}5O)|lh;흴<1UJy"7b FC+u`!f(*北ǢlA."y.?>mVPrw$hC]P'E.@U/nQxA<7:իFSkS_$ȋsTUCo{w#aD+gCr?5ϲ|hb_J۞!c!dPQj}j,i[KД z3vښty}T{ 6 VBDGBIMS>4|s73UVC(TEx+ewtUK7*6NRГ a\TExGcPDUQFf0nJ4N]7E$؜:^7M#\#"aQ9r3 ΰ|ClDGl{6d" 1.AYA uPp@t'*7y/2E*Q}nF"r*,?>2ZC"|GU1D̦ n1ɶZmC MEg|D+%YAQQy[E y|'` &` &` +IENDB`aqemu-0.9.2/resources/os_icons/ubuntu_v2.png000066400000000000000000000105251272330227200211220ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYsLLtIME>wIDATxݛyp\Օ-KՒZlyl;80`0L@ Ld&0LRN*I THA%Bxllcd,$.RK-޻ZZB2ܪR'GVab5`4M9x ]ChU"A&S27]Y>'U,s 4@cDg6%r`PӅy҂Z1|Y2,;ff(lX1*@QMr1yAa0(b>M)uq/i@1UdFqXl%z\* s[8__֡؎jz eLRO<Hl`192m }f,G[/z TEcrփ=@'@_v*%3SlvW ="#j˺ -;j]D{s3p 6S lT^^l_4dv]YNn MkA8Y8' m1ܫTAv?-_#dow?t|ےdׇtE&qˮz|okr&P/&|k<H|(ut7 =zw^zIznTR<"W:6[1j]\[$-h H2z'mA/*Bp!.= -YJfu2cA22Mw &q ]kpDLkV?p' Ku0S 6M{#",ϭ!&l2<~xC_3^{lkNx] %v4( 4AGY{qB49H~W;_aak,S`c wr[*>0Q*\F$>5H &8Qߍ\q7"ӕ;D,@&=k>#{g>| /63a5ʊd%MKRBmim^;K¶1ڧ41=ڃrkwuYVPaiR>)9]4ٖVl䷛C51j7&kWbG{-3 B>W$7QҪ˴61s!+{"Gֽzܫ3`S$KTc (U(xBѷP>+EISf%VS~)B̓w]\KU4x?q[fMz_G\b)lmmA㱘Ew NW8Vfz;ǍN4C騜B89 tb(iv k߯\Oyap]BydeQeOp!vb^m\{>xrKhס&sW\RPI(,MF[vkOLmu EIw n-TKPSKWu3}ܴ7v8z67edI M:un68Ef*c:EZ6փoŶ/g*sAnM|Vؾ0> 8IHDBKSf6w~(?q3x eoF|cy  :ٖX DP{>.5 x 0gR@ؔ3jJ2$ HJ<;k ㋕q3EsREC5K9@ŰiS8=(j{^r#{LY)J^P}'rV5Ius?+yKhd[~yYDJazd,Ѳ: ץ uV82gMaOem}ΆlyyvԂ#ƎOͱd~sLNEZ5s!2PQHsx|b{U{[#K̳a9෺6Xt[ .*RF̽=g*[^rіxH:0;%zj@Zc_<ĝX3C|]?Jr:kY+2Ec>ze!je"3T!0 ΧўrJǍ^Fyy _WQ=(CdϰL~z+FcǍ*g˾A`m>^kcޓ}DR߄4N5XUΝ]pgS,H{c#j8qܻ %t1O5OtOT ڂRۭSU(KG9f$n,Gg'T%c{ 3ՉZfW*rǃ@hĕ[P[#(翮*l-N-# o|etzbd)C0T855S/_kCM؁`;}X0To 0wdǵTy:M55V fc4IIhGu ӋY^24"*z&pX[?zw3SUlQHLXKx/-Nmz>$o"ˋZU::+}e: ㏄E$m](>RsT!>bʧ0Ծ~ u"l_΁9DD?JG`Pܶ8(@+&/|.m <ƖO2S]W}8H[{x?nkp~-cث%!HBuI;|XSf^+Ћ9*xgSyj{̿WI#M-q{vM5GhQld omMqʭg׎)Lh,W;SEŝݭ= &>:VfB'0%zdkis0${ç1w La{G_}`Yq h7e et`~ \W䩋2EJka/;}"7a"4u_o ˳{LVĬq?Z>"L3[VnckorVQeSVd_cY;69?ݒ>F>ol}XzzweK-.ڟ# uF 9pP fgs+sh*,(UK/:Lab 4myhiO*Jr2ێz|a )sRAZ"9Z& Q/+3A`_ƾ'2 :y(X-gC3ThbPezgna$ C0TS0GsFfw8*FYqKo7w_ui0Nr`k_By8v4ݑ x6FQ#,.fxTygGbgs"uAt-[ek;l*pz±a.yuQWw21o q~8Wqj^Z:A - M[6t9Don/T`,Y`$QD) E(KqV-{RȪ9JSe$q:h lP@C\ݹVx߀O0zzM6"?XJF`,YX.8=x1lY?ɺg8ϓHyX8D[#$ ό֡^"V>:uX0¶0]>zZ 8=ܶ:{YƣPpv^h@{8DGďgbҁ8ΜɕOSyCh'h܇i P3ߝ>r%<=GL%~tD}7\<R)60̥5+E vNK9[H V5x]32#"*-‘.;a^wc{ ay;j(,,cU"\ 0OdK|N0 #JO1㑧/-}n ׯl{z&8fߦHݿhkkG>H|L\_vQ%bEU1%ZQ@wY xd6g 9ўH`pPf73| ?νq[ \92>%7*-vB"Λj(1tɖW2]` 1ZA)V'Kj. Y pbh ́+ hǎOR():ˬSEM<9< .$K>!iJT9O־|pÖjc*+?oЍ! &\uU#k4rR(i՜L$Iq,̌oRF t21mX$qeT6hd8""L56<,b+)1X|%q?tK YA0 8a^E9@T*[Za`_o+Q0m\srSř jV&agβÃFzI8M"wꤏɬMqr1zN0+n]NiVZ6jnc<'ȥUm~Ln~ׅ(3'<:uqDb)%Y^hFJڡ)vrmQJcw6~%叛>sYe NJJ33 5Ue,zNw?Sl#F hEVHM:2/Nr5lE{kͻ5KGMȥـHfVn0]O.J&KJJEbw~  #뗴dlѼeNvjB˞ߑ',ȹ=x_⎆k`N`#[,PT| H*8l@Ͼ{XO>iN-8)нIV2Wu:2'>@@K>ҩ2.6x7p-N*Ys0O7[Ƴ/CQNz٘?ҩαaWu SM81baC' k{6`g\MYq|ږׂdZCW5 UbɔPTэ"DNQxo}Q^yn`~[]یF3ЃǹyŲEQLLH^?wAn۞dMREQWu.sւ`:kHNӢ#u Dt6Ax8HaZ UW6qX `s7\`rn{dQԅז5IwUˏ) TP/Sjcf6lB̮]یy z`ɖL oL,?`YN̡ uBmOqz ]^[R9[,48 +G?-䓠zb(#]} k9qy:I^gKC dKêZkz-TY `r窪WTpZ[%vxqˡڶia<s,2ԫ;xS(=U+Xh@[TohK{Lv3`gA,w.Tu,6yې\sdr|w uZD;@OЗOgj!ת8[+9Ƴ )* !;l||th \k%ܹjs|l&wZs9.Ic]XpgQKE|EӼ+Yj!H w{Ұs47p=SY@hqOXk&RrD B;[l& h3mr"cz/ h1ĴˣjAZDẗ́ꏈXkl-c a>y A5϶p2wyѵͪOY1sgd3h@DN)t_(v אtY4;kYg_f=-h,y̫Ksua]7> )R'rM?>rwۍmhr+ iLjQ/=uN~]8ҟDp̪;YH6NJ0%PY}KHpNRvR l$`82:4:ޮo˻=~,?~޼ VLӷ>7~^x<d2gЅхퟦ V/b3?A/^bކRKo[eTv^vg<=k hrg5+ipx-X١7BM/)H/jQ$ ?ЛkT5Wp aqWnk>r"tQED~n-6RRrKFXvN-< ^I-w4 !Y<54O?7B91ùoASaKȪ2?][!5D."?i)ɞw; 2qd! S뚐 CkllKfMd`5N5z^XRUsˬYEc~;l?W4e(";C sD]t^[_ ׷7s&Ueo%?#;`"gj f>!0ϙtqIʠz56ÁэqxM|G "UÌM(ghF8qzvVuSkD7<z׆Yc 9 .قK0X0Ifф<  |+Qt&\Gf"A53zGy z-H5DrtB!YVv D^ xd'^8/d8.sΘڈĄNV dƉHw+OX>Ybe1cM2\Jt M.iF冥L;0Qb Xj(N Yk4!O: /srd̔r*êmn"~<Ѵt'|ЁM"@Xɫ:%͂VNS \tE+bhSn`gZ'j?hySK}24v)NjljiԚ9{R. wY'2NGk_|hNSݷ ?}b }"503MY4".K_^n8$ᒤTY0%vPms9Go\l0JqrKMVj>AAHGEgԬ m!gY2@v@#ʻ]+o\E-T0.QK64zAoN[GÜh'h>[ć=3|w 2k:wh0wª ~yC/N 9p{$j ~4iݿbgvOA h1 !CE<zB~vΰ73{\',lz%K_{vWb(gh\Yg^ngwc]/iVbl\=yNsãRifcn_N<}?qW5x=h1{zZ _&lwasRGBbKGD pHYs  tIME kr IDATx^y|U嵿I (8&j&ֶ*kZm`Z`G;( qhePI hUj֡̐OBsII^χ{]]zmd^*c ;Z`8ysK.zּU̹K~8HU9eQz`t%vL0@̬Xf !3UHsxo|$IOp ̨X yg5l $^]kznZC5}F媛|C$qfUZKR 9h۶+ģ9?ߩxnD:-vA]e `OY˟|;t>'j$f[1d#D{@~AH5f;'ʋݓ ]'[w%af̨Xq\4~g.,*n響`˾ &}о~{W)ShѢh8y= Mi䢑2<иkxȽ178:df:T2f:xBGZlfڷ+~뎾5K;{f=`>S2ț;ml\WOx/qN eT25n720!UO"g__5a!CțTs͒(M2d~Roț1 3L֮6e zvӡф9slJc@` ôfM*]o `ρNO2Xta]40QM~b@%M.`sZwF ٳ;Rfc~Ro^)r3+Fw5Ju&A@fȝ9fdT>1@%Ʊ\Cv 􉮉3Dfʹ&!Iun~H 8J^@_طTuJY2e1Ro"\xmk8 XP@=7s{Uwq#aVU.dON2G)?v/{^+@@j7^Stɨg$K̐O.iW]ňQ^69+q L7O 135WSH=@٪ P]}IҒ7O+9F~&?pp ;Y؈wdͼnb]~TTŃ@&o@rH(Ї-L8/, 3`%U[\oZs=$:^{yO*o{+o dOc\b.@xc b2'ca. Y>;HaMK*Np@?q[JH9f&{ K3\Ǚ RIǩxAp 7˜@. 2?p~:n׭ Ɛ>3= =|<:.M@(kg^90`v7h)rw]{y_.7 \_xn3 X"L&{O%'LpZ%75…3bCK ,k>#I6xȐ\xVK,܉7Ҵ^&,27p#lfͣnsںp7D?d! Nq6}\{};W y~*ZOb"IʇHHw򞄚⸹n(r.kxzת^v)ڥ{YVAakmݛ.9"_1 `W_+׌=;lkNm座uU(].Ewtȝx0=t$py/,*跇^6 I`)*=O4|Yx>#//u~\nFrSMaiU*ipbLr03ODӨ /I"%nk<Ղa=k~mFO6Ӓ̊?dŅR|ɻf*1@l?L{mmyO>0u!R7_ZBãտ{j݀1wd!jK{zAbQaUK{O}xO{:v& cTK.@rGhO.HzÜ-tMA?^*K.TI~ NN*/!Ey=XhGA=-2,#0$ȟ\:1i1Rgw{]URR₼-`Ls.x c)#L~ܴ$#H,ov y9}A=yrɢEȻ%U%fݐK e`XN]DZZX;B4>Uunw!WpƱoY_%@ 4&86PI @+mo~ߑ{(0 KnoqYʎ-{odIrK &,ȐdwVΌz<7l'&]M޽{yٲu ߹[a7i9G0\FV0dA#@ݎyKXW~ō <否ProAn׭?%kB$a۶m Yg\c(lxl+oiiIzwkUÛ3ӡ ]2+2l(v3_z د~;56l(Ĕ͠}{f}8ڔ-`ONsenj)ڥUN,Pg)F_V9z1ZHtVQ rBN$U‘gs(leqIiSS"+{3X&| GUj̙מrNO*هY\B.:cJHp,yK8p4_/<7YGd~d԰i r>KVΏ Y9_'>9g"e@vuñvlD6"o{1df{XuI삌=N̿g_[')юs9 ='{-CfF*2s4_ ^(`^}Lbֈ*m{6NGS݋i!'9f nf+1>\]εpz%hDs7G&{ݰl:7M.WMX'2oìmׁ=b%]XsлlِT%{җS|(¾ف`}O;Ěݭc~APˠǁ{Ӿ@fJ1 N!g"6kzq(!x&\:~<[G0 -{DQӻygผ@'oO.֫ޤ/5z~˽3'>8v{\fkoG5 a8/9[6fbB/K7 ='J#!I2azY\'{:H9Fغa~BF`noj_dmI+r>M!,.\jJnA8HW "LR ^G n͋SŒۇEKp2[7|Y /Zn^ew'Xiii#B( 0EDÆ!4l\Nfdwk=х+f#rIbᔙU2cZeM.}8$f6G;jm}6KjMkuFT|"4"^O t(1Zɭ7Ɏ eO:1*AU^ ۖa5^\F M4,d͒d99cUWht2қe]iC fWǏq(Y9)# 쉮.Fdޖe ]u<.1$Z1% sf}:0rEdAKj疍@2oҍZvyA%9My1@fNȈ'eC]0T-8tx 8!7E@m_#}kxcrQ3vz_ =k/t,ɷOM]Ske#1G0__n3lRd|7lxQ2dC㤘8ЈtqV5'e 1i΍5|{#mO6^wq8F јY sCEBvBOHa4CӁںdn}*n A0v{&F:>j;3+VyI2IEs/ڱTDIf(+…1FW(FjfVyHtkvq %$G&>'{ 3cʯcz >xƞK e EJQǼ~_[ߘxWy+l-2[fV=S"%ic~¡TE@ ud$fV:SBInw@)+e\yW`Vz(;R|'RDصy_I P֝5uX?Uޥ>tǃ Z4O.`fLG^%п_KG?V0rEfq{3SW(>0woO6P 盖`fH70歘lKjU$,,L;\ kv͙:!3 ]{T>ꕃfVp.5-Θ0yMcF  L|pmA?itʘ={6?*ڋkcd#sO~3&#RhC&3-`nKL[e]l3;1} zR1H2feh\xGk!py~ݤn.i`bq{q3*V]G]'="1הORCyٗXZv 8BI`ڰ/:'jWΒ̨X)ހSDƷoh[i!#F$j$47WCq0C2lнA8[Q dgV> 87Um=2-iC{Nr{0}`=½Ҍ`@ymLv LtŻJwb^O( +.Nr_xk2Woϙ2$0s,/]?hk Fm]?8F!S%qy?icP@%h9S0vnO>=1/8\%;Fؓܬ{ü~q[hliyD6_H ;*ï~6V0 g#Zls~bsQjF^:ZRZq@|`qL `vpe}Q>Eu(Y(Jr\WfVגnNIX0@KzÝ7 :~ukaT1{ڥLJ'U.ec8 rǿ_AА֌w 5xbfT \!o_5s./b<Ҭ35v)]YaZҶUzdES'殈v#3筬a\FB*!wm01@W&;,^BMΫ\;ˈ~泘&$i[84 [{HGKK&<_2 F V sſvLtQMt'W?-o}wH:ϸÏxTP[ߴ/l=}$Ӭ$wծیS"!$=8wڸk:=X(qıPdFઢ‘?A`_OqefTlۗsMecwNY-|i "woGB]2OMc`̬X;o鵭9vS΁}MBIvoRL'l]һ&I[~Y!c *$ʧu^Qx@Z(>NDvTT,p@[ qPg%@^|IPx]SNo<8 ! R׭j7 œ`n\iD1ٷ_A)+iG$o^|h 9~BHE(̸w ؅BՆGFR:0ll5՘Qd!s7Iv%u[ 0so \ IDAT3NtydiVRLmׇ#M>T=1lOncW-g0EwsikmTrQA9|XUѽ!bbxd⍝/I(/Ei{2.)#8<P>51 櫶],u{ λ0wlW>U@o[Q?[ĥ~r6?hw3T6M(^9h)flR&ophĂIC Mہa~r #Z+ҿc_z0'r9z/eNxԂ/u:NVDJA~E퉃OggL,* }EH+$BM]i DWԶdgQ9<L9& sϐҦG.# ^ Ÿ(*58 Y83Jvht) s_[GQar/1?IENDB`aqemu-0.9.2/resources/os_templates/000077500000000000000000000000001272330227200173435ustar00rootroot00000000000000aqemu-0.9.2/resources/os_templates/FreeBSD 4.aqvmt000066400000000000000000000126661272330227200217660ustar00rootroot00000000000000 3369026 Power_Off :/images/other.png FreeBSD 4 qemu-system-x86 1 Default CDROM Default false false false false false false false false false 64 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 4G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/FreeBSD 7.aqvmt000066400000000000000000000126731272330227200217670ustar00rootroot00000000000000 3369026 Power_Off :/images/other.png FreeBSD 7 qemu-system-x86 std 1 Default CDROM Default false false false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/FreeBSD 8.aqvmt000066400000000000000000000126731272330227200217700ustar00rootroot00000000000000 3369026 Power_Off :/images/other.png FreeBSD 7 qemu-system-x86 std 1 Default CDROM Default false false false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Linux 2.0.aqvmt000066400000000000000000000126761272330227200220100ustar00rootroot00000000000000 3369026 Power_Off :/images/default_linux.png Linux 2.0 qemu-system-x86 1 Default CDROM Default false false false false false false false false false 64 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 4G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Linux 2.4.aqvmt000066400000000000000000000126771272330227200220150ustar00rootroot00000000000000 3369026 Power_Off :/images/default_linux.png Linux 2.4 qemu-system-x86 1 Default CDROM Default false true false false false false false false false 128 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 10G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Linux 2.6 x86_64.aqvmt000066400000000000000000000127051272330227200227260ustar00rootroot00000000000000 3369026 Power_Off :/images/default_linux.png Linux x86_64 qemu-system-x86_64 1 Default CDROM Default false true false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Linux 2.6.aqvmt000066400000000000000000000126641272330227200220130ustar00rootroot00000000000000 3369026 Power_Off :/images/default_linux.png Linux 2.6 qemu 1 Default CDROM Default false true false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/MacOS X x86.aqvmt000066400000000000000000000127011272330227200221560ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Mac OS X qemu-system-x86 1 Default CDROM Default false true false false false false false false false 1024 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 40G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows 2000.aqvmt000066400000000000000000000127031272330227200224140ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows 2000 qemu-system-x86 1 Default CDROM Default false true false false false false false false false 192 false true true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 10G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows 7 x64.aqvmt000066400000000000000000000127111272330227200226020ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows 7 x64 qemu-system-x86_64 1 Default CDROM Default false true false false false false false false false 1024 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 40G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows 7.aqvmt000066400000000000000000000127021272330227200222000ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows 7 qemu-system-x86 1 Default CDROM Default false true false false false false false false false 1024 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 40G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows 9X.aqvmt000066400000000000000000000127011272330227200223310ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows 9X qemu-system-x86 1 Default CDROM Default false true false false false false false false false 128 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 4G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows Vista x64.aqvmt000066400000000000000000000127151272330227200235260ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows Vista x64 qemu-system-x86_64 1 Default CDROM Default false true false false false false false false false 1024 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 40G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows Vista.aqvmt000066400000000000000000000127061272330227200231240ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows Vista qemu-system-x86 1 Default CDROM Default false true false false false false false false false 1024 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 40G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows XP x64.aqvmt000066400000000000000000000127111272330227200227630ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows XP x64 qemu-system-x86_64 1 Default CDROM Default false true false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/os_templates/Windows XP.aqvmt000066400000000000000000000127021272330227200223610ustar00rootroot00000000000000 3369026 Power_Off :/images/default_windows.png Windows XP qemu-system-x86 1 Default CDROM Default false true false false false false false false false 256 false false true true true false true false false false /dev/fd0 true false /dev/fd0 true true /dev/cdrom true true 20G qcow2 false false false 0 0 true false 1 Usermode 0 0 true 0 0 Default Default true 0 false false false false false false 1234 false false false 1 false 800 600 24 false false false false false 20.01.2009 14:30:00 false false 1 false false false false aqemu-0.9.2/resources/shared_images.qrc000066400000000000000000000014021272330227200201430ustar00rootroot00000000000000 icons/aqemu_logo.png icons/default_linux.png icons/default_windows.png icons/other.png icons/pointcursormask.png icons/pointcursor.png icons/aqemu.png icons/vnc.png icons/qemu-black-and-orange.png icons/pepper.png icons/samba.png aqemu-0.9.2/resources/translations/000077500000000000000000000000001272330227200173655ustar00rootroot00000000000000aqemu-0.9.2/resources/translations/English.ts000066400000000000000000014650211272330227200213370ustar00rootroot00000000000000 About_Window About AQEMU About <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.8.3 of 2011.07.27</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> Thanks To <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> License <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></td></tr></table></body></html> Links <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L';"></p></td></tr></table></body></html> Update Links Form Internet <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> OK <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br>Pavel Serebryakov (aka Kronoph) - Correcting English translation <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team Error! Unable to save the file %1: %2. Cannot Find AQEMU Links File! Download failed: %1. Add_New_Device_Window New Storage Device &File &Interface ide scsi sd mtd floppy pflash virtio Index (For IDE, Floppy) Bus, Unit (For SCSI) &Media Disk CD-ROM Cac&he none writeback writethrough AIO threads native &Snapshot on off Boot Settings for -hdachs Option s&ecs &trans c&yls &heads &OK &Cancel Select your device All Files (*) Error! File does not exist! Warning! "Cyls" value is incorrect! "Heads" value is incorrect! "Secs" value is incorrect! "Trans" value is incorrect! Add_Port_Window Adding Port Redirect virtual port to: Default vc (Virtual console) pty (Pseudo TTY) none null (/dev/null) /dev/ File stdio Pipe COM UDP msmouse TCP Telnet Unix mon braille Additional Arguments: ... Arguments Help: &OK &Cancel Open File All Files (*) Optionally width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C [Linux only] Pseudo TTY (a new PTY is automatically allocated) No device is allocated. Void device [Unix only] standard input/output [Linux only] Use host tty, e.g. /dev/ttyS0. The host serial port parameters are set according to the emulated ones. COMn Use host serial port n filename - Write output to filename. No character can be read. filename - name pipe filename [remote_host]:remote_port[@[src_ip]:src_port] This implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen. [host]:port[,server][,nowait][,nodelay] Example to send tcp console to 192.168.0.2 port 4444 92.168.0.2:4444 Example to listen and wait on port 4444 for connection :4444,server Example to not wait and listen on ip 192.168.0.100 port 4444 192.168.0.100:4444,server,nowait host:port[,server][,nowait][,nodelay] The telnet protocol is used instead of raw tcp sockets. path[,server][,nowait] A unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections. Three button serial mouse. Configure the guest to use Microsoft protocol. mon:dev_string This is a special option to allow the monitor to be multiplexed onto another serial port. Braille device. This will use BrlAPI to display the braille output on a real or fake device. Add_USB_Port_Window Adding USB Connecting virtual QEMU/KVM USB device Mouse Keyboard Tablet Wacom tablet Braille Connecting USB host device Manufacturer: Product: bus.addr: Show devices All host devices Not used in running VM Selected device Speed: Bus.Address: Vendor ID: Product ID: Update USB host list &OK &Cancel Manufacturer: Product: Speed: bus.addr: Vendor ID: Product ID: Bus.Address: Advanced_Settings_Window Advanced Settings &OK &Cancel General Screenshot Settings File Format: Original (PPM) JPEG PNG Jpeg Quality: Shared screenshot folder Folder Path: Installed Emulators Find All Emulators Add Delete Edit Use Default Name Type and version Path Use default Advanced AQEMU Logging Write log to Save in File Print to STDOUT Log Messages Debug Messages Warning Messages Error Messages Log Path: qemu-img path VM Network Card MAC Address Random MAC Address QEMU Segment MAC Address (52:54:00:XX:XX:XX) Valid MAC Address (Especial For Each Network Card model) Don't use default audio driver Host Sound System: alsa oss pa esd sdl wav none Other Start/Stop QEMU/KVM emulator Execute Before Starting QEMU/KVM: Execute After Stoping QEMU/KVM: Other Settings Recent CD-ROM Images Count Recent Floppy Images Count First VNC Port for Embedded Display QEMU/KVM Monitor Connection Type stdio (Does not work with Windows version of QEMU) TCP Socket Hostname localhost 127.0.0.1 First port Additional CD/DVD Devices Information in Info Tab Show Tab Info Show Inside Tab Info Screenshot in Save Mode Show QEMU/KVM Arguments Machine Details Machine Name Boot Priority Emulator Type CPU Type Emulator Version Number of CPU Computer Type Video Card Machine Type Keyboard Layout Memory Size Network Cards Use Sound Network Redirections Show Floppy Fullscreen Mode Show CD-ROM Snapshot Mode Show HDD Use Local Time Serial Ports VNC Parallel Ports SPICE USB Ports Use Linux Boot No Frame Windows 2K Hack Alt Grab RTC TD Hack No Quit No Shutdown Portrait No Reboot Curses Start CPU at Startup Show cursor Check Boot Sector on FDD Initial graphical mode Enable ACPI Acceleration Start Date Flash Image Parallel Flash Image ROM File SD Image Invalid Value! Shared screenshot folder doesn't exist! Select executable All Files (*);;Scripts (*.sh) Select or Create Log File All Files (*) Yes Error! Cannot find any emulators installed on your OS! Please add them manually! Add CD/DVD Device Enter Device Name. Example: /dev/cdrom Enter Device Name. Sample: /dev/cdrom Default QEMU Emulator isn't selected! Default KVM Emulator isn't selected! Cannot save emulator "%1"! No Choose screenshot folder Boot_Device_Window Boot settings 1 Enable interactive boot &menu &OK &Cancel Floppy A Floppy B CD-ROM Hard Drive Network 1 Network 2 Network 3 Network 4 Convert_HDD_Image_Window Convert HDD Image Input image File name: Image Format: none Allocated Disk Space: 0 Virtual Size: 0 Cluster Size: 0 Output image Format: QCOW format options Com&press image &Encrypt image Con&vert &Cancel Select Base HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Error! Cannot Locate Input File! Image Format: %1 Allocated Disk Space: %2 %3 Virtual Size: %1 %2 Cluster Size: %3 Save Out HDD Image File File Name is Empty! Please Enter Correct HDD Image filename! Cannot get a valid format for current HDD image! Please Wait. Converting HDD Image... Cancel Information: Conversion completed sucessfuly! Cannot convert image! Details: %1 Copy_VM_Window Copy VM New VM Name: Copy Disk Images Copy Floppy Images Copy Hard Drive Images &OK &Cancel Error! This VM Name is Already Used! Create_HDD_Image_Window Create HDD Image New Image &File Name: Browse... &Format: qcow2 qcow vmdk cow raw cloop &Help... &Size: KB MB GB Additional features Image Must be &Encrypted (QCOW Format Only) Use &Base HDD Image C&reate &Cancel F&ormat Select Base HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Create HDD Image File Error! Image File Name is Empty! Invalid image size! Base Image File doesn't Exists! Image was Not Created! QEMU-IMG Supported formats raw Raw disk image format. This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux. qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots. qcow Old QEMU image format. Left for compatibility. cow User Mode Linux Copy On Write image format. Used to be the only growable image format in QEMU. It is supported only for compatibility with previous versions. It does not work on win32. vmdk VMware 3 and 4 compatible image format. cloop Linux Compressed Loop image, useful only to reuse directly compressed CD-ROM images present for example in the Knoppix CD-ROMs. Create_Template_Window Create Template New VM template name Files Virtual machine file Use default folder for new template Other folder for new template: Creating Options Save Floppy and CD-ROM Settings Save Hard Disks Size or Format Settings Save Network Settings Save Ports (USB/Serial/Parallel) C&reate &Cancel Open VM File AQEMU VM Files (*.aqemu) Select Template Folder Warning! Template Name is Empty! VM file doesn't exist! Cannot Locate Template Folder! Error! Cannot Load VM! Cannot Create Template! Replace Your template name is already used! Do you want replace previous template? You Name For Template in Not Unique! Replace Previous Template? Delete_VM_Files_Window Delete VM and Files Show only: &Hard drive images &All VM files Delete Device name Path &Delete selected &Cancel Screenshot Floppy A Floppy B CD-ROM HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) ROM File MTDBlock File SD Card File PFlash File Kernel bzImage Kernel Initrd Serial Port Redirection Parallel Port Redirection Storage Device Confirm Delete Delete " " VM and Selected Files? An error occurred while deleting files This Files Not Deleted: Please Check Permissions! Device_Manager_Widget Device Manager Widget View Mode Icon Mode List Mode Manage Devices Properties Delete Format HDD Quick Format Add Devices Add Floppy Add CD/DVD-ROM Add HDD Add Storage Device Device List: Information: Add Device Type: Host Device Type: Image On Disk Size: KB MB Image Virtual Size: Image On Disk Size: Type: Storage Device Floppy 1 Floppy 2 Warning! Maximum Floppy Disk Count is 2 CD/DVD-ROM CD-ROM Maximum CD-ROM Disk Count is 1 HDA (First Master) HDA HDB (First Slave) HDB HDC (Second Master) HDC HDD (Second Slave) HDD Maximum Hard Disk Count is 4 excluding CD-ROM Delete? Delete Device? Error! Incorrect Device! Format? Format Virtual Hard Disk? Information Complete! Cannot Format! Edit_Emulator_Version_Window Edit Emulator Version &Available Versions: &OK &Cancel %1 (Located in %2) QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Emulator_Control_Window Emulator Control &Help &VM Send &Keys Ctrl-Alt-&F# &Connect Floppy &B Recent Files Floppy &A &USB Connect Disconnect &CD-ROM View Save Screens&hot &Save VM &Load VM Ctrl+O &Pause VM &Quit Save VM S&tate... Load VM St&ate... &Reset VM Power &Off &Commit Ctrl-Alt-&Delete 1 2 3 4 5 6 7 8 9 10 11 12 /dev/fd0 /dev/null Other... Eject Update Device List &About Emulator Control... /dev/cdrom Save Screenshot As... All Devices &Other Keys... QEMU/KVM &Monitor Ctrl-Alt-Backspace null (/dev/null) stdio (Standard In Out) /dev/ttyS0 By Bus.Address Manage Snapshots d Display Scaling Fullscreen Mode Ctrl+Alt+F Show Status Bar Reinit VNC a [Paused] [Saved] Power Off This VM? Selected VM is running now. Shutdown anyway? (Emulator Control) All Files (*) Are you sure? Are you sure to shutdown VM "%1"? Are you sure to reboot VM "%1"? Open Device or Image File All Files (*);;Images Files (*.img *.ima) All Files (*);;Images Files (*.iso) Error! Cannot Find USB Device! Cannot Get USB Information From System! Disconnect USB Enter You Bus.Address VM USB Value Send Keys Enter your key combinations such as ctrl-alt-del or alt-f2 Fullscreen mode To enable window mode press Ctrl-Alt-F Do you want to show this message again? About Emulator Control... Emulator Control is a Tool for Managing QEMU in Runtime. Warning! In This VM Floppy 1 Not Found! In This VM Floppy 2 Not Found! In This VM CD-ROM Not Found! Emulator_Options_Window Emulator Settings Name (Emulator identifier) Find emulator Emulator type: QEMU KVM (For adding QEMU-KVM, add them one by one) Path to Emutators Binary Directory: ... &Find Emulators Emulators Executables Files QEMU/KVM System Binary File Name Emulator Version Use saved available emulator options (Recomended to choose it again after emulator updating) Always check available emulator options while starting AQEMU (Slow) Always check emulator version while starting AQEMU Set version and available options manually &OK &Cancel Error! Path is Empty! Warning Path doesn't exist! Select Directory Enulator Name is Empty! This emulator name is already used! QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Select QEMU Binary File All Files (*) Cannot get emulator info! For file: %1 Cannot get version for emulator! Error_Log_Window QEMU Error Log Error Window Show Mode Normal Mode Do Not Show Until Next VM Started Do Not Show Until Next AQEMU Started Never show it (For View Error Log Select VM->Show QEMU/KVM Error Log Window) &Clear Errors List &OK Error # First_Start_Wizard First Start Wizard English QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X Warning! Are you sure? You can configure these options later in Settings windows. Set Folder for you VM's Search... Cancel Error! Cannot get emulator info! For file: %1 QEMU Found in "%1", version: %2 KVM Found in "%1", version: %2 Emulator Version Modified By User Select QEMU emulator directory &Finish &Next Cannot Create New Folder! Error Emulator binary files not exists! Please click Back and set it manual. Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path Welcome General Settings Find Emulators Setup Emulator Finish &Back &Cancel Welcome to AQEMU settings wizard! This wizard will help you to choose options AQEMU needed to work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. Here you can choose interface language Please select folder for AQEMU virtual machines If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will be displayed in virtual machine as icons, like in file manager window. Use Device manager New experimental work mode is available in AQEMU. In this mode QEMU/KVM display will be showed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this feature you must mark the "Include Emdedded VNC Display in Main Window" flag. Include Emdedded VNC Display in Main Window For correct working AQEMU must know your emulators locations and versions. For searching push the "Search" button. If automatic search can't find out your emulators, you should configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. &Search S&kip Search Set &Versions Manualy Congratulations! The Wizard has got all necessary settings for configuring AQEMU. Push "Finish" button to save your settings. MachineView Error! Cannot Reinit VNC Connection! Main_Window AQEMU Info General Machine &Name: Emulator Type: Emulator Version: Computer Type: Machine &Type: B&oot Priority: Floppy HDD CD-ROM Network None &CPU Type: Number of CP&U: 1 2 4 8 16 32 64 128 255 &Video Card: &Keyboard Layout en-us (default) ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr Memory Size 1 MB Updating free memory information Free memory: 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Audio Cards Sound &Blaster 16 &ENSONIQ ES1370 &Yamaha YM3812 AC97 (Intel 82801AA) Gravis &Ultrasound GF1 PC Speaker Options Start in full screen &Fullscreen Mode Snapshot &Mode Set real time clock to local time. Default=utc Use &Local Time HDA (Primary Master) Select Disk Image Open Create New HDD Create Image Format: none Allocated Disk Space: 0 Virtual Size: 0 Cluster Size: 0 Format All settings HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) CD/DVD/Floppy CD/DVD-ROM Browse Type: none Size: 0 Floppy A Floppy B Use &Network Network Settings GUI Type: Basic Native Additional Settings &Redirections Protocol Host Port Guest IP Guest Port A&dd item D&elete item &Clear list Redirect item settings Protocol: &TCP &UDP &Host Port to &guest IP Guest Por&t Other network settings T&FTP Server Prefix: Allow &SMB Access to: ... Advanced Additional Options Fix Windows 2000 install Bug &Windows 2K Hack RTC TD Hack (Fix Time Drift in Windows ACPI HAL) No Shutdown Exit instead of rebooting No Reboot Start CP&U at Startup Check Floppy Disk boot signature in VM BIOS Check Boot Secto&r on FDD Enable ACP&I Start Date (Day.Month.Year Hour:Minute:Second) dd.MM.yyyy HH:mm:ss QEMU/KVM Window Options Show QEMU/KVM Window Without a Frame and Window Decorations Use Ctrl-Alt-Shift to Grab Mouse (Default is Ctrl-Alt) Disable QEMU/KVM Window Close Capability Rotate Graphical Output 90 Deg Left (Only PXA LCD) Curses (Use a curses/ncurses Interface Instead of SDL) Show Cursor (It Works Only in QEMU/KVM SDL Window) Initial Graphical Mode Width Height Depth 24 Send Only User Arguments Without AQEMU Arguments Use Emulator Binary File in "Additional QEMU/KVM Arguments" Additional QEMU/KVM &Arguments Other Hardware Virtualization KVM Options Enable KVM Disable KVM kernel mode PIC/IOAPIC/LAPIC Disable KVM kernel mode PIT Disable KVM kernel mode PIT interrupt reinjection Nesting (Support for Running a VM Inside other VM (AMD Only) KVM Shadow Memory Mb KQEMU Acceleration Module Disabled (Disable KQEMU Accelerator module) Use If Possible (AQEMU won't check loaded KQEMU module) Enabled (AQEMU checks loaded KQEMU module. If it isn't loaded QEMU won't started) Full (Enable full virtualization mode for best performances) VNC Activate VNC General settings VNC Display Number For Connection Use Port 5900 + VNC Display Number UNIX Domain Socket Security settings Use Password (You must set a password when you starting the VM) Use TLS x509 Folder Path x509verify Folder Path Warning: Globaly Activated Embedded Display in Emulator Control Window. To Disable This Function in Current VM choose "Don't Use Embedded VNC Display" Don't use embedded VNC Display Optional Images ROM File (For EtherBoot) On-Board Flash Image SecureDigital Card Image Parallel Flash Image Boot Linux Kernel Use &Linux Boot Kernel bzImage File: &Initrd File: Append Command Line: &Apply &Discard Changes &VM &New VM &Help &File &About AQEMU About AQEMU F1 About &Qt &Delete VM &Exit Ctrl+Q &Wizard... Ctrl+W &Add New VM Ctrl+N &Create HDD Image Con&vert HDD Image Convert HDD Image General &Settings AQEMU &Settings &Start Ctrl+S Sto&p Ctrl+D &Pause Ctrl+P &Reset Ctrl+R &Load VM From File Save As &Template Show QEMU/KVM &Arguments Sa&ve Change Icon Copy Manage Snapshots Show Emulator Control Show QEMU/KVM Error Log Window &Advanced Settings Start &First Run Wizard Create Shell Script Delete VM And Files SPICE Ports Cannot Save Settings! Close AQEMU? One or More VM is Running! Terminate All Running VM and Close AQEMU? Error! VM Name is Empty! Redirection List is Empty! Please Disable Redirections! Device Manager VM File " " is Read Only! Check Permissions! Memory size < 1! Using default value: 256 MB Memory size > all free memory on this system! You must create a new virtual machine This VM uses an emulator "%1" which is not installed in the system. The work of the VM is not possible! Machine Details Machine State: Running Power Off Pause Saved Machine Name: Machine Type: Boot Priority: CPU Type: Number of CPU: Video Card: Keyboard Layout: Memory Size: Use Sound: Yes No Fullscreen Mode: Use Snapshot Mode: Use Local Time: Storage Devices Floppy 1: Floppy 2: CD/DVD-ROM: Primary Master (HDA): Primary Slave (HDB): Secondary Master (HDC): Secondary Slave (HDD): Use Network: Card: User mode network stack TUN/TAP Interface TCP Socket VLAN UDP multicast socket No Connection Item %1 NIC User Channel TAP Socket Multicast Socket VDE Dump Unknown Type Item Redirection Use Redirections: Serial Port %1: Default vc pty none null dev host_port file stdio pipe udp tcp telnet unix Parallel Port %1: USB Port %1: Acceleration: Use If Possible Disabled Enabled Full VNC Port: SPICE Port: Use Linux Boot: Kernel bzImage: Initrd File: Kernel ComLine: ROM File: On-Board Flash Image: SD Card Image: Parallel Flash Image: RTC TD Hack: Windows 2000 Hack: No Shutdown: No Reboot: Start CPU at Startup: Check Boot Sector on FDD: Enable ACPI: Start Date: No Frame: Alt Grab: No Quit: Portrait Mode: Curses: Show Cursor: Initial Graphical Mode: QEMU/KVM Arguments Type: Host Device Type: Image Size: 0 Byte Kb Gb Type: Image Size: Display Warning! Current VM was changed. Discard all changes? Current VM was changed. Save all changes? Warning Cannot Change Icon When VM in Save State. bzImage Initrd ROM File On-Board Flash SecureDigital Card Parallel Flash VNC x509 Folder VNC x509verify Folder No boot device found! %1 Image "%2" doesn't Exist! Continue Without this Image? Delete? Delete " " VM? Cannot Delete VM XML File! VM Name New Virtual Machine Name: Your New VM Name is Empty! VM isn't Created! VM be Changed. Save Changes? QEMU running in snapshot mode. VM can not be saved in this mode. Are you sure? Shutdown VM "%1"? Reboot VM "%1"? Open AQEMU VM File AQEMU VM (*.aqemu) VM With This Name Already Exists! Information New Template Created! Emulator Control Already Show This Function Works Only On Running VM! QEMU/KVM Arguments: No VM Found! Save VM to Script Shell Script Files (*.sh);;All Files (*) Cannot Open File! Error Cannot convert "%1" to memory size! Cannot convert "%1" to integer! Cannot convert "%1" to size suffix! Valid suffixes are: MB, GB Memory size < 0! Valid size is 1 or more Your memory size %1 MB > %2 MB - all free RAM on this system! To set this value, check "Remove limitation on maximum amount of memory". Current memory size more of all host memory! Use the maximum available size. Free memory: %1 MB Free memory on this system is less than 32 MB! Open Floppy Image File All Files (*);;Images Files (*.img *.ima) Open CD\DVD-ROM Image File All Files (*);;Images Files (*.iso) Open HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Image Format: Allocated Disk Space: Virtual Size: Cluster Size: QEMU KVM CPU count value is not valid digit! CPU count > max CPU count for this emulator! Cannot Save This VM to File! Network Settings Network Cards To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press "Ignore" button for hide this message in future. Add This Record? Select SMB Directory UNIX Domain Socket Path All Files (*) Select x509 Certificate Folder Select x509 Verify Certificate Folder Select Kernel Image File Select InitRD File Select ROM File Select On-Board Flash Image Select SecureDigital Card Image Select Parallel Flash Image Monitor_Window QEMU/KVM Monitor Com&mand: info version info network info block info registers info cpus info history info irq info pic info pci info tlb info mem info jit info kqemu info usb info usbhost info profile info capture info snapshots info mice info vnc &Run &Clear Change font Font Network_Widget AQEMU Network Widget Items List: &Add &Delete Connection Type ? Model macaddr aa:bb:cc:dd:ee Generate New MAC vlan name hostname port:dev fd ifname script ... downscript listen connect mcast sock port group mode file len 64Kb (default) 128Kb 512Kb 1Mb 5Mb 10Mb addr vectors net host restrict y n dhcpstart dns tftp bootfile smb smbserver sndbuf vnet_hdr on off vhost vhostfd hostfwd guestfwd Unknown Type Item Warning! Maximum Network Cards Count is 8. New Item nic -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no '-net' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. user -net user[,vlan=n][,hostname=name][,name=name] Use the user mode network stack which requires no administrator privilege to run. 'hostname=name' can be used to specify the client hostname reported by the builtin DHCP server. channel -net channel,port:dev Forward 'user' TCP connection to port port to character device dev tap -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] Connect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. 'fd'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is '/etc/qemu-ifup' and the default network deconfigure script is '/etc/qemu-ifdown'. Use 'script=no' or 'downscript=no' to disable script execution. socket -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] Connect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If 'listen' is specified, QEMU waits for incoming connections on port (host is optional). 'connect' is used to connect to another QEMU instance using the 'listen' option. 'fd'=h specifies an already opened TCP socket. -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] Create a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. NOTES: 1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). 2. mcast support is compatible with User Mode Linux (argument 'ethN=mcast'), see http://user-mode-linux.sf.net. 3. Use 'fd=h' to specify an already opened UDP multicast socket. vde -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] Connect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled. dump -net dump[,vlan=n][,file=f][,len=n] dump traffic on vlan 'n' to file 'f' (max n bytes per packet) Select script All Files (*);;Scripts (*.sh) Boot file All Files (*) SMB directory Error! Incorrect MAC address! Invalid name! Valid characters are:: a-z A-Z 0-9 _ - Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ - %1 File "%2" doesn't Exist! Continue Without this File? Old_Network_Widget Old Network Widget Cards List: Add &Delete Network Card Model: Connection &Mode: Use the user mode network stack Open a TUN/TAP interface Use an already open TUN/TAP interface Open a listening TCP socket Use an already open TCP socket Connect to listening TCP socket Create shared VLAN via UDP multicast socket Use an already open UDP multicast socket No connection VM Hostname: &IP Address: &MAC Address: Generate New MAC &VLAN: &Port: &FD: If the value is 0 then it will not be used &TUN/TAP Script: ... &Interface Name: Error Network Card #% Not Valid! Card Warning! Maximum Network Cards Count is 8. Network Cards List is Empty! Cannot Delete Network Card! Select script All Files (*);;Scripts (*.sh) Error! IP Address in Card Invalid! MAC Address in Card In Card TUN/TAP Script File "%1" Not Exists! Continue Without It File? Ports_Tab_Widget Ports Add port Serial (COM) Parallel (LPT) USB Edit Port Delete Port Ports List Port type Details COM (Serial Port) LPT (Parallel Port) USB Port Keyboard Mouse Tablet Wacom Tablet Braille Virtual QEMU/KVM Device: %1 %1 %2 (Vendor ID: %3 Product ID: %4) %1 %2 (BusAddr: %3) Warning You can add no more than 4 COM ports You can add no more than 3 LPT ports Device not select! Device doesn't selected! Properties_Window Properties Floppy Browse Advanced settings CD/DVD-ROM Hard Disk Path to Image: ... Create &New &Format Exist Information Device Name: Up&date Info &OK &Cancel Warning Image file doesn't exist! Image Size: Kb Mb Open Floppy Image File All Files (*);;Images Files (*.img *.ima) Open CD\DVD-ROM Image File All Files (*);;Images Files (*.iso) Open HDD Image File All Files (*);;Images Files (*.img *.qcow *.wmdk) Format: Virtual Size: On Disk Size: Cluster Size: QObject Standard PC ISA-only PC Integrator/CP (ARM926EJ-S) Integrator/CP (ARM1026EJ-S) Versatile/PB (ARM926EJ-S) Versatile/AB (ARM926EJ-S) RealView (ARM926EJ-S) R4k platform Malta Core LV Heathrow PowerMAC Mac99 PowerMAC PowerPC PREP SPARCstation 2 (Sun4c) SPARCstation 5 (Sun4m) SPARCstation 10 (Sun4m) SPARCstation 20 (Sun4m) SPARCserver 600MP (Sun4m) SPARCserver 1000 (Sun4d) SPARCcenter 2000 (Sun4d) NE2000 PCI NE2000 ISA i82551 i82557B i82559ER PCnet32 PCI RTL8139 SMC91C111 MCF FEC shix card r2d-plus board Lance No Video Card Cirrus CLGD 5446 Standard VGA Sun4m qemu64 Athlon Akita PDA (PXA270) Spitz PDA (PXA270) Borzoi PDA (PXA270) Terrier PDA (PXA270) Palm Tungsten (OMAP310) Stellaris LM3S811EVB Stellaris LM3S6965EVB Gumstix Connex (PXA255) Gumstix Verdex (PXA270) Mainstone II (PXA27x) Bare ETRAX FS board Acer Pica 61 MIPS MIPSsim platform R4000 VR5432 5Kc 5Kf 20Kc MIPS64R2-generic Ref405ep Taihu StdVGA (VESA 2.0) VMWare Video Card None Video Card Core Duo Atom N270 e1000 virtio Phenom Core 2 Duo QEMU 64Bit ARM 1136 R2 Siemens SX1 (OMAP310) V1 Siemens SX1 (OMAP310) V2 Nokia N800 Nokia N810 Marvell 88w8618 / MusicPal Tosa PDA (PXA255) AXIS devboard 88 fseth MCF5206EVB Arnewsh 5206 Dummy board MIPS Malta Core LV MIPS Magnum mips r4k platform MIPS R4000 MIPS VR5432 MIPS 5Kc MIPS 5Kf MIPS 20Kc MIPS MIPS64R2-generic Spartan 3ADSP1800 xilinx-ethlite e500v1 Mac99 based PowerMAC PowerPC PREP platform ref405ep taihu bamboo mpc8544ds SH7750R SH7751R SH7785 SPARCstation Voyager (Sun4m) SPARCstation LX (Sun4m) SPARCstation 4 (Sun4m) SPARCClassic (Sun4m) SPARCbook (Sun4m) Sun4u Sun4v Sun4v (Niagara) This Fatal Error. Recomend Close AQEMU. Fatal error. It's recommended to close AQEMU Error! Cannot Start qemu-img! Image isn't Created! qemu-img Cannot Finish! Image isn't Created! Cannot Create Image! Information: Complete! QEMU-IMG is Creates HDD Image. Additional Information: Warning! QEMU-IMG is Returned non Standard Message!. Additional Information: Kb Mb Gb AQEMU Config File is Read Only! Check Permissions For File: AQEMU VM Directory is Read Only! Check Permissions For: AQEMU VM Template Directory is Read Only! Check Permissions For: AQEMU Log File is Read Only! Check Permissions For File: Default Error Cannot create directory for log file! Path: %1 This is a first AQEMU start and program running in root mode. In some Linux distributions you may have problems with configuration saving. Close AQEMU? AQEMU emulators search AQEMU will search for emulators after uptating. Please wait. Cannot Find any Emulators installed in your OS! You should choose them In Advanced Settings! Cannot Find AQEMU Data! Cannot Locate AQEMU Data Folder! You Should Select This Folder in Next Window! Please Select AQEMU Data Folder: AQEMU won't Work If Data Folder isn't Selected! Cannot Load AQEMU Icon Theme! File "%1" Not Found! AQEMU VM Folder doesn't Exists! Create It? SMP_Settings_Window SMP Settings If any on the values can be omitted. Missing (zero) values will be computed. CPUs count Sockets count Cores per socket Threads per core Max number of hotpluggable CPUs &OK &Cancel Select_Icon_Window Change Icon Select Icon For Your VM Default &Other System Icon Default &Linux Icon Default &Windows Icon &All OS Icons From AQEMU Collection Other &Icon Your Icon Path: &Browse... &OK &Cancel Error! Icon file doesn't exist! Select Icon File: PNG Images (*.png) Settings_Window General Settings Basic Settings AQEMU VM Folder: ... Default VM Template: Create Template View Interface Language: English GUI Icons Theme: Crystal SVG (KDE 3) Oxygen (KDE 4) VM Icon Size: 16x16 24x24 32x32 48x48 64x64 Use Screenshot for OS Icon in Save Mode Use Device Manager by Default Emulator Control Show Mode Show In Separate Window Show Window With Embedded Display Show In AQEMU Main Window Show In AQEMU Main Window With Embedded Display Don't show &OK &Cancel Warning AQEMU VM Templates Not Found! Information New template was created! Set your VM folder Language will set after restarting AQEMU Show this message in future? Icons theme be set after restart AQEMU Show this message in future? Invalid Value! AQEMU VM folder doesn't exist! Do you want to create it? Error! Cannot Create New Folder! Support for this feature is not complete! If there is no picture, click "View->Reinit VNC" Show This Message Again? Snapshot_Properties_Window Snapshot Properties Snapshot Name: Snapshot Description: &OK &Cancel Warning Snapshot name is empty! Snapshots_Window Manage VM Snapshots Description: Size: VM Clock: ID: Date: Properties Start Delete Create OK Update Info Snapshot List: Warning! Please select snapshot that you want to delete! Warning Delete Current Snapshot? Please select snapshot that you want to start! This VM is Running now! Stop VM and Load Snapshot? Error! You must add HDD image in QCOW2 format if you want to use snapshots! VM_Wizard_Window New Virtual Machine Wizard &Back &Next &Cancel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the steps that are necessary to create a new virtual machine for AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p></body></html> Select AQEMU Configuration Mode &Typical (For Beginners) Create new virtual machine with most common devices and configuration options. &Custom Create new virtual machine with additional configuration options. Select Emulator Type For Using In New Virtual Machine QEMU KVM Please Select VM Hardware Template Template OS Type: No Selected Generate VM C&omputer Type: Release Date: 1985-1990 1990-1995 1995-2000 2000-2005 2005-2010 VM Name: Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. CPU Type: Select a CPU type for your new virtual machine: Select the amount of base memory (RAM) in megabytes for virtual machine allocating. 1 MB Update free memory information Free memory: 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> Boot Hard Disk (Primary Master) N&ew... E&xisting... Select network type using on your new virtual machine. &User Mode Network Connection (Uses the user mode network stack) N&o Network (No net cards installed on VM) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> Enter your new virtual machine hard disk capacity. Disk Size in GB (Gigabytes): Emulator Type Wizard Mode VM Hardware Template VM Name and CPU Type Virtual Machine Name Memory Hard Disk Size Virtual Hard Disk Network Error! Please Add One Or More Emulators in Advanced Settings! Template For VM Cannot Create New VM from Template! Cannot Find Emulator System ID! Warning This VM Name is Already Exists! &Finish Finish! Cannot Find QEMU System ID! Error Cannot convert "%1" to memory size! Cannot convert "%1" to integer! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Memory size < 0! Valid size is 1 or more Your memory size %1 MB > %2 MB - all free RAM on this system! To setup this value, check "Remove limitation on maximum amount of memory". Current memory size bigger than all existing host memory! Using maximum available size. Free memory: %1 MB Free memory on this system is lower than 32 MB! Select HDD Image All Files (*) VNC_Password_Window VNC Password Password: Confirm: OK Warning Password is Empty! Password Not Confirmed! Virtual_Machine Version Invalid! Version of this AQEMU VM File isn't 0.5 Load This File anyway? Warning! USB Device %1 %2 (%3 %4) Not Found! Error! ROM File doesn't Exists! Can't run emulator! Additional Arguments is Empty! Cannot Use User Arguments! KVM Kernel Module Not Loaded! To load this Module, Enter in Terminal with root privileges: "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? KQEMU Kernel Module Not Loaded! This Module Provides Acceleration for QEMU. For Loading KQEMU Module Type: "modprobe kqemu" in root mode Or Disable Acceleration in "Other->Hardware Virtualization" tab. Cannot start emulator! Binary path is empty! QEMU Error Log Loading... Loading Virtual Machine. Please wait... Saving... Saving Virtual Machine. Please wait... You must add HDD image in QCOW2 format to save virtual machine! VncView Password required Please enter the password for the remote desktop: aqemu-0.9.2/resources/translations/French.ts000066400000000000000000015076611272330227200211620ustar00rootroot00000000000000 About_Window About AQEMU À propos d'AQEMU About À propos <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.8.3 of 2011.07.27</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU est une interface graphique pour les émulateurs QEMU et KVM</p> <p>Version : 0.8.1 of 21.12.2010</p> <p>Licence : GNU GPL Version 2</p> <p>Auteur : Andrey Rijov (alias RDron)</p> <p>E-Mail : <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Site Web : <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Émulateurs supportés :<br>QEMU 0.9.0-0.13 and KVM 60-88-0.13</p> </b> </body> </html> Thanks To Remerciements <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> License Licence <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></td></tr></table></body></html> Links Liens <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L';"></p></td></tr></table></body></html> Update Links Form Internet Mise à jour des liens depuis internet <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> OK <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br>Pavel Serebryakov (aka Kronoph) - Correcting English translation <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Développeurs :</b> <br>Andrey Rijov (alias RDron) - auteur <br><br><b>Contributeurs :</b> <br>Max Brazhnikov - port FreeBSD <br>Boris Savelev - paquet ALTLinux <br>Denis Smirnov (alias reMiND) - paquet Arch Linux Package et d'autres aides <br>Ignace Mouzannar - paquet Debian <br>Michael Brandstetter - scripts d'améliorations <br>Robert Warnke - traduction en allemand de la documentation d'AQEMU <br>Michael Schmöller (alias schmoemi) - traduction en allemand et correction de la traduction en anglais <br>Guillem Rieu - patch pour les redirections réseau <br>Karol Krenski - pour avoir réglé les adresses IP RegExp <br>Alexander Romanov (alias romale) - tests, nouvelles idées et d'autres aides <br>Timothy Redaelli - patch pour CMake <br>Pavel Serebryakov (alias Kronoph) - correction de la traduction anglaise <br><br><b>Remerciements particuliers :</b> <br>Sergey Sinitsa (alias sin) <br>Grigory Pulyaev (alias Rodegast) <br>Alexander Saifulin (alias Ne01eX) <br>Mihail Parshin (alias Skeeper) <br>Garret Acott (alias gacott) <br>Damir Vafin (alias Denver-22) <br><br><b>Merci à tous « www.nclug.ru group » pour les tests et les suggestions d'améliorations.</b> <br><br><b>AQEMU utilise du code de QtEMU et de Krdc, merci à tous leurs développeurs :</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icônes :</b> <br>Crystal SVG - thème d'icône d'Everaldo.com Design Studio <br>Oxygen - thème d'icône de l'équipe Oxygen Error! Erreur ! Unable to save the file %1: %2. Impossible de sauvegarder le fichier %1 : %2. Cannot Find AQEMU Links File! Impossible de trouver le fichier de liens d'AQEMU ! Download failed: %1. Le téléchargement a échoué : %1. Add_New_Device_Window New Storage Device Nouveau périphérique de stockage &File &Fichier &Interface ide scsi sd mtd floppy pflash virtio Index (For IDE, Floppy) Index (pour IDE, disquette) Bus, Unit (For SCSI) &Media &Média Disk Disque CD-ROM Cac&he none aucun writeback writethrough AIO threads native &Snapshot &Instantané on marche off arrêt Boot Démarrage Settings for -hdachs Option Paramètres pour l'option « -hdachs » s&ecs &trans c&yls &heads &OK &Cancel &Annuler Select your device Sélectionnez votre périphérique All Files (*) Tous les fichiers (*) Error! Erreur ! File does not exist! Le fichier n'existe pas ! Warning! Attention ! "Cyls" value is incorrect! La valeur de « cyls » est incorrecte ! "Heads" value is incorrect! La valeur de « heads » est incorrecte ! "Secs" value is incorrect! La valeur de « secs » est incorrecte ! "Trans" value is incorrect! La valeur de «trans » est incorrecte ! Add_Port_Window Adding Port Ajouter un port Redirect virtual port to: Rediriger le port virtuel vers : Default Par défaut vc (Virtual console) pty (Pseudo TTY) none aucun null (/dev/null) /dev/ File Fichier stdio Pipe COM UDP msmouse TCP Telnet Unix mon braille Additional Arguments: Arguments additionnels : ... Arguments Help: Aide pour les arguments : &OK &Cancel &Annuler Open File Ouvrir le fichier All Files (*) Tous les fichiers (*) Optionally width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C [Linux only] Pseudo TTY (a new PTY is automatically allocated) (Seulement pour Linux) pseudo TTY (un nouveau PTY est automatiquement alloué) No device is allocated. Void device [Unix only] standard input/output (Seulement pour Unix) standard « input/output » [Linux only] Use host tty, e.g. /dev/ttyS0. The host serial port parameters are set according to the emulated ones. COMn Use host serial port n filename - Write output to filename. No character can be read. filename - name pipe filename [remote_host]:remote_port[@[src_ip]:src_port] This implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen. [host]:port[,server][,nowait][,nodelay] Example to send tcp console to 192.168.0.2 port 4444 92.168.0.2:4444 Example to listen and wait on port 4444 for connection :4444,server Example to not wait and listen on ip 192.168.0.100 port 4444 192.168.0.100:4444,server,nowait host:port[,server][,nowait][,nodelay] The telnet protocol is used instead of raw tcp sockets. path[,server][,nowait] A unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections. Three button serial mouse. Configure the guest to use Microsoft protocol. mon:dev_string This is a special option to allow the monitor to be multiplexed onto another serial port. Braille device. This will use BrlAPI to display the braille output on a real or fake device. Add_USB_Port_Window Adding USB Ajouter USB Connecting virtual QEMU/KVM USB device Connection au périphérique USB virtuel de QEMU/KVM Mouse Souris Keyboard Clavier Tablet Tablette Wacom tablet Tablette Wacom Braille Connecting USB host device Connecter les périphériques de l'hôte USB Manufacturer: Fabricant : Product: Produit : bus.addr: Adresse du bus : Show devices Montrer périphériques All host devices Tous les périphériques hôtes Not used in running VM Pas utilisé dans la VM en cours Selected device Périphérique sélectionné Speed: Vitesse : Bus.Address: Adresse du bus : Vendor ID: Identité du fournisseur : Product ID: Identité du produit : Update USB host list Il faut que ça soit le plus court possible sinon le boutton n'affiche pas tout Mise à jour liste USB hôte &OK &Cancel &Annuler Manufacturer: Fabricant : Product: Produit : Speed: Vitesse : bus.addr: Adresse du bus : Vendor ID: Identité du fournisseur : Product ID: Identité du produit : Bus.Address: Adresse du bus : Advanced_Settings_Window Advanced Settings Paramètres avancés &OK &Cancel &Annuler General Général Screenshot Settings Paramètres des captures d'écrans File Format: Format du fichier : Original (PPM) JPEG PNG Jpeg Quality: Qualité JPEG : Shared screenshot folder Folder Path: Chemin vers le répertoire : Installed Emulators Émulateurs installés Find All Emulators Rechercher tous les émulateurs Add Ajouter Delete Supprimer Edit Éditer Use Default Name Nom Type and version Path Chemin Use default Advanced Avancé AQEMU Logging Journal d'AQEMU Write log to Écrire le journal dans Save in File Sauvegarder dans le fichier Print to STDOUT Log Messages Messages du journal Debug Messages Débugguer les messages Warning Messages Messages d'avertissements Error Messages Messages d'erreurs Log Path: Chemin du journal : qemu-img path Chemin vers « qemu-img » VM Network Card MAC Address Random MAC Address Adresse MAC aléatoire QEMU Segment MAC Address (52:54:00:XX:XX:XX) Valid MAC Address (Especial For Each Network Card model) Adresse MAC valides (spécialement pour chaque modèle de carte réseau) Don't use default audio driver Ne pas utiliser le driver audio par défaut Host Sound System: Système de son hôte : alsa oss pa esd sdl wav none aucun Other Autre Start/Stop QEMU/KVM emulator Démarrer/Arrêter l'émulateur QEMU/KVM Execute Before Starting QEMU/KVM: Exécuter avant le démarrage de QEMU/KVM : Execute After Stoping QEMU/KVM: Exécuter après l'arrêt de QEMU/KVM : Other Settings Autres paramètres Recent CD-ROM Images Count Recent Floppy Images Count First VNC Port for Embedded Display QEMU/KVM Monitor Connection Type stdio (Does not work with Windows version of QEMU) TCP Socket Socket TCP Hostname Nom d'hôte localhost 127.0.0.1 First port Premier port Additional CD/DVD Devices Périphériques CD/DVD additionnels Information in Info Tab Information dans l'onglet Information Show Tab Info Montrer l'onglet Information Show Inside Tab Info Screenshot in Save Mode Show QEMU/KVM Arguments Montrer les arguments QEMU/KVM Machine Details Détails de la machine Machine Name Nom de la machine Boot Priority Priorité de démarrage Emulator Type Type d'émulateur CPU Type Type de processeur Emulator Version Version de l'émulateur Number of CPU Nombre de processeur Computer Type Type d'ordinateur Video Card Carte vidéo Machine Type Type de machine Keyboard Layout Disposition du clavier Memory Size Taille de la mémoire Network Cards Cartes réseaux Use Sound Utiliser le son Network Redirections Redirections réseau Show Floppy Voir disquette Fullscreen Mode Mode plein-écran Show CD-ROM Voir CD-ROM Snapshot Mode Mode instantané Show HDD Use Local Time Utiliser l'heure locale Serial Ports Ports séries VNC Parallel Ports Ports parallèle SPICE USB Ports Ports USB Use Linux Boot No Frame Windows 2K Hack Alt Grab RTC TD Hack No Quit Ne pas quitter No Shutdown Ne pas éteindre Portrait No Reboot Ne pas redémarrer Curses Start CPU at Startup Démarrer le CPU au démarrage Show cursor Voir le curseur Check Boot Sector on FDD Initial graphical mode Enable ACPI Activer l'ACPI Acceleration Accélération Start Date Flash Image Parallel Flash Image ROM File FIchier ROM SD Image Image SD Invalid Value! Valeur invalide ! Shared screenshot folder doesn't exist! Select executable All Files (*);;Scripts (*.sh) Tous les fichiers (*);;Scripts (*.sh) Select or Create Log File Sélectionnez ou créez le fichier log All Files (*) Tous les fichiers (*) Yes Oui Error! Erreur ! Cannot find any emulators installed on your OS! Please add them manually! Impossible de trouver des émulateurs installés sur votre système d'exploitation ! Ajoutez-les manuellement ! Add CD/DVD Device Ajouter CD/DVD-ROM Enter Device Name. Example: /dev/cdrom Entrez le nom de périphérique. Exemple : /dev/cdrom Enter Device Name. Sample: /dev/cdrom Entrez le nom du périphérique. Exemple : /dev/cdrom Default QEMU Emulator isn't selected! L'émulateur QEMU par défaut n'est pas sélectionné ! Default KVM Emulator isn't selected! L'émulateur KVM par défaut n'est pas sélectionné ! Cannot save emulator "%1"! Impossible de sauvegarder l'émulateur « %1 » ! No Non Choose screenshot folder Choississez le répertoire des captures d'écrans Boot_Device_Window Boot settings Paramètres de démarrage 1 Enable interactive boot &menu Activer le &menu de démarrage interactif &OK &Cancel &Annuler Floppy A Disquette A Floppy B Disquette B CD-ROM Hard Drive Disque dur Network 1 Réseau 1 Network 2 Réseau 2 Network 3 Réseau 3 Network 4 Réseau 4 Convert_HDD_Image_Window Convert HDD Image Convertir l'image disque dur Input image Image entrante File name: Nom de fichier : Image Format: none Allocated Disk Space: 0 Format de l'image : aucun Espace disque alloué : 0 Virtual Size: 0 Cluster Size: 0 Taille virtuelle : 0 Taille de cluster : 0 Output image Image sortante Format: Format : QCOW format options Options du format QCOW Com&press image Com&presser l'image &Encrypt image Crypt&er l'image Con&vert Con&vertir &Cancel &Annuler Select Base HDD Image File Sélectionnez le fichier d'image disque dur de base All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Tous les fichier (*);;Fichiers images (*.img *.qcow *.qcow2 *.wmdk) Error! Erreur ! Cannot Locate Input File! Impossible de localiser le fichier entrant ! Image Format: %1 Allocated Disk Space: %2 %3 Format de l'image : %1 Espace disque alloué : %2 %3 Virtual Size: %1 %2 Cluster Size: %3 Taille virtuelle : %1 %2 Taille de cluster : %3 Save Out HDD Image File File Name is Empty! Le nom du fichier est vide ! Please Enter Correct HDD Image filename! Entrez un nom correct pour l'image disque dur ! Cannot get a valid format for current HDD image! Impossible d'avoir un format valide pour l'image disque actuelle ! Please Wait. Converting HDD Image... Patientez s'il-vous-plait. Conversion de l'image disque dur en cours... Cancel Annuler Information: Information : Conversion completed sucessfuly! Conversion complètement terminée ! Cannot convert image! Details: %1 Impossible de convertir l'image ! Détails : %1 Copy_VM_Window Copy VM Copier la machine virtuelle New VM Name: Nouveau nom de la machine virtuelle : Copy Disk Images Copier les images disques Copy Floppy Images Copier les images disquettes Copy Hard Drive Images Copier les images disques durs &OK &Cancel &Annuler Error! Erreur ! This VM Name is Already Used! Ce nom pour la machine virtuelle est déjà utilisé ! Create_HDD_Image_Window Create HDD Image Créer une image de disque dur New Image &File Name: Nouveau nom du &fichier image : Browse... Parcourir... &Format: &Format : qcow2 qcow vmdk cow raw cloop &Help... &Aide... &Size: &Taille : KB MB GB Additional features Caractéristiques additionnelles Image Must be &Encrypted (QCOW Format Only) L'image doit être &cryptée (seulement au format QCOW) Use &Base HDD Image C&reate C&réer &Cancel &Annuler F&ormat F&ormater Select Base HDD Image File Sélectionnez le fichier d'image disque dur de base All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Tous les fichier (*);;Fichiers images (*.img *.qcow *.qcow2 *.wmdk) Create HDD Image File Créer un fichier image de disque dur Error! Erreur ! Image File Name is Empty! Le nom du fichier image est vide ! Invalid image size! Taille d'image invalide ! Base Image File doesn't Exists! Image was Not Created! L'image n'a pas été créé ! QEMU-IMG Supported formats Formats supportés par « qemu-img » raw Raw disk image format. This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux. qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots. qcow Old QEMU image format. Left for compatibility. cow User Mode Linux Copy On Write image format. Used to be the only growable image format in QEMU. It is supported only for compatibility with previous versions. It does not work on win32. vmdk VMware 3 and 4 compatible image format. cloop Linux Compressed Loop image, useful only to reuse directly compressed CD-ROM images present for example in the Knoppix CD-ROMs. Create_Template_Window Create Template Créer un modèle (« template ») New VM template name Non de nouveau modèle (« template ») de VM Files Fichiers Virtual machine file Fichier de la machine virtuelle Use default folder for new template Utiliser le dossier par défaut pour les nouveaux modèles (« template ») Other folder for new template: Autre répertoire pour les nouveaux modèles (« template ») : Creating Options Options de créations Save Floppy and CD-ROM Settings Sauvegarder les paramètres disquette et CD-ROM Save Hard Disks Size or Format Settings Sauvegarder les tailles de disques durs et les paramètres de formatages Save Network Settings Sauvegarder les paramètres réseau Save Ports (USB/Serial/Parallel) Sauvegarder les ports (USB/Série/Parallèle) C&reate C&réer &Cancel &Annuler Open VM File Ouvrir le fichier de VM AQEMU VM Files (*.aqemu) VM AQEMU (*.aqemu) Select Template Folder Sélectionnez le répertoire des modèles (« template ») Warning! Attention ! Template Name is Empty! Le nom de modèle (« template ») est vide ! VM file doesn't exist! Le fichier de VM n'existe pas ! Cannot Locate Template Folder! Impossible de localiser le répertoire des modèle (« template ») ! Error! Erreur ! Cannot Load VM! Impossible de charger la VM ! Cannot Create Template! Impossible de créer le modèle (« template ») ! Replace Remplacer Your template name is already used! Do you want replace previous template? Votre nom de modèle (« template ») est déjà utilisé ! Voulez-vous écraser le modèle précédent ? You Name For Template in Not Unique! Replace Previous Template? Votre nom pour le modèle b'est pas unique ! Écraser le modèle précédent ? Delete_VM_Files_Window Delete VM and Files Supprimer la VM et ses fichiers Show only: Montrer seulement : &Hard drive images Images de &disques durs &All VM files &Fichiers de toutes les VM Delete Supprimer Device name Nom du périphérique Path Chemin &Delete selected &Supprimer les sélectionnés &Cancel &Annuler Screenshot Capture d'écran Floppy A Disquette A Floppy B Disquette B CD-ROM HDA (Primary Master) HDA (premier maître) HDB (Primary Slave) HDB (premier esclave) HDC (Secondary Master) HDC (second maître) HDD (Secondary Slave) HDD (second esclave) ROM File FIchier ROM MTDBlock File Fichier MTDBlock SD Card File File de carte SD PFlash File Fichier PFlash Kernel bzImage Kernel Initrd Serial Port Redirection Redirection du port série Parallel Port Redirection Redirection du port parallèle Storage Device Périphérique de stockage Confirm Delete Confirmer la suppression Delete " Supprimer la VM « " VM and Selected Files? » et les fichiers sélectionnés ? An error occurred while deleting files Une erreur est survenu pendant la suppression des fichiers This Files Not Deleted: Ces fichiers ne sont pas supprimé : Please Check Permissions! Vérifiez les permissions ! Device_Manager_Widget Device Manager Widget Widget de gestionnaire de périphérique View Mode Mode de visualisation Icon Mode Mode icône List Mode Mode liste Manage Devices Gérer les périphériques Properties Propriétés Delete Supprimer Format HDD Formater le disque dur Quick Format Formatation rapide Add Devices Ajouter des périphériques Add Floppy Ajouter disquette Add CD/DVD-ROM Ajouter CD/DVD-ROM Add HDD Ajouter disque dur Add Storage Device Ajouter des périphériques de stockage Device List: Liste de périphérique : Information: Information : Add Device Ajouter périphérique Type: Host Device Type: Image Type : image On Disk Size: Sur la taille du disque : KB MB Image Virtual Size: Taille virtuelle de l'image : Image On Disk Size: Image sur la taille du disque : Type: Storage Device Type : périphérique de stockage Floppy 1 Disquette 1 Floppy 2 Disquette 2 Warning! Attention ! Maximum Floppy Disk Count is 2 Le nombre maximal de disquettes est de 2 CD/DVD-ROM CD-ROM Maximum CD-ROM Disk Count is 1 Le nombre maximal de CD-ROM est de 1 HDA (First Master) HDA (premier maître) HDA HDB (First Slave) HDB (premier esclave) HDB HDC (Second Master) HDC (second maître) HDC HDD (Second Slave) HDD (second esclave) HDD Maximum Hard Disk Count is 4 excluding CD-ROM Le nombre maximal de disque dur est de 4, CD-ROM exclu Delete? Supprimer ? Delete Device? Supprimer le périphérique ? Error! Erreur ! Incorrect Device! Périphérique incorrect ! Format? Formater ? Format Virtual Hard Disk? Formater le disque dur virtuel ? Information Complete! Terminé ! Cannot Format! Impossible de formater ! Edit_Emulator_Version_Window Edit Emulator Version Éditer la version de l'émulateur &Available Versions: Versions &disponibles : &OK &Cancel &Annuler %1 (Located in %2) %1 (situé dans %2) QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Emulator_Control_Window Emulator Control Contrôle de l'émulateur &Help &Aide &VM Send &Keys Envoyer les cle&fs Ctrl-Alt-&F# &Connect &Connexion Floppy &B Disquette &B Recent Files Fichiers récents Floppy &A Disquette &A &USB Connect Connexion Disconnect Déconnexion &CD-ROM View Vue Save Screens&hot Sauvegarder la capture d'&écran &Save VM &Sauvegarder la VM &Load VM Charger &la VM Ctrl+O &Pause VM Mettre en &pause la VM &Quit &Quitter Save VM S&tate... Sauvegarder l'é&tat de la VM... Load VM St&ate... Charger l'ét&at de la VM... &Reset VM &Redémarrer la VM Power &Off Étein&dre &Commit Ctrl-Alt-&Delete Ctrl-Alt-&Suppr 1 2 3 4 5 6 7 8 9 10 11 12 /dev/fd0 /dev/null Other... Autre... Eject Éjecter Update Device List Mise à jour de la liste des périphériques &About Emulator Control... &À propos du contrôle de l'émulateur... /dev/cdrom Save Screenshot As... Sauvegarder la capture sous... All Devices Tous les périphériques &Other Keys... &Autre clef... QEMU/KVM &Monitor &Moniteur QEMU/KVM Ctrl-Alt-Backspace Ctrl-Alt-Entrer null (/dev/null) stdio (Standard In Out) stdio (« standard in out © ») /dev/ttyS0 By Bus.Address Par adresse de bus Manage Snapshots Gérer les instantanés d Display Scaling Fullscreen Mode Mode plein-écran Ctrl+Alt+F Show Status Bar Monter la barre de status Reinit VNC Réinitialiser VNC a [Paused] (En pause) [Saved] (Sauvegardé) Power Off This VM? Éteindre cette VM ? Selected VM is running now. Shutdown anyway? La VM sélectionnée est en cours d'exécution. Voulez-vous l'éteindre malgré tout ? (Emulator Control) (Contrôle de l'émulateur) All Files (*) Tous les fichiers (*) Are you sure? Êtes-vous sûr ? Are you sure to shutdown VM "%1"? Êtes-vous sûr de vouloir éteindre la VM « %1 » ? Are you sure to reboot VM "%1"? Êtes-vous sûr de vouloir redémarrer la VM « %1 » ? Open Device or Image File Ouvrir un périphérique ou un fichier image All Files (*);;Images Files (*.img *.ima) Tous les fichiers (*);;Fichiers images (*.img *.ima) All Files (*);;Images Files (*.iso) Tous les fichiers (*);;Fichiers images (*.iso) Error! Erreur ! Cannot Find USB Device! Impossible de trouver le périphérique USB ! Cannot Get USB Information From System! Impossible d'obtenir des informations sur l'USB depuis le système ! Disconnect USB Déconnecter l'USB Enter You Bus.Address VM USB Value Entrez l'adresse du bus USB de la machine virtuelle Send Keys Envoyer les clefs Enter your key combinations such as ctrl-alt-del or alt-f2 Entrez votre combinaison de touches comme « Ctrl-Alt-Suppr » ou « Alt-F2 » Fullscreen mode Mode plein-écran To enable window mode press Ctrl-Alt-F Do you want to show this message again? Pour activer le mode fenêtré, pressez « Ctrl-Alt-F ». Voulez-vous voir ce message la prochaine fois ? About Emulator Control... À propos du contrôle d'émulateur... Emulator Control is a Tool for Managing QEMU in Runtime. Le contrôle d'émulateur est un outil de gestion de QEMU en exécution. Warning! Attention ! In This VM Floppy 1 Not Found! Dans cette VM la disquette 1 n'est pas trouvée ! In This VM Floppy 2 Not Found! Dans cette VM la disquette 2 n'est pas trouvée ! In This VM CD-ROM Not Found! Dans cette VM le CD-ROM n'est pas trouvé ! Emulator_Options_Window Emulator Settings Paramètres de l'émulateur Name (Emulator identifier) Nom (identifiant de l'émulateur) Find emulator Rechercher un émulateur Emulator type: Type d'émulateur : QEMU KVM (For adding QEMU-KVM, add them one by one) (Pour ajouter QEMU-KVM, ajoutez-les un à un) Path to Emutators Binary Directory: Chemin vers le répertoire des binaires des émulateurs : ... &Find Emulators &Rechercher les émulateurs Emulators Executables Files Fichiers exécutables des émulateurs QEMU/KVM System Système QEMU/KVM Binary File Name Nom du fichier binaire Emulator Version Version de l'émulateur Use saved available emulator options (Recomended to choose it again after emulator updating) Utiliser les options disponibles sauvegardées de l'émulateur (il est recommandé de rechoisir ceci après la mise à jour de l'émulateur) Always check available emulator options while starting AQEMU (Slow) Toujours vérifier les options pour l'émulateur disponible au démarrage d'AQEMU (lent) Always check emulator version while starting AQEMU Toujours vérifier la version de l'émulateur au démarrage d'AQEMU Set version and available options manually Paramètrer la version et les options disponible manuellement &OK &Cancel &Annuler Error! Erreur ! Path is Empty! Le chemin est vide ! Warning Avertissement Path doesn't exist! Le patch n'existe pas ! Select Directory Sélectionnez un répertoire Enulator Name is Empty! Le nom de l'émulateur est vide ! This emulator name is already used! Ce nom d'émulateur est déjà utilisé ! QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Select QEMU Binary File Sélectionnez le fichier binaire de QEMU All Files (*) Tous les fichiers (*) Cannot get emulator info! For file: %1 Impossible d'avoir d'information sur l'émulateur ! Pour le fichier : %1 Cannot get version for emulator! Impossible d'avoir la version de l'émulateur ! Error_Log_Window QEMU Error Log Log d'erreur de QEMU Error Window Show Mode Fenêtre de visualisation d'erreur Normal Mode Mode normal Do Not Show Until Next VM Started Ne pas montrer avant le prochain démarrage de la VM Do Not Show Until Next AQEMU Started Ne pas montrer avant le prochain démarrage d'AQEMU Never show it (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Ne jamais montrer (Pour voir le log d'erreur, sélectionner « VM > Montrer la fenêtre de log d'erreur de QEMU/KVM ») &Clear Errors List &Nettoyer la liste d'erreurs &OK Error # Erreur # First_Start_Wizard First Start Wizard Premier démarrage de l'assistant English QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X Warning! Attention ! Are you sure? You can configure these options later in Settings windows. Êtes-vous sûr ? Vous pouvez configurer ces options plus tard dans la fenêtre « Paramètres ». Set Folder for you VM's Paramètrez le répertoire pour vos machines virtuelles Search... Recherche... Cancel Annuler Error! Erreur ! Cannot get emulator info! For file: %1 Impossible d'avoir d'information sur l'émulateur ! Pour le fichier : %1 QEMU Found in "%1", version: %2 QEMU trouvé dans « %1 », version : %2 KVM Found in "%1", version: %2 KVM trouvé dans « %1 », version : %2 Emulator Version Modified By User Version de l'émulateur modifié par l'utilisateur Select QEMU emulator directory Sélectionnez le répertoire de l'émulateur QEMU &Finish &Terminer &Next &Suivant Cannot Create New Folder! Impossible de créer un nouveau répertoire ! Error Erreur Emulator binary files not exists! Please click Back and set it manual. Les fichiers binaires de l'émulateur n'existent pas ! Cliquez sur « Précédent » et configurez-le manuellement. Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path Impossible de trouver « qemu-img.exe » ! Vous devez entrer son chemin dans : « Fichier > Paramètres avancé > Chemin vers qemu-img » Welcome Bienvenue General Settings Paramètres généraux Find Emulators Rechercher les émulateurs Setup Emulator Configuration de l'émulateur Finish Terminer &Back &Précédent &Cancel &Annuler Welcome to AQEMU settings wizard! This wizard will help you to choose options AQEMU needed to work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. Bienvenue sur l'assistant de paramètrage d'AQEMU ! Cet assistant vous aidera à choisir les options nécéssaire pour qu'AQEMU fonctionne correctement. Cliquez sur le boutton « Suivant » pour aller à la page suivante ou sur le boutton « Précédent » pour aller à la page précédente. Here you can choose interface language Vous pouvez choisir le langage de l'interface Please select folder for AQEMU virtual machines Sélectionnez un répertoire pour les machines virtuelles d'AQEMU If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will be displayed in virtual machine as icons, like in file manager window. Si le mode « Gestionnaire de périhérique » est activé, les périphérique de stockage (disquette, CD/DVD, disque dur) seront affichés dans la machine virtuelle comme des icônes. Use Device manager Utiliser le gestionnaire de périphérique New experimental work mode is available in AQEMU. In this mode QEMU/KVM display will be showed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this feature you must mark the "Include Emdedded VNC Display in Main Window" flag. Un nouveau mode de travail est disponible dans AQEMU. Dans ce mode l'affichage de QEMU/KVM sera montré dans la fenêtre principale d'AQEMU. Notez que ce mode est toujours instable et des problèmes peuvent survenir. Si vous voulez activer cette caractéristique, vous devez sélectionner « ». Include Emdedded VNC Display in Main Window Inclure l'affichage intégré de VNC dans la fenêtre principale For correct working AQEMU must know your emulators locations and versions. For searching push the "Search" button. If automatic search can't find out your emulators, you should configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Pour correctement fonctionner, AQEMU doit connaître les versions et les localisations de vos émulateurs. Pour rechercher, cliquez sur le boutton « Rechercher ». Si la recherche automatique ne peut pas trouver vos émulateurs, vous devez configurer AQEMU vous-même plus tard. Vous pouvez le faire dans « Fichiers > Paramètres avancés ». &Search &Rechercher S&kip Search S&auter la recherche Set &Versions Manualy Paramètrer la &version manuellement Congratulations! The Wizard has got all necessary settings for configuring AQEMU. Push "Finish" button to save your settings. Félicitations ! L'assistant a tous les paramètres nécéssaire pour configurer AQEMU. Cliquez sur « Terminer » pour sauvegarder vos paramètres. MachineView Error! Erreur ! Cannot Reinit VNC Connection! Impossible de réinitialiser la connexion VNC ! Main_Window AQEMU Info Information General Général Machine &Name: &Nom de la machine : Emulator Type: Type d'émulateur : Emulator Version: Version de l'émulateur : Computer Type: Type d'ordinateur : Machine &Type: &Type de machine : B&oot Priority: Priorité de &démarrage : Floppy Disquette HDD Disque dur CD-ROM Network Réseau None Aucun &CPU Type: Type de &processeur : Number of CP&U: Nombre de p&rocesseur : 1 2 4 8 16 32 64 128 255 &Video Card: Carte &vidéo : &Keyboard Layout Disposition du &clavier en-us (default) ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr Memory Size Taille de la mémoire 1 MB Updating free memory information Mise à jour des informations sur la mémoire libre Free memory: 768 MB Mémoire libre : 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Enlever la limitation sur la quantité maximum de mémoire Audio Cards Cartes audio Sound &Blaster 16 &ENSONIQ ES1370 &Yamaha YM3812 AC97 (Intel 82801AA) Gravis &Ultrasound GF1 PC Speaker Haut-parleur d'ordinateur Options Start in full screen Démarrer en plein écran &Fullscreen Mode Mode &plein écran Snapshot &Mode Mode &instantané Set real time clock to local time. Default=utc Paramétrer Use &Local Time Utiliser l'horloge &locale HDA (Primary Master) HDA (premier maître) Select Disk Image Sélectionnez une image disque Open Ouvrir Create New HDD Créer nouveau disque dur Create Créer Image Format: none Allocated Disk Space: 0 Format de l'image : aucun Espace disque alloué : 0 Virtual Size: 0 Cluster Size: 0 Taille virtuelle : 0 Taille de cluster : 0 Format Formater All settings Tous les paramètres HDB (Primary Slave) HDB (premier esclave) HDC (Secondary Master) HDC (second maître) HDD (Secondary Slave) HDD (second esclave) CD/DVD/Floppy CD/DVD/disquette CD/DVD-ROM Browse Parcourir Type: none Size: 0 Type : aucun Taille : 0 Floppy A Disquette A Floppy B Disquette B Use &Network Utiliser le &réseau Network Settings GUI Type: Basic Basique Native Additional Settings Paramètres additionnels &Redirections Protocol Protocole Host Port Guest IP Guest Port A&dd item D&elete item &Clear list &Nettoyer la liste Redirect item settings Protocol: Protocole : &TCP &UDP &Host Port to &guest IP Guest Por&t Other network settings Autres paramètres réseau T&FTP Server Prefix: Allow &SMB Access to: ... Advanced Avancé Additional Options Options additionnelles Fix Windows 2000 install Bug &Windows 2K Hack RTC TD Hack (Fix Time Drift in Windows ACPI HAL) No Shutdown Pas d'extinction Exit instead of rebooting Quitter au lieu de redémarrer No Reboot Pas de redémarrage Start CP&U at Startup Démarrer le processe&ur au démarrage Check Floppy Disk boot signature in VM BIOS Check Boot Secto&r on FDD Enable ACP&I Activer l'ACP&I Start Date (Day.Month.Year Hour:Minute:Second) Date de démarrage (jour.mois.année heure:minute:seconde) dd.MM.yyyy HH:mm:ss jj.MM.aaaa HH:mm:ss QEMU/KVM Window Options Fenêtre d'options de QEMU/KVM Show QEMU/KVM Window Without a Frame and Window Decorations Use Ctrl-Alt-Shift to Grab Mouse (Default is Ctrl-Alt) Disable QEMU/KVM Window Close Capability Rotate Graphical Output 90 Deg Left (Only PXA LCD) Curses (Use a curses/ncurses Interface Instead of SDL) Show Cursor (It Works Only in QEMU/KVM SDL Window) Initial Graphical Mode Mode graphique initial Width Largeur Height Hauteur Depth Profondeur 24 Send Only User Arguments Without AQEMU Arguments Use Emulator Binary File in "Additional QEMU/KVM Arguments" Additional QEMU/KVM &Arguments &Arguments additionnels pour QEMU/KVM Other Autre Hardware Virtualization Virtualisation du matériel KVM Options Options de KVM Enable KVM Activer KVM Disable KVM kernel mode PIC/IOAPIC/LAPIC Disable KVM kernel mode PIT Disable KVM kernel mode PIT interrupt reinjection Nesting (Support for Running a VM Inside other VM (AMD Only) KVM Shadow Memory Mb KQEMU Acceleration Module Module d'accélération KQEMU Disabled (Disable KQEMU Accelerator module) Use If Possible (AQEMU won't check loaded KQEMU module) Enabled (AQEMU checks loaded KQEMU module. If it isn't loaded QEMU won't started) Full (Enable full virtualization mode for best performances) VNC Activate VNC Activer VNC General settings Paramètres généraux VNC Display Number For Connection Use Port 5900 + VNC Display Number UNIX Domain Socket Security settings Paramètres de sécurité Use Password (You must set a password when you starting the VM) Use TLS Utiliser TLS x509 Folder Path x509verify Folder Path Warning: Globaly Activated Embedded Display in Emulator Control Window. To Disable This Function in Current VM choose "Don't Use Embedded VNC Display" Don't use embedded VNC Display Optional Images Images optionnelles ROM File (For EtherBoot) On-Board Flash Image SecureDigital Card Image Parallel Flash Image Boot Linux Kernel Use &Linux Boot Utiliser le démarrage &Linux Kernel bzImage File: &Initrd File: Fichier &Initrd : Append Command Line: &Apply &Appliquer &Discard Changes &Désactiver les changements &VM &New VM &Nouvelle VM &Help &Aide &File &Fichier &About AQEMU &À propos d'AQEMU About AQEMU À propos de AQEMU F1 About &Qt À propos de &Qt &Delete VM &Supprimer VM &Exit Quitt&er Ctrl+Q &Wizard... &Assistant... Ctrl+W &Add New VM &Ajouter une nouvelle VM Ctrl+N &Create HDD Image &Créer une image disque dur Con&vert HDD Image Con&vertir l'image dique dur Convert HDD Image Convertir l'image dique dur General &Settings Paramètres &généraux AQEMU &Settings &Paramètres d'AQEMU &Start &Démarrer Ctrl+S Sto&p Ctrl+D &Pause Ctrl+P &Reset &Redémarrer Ctrl+R &Load VM From File Save As &Template Show QEMU/KVM &Arguments Sa&ve Sau&vegarder Change Icon Changer licône Copy Copier Manage Snapshots Gérer les instantanés Show Emulator Control Voir le contrôle d'émulateur Show QEMU/KVM Error Log Window &Advanced Settings P&aramètres avancés Start &First Run Wizard &Premier démarrage de l'assistant Create Shell Script Créer un script Shell Delete VM And Files SPICE Ports Cannot Save Settings! Impossible de sauvegarder les paramètres ! Close AQEMU? Fermer AQEMU ? One or More VM is Running! Terminate All Running VM and Close AQEMU? Une, ou plus, VM est en cours d'exécution ! Toutes les terminer et fermer AQEMU ? Error! Erreur ! VM Name is Empty! Le nom de la VM est vide ! Redirection List is Empty! Please Disable Redirections! Device Manager Gestionnaire de périphérique VM File " " is Read Only! Check Permissions! Memory size < 1! Using default value: 256 MB Memory size > all free memory on this system! La taille mémoire est supérieure à la mémoire libre sur ce système ! You must create a new virtual machine This VM uses an emulator "%1" which is not installed in the system. The work of the VM is not possible! Machine Details Détails de la machine Machine State: État de la machine : Running Fonctionnement Power Off Éteinte Pause Saved Sauvegardé Machine Name: Nom de la machine : Machine Type: Type de machine : Boot Priority: Priorité de démarrage : CPU Type: Type de processeur : Number of CPU: Nombre de processeur : Video Card: Carte vidéo : Keyboard Layout: Disposition du clavier : Memory Size: Taille de la mémoire : Use Sound: Utiliser le son : Yes Oui No Non Fullscreen Mode: Mode plein-écran : Use Snapshot Mode: Utiliser le mode instantané : Use Local Time: Utiliser l'heure locale : Storage Devices Périphériques de stockage Floppy 1: Disquette 1 : Floppy 2: Disquette : CD/DVD-ROM: CD/DVD-ROM : Primary Master (HDA): premier maître (HDA) : Primary Slave (HDB): premier esclave (HDB) : Secondary Master (HDC): Second maître (HDC) : Secondary Slave (HDD): Second esclave (HDD) : Use Network: Utiliser le réseau : Card: Carte : User mode network stack TUN/TAP Interface Interface TUN/TAP TCP Socket Socket TCP VLAN UDP multicast socket No Connection Pas de connexion Item %1 NIC User Utilisateur Channel Canal TAP Socket Multicast Socket VDE Dump Unknown Type Item Item de type inconnu Redirection Use Redirections: Serial Port %1: Port série %1 : Default Par défaut vc pty none null dev host_port file stdio pipe udp tcp telnet unix Parallel Port %1: Port parallèle %1 : USB Port %1: Port USB %1 : Acceleration: Accélération : Use If Possible Utiliser si possible Disabled Désactivé Enabled Activé Full Plein VNC Port: Port VNC : SPICE Port: Port SPICE : Use Linux Boot: Utiliser le démarrage Linux : Kernel bzImage: Initrd File: Fichier initrd : Kernel ComLine: ROM File: FIchier ROM : On-Board Flash Image: SD Card Image: Image de carte SD : Parallel Flash Image: RTC TD Hack: Windows 2000 Hack: No Shutdown: Pas d'extinction : No Reboot: Pas de redémarrage : Start CPU at Startup: Démarrer le CPU eu démarrage : Check Boot Sector on FDD: Enable ACPI: Activer l'ACPI : Start Date: No Frame: Alt Grab: No Quit: Portrait Mode: Mode portrait : Curses: Show Cursor: Montrer le curseur : Initial Graphical Mode: Mode graphique initial : QEMU/KVM Arguments Arguments QEMU/KVM Type: Host Device Type: Image Size: 0 Byte Kb Gb Type: Image Size: Type : Image Taille : Display Affichage Warning! Attention ! Current VM was changed. Discard all changes? Current VM was changed. Save all changes? Warning Avertissement Cannot Change Icon When VM in Save State. bzImage Initrd ROM File FIchier ROM On-Board Flash SecureDigital Card Carte Secure Digital Parallel Flash VNC x509 Folder VNC x509verify Folder No boot device found! %1 Image "%2" doesn't Exist! Continue Without this Image? Delete? Supprimer ? Delete " Supprimer « " VM? » VM ? Cannot Delete VM XML File! VM Name Nom de la VM New Virtual Machine Name: Nouveau nom de la machine virtuelle : Your New VM Name is Empty! VM isn't Created! Le nom de votre nouvelle VM est vide ! La VM n'est pas créée ! VM be Changed. Save Changes? QEMU running in snapshot mode. VM can not be saved in this mode. Are you sure? Êtes-vous sûr ? Shutdown VM "%1"? Éteindre la VM « %1 » ? Reboot VM "%1"? Redémarrer la VM « %1 » ? Open AQEMU VM File Ouvrir un fichier AQEMU de VM AQEMU VM (*.aqemu) VM AQEMU (*.aqemu) VM With This Name Already Exists! Ce nom de VM existe déjà ! Information New Template Created! Un nouveau modèle (« template ») créé ! Emulator Control Already Show Le contrôle de l'émulateur est déjà affiché This Function Works Only On Running VM! Cette fonction ne fonctionne qu'avec une VM en cours d'exécution ! QEMU/KVM Arguments: Arguments QEMU/KVM : No VM Found! Aucune VM trouvée ! Save VM to Script Shell Script Files (*.sh);;All Files (*) Tous les fichiers (*);;Scripts (*.sh) Cannot Open File! Impossible d'ouvrir le fichier ! Error Erreur Cannot convert "%1" to memory size! Impossible de convertir « %1 » en taille mémoire ! Cannot convert "%1" to integer! Impossible de convertir « %1 » en un entier ! Cannot convert "%1" to size suffix! Valid suffixes are: MB, GB Impossible de convertir « %1 » à la grandeur donnée en suffixe ! Les suffixes valides sont : MB et GB Memory size < 0! Valid size is 1 or more Taille mémoire < 0 ! Une taille valide est de 1 ou plus Your memory size %1 MB > %2 MB - all free RAM on this system! To set this value, check "Remove limitation on maximum amount of memory". Current memory size more of all host memory! Use the maximum available size. Free memory: %1 MB Mémoire libre : %1 MB Free memory on this system is less than 32 MB! La mémoire libre sur ce système est de moins de 32 MB ! Open Floppy Image File Ouvrir le fichier image disquette All Files (*);;Images Files (*.img *.ima) Tous les fichiers (*);;Fichiers images (*.img *.ima) Open CD\DVD-ROM Image File Ouvrir le fichier image CD/DVD-ROM All Files (*);;Images Files (*.iso) Tous les fichiers (*);;Fichiers images (*.iso) Open HDD Image File Ouvrir le fichier image disque dur All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Tous les fichier (*);;Fichiers images (*.img *.qcow *.qcow2 *.wmdk) Image Format: Format de l'image : Allocated Disk Space: Espace disque dédié : Virtual Size: Taille virtuelle : Cluster Size: Taille de cluster : QEMU KVM CPU count value is not valid digit! CPU count > max CPU count for this emulator! Nombre de CPU suppérieur au nombre maximal pour cet émulateur ! Cannot Save This VM to File! Impossible de sauvegarder cette VM dans le fichier ! Network Settings Paramètres réseau Network Cards Cartes réseaux To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press "Ignore" button for hide this message in future. Add This Record? Select SMB Directory UNIX Domain Socket Path All Files (*) Tous les fichiers (*) Select x509 Certificate Folder Select x509 Verify Certificate Folder Select Kernel Image File Select InitRD File Select ROM File Select On-Board Flash Image Select SecureDigital Card Image Select Parallel Flash Image Monitor_Window QEMU/KVM Monitor Moniteur de QEMU/KVM Com&mand: Com&mande : info version info network info réseau info block info registers info registres info cpus info history info historique info irq info pic info pci info tlb info mem info jit info kqemu info usb info usbhost info usb hôte info profile info profil info capture info snapshots info mice info souris info vnc &Run &Lancer &Clear &Nettoyer Change font Changer la police Font Police Network_Widget AQEMU Network Widget Widget réseau d'AQEMU Items List: Liste d'items : &Add &Ajouter &Delete S&upprimer Connection Type Type de connexion ? Model Modèle macaddr Adresse MAC aa:bb:cc:dd:ee Generate New MAC Générer une nouvelle adresse MAC vlan VLAN name Nom hostname Nom d'hôte port:dev port:périphérique fd Descripteur de fichier ifname nom de l'interface script ... downscript listen Écouter connect Connecter mcast Multi-cast sock port Port group Groupe mode Mode file fichier len Longueur 64Kb (default) 64Kb (défaut) 128Kb 512Kb 1Mb 5Mb 10Mb addr Adresse vectors Vecteurs net Réseau host Hôte restrict Restreindre y Oui n Non dhcpstart dns tftp TFTP bootfile Fichier de démarrage smb SMB smbserver Serveur SMB sndbuf vnet_hdr on marche off arrêt vhost vhostfd hostfwd guestfwd Unknown Type Item Item de type inconnu Warning! Attention ! Maximum Network Cards Count is 8. Le nombre maximal de carte réseau est de 8. New Item Nouvel item nic -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no '-net' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. user utilisateur -net user[,vlan=n][,hostname=name][,name=name] Use the user mode network stack which requires no administrator privilege to run. 'hostname=name' can be used to specify the client hostname reported by the builtin DHCP server. channel Canal -net channel,port:dev Forward 'user' TCP connection to port port to character device dev tap -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] Connect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. 'fd'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is '/etc/qemu-ifup' and the default network deconfigure script is '/etc/qemu-ifdown'. Use 'script=no' or 'downscript=no' to disable script execution. socket -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] Connect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If 'listen' is specified, QEMU waits for incoming connections on port (host is optional). 'connect' is used to connect to another QEMU instance using the 'listen' option. 'fd'=h specifies an already opened TCP socket. -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] Create a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. NOTES: 1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). 2. mcast support is compatible with User Mode Linux (argument 'ethN=mcast'), see http://user-mode-linux.sf.net. 3. Use 'fd=h' to specify an already opened UDP multicast socket. vde -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] Connect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled. dump -net dump[,vlan=n][,file=f][,len=n] dump traffic on vlan 'n' to file 'f' (max n bytes per packet) Select script Sélectionnez un script All Files (*);;Scripts (*.sh) Tous les fichiers (*);;Scripts (*.sh) Boot file Fichier de démarrage All Files (*) Tous les fichiers (*) SMB directory Répertoire SMB Error! Erreur ! Incorrect MAC address! L'adresse MAC est incorrecte ! Invalid name! Valid characters are:: a-z A-Z 0-9 _ - Nom invalide ! Les caractères valides : a-z A-Z 0-9 _ - Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ - %1 File "%2" doesn't Exist! Continue Without this File? Old_Network_Widget Old Network Widget Widget ancien réseau Cards List: Liste des cartes : Add Ajouter &Delete S&upprimer Network Card Model: Modèle de la carte réseau : Connection &Mode: Mode de &connexion : Use the user mode network stack Open a TUN/TAP interface Ouvrir une interface TUN/TAP Use an already open TUN/TAP interface Utiliser une interface TUN/TAP déjà ouverte Open a listening TCP socket Use an already open TCP socket Connect to listening TCP socket Create shared VLAN via UDP multicast socket Use an already open UDP multicast socket No connection Pas de connexion VM Hostname: Nom d'hôte de la VM : &IP Address: Adresse &IP : &MAC Address: Adresse &MAC : Generate New MAC Générer une nouvelle adresse MAC &VLAN: &VLAN : &Port: &Port : &FD: &FD : If the value is 0 then it will not be used Si la valeur est 0 alors ce ne sera pas utilisé &TUN/TAP Script: Script &TUN/TAP : ... &Interface Name: Nom de l'&interface : Error Erreur Network Card #% Not Valid! Carte réseau #% invalide ! Card Carte Warning! Attention ! Maximum Network Cards Count is 8. Le nombre maximal de carte réseau est de 8. Network Cards List is Empty! La liste des cartes réseau est vide ! Cannot Delete Network Card! Impossible de supprimer la carte réseau ! Select script Sélectionnez un script All Files (*);;Scripts (*.sh) Tous les fichiers (*);;Scripts (*.sh) Error! Erreur ! IP Address in Card Invalid! Non valide ! MAC Address in Card In Card Dans la carte TUN/TAP Script File "%1" Not Exists! Continue Without It File? Ports_Tab_Widget Ports Add port Ajouter un port Serial (COM) Série (COM) Parallel (LPT) Parallèle (LPT) USB Edit Port Éditer un port Delete Port Supprimer un port Ports List Liste des ports Port type Type de port Details Détails COM (Serial Port) COM (port série) LPT (Parallel Port) LPT (port parallèle) USB Port Port USB Keyboard Clavier Mouse Souris Tablet Tablette Wacom Tablet Tablette Wacom Braille Virtual QEMU/KVM Device: %1 Périphérique virtuel de QEMU/KVM : %1 %1 %2 (Vendor ID: %3 Product ID: %4) %1 %2 (identité du fournisseur : %3 identité du produit : %4) %1 %2 (BusAddr: %3) %1 %2 (adresse du bus %3) Warning Avertissement You can add no more than 4 COM ports Vous ne pouvez ajouter plus de 4 ports COM You can add no more than 3 LPT ports Vous ne pouvez ajouter plus de 3 ports LPT Device not select! Périphérique non sélectionné ! Device doesn't selected! Le périphérique n'est pas sélectionné ! Properties_Window Properties Propriétés Floppy Disquette Browse Parcourir Advanced settings Paramètres avancés CD/DVD-ROM Hard Disk Disque dur Path to Image: Chemin vers l'image : ... Create &New Créer un &nouveau &Format Exist &Formater existant Information Device Name: Nom du périphérique : Up&date Info &Mise à jour des informations &OK &Cancel &Annuler Warning Avertissement Image file doesn't exist! Le fichier image n'existe pas ! Image Size: Taille de l'image : Kb Mb Open Floppy Image File Ouvrir le fichier image disquette All Files (*);;Images Files (*.img *.ima) Tous les fichiers (*);;Fichiers images (*.img *.ima) Open CD\DVD-ROM Image File Ouvrir le fichier image CD/DVD-ROM All Files (*);;Images Files (*.iso) Tous les fichiers (*);;Fichiers images (*.iso) Open HDD Image File Ouvrir le fichier image disque dur All Files (*);;Images Files (*.img *.qcow *.wmdk) Tous les fichier (*);;Fichiers images (*.img *.qcow *.wmdk) Format: Format : Virtual Size: Taille virtuelle : On Disk Size: Sur la taille du disque : Cluster Size: Taille de cluster : QObject Standard PC Ordinateur standard ISA-only PC Ordinateur uniquement ISA Integrator/CP (ARM926EJ-S) Integrator/CP (ARM1026EJ-S) Versatile/PB (ARM926EJ-S) Versatile/AB (ARM926EJ-S) RealView (ARM926EJ-S) R4k platform Plate-forme R4k Malta Core LV Heathrow PowerMAC Mac99 PowerMAC PowerPC PREP SPARCstation 2 (Sun4c) SPARCstation 5 (Sun4m) SPARCstation 10 (Sun4m) SPARCstation 20 (Sun4m) SPARCserver 600MP (Sun4m) SPARCserver 1000 (Sun4d) SPARCcenter 2000 (Sun4d) NE2000 PCI NE2000 ISA i82551 i82557B i82559ER PCnet32 PCI RTL8139 SMC91C111 MCF FEC shix card Carte shix r2d-plus board Planche r2d-plus Lance No Video Card Pas de carte vidéo Cirrus CLGD 5446 Standard VGA VGA standard Sun4m qemu64 Athlon Akita PDA (PXA270) Spitz PDA (PXA270) Borzoi PDA (PXA270) Terrier PDA (PXA270) Palm Tungsten (OMAP310) Stellaris LM3S811EVB Stellaris LM3S6965EVB Gumstix Connex (PXA255) Gumstix Verdex (PXA270) Mainstone II (PXA27x) Bare ETRAX FS board Acer Pica 61 MIPS MIPSsim platform R4000 VR5432 5Kc 5Kf 20Kc MIPS64R2-generic Ref405ep Taihu StdVGA (VESA 2.0) VMWare Video Card Carte vidéo VMWare None Video Card Aucune carte vidéo Core Duo Atom N270 e1000 virtio Phenom Core 2 Duo QEMU 64Bit ARM 1136 R2 Siemens SX1 (OMAP310) V1 Siemens SX1 (OMAP310) V2 Nokia N800 Nokia N810 Marvell 88w8618 / MusicPal Tosa PDA (PXA255) AXIS devboard 88 fseth MCF5206EVB Arnewsh 5206 Dummy board MIPS Malta Core LV MIPS Magnum mips r4k platform MIPS R4000 MIPS VR5432 MIPS 5Kc MIPS 5Kf MIPS 20Kc MIPS MIPS64R2-generic Spartan 3ADSP1800 xilinx-ethlite e500v1 Mac99 based PowerMAC Mac99 basé sur PowerMAC PowerPC PREP platform Plate-forme PowerPC PREP ref405ep taihu bamboo mpc8544ds SH7750R SH7751R SH7785 SPARCstation Voyager (Sun4m) SPARCstation LX (Sun4m) SPARCstation 4 (Sun4m) SPARCClassic (Sun4m) SPARCbook (Sun4m) Sun4u Sun4v Sun4v (Niagara) This Fatal Error. Recomend Close AQEMU. Erreur fatale. Il est recommandé de fermer AQEMU. Fatal error. It's recommended to close AQEMU Erreur fatale. Il est recommandé de fermer AQEMU Error! Erreur ! Cannot Start qemu-img! Image isn't Created! Impossible de démarrer « qemu-img » ! L'image n'est pas créée ! qemu-img Cannot Finish! Image isn't Created! « qemu-img » impossible à terminer ! L'image n'est pas créée ! Cannot Create Image! Information: Impossible de créer l'image ! Information : Complete! Terminé ! QEMU-IMG is Creates HDD Image. Additional Information: « qemu-img » créé une image de disque dur. Information additionelle : Warning! Attention ! QEMU-IMG is Returned non Standard Message!. Additional Information: « qemu-img » a retourné un message non-standard ! Information additionelle : Kb Mb Gb AQEMU Config File is Read Only! Check Permissions For File: Le fichier de configuration d'AQEMU est en lecture seule ! Vérifiez les permissions pour le fichier : AQEMU VM Directory is Read Only! Check Permissions For: Le répertoire des VM d'AQEMU est en lecture seule ! Vérifiez les permissions pour : AQEMU VM Template Directory is Read Only! Check Permissions For: Le répertoire de « template » d'AQEMU est en lecture seule ! Vérifiez les permissions de : AQEMU Log File is Read Only! Check Permissions For File: Le fichier de log d'AQEMU est en lecture seule ! Vérifiez les permissions pour le fichier : Default Par défaut Error Erreur Cannot create directory for log file! Path: %1 Impossible de créer le répertoire pour le fichier de log ! Chemin : %1 This is a first AQEMU start and program running in root mode. In some Linux distributions you may have problems with configuration saving. Close AQEMU? AQEMU emulators search Recherche d'émulateurs par AQEMU AQEMU will search for emulators after uptating. Please wait. AQEMU cherchera les émulateurs après la mise à niveau. Cannot Find any Emulators installed in your OS! You should choose them In Advanced Settings! Impossible de trouver des émulateurs installés sur votre système d'exploitation ! Vous devriez les choisir dans les « Paramètres avancés » ! Cannot Find AQEMU Data! Impossible de trouver les données d'AQEMU ! Cannot Locate AQEMU Data Folder! You Should Select This Folder in Next Window! Please Select AQEMU Data Folder: Sélectionnez le répertoire de données d'AQEMU : AQEMU won't Work If Data Folder isn't Selected! AQEMU ne marchera pas si le répertoire de données n'est pas sélectionné ! Cannot Load AQEMU Icon Theme! File "%1" Not Found! Impossible de charger le thème d'icône d'AQEMU ! Fichier « %1 » introuvable ! AQEMU VM Folder doesn't Exists! Create It? Le répertoire AQEMU n'existe pas ! Voulez-vous le créer ? SMP_Settings_Window SMP Settings Paramètres SMP If any on the values can be omitted. Missing (zero) values will be computed. Il est possible qu'une valeur ne soit pas entrée. La valeur manquante (zéro) sera utilsée. CPUs count Nombre de processeurs Sockets count Nombre de sockets Cores per socket Cœurs par socket Threads per core Threads par cœur Max number of hotpluggable CPUs Nombre maximal de processeurs « hotpluggable » &OK &Cancel &Annuler Select_Icon_Window Change Icon Changer l'icône Select Icon For Your VM Sélectionnez l'icône pour votre VM Default &Other System Icon Icône générique de &système Default &Linux Icon Icône &Linux par défaut Default &Windows Icon Icône &Windows par défaut &All OS Icons From AQEMU Collection &Toute la collection d'icônes d'AQEMU Other &Icon Autre &Icône Your Icon Path: Chemin vers votre icône : &Browse... &Parcourir... &OK &Cancel &Annuler Error! Erreur ! Icon file doesn't exist! Le fichier icône n'existe pas ! Select Icon File: Sélectionnez le fichier icône : PNG Images (*.png) Images PNG (*.png) Settings_Window General Settings Paramètres généraux Basic Settings Paramètres basiques AQEMU VM Folder: Répertoire pour les VM d'AQEMU : ... Default VM Template: Modèle (« template ») de VM par défaut : Create Template Créer un modèle (« template ») View Interface Interface Language: Langage de l'interface : English GUI Icons Theme: Thème d'icônes : Crystal SVG (KDE 3) Oxygen (KDE 4) VM Icon Size: Taille des icônes des VM : 16x16 24x24 32x32 48x48 64x64 Use Screenshot for OS Icon in Save Mode Utiliser une capture d'écran comme icône Use Device Manager by Default Utiliser le gestionnaire de périphérique par défaut Emulator Control Show Mode Contrôle du mode d'affichage de l'émulateur Show In Separate Window Voir dans une fenêtre séparée Show Window With Embedded Display Voir dans une fenêtre avec affichage intégré Show In AQEMU Main Window Voir dans la fenêtre principale d'AQEMU Show In AQEMU Main Window With Embedded Display Voir dans la fenêtre principale d'AQEMU avec un affichage intégré Don't show Ne pas montrer &OK &Cancel &Annuler Warning Avertissement AQEMU VM Templates Not Found! Les modèles (« template ») de VM d'AQEMU sont introuvables ! Information New template was created! Un nouveau modèle (« template ») a été créé ! Set your VM folder Paramétrez votre répertoire de VM Language will set after restarting AQEMU Show this message in future? Le langage sera mis en place après le redémarrage d'AQEMU Voir ce message la prochaine fois ? Icons theme be set after restart AQEMU Show this message in future? Le thème d'icône sera mis en place après le redémarrage d'AQEMU Voir ce message la prochaine fois ? Invalid Value! Valeur invalide ! AQEMU VM folder doesn't exist! Do you want to create it? Le répertoire AQEMU n'existe pas ! Voulez-vous le créer ? Error! Erreur ! Cannot Create New Folder! Impossible de créer un nouveau répertoire ! Support for this feature is not complete! If there is no picture, click "View->Reinit VNC" Show This Message Again? Le support de cette fonctionnalité n'est pas complète ! S'il n'y a pas d'image, cliquez sur « Voir > Réinitialiser VNC » Voir ce message la prochaine fois ? Snapshot_Properties_Window Snapshot Properties Propriété de l'instantané (« snapshot ») Snapshot Name: Nom de l'instantané : Snapshot Description: Description de l'instantané : &OK &Cancel &Annuler Warning Avertissement Snapshot name is empty! Le nom de l'instantané est vide ! Snapshots_Window Manage VM Snapshots Gestionnaire d'instantanés des VM Description: Description : Size: Taille : VM Clock: Horloge VM : ID: Identité : Date: Date : Properties Propriétés Start Démarrer Delete Supprimer Create Créer OK Update Info Mise à jour des informations Snapshot List: Liste des instantanés : Warning! Attention ! Please select snapshot that you want to delete! Sélectionnez l'instantané que vous voulez supprimer ! Warning Avertissement Delete Current Snapshot? Supprimer cet instantané ? Please select snapshot that you want to start! Sélectionnez l'instantané que vous voulez supprimer ! This VM is Running now! Stop VM and Load Snapshot? Cette machine virtuelle est en cours d'exécution ! Stopper la VM et charger l'instantané ? Error! Erreur ! You must add HDD image in QCOW2 format if you want to use snapshots! Vous devez ajouter une image de disque dur au format QCOW2 si vous voulez utiliser les instantanés ! VM_Wizard_Window New Virtual Machine Wizard Assistant pour une nouvelle machine virtuelle &Back &Précédent &Next &Suivant &Cancel &Annuler <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the steps that are necessary to create a new virtual machine for AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cet assistant vous guidera à travers les étapes qui sont nécéssaire pour créer une nouvelle machine virtuelle pour AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Utilisez le boutton <span style=" font-weight:600;">« Suivant »</span> pour aller à la prochaine page de cet assistant et le boutton <span style=" font-weight:600;">« Précédent »</span> pour retourner à la page précédente.</p></body></html> Select AQEMU Configuration Mode Sélection du mode de configuration d'AQEMU &Typical (For Beginners) &Typique (pour débutant) Create new virtual machine with most common devices and configuration options. Créer une nouvelle machine virtuelle avec les périphériques et options de configurations les plus communes. &Custom &Personnalisé Create new virtual machine with additional configuration options. Créer une nouvelle machine virtuelle avec les options additionnelles de configurations. Select Emulator Type For Using In New Virtual Machine Sélectionnez le type d'émulateur à utiliser pour la nouvelle machine virtuelle QEMU KVM Please Select VM Hardware Template Sélectionnez le modèle de matériel de la machine virtuelle Template « Template » OS Type: Type d'OS : No Selected Aucun sélectionné Generate VM Génère une VM C&omputer Type: Type d'&ordinateur : Release Date: Date de sortie : 1985-1990 1990-1995 1995-2000 2000-2005 2005-2010 VM Name: Nom de la VM : Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. Entrez un nom pour la nouvelle machine virtuelle. Le nom d'une machine virtuelle indique généralement sa configuration logicielle et matérielle. CPU Type: Type de processeur : Select a CPU type for your new virtual machine: Sélectionnez un type de CPU pour votre nouvelle machine virtuelle : Select the amount of base memory (RAM) in megabytes for virtual machine allocating. Sélectionnez la quantité de mémoire vive (RAM) en « megabytes » a allouer à la machine virtuelle. 1 MB Update free memory information Mise à jour des informations sur la mémoire libre Free memory: 768 MB Mémoire libre : 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Enlever la limitation sur la quantité maximum de mémoire <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sélectionnez une image de disque dur qui sera utilisée comme un disque de démarrage pour la machine virtuelle. Vous pouvez soit créer un nouveau disque dur en utilisant le boutton <span style=" font-weight:600;">Nouveau</span> ou sélectionner une image de disque dur déjà existante en cliquant sur le boutton <span style=" font-weight:600;">Quitter</span>. </p></body></html> Boot Hard Disk (Primary Master) Démarrer sur le disque dur (premier maître) N&ew... Nouv&eau... E&xisting... &Quitter... Select network type using on your new virtual machine. Sélectionnez le type de réseau à utiliser sur votre nouvelle machine virtuelle. &User Mode Network Connection (Uses the user mode network stack) Connexion résea&u en mode non-privilégié (utilise une pile réseau en mode non supervisé) N&o Network (No net cards installed on VM) Pa&s de réseau (pas de carte réseau installée sur cette VM) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> Enter your new virtual machine hard disk capacity. Entrez votre capacité de disque dur pour la nouvelle machine virtuelle. Disk Size in GB (Gigabytes): Taille du disque en GB (« Gigabytes ») : Emulator Type Type d'émulateur Wizard Mode Mode assistant VM Hardware Template Modèle de configuration matérielle de la VM VM Name and CPU Type Nom de la VM et le type de CPU Virtual Machine Name Nom de la machine virtuelle Memory Mémoire Hard Disk Size Taille du disque dur Virtual Hard Disk Disque dur virtuel Network Réseau Error! Erreur ! Please Add One Or More Emulators in Advanced Settings! Ajoutez un ou plus d'émulateur dans les « Paramètres avancés » ! Template For VM Modèle de machine virtuelle Cannot Create New VM from Template! Impossible de créer une machine virtuelle à partir du modèle ! Cannot Find Emulator System ID! Impossible de trouver l'identifiant de l'émulateur système ! Warning Avertissement This VM Name is Already Exists! Ce nom de VM existe déjà ! &Finish &Terminer Finish! Terminer ! Cannot Find QEMU System ID! Error Erreur Cannot convert "%1" to memory size! Impossible de convertir « %1 » en taille mémoire ! Cannot convert "%1" to integer! Impossible de convertir « %1 » en un entier ! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Impossible de convertir « %1 » à la grandeur donnée en suffixe ! Les suffixes valides sont : MB et GB Memory size < 0! Valid size is 1 or more Taille mémoire < 0 ! Une taille valide est de 1 ou plus Your memory size %1 MB > %2 MB - all free RAM on this system! To setup this value, check "Remove limitation on maximum amount of memory". Current memory size bigger than all existing host memory! Using maximum available size. Free memory: %1 MB Mémoire libre : %1 MB Free memory on this system is lower than 32 MB! La mémoire libre sur ce système est de moins de 32 MB ! Select HDD Image Sélectionnez l'image du disque dur All Files (*) Tous les fichiers (*) VNC_Password_Window VNC Password Mot de passe VNC Password: Mot de passe : Confirm: Confirmation : OK Warning Avertissement Password is Empty! Le mot de passe est vide ! Password Not Confirmed! Les mots de passe ne correspondent pas ! Virtual_Machine Version Invalid! Version invalide ! Version of this AQEMU VM File isn't 0.5 Load This File anyway? La version de ce fichier de VM d'AQEMU n'est pas la 0.5 Charger ce fichier malgré tout ? Warning! Attention ! USB Device %1 %2 (%3 %4) Not Found! Périphérique USB %1 %2 (%3 %4) introuvable ! Error! Erreur ! ROM File doesn't Exists! Can't run emulator! Le fichier ROM n'existe pas ! Impossible de lancer l'émulateur ! Additional Arguments is Empty! Cannot Use User Arguments! Arguments additionels vide ! Impossible d'utiliser les arguments de l'utilisateurs ! KVM Kernel Module Not Loaded! To load this Module, Enter in Terminal with root privileges: "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? Le module du noyau KVM n'est pas chargé ! Pour charger ce module, entrez dans un terminal avec les privilèges du super-utilisateur : « modprobe kvm-intel ». Ou, si vous utilisez un processeur AMD : « modprobe kvm-amd ». Ignorer cette erreur ? KQEMU Kernel Module Not Loaded! This Module Provides Acceleration for QEMU. For Loading KQEMU Module Type: "modprobe kqemu" in root mode Or Disable Acceleration in "Other->Hardware Virtualization" tab. Le module du noyau KQEMU n'est pas chargé ! Ce module fournit l'accélération pour QEMU. Pour charger ce module, entrez dans un terminal avec les privilèges du super-utilisateur : « modprobe kqemu ». Vous pouvez aussi désactiver cette accélération dans l'onglet « Autre > Virtualisation matérielle ». Cannot start emulator! Binary path is empty! Impossible de démarrer l'émulateur ! Le chemin vers le binaire est vide ! QEMU Error Log Log d'erreur de QEMU Loading... Chargement... Loading Virtual Machine. Please wait... Chargemen de la machine virtuelle. Patientez... Saving... Sauvegarde... Saving Virtual Machine. Please wait... Sauvegarde de la machine virtuelle. Patientez... You must add HDD image in QCOW2 format to save virtual machine! Vous devez ajouter une image de disque dur au format QCOW2 pour sauvegarder la machine virtuelle ! VncView Password required Mot de passe nécéssaire Please enter the password for the remote desktop: Entrez le mot de passe pour l'ordinateur cible : aqemu-0.9.2/resources/translations/German.ts000066400000000000000000016015501272330227200211560ustar00rootroot00000000000000 About_Window About AQEMU Über AQEMU <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L';"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> OK OK About Über Thanks To Vielen Dank an <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> License Lizenz Error! Fehler! Unable to save the file %1: %2. Kann die Datei %1 nicht speichern: %2. Cannot Find AQEMU Links File! Не могу найти файл ссылок AQEMU! Download failed: %1. Download gescheitert: %1. Links Links Update Links Form Internet <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br>Pavel Serebryakov (aka Kronoph) - Correcting English translation <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br>Pavel Serebryakov (aka Kronoph) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Entwickler:</b> <br>Аndreij Rijov (aka RDron) - Autor <br><br><b>Mitwirkende:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Paket <br>Denis Smirnov (aka reMiND) - Arch Linux Paket usw. <br>Ignace Mouzannar - Debian Paket <br>Michael Brandstetter - Deutsche Übersetzung und Improvement Scripts <br>Robert Warnke - Deutsche Übersetzung der AQEMU Dokumentation <br>Guillem Rieu - Patch für Netzwerk Weiterleitungen <br>Karol Krenski - IP Adressen RegExp Fix <br>Alexander Romanov (aka romale) - Test, Neue Ideen und weitere Hilfe <br>Timothy Redaelli - Patch fur CMake <br><br><b>Vielen Dank:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br>Pavel Serebryakov (aka Kronoph) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU benutze Code von QtEMU und Krdc. Vielen Dank an alle Entwickler:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme des Everaldo.com Design Studio <br>Oxygen - Icon Theme des Oxygen Teams <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU ist eine grafische Benutzeroberfläche für QEMU und KVM</p> <p>Version: 0.9.20 vom 2016.04.20</p> <p>Lizenz: General Public License Version 2</p> <p>Autor: Andreij Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Webseite: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Unterstützte Emulatoren:<br>QEMU 0.9.0-0.14.1 und KVM 60-88-0.14.1</p> </b> </body> </html> Add_New_Device_Window Select You Device Wählen sie Ihr Gerät Select your device All Files (*) Alle Dateien (*) Error! Fehler! File does not exist! "Cyls" value is incorrect! "Heads" value is incorrect! "Secs" value is incorrect! "Trans" value is incorrect! File Not Exists! Die Datei existiert nicht! Warning! Warnung! "Cyls" Value Incorrect! Fehlerhafter "Cyls" Wert! "Heads" Value Incorrect! Fehlerhafter "Heads" Wert! "Secs" Value Incorrect! Fehlerhafter "Secs" Wert! "Trans" Value Incorrect! Fehlerhafter "Trans" Wert! New Storage Device Neues Massenspeichergerät Bus, Unit (For SCSI) Bus, Unit (für SCSI) Index (For IDE, Floppy) Index (für IDE, Floppy) &Snapshot &Snapshot &OK &OK &Cancel &Abbrechen Cac&he Cac&he Disk Disk CD-ROM ide scsi sd mtd floppy pflash &Media &Тип носителя &File &Datei &Interface &Интерфейс Settings for -hdachs Option Einstellungen für -hdachs Option s&ecs &trans c&yls &heads virtio none kein writeback writethrough AIO threads native on off Boot Add_Port_Window Open File Datei öffnen All Files (*) Alle Dateien (*) Optionally width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C Optionally, a width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C Optional kann eine Breite und Höhe in Pixeln angegeben werden 800x600 Es ist auch möglich, die Breite oder Höhe in Zeichen anzugeben: 80Cx24C [Linux only] Pseudo TTY (a new PTY is automatically allocated) [nur Linux] Pseudo TTY (ein neues PTY wird automatisch erstellt) No device is allocated. Kein Gerät gewählt. Void device [Unix only] standard input/output [nur UNIX] standard input/output [Linux only] Use host tty, e.g. /dev/ttyS0. The host serial port parameters are set according to the emulated ones. [nur Linux] Host tty benutzen, z.B. /dev/ttyS0. Die Parameter des Seriellen Ports werden entsprechend denen des Emulierten gesetzt. COMn Use host serial port n COMn Benutze Seriellen Host Port n filename - Write output to filename. No character can be read. filename - name pipe filename [remote_host]:remote_port[@[src_ip]:src_port] This implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen. [host]:port[,server][,nowait][,nodelay] Example to send tcp console to 192.168.0.2 port 4444 92.168.0.2:4444 Example to listen and wait on port 4444 for connection :4444,server Example to not wait and listen on ip 192.168.0.100 port 4444 192.168.0.100:4444,server,nowait host:port[,server][,nowait][,nodelay] The telnet protocol is used instead of raw tcp sockets. path[,server][,nowait] A unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections. Three button serial mouse. Configure the guest to use Microsoft protocol. mon:dev_string This is a special option to allow the monitor to be multiplexed onto another serial port. Braille device. This will use BrlAPI to display the braille output on a real or fake device. Braille Gerät. Es wird eine BrlAPI für Braille Ausgabe auf einem realen oder simulierten Gerät benutzt. Adding Port Port hinzufügen Redirect virtual port to: Select redirect virtual port to: Virtuellen Port weiterleiten an: Default Standard vc (Virtual console) vc (Virtuelle Konsole) pty (Pseudo TTY) pty (Pseudo TTY) none kein null (/dev/null) null (/dev/null) /dev/ /dev/ File Datei stdio Pipe COM UDP msmouse TCP Telnet Unix mon braille Additional Arguments: Zusätzliche Variablen: ... Arguments Help: Hilfe zu den Variablen: &OK &OK &Cancel &Abbrechen Add_USB_Port_Window Manufacturer: Hersteller: Product: Produkt: Speed: Geschwindigkeit: bus.addr: Bus.Adr: Vendor ID: Vendor ID: Product ID: Produkt ID: Bus.Address: Adding USB USB hinzufügen Connecting Virtual QEMU/KVM USB Device Virtuelles QEMU/KVM USB Gerät verbinden Connecting virtual QEMU/KVM USB device Mouse Maus Keyboard Tastatur Tablet Tablet Wacom tablet Braille Braille Connecting USB host device Connecting host USB device Show devices All host devices Not used in running VM Only not used in running VM Selected device Bus.Address: Update USB host list Connecting Host USB Device Host USB Gerät verbinden Manufacturer: Hersteller: Product: Produkt: bus.addr: Bus.Adr: Show Devices: Zeige Geräte: All Host Devices Alle Host Geräte Only Not Used in Running VM Nur in VM unbenutzte Geräte Selected Device Gewähltes Gerät Speed: Geschwindigkeit: Vendor ID: Vendor ID: Product ID: Produkt ID: Update USB Host List USB Host Liste aktualisieren &OK &OK &Cancel &Abbrechen Advanced_Settings_Window Select executable Ausführbare Datei wählen All Files (*) Alle Dateien (*) Select or Create Log File Logdatei wählen oder erzeugen Advanced Settings Erweiterte Einstellungen Information in Info Tab Information im Info Tab Machine Details Maschinendetails Machine Name Maschinenname Network Cards Netzwerkkarten Redirections Weiterleitungen TFTP Server Prefix TFTP Server Prefix SMB Directory SMB Verzeichnis Serial Port Serieller Port Parallel Port Paralleler Port USB Ports USB Ports ROM File ROM Datei GDB Port GDB Port Computer Type Comptertyp Machine Type Maschinentyp CPU Type CPU Typ Number of CPU Anzahl CPUs Acceleration Beschleunigung Boot Priority Bootreihenfolge Video Card Grafikkarte Keyboard Layout Tastatur Layout Fullscreen Mode Vollbildmodus Windows 2K Hack Windows 2000 Hack Enable ACPI ACPI aktiviert Use Local Time Benutze lokale Uhrzeit Check Boot Sector on FDD Bootsektor auf Diskette prüfen Start CPU at Startup Snapshot Mode Snapshot Modus Use QEMU Log QEMU Log benutzen No Reboot Kein Reboot Use Linux Boot Linux Boot benutzen Show Floppy Diskette zeigen Show CD-ROM CD-ROM zeigen Show HDD HDD zeigen Memory Size Größe des Arbeitsspeichers Use Sound Sound benutzen ... ... &OK &OK &Cancel &Abbrechen Write log to Print to STDOUT Valid MAC Address (Especial For Each Network Card model) Don't use default audio driver Start/Stop QEMU/KVM emulator Execute Before Starting QEMU/KVM: Execute After Stoping QEMU/KVM: QEMU/KVM Monitor Connection Type stdio (Does not work with Windows version of QEMU) TCP Socket TCP Socket Hostname localhost 127.0.0.1 First port Network Redirections Serial Ports VNC Parallel Ports SPICE No Frame Kein Rahmen Alt Grab RTC TD Hack No Quit Kein Beenden No Shutdown Не выключать Portrait Portrait Curses Show cursor Initial graphical mode Start Date Flash Image Flash Image SD Image SD Image Parallel Flash Image Parallel Flash Image General Allgemein Other Другое AQEMU Logging AQEMU Logging Save in File In Datei speichern Print in STDOUT Nach STDOUT ausgeben Debug Messages Debug Nachrichten Warning Messages Warnungen Error Messages Fehlermeldungen Log Path: Logpfad: Write Log In Schreibe Log in Log Messages Log Nachrichten VM Network Card MAC Address MAC Adresse der Netzwerkkarte Random MAC Address Zufällige MAC Adresse Valid MAC Address (Individualized For Each Model of Network Card) Правильный MAC адрес (Свой для каждой модели сетевой карты) Host Sound System: Host Sound System: alsa oss sdl wav none keines QEMU Segment MAC Address (52:54:00:XX:XX:XX) Recent CD-ROM Images Count Show Tab Info Zeige Tab Info Use Not Default Audio Driver Nicht Standard Audiotreiber benutzen First VNC Port for Embedded Display Erster VNC Port für eingebettetes Display All Files (*);;Scripts (*.sh) Alle Dateien (*);;Skripte (*.sh) Installed Emulators Installierte Emulatoren Add Hinzufügen Delete Löschen Edit Bearbeiten Use Default Standard Name Name Path Pfad File Format: Save Format: Format speichern: Original (PPM) Original (PPM) JPEG Jpeg JPG PNG PNG Jpeg Quality: JPG Qualität: Shared screenshot folder Shared Folder to Save All Screenshots Gemeinsamer Ordner für alle Bildschirmfotos Folder Path: Pfad: Invalid Value! Ungültiger Wert! Shared Folder for Screenshots is Not Exists! Der gemeinsame Ordner für Bildschirmfotos existiert nicht! Error! Fehler! Not Select Default QEMU Emulator! Kein Standard QEMU Emulator gewählt! Not Select Default KVM Emulator! Kein Standard KVM Emulator gewählt! Select Folder for Screenshots Wähle Ordner für Bildschirmfotos Screenshot Settings Bildschirmfotoeinstellungen Advanced Erweitert Other Settings Andere Einstellungen Show Inside Tab Info Screenshot in Save Mode Show QEMU/KVM Arguments Zeige QEMU/KVM Argumente Emulator Type Emulatortyp Emulator Version Emulatorversion Find All Emulators Finde alle Emulatoren Add CD/DVD Device CD/DVD Gerät hinzufügen Enter Device Name. Sample: /dev/cdrom Gerätename eingeben. z.B.: /dev/cdrom Additional CD/DVD Devices Zusätzliche CD/DVD Geräte Shared screenshot folder doesn't exist! Yes Ja Cannot find any emulators installed on your OS! Please add them manually! Enter Device Name. Example: /dev/cdrom Default QEMU Emulator isn't selected! Default KVM Emulator isn't selected! Cannot save emulator "%1"! No Nein Choose screenshot folder Type and version Typ und Version Use default Standard benutzen qemu-img path Pfad zu qemu-img pa esd Start and Stop QEMU/KVM QEMU/KVM starten und anhalten Execute Before Start QEMU/KVM: Vor dem QEMU/KVM Start ausführen: Execute After Stop QEMU/KVM: Nach dem QEMU/KVM Halt ausführen: Recent Floppy Images Count Boot_Device_Window Floppy A Diskette A Floppy B Diskette B CD-ROM Hard Drive Festplatte Network 1 Netzwerk 1 Network 2 Netzwerk 2 Network 3 Netzwerk 3 Network 4 Netzwerk 4 Boot settings Booteinstellungen 1 Enable interactive boot &menu Interaktives Boot&menü aktivieren &OK &OK &Cancel &Abbrechen Convert_HDD_Image_Window Convert HDD Image HDD Image konvertieren File Name is Empty! Dateiname ist leer! Please Enter Correct File Name for You HDD Image! Bitte geben sie den korrekten Dateinamen für Ihr HDD Image ein! Error! Fehler! Con&vert Kon&vertieren &Cancel &Abbrechen Cannot Locate Input File! Не могу найти входной файл! Select Base HDD Image File HDD Imagedatei auswählen Save Out HDD Image File Сохранить выходной образ HDD Information: Information: Please Wait. Converting HDD Image... Bitte warten. Konvertiere HDD Image... Cancel Abbrechen All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Alle Dateien (*);;Image Dateien (*.img *.qcow *.qcow2 *.vmdk) Image Format: %1 Allocated Disk Space: %2 %3 Image Format: %1 Reservierter Plattenplatz: %2 %3 Virtual Size: %1 %2 Cluster Size: %3 Virtuelle Größe: %1 %2 Clustergröße: %3 Please Enter Correct HDD Image filename! Cannot get a valid format for current HDD image! ! Conversion completed sucessfuly! Conversion complete sucess! Konvertierung erfolgreich! Cannot convert image! Details: %1 Image kann nicht konvertiert werden! Details: %1 Input image Input Image File name: Dateiname: Image Format: none Allocated Disk Space: 0 Image Format: none Reservierter Plattenplatz: 0 Virtual Size: 0 Cluster Size: 0 Virtuelle Größe: 0 Clustergröße: 0 Output image Output Image Format: Format: QCOW format options QCOW Format Optionen Com&press image Image kom&primieren &Encrypt image Image v&erschlüsseln Copy_VM_Window Error! Ошибка! This VM Name is Already Used! Это имя ВМ уже используется! Copy VM Копирование ВМ New VM Name: Имя новой ВМ: Copy Disk Images Копировать образы дисков Copy Floppy Images Копировать Floppy образы Copy Hard Drive Images Копировать образы жёских дисков &OK &OK &Cancel &Отмена Create_HDD_Image_Window Create HDD Image HDD Image erzeugen qcow2 cloop vmdk qcow cow raw KB KB MB МB GB GB Browse... Durchsuchen... Error! Fehler! Invalid image size! Base Image File doesn't Exists! Image was Not Created! QEMU-IMG Supported formats QEMU-IMG unterstützte Formate &Format: &Format: &Size: &Größe: &Help... &Hilfe... New Image &File Name: Neues Image er&zeugen: Additional features Use &Base HDD Image &Benutze HDD Image C&reate E&rzeugen &Cancel &Abbrechen Select Base HDD Image File HDD Imagedatei auswählen Create HDD Image File HDD Image File erzeugen Image File Name is Empty! Der Image Dateiname ist leer! Image Size Invalid! Ungültige Imagegröße! Base Image File Not Exists! Die Imagedatei existiert nicht! Image Not Created! Image wurde nicht erzeugt! raw Raw disk image format. This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux. qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots. qcow Old QEMU image format. Left for compatibility. cow User Mode Linux Copy On Write image format. Used to be the only growable image format in QEMU. It is supported only for compatibility with previous versions. It does not work on win32. vmdk VMware 3 and 4 compatible image format. cloop Linux Compressed Loop image, useful only to reuse directly compressed CD-ROM images present for example in the Knoppix CD-ROMs. Image Must be &Encrypted (QCOW Format Only) Image muss &verschlüsselt sein (Nur QCOW Format) All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Alle Dateien (*);;Imagedateien (*.img *.qcow *.qcow2 *.wmdk) F&ormat Ф&ормат Create_Template_Window Create Template Vorlage erstellen New VM Template Name: Name der neuen VM Vorlage: Virtual machine file Save Floppy and CD-ROM Settings Floppy und CD-ROM Einstellungen speichern Save Hard Disks Size or Format Settings Festplattengrößen- oder Formateinstellungen speichern Save Network Settings Netzwerkeinstellungen speichern C&reate E&rstellen &Cancel &Abbrechen Warning! Warnung! Template Name is Empty! Vorlagenname ist leer! VM File Not Exists! Die VM Datei existiert nicht! Error! Fehler! Cannot Load VM! VM kann nicht geladen werden! Cannot Create Template! Vorlage kann nicht erstellt werden! Open VM File VM Datei öffnen AQEMU VM Files (*.aqemu) AQEMU VM Dateien (*.aqemu) Select Template Folder Vorlagenordner auswählen VM file doesn't exist! Cannot Locate Template Folder! Vorlagenordner kann nicht gefunden werden! Replace Ersetzen Your template name is already used! Do you want replace previous template? You Name For Template in Not Unique! Replace Previous Template? Der Name der Vorlage existiert bereits! Existierende Vorlage ersetzen? Use default folder for new template Standardverzeichnis für neue Vorlage benutzen Other folder for new template: Anderes Verzeichnis für neue Vorlage: Virtual machine file: Virtuelle Maschinendatei: Save Ports (USB/Serial/Parallel) Ports speichern (USB/Seriell/Parallel) Creating Options Optionen New VM template name Files Dateien Delete_VM_Files_Window Screenshot Bildschirmfoto Floppy A Diskette A Floppy B Diskette B CD-ROM HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) ROM File ROM Datei MTDBlock File MTDBlock Datei SD Card File SD Kartendatei PFlash File PFlash Datei Kernel bzImage Kernel bzImage Kernel Initrd Kernel initrd Serial Port Redirection Weiterleitung Serieller Port Parallel Port Redirection Weiterleitung Parelleler Port Storage Device Speichergerät Confirm Delete Löschen bestätigen Delete " Löschen " " VM and Selected Files? " VМ und gewählte Dateien? An error occurred while deleting files During removal errors occurred Während des Löschvorgangs traten Fehler auf This Files Not Deleted: Diese Dateien wurden nicht gelöscht: Please Check Permissions! Bitte Berechtigungen überprüfen! Delete VM and Files VM und Dateien löschen Show only: Zeige nur: &Hard drive images &Festplatten Images &All VM files Alle &VM Dateien Delete Löschen Device name Gerätename Path Pfad &Delete selected &Delete all selected Alle ausgewählten &Löschen &Cancel &Abbrechen Device_Manager_Widget Devices List: Geräteliste: Floppy 1 Floppy 2 CD-ROM HDA HDB HDC HDD Device Manager Widget Add Floppy Diskettenlaufwerk hinzufügen Add CD/DVD-ROM CD/DVD-ROM hinzufügen Add HDD HDD hinzufügen Format HDD HDD formatieren Delete Löschen List Mode Listenansicht Icon Mode Symbolansicht Delete? Löschen? Delete Device? Gerät löschen? Properties Свойства Format? Formatieren? Format Virtual Hard Disk? Virtuelle Festplatte formatieren? Quick Format Schnellformatierung CD/DVD-ROM HDA (First Master) HDB (First Slave) HDC (Second Master) HDD (Second Slave) Error! Fehler! Incorrect Device! Fehlerhaftes Gerät! Information: Add Devices Geräte hinzufügen Manage Devices Geräte verwalten View Mode Ansicht Information Type: Host Device Тип: реальное устройство Type: Image Typ: Image On Disk Size: Größe auf Platte: KB KB MB МB Image Virtual Size: Virtuelle Imagegröße: Image On Disk Size: Imagegröße auf HD: Warning! Warnung! Maximum Floppy Disk Count is 2 Maximum Floppy's Disk Count is 2 Die maximale Anzahl Diskettenlaufwerke ist 2 Maximum CD-ROM Disk Count is 1 Die maximale Anzahl CD-ROMs ist 1 Maximum Hard Disk Count is 4 excluding CD-ROM Maximum Hard Disk Count is 4 Without CD-ROM Die maximale Anzahl an Festplatten ist 4 (ohne CD-ROM) Complete! Fertig! Cannot Format! Не могу форматировать! Type: Storage Device Typ: Speichermedium Add Storage Device Speichermedium hinzufügen Device List: Add Device Gerät hinzufügen Edit_Emulator_Version_Window Edit Emulator Version Emulatorversion bearbeiten &Available Versions: &Verfügbare Versionen: &OK &OK &Cancel &Abbrechen %1 (Located in %2) QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Emulator_Control_Window Save Screenshot As... Bildschirmfoto speichern als... Open Device or Image File Gerät oder Bilddatei öffnen Emulator Control Connect Verbinden Disconnect Trennen Send Keys Нажать кнопку Ctrl+O 1 2 3 4 5 6 7 8 9 10 11 12 /dev/fd0 /dev/null Other... Andere... Eject Auswerfen Update Device List Обновить список устройств /dev/cdrom All Devices Alle Geräte Enter You Keys as ctrl-alt-delete or alt-f2 Вводите ваши клавиши так ctrl-alt-delete или alt-f2 &Other Keys... &Другие кнопки... &VM &VM Send &Keys Нажать &кнопки Ctrl-Alt-&F# Ctrl-Alt-&F# &Help &Hilfe &Connect &Verbinden Floppy &B Floppy &B &CD-ROM &CD-ROM &USB &USB Floppy &A Floppy &A Save Screens&hot Сохранить скрин&шот &Save VM Со&хранить ВМ &Load VM &Загрузить ВМ &Pause VM Приост&ановить ВМ &Quit &Beenden Save VM S&tate... Сохранить состоя&ние ВМ... Load VM St&ate... Загрузить состоян&ие ВМ... &Reset VM &Перезагрузить ВМ Power &Off В&ыключить &Commit &Anwenden Ctrl-Alt-&Delete Strg-Alt-&Entf &About Emulator Control... &О Emulator Control... QEMU/KVM &Monitor QEMU/KVM &Monitor About Emulator Control... Über Emulator Control... Emulator Control is a Tool for Managing QEMU in Runtime. Emulator Control это примочка для управления QEMU во время выполнения. Ctrl-Alt-Backspace Strg-Alt-Backspace null (/dev/null) null (/dev/null) stdio (Standard In Out) stdio (Standard In Out) /dev/ttyS0 /dev/ttyS0 Error! Fehler! Cannot Get USB Information From System! Не могу получить информацию о USB из системы! All Files (*) Alle Dateien (*) Selected VM is running now. Shutdown anyway? Are you sure? Are you sure to shutdown VM "%1"? Are you sure to reboot VM "%1"? Cannot Find USB Device! Не могу найти USB устройства! Disconnect USB USB trennen Enter You Bus.Address VM USB Value By Bus.Address Nach Bus Adresse All Files (*);;Images Files (*.img *.ima) Alle Dateien (*);;Imagedateien (*.img *.ima) All Files (*);;Images Files (*.iso) Alle Dateien (*);;Imagedateien (*.iso) Enter your key combinations such as ctrl-alt-del or alt-f2 To enable window mode press Ctrl-Alt-F Do you want to show this message again? Warning! Warnung! Manage Snapshots Snapshots verwalten In This VM Floppy 2 Not Found! В этой ВМ нет Floppy 2! Recent Files d (Emulator Control) View Ansicht Display Scaling Display Skalierung Fullscreen Mode Vollbildmodus Show Status Bar Statusleiste zeigen Power Off This VM? Diese VM abschalten? This VM is Running, Off Power? Diese VM läuft noch, ausschalten? Ctrl+Alt+F Strg+Alt+F Reinit VNC Reinitialsiere VNC You Sure? Sind sie sicher? Shutdown VM "%1"? VM "%1" herunterfahren? Reboot VM "%1"? VМ "%1" neu starten? [Paused] [Pausiert] [Saved] [Gespeichert] Fullscreen mode Vollbildmodus For switch to window mode press Ctrl-Alt-F Show this message again? Ctrl-Alt-F drücken, um zum Fenstermodus zurückzukehren Diese Nachricht erneut anzeigen? In This VM Floppy 1 Not Found! In dieser VM wurde kein 1. Diskettenlaufwerk gefunden! In This VM CD-ROM Not Found! In dieser VM wurde kein CD-ROM gefunden! a Emulator_Options_Window Error! Ошибка! Path is Empty! Путь пуст! Warning Внимание Path is Not Exists! Путь не существует! Select Directory Выберите папку This Enulator Name is Already Used! Это имя эмулятора уже используется! Cannot get emulator info! For file: %1 Не могу получить информацию о эмуляторе! Файл: %1 Cannot get version for emulator! Не могу получить версию эмулятора! QEMU 0.9.0 Path doesn't exist! Enulator Name is Empty! This emulator name is already used! QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Select QEMU Binary File Выберите бинарник QEMU All Files (*) Все файлы (*) Emulator Settings Параметры эмулятора Name (Emulator identifier) Name (This be identifier for it emulator): Имя (Оно будет идентификатором для этого эмулятора): Find emulator Искать эмулятор Emulator type: Тип эмулятора: QEMU KVM (For adding QEMU-KVM, add them one by one) (Чтобы добавить QEMU-KVM, добавляйте эмуляторы по одному) Path to Emutators Binary Directory: Путь к папке с бинарниками эмулятора: ... ... &Find Emulators &Искать эмуляторы Emulators Executables Files Исполняемые файлы эмулятора QEMU/KVM System QEMU/KVM система Binary File Name Имя бинарника Emulator Version Версия эмулятора Use saved available emulator options (Recomended to choose it again after emulator updating) Use saved emulator available options (Recomend refind after update emulator) Использовать сохранённое описание возможностей эмулятора (Рекомендуется после обновления эмулятора выполнить заново поиск) Always check available emulator options while starting AQEMU (Slow) Check available emulator options always start AQEMU (Slowly) Проверять доступные возможности эмулятора при каждом запуске AQEMU (Медленно) Always check emulator version while starting AQEMU Check emulator version always start AQEMU Проверять версию эмулятора при каждом запуске AQEMU Set version and available options manually Указать версию эмулятора вручную &OK &OK &Cancel &Отмена Error_Log_Window Error # Ошибка # QEMU Error Log Лог ошибок QEMU Error Window Show Mode Режим отображения окна ошибок Normal Mode Нормальный режим Do Not Show Until Next VM Started Не показывать по следующего запуска ВМ Do Not Show Until Next AQEMU Started Не показывать по следующего запуска AQEMU Never show it (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Do Not Show Forever (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Вообще не показывать (Для просмотра выберите ВМ ->Показать окно ошибок QEMU/KVM) &OK &OK &Clear Errors List &Очистить список ошибок First_Start_Wizard Warning! Внимание! Finded QEMU in %1, version: %2 Найден QEMU в %1, версия: %2 Finded KVM in %1, version: %2 Найден KVM в %1, версия: %2 &Finish &Конец &Next &Далее Error! Ошибка! Are you sure? You can configure these options later in Settings windows. QEMU Found in "%1", version: %2 KVM Found in "%1", version: %2 Select QEMU emulator directory Cannot Create New Folder! Не могу создать новую папку! Error Emulator binary files not exists! Please click Back and set it manual. Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path Welcome Добро пожаловать General Settings Настройки AQEMU Find Emulators Поиск эмуляторов Setup Emulator Finish Готово &Back На&зад &Cancel &Отмена Welcome to AQEMU settings wizard! This wizard will help you to choose options that need to AQEMU work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. Добро пожаловать в мастер настройки AQEMU! Этот мастер поможет вам установить параметры, необходимые для правильной работы AQEMU. Нажмите кнопку Далее, чтобы перейти к следующей странице мастера, или кнопку Назад для возврата на предыдущую страницу. Here you can choose interface language Вы можете выбрать язык интерфейса AQEMU Please select folder for AQEMU virtual machines Укажите папку где будут храниться настройки виртуальных машин If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will displayed in virtual machine as icons, like in file manager window. Если включён режим "менеджер устройств", то устройства хранения данных (Floppy, CD/DVD, HDD) будут отображаться в виртуальной машине в виде значков, как в окне файлового менеджера. Use Device manager Использовать Менеджер устройств New experimental work mode is accessible in AQEMU. In this mode QEMU/KVM display will displayed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this function you must mark the "Include Emdedded VNC Display in Main Window" flag. В AQEMU доступен новый экспериментальный режим работы, при котором экран QEMU/KVM отображаться в окне AQEMU. Пока это не совсем стабильная и завершённая функция, поэтому при её работе возможны проблемы. Для её включения отметьте "Встроить VNC дисплей в главное окно". Include Emdedded VNC Display in Main Window Встроить VNC дисплей в главное окно To work correctly, AQEMU must know your emulators' arrangement and its' versions. For searching push the "Search" button. If automatic search can't find out your emulators, you must configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Для правильной работы AQEMU должна знать расположение установленных в вашей системе эмуляторов и их версии. Для поиска нажмите "Поиск". Если автоматический поиск не сможет определить какие эмуляторы установлены, то вам придётся настроить AQEMU в ручную позже. Для этого необходимо открыть "Файл->Дополнительные настройки". Congratulations! The Wizard has got all necessary settings for configuring AQEMU. Push "Finish" button to save your settings. Поздравляю! Мастер получил всё необходимые сведения для настройки AQEMU. Нажмите "Готово" для сохранения настроек. First Start Wizard Мастер первого запуска English QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X You sure? You Can Configure These Options In The Settings Window. Вы уверены? Позже Вы сможете настроить это в окне настроек. &Search &Поиск S&kip Search П&ропустить поиск Set Folder for you VM's Выберите папку для ваших ВМ Emulator Version Modified By User Версия эмулятора изменена пользователем Welcome to AQEMU settings wizard! This wizard will help you to choose options AQEMU needed to work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will be displayed in virtual machine as icons, like in file manager window. New experimental work mode is available in AQEMU. In this mode QEMU/KVM display will be showed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this feature you must mark the "Include Emdedded VNC Display in Main Window" flag. For correct working AQEMU must know your emulators locations and versions. For searching push the "Search" button. If automatic search can't find out your emulators, you should configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Set &Versions Manualy Установить версию &вручную Search... Поиск... Cancel Отмена Cannot get emulator info! For file: %1 Не могу получить информацию о эмуляторе! Файл: %1 MachineView Error! Ошибка! Cannot Reinit VNC Connection! Невозможно перезапустить VNC подключение! Main_Window Device Manager Gerätemanager HDD CD/DVD/Floppy 2048 MB All Files (*) Alle Dateien (*) Open Floppy Image File Diskettenabbild öffnen Open CD\DVD-ROM Image File CD\DVD-ROM-Abbild öffnen Open HDD Image File HDD-Abbild öffnen AQEMU Info General Основные Number of CP&U: Anzahl CP&Us: 1 2 4 8 16 32 64 128 255 Machine &Type: Maschinentyp: &CPU Type: &CPU-Typ: Default По умолчанию ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr Floppy Diskette CD-ROM Network Netzwerk Disabled Deaktiviert Enabled Aktiviert Full Полная &Video Card: Gra&fikkarte: B&oot Priority: B&ootreihenfolge: Machine &Name: &Name: Options Optionen Start in full screen Im Vollbildmodus starten &Fullscreen Mode &Vollbildmodus Use &Local Time Benutze &lokale Uhrzeit Enable ACP&I ACP&I aktivieren Snapshot &Mode Snapshot &Modus Memory Size: Größe des Arbeitsspeichers: Select Disk Image Disk Image wählen ... ... Floppy 1: Diskette 1: Floppy 2: Diskette 2: CD/DVD-ROM: CD/DVD-ROM: Other Andere &Help &Hilfe About AQEMU Über AQEMU F1 About &Qt Über &Qt &Exit Beend&en Ctrl+Q &Wizard... &Wizard... Ctrl+W Strg+W &Add New VM Neue VM &hinzufügen Ctrl+N Strg+N &Create HDD Image HDD Image er&zeugen Con&vert HDD Image HDD Image kon&vertieren Ctrl+S Strg+S Ctrl+D Strg+D Ctrl+P Strg+P Ctrl+R Strg+R &File &Datei 1 MB &VM &VM &New VM &Neue VМ &About AQEMU &Über AQEMU AQEMU &Settings AQEMU &Einstellungen &Start &Starten Sto&p Sto&p &Pause &Pause &Reset Zu&rücksetzen &Load VM From File VM aus Datei &laden Save As &Template Als &Template speichern Convert HDD Image HDD Image konvertieren Select SMB Directory SMB Verzeichnis wählen Protocol Protokoll Host Port Host Port Guest IP Gast IP Guest Port Gast Port &TCP &TCP &UDP &UDP to &guest IP zu &Gast IP T&FTP Server Prefix: T&FTP Server Prefix: Allow &SMB Access to: SMB &Zugriff erlauben: Network Cards Netzwerkkarten Use &Network &Netzwerk aktivieren &Initrd File: &Initrd Datei: &Apply &Anwenden Ports Ports Sa&ve &Speichern Error! Fehler! Cannot Save This VM to File! Diese VM kann nicht in die Datei gespeichert werden! Start CP&U at Startup Warning! Warnung! VM be Changed. Discard Changes? VM wurde geändert. Änderungen verwerfen? VM be Changed. Save Changes? VM wurde geändert. Änderungen speichern? Cannot Delete VM XML File! Die VМ XML-Datei kann nicht gelöscht werden! VM Name VM Name New Virtual Machine Name: Name für neue Virtuelle Maschine: You New VM Name is Empty! VM Not Created! Kein Name für neue VM angegeben! Es wurde keine neue VM erzeugt! Open AQEMU VM File AQEMU VМ Datei öffnen Cannot Save Settings! Die Einstellungen können nicht gespeichert werden! Close AQEMU? AQEMU schließen? One or More VM is Running! Terminate All Running VM and Close AQEMU? Eine oder mehrere VMs laufen noch! Alle laufenden VMs beenden und AQEMU schließen? Delete? Löschen? Change Icon Icon ändern VM Name is Empty! VM Name ist leer! Computer Type: Computertyp: Machine State: Maschinenstatus: Running Läuft Power Off Abgeschaltet Pause Pause Saved Gesichert Machine Type: Maschinentyp: CPU Type: CPU Typ: Boot Priority: Bootreihenfolge: Memory size < 1! Using default value: 256 MB Memory size < 1! Using efault value: 256 MB Use Sound: Sound benutzen: Yes Ja No Nein Use Snapshot Mode: Snapshot Modus benutzen: Use Network: Netzwerk verwenden: Card: Karte: TUN/TAP Interface TUN/TAP Schnittstelle TCP Socket TCP Socket VLAN VLAN No Connection Keine Verbindung VNC Port: SPICE Port: RTC TD Hack: No Shutdown: Start Date: Curses: Show Cursor: Initial Graphical Mode: Current VM was changed. Discard all changes? Current VM was changed. Save all changes? %1 Image "%2" doesn't Exist! Continue Without this Image? Your New VM Name is Empty! VM isn't Created! Are you sure? Information Information New Template Created! Neues Template erstellt! ROM File (For EtherBoot) ROM Datei (für EtherBoot) Select Kernel Image File Kernel Image wählen Select InitRD File InitRD Datei wählen Select ROM File ROM Datei wählen &Discard Changes Änderungen &verwerfen QEMU running in snapshot mode. VM can not be saved in this mode. QEMU läuft im Snapshot Modus. Die VM kann in diesem Modus nicht gespeichert werden. Set real time clock to local time. Default=utc Set the real time clock to local time. Default=utc Uhr auf lokale Uhrzeit setzen. Standard=utc No VM Found! Es wurde keine VM gefunden! None Keine Create New HDD Neue HDD erzeugen Mb МB Machine Details Maschinendetails Number of CPU: Anzahl Prozessoren: Acceleration: Beschleunigung: Video Card: Grafikkarte: Keyboard Layout: Tastatur Layout: Fullscreen Mode: Vollbildmodus: Windows 2000 Hack: Windows 2000 Hack: Enable ACPI: ACPI aktivieren: Use Local Time: Lokale Uhrzeit benutzen: Check Boot Sector on FDD: Bootsektor auf Diskette prüfen: Start CPU at Startup: Storage Devices Datenspeicher Exit instead of rebooting Beenden anstelle von neu booten No Reboot Kein Reboot Audio Cards Audiokarten CD/DVD-ROM &Redirections Weite&rleitungen Memory Size Speichergröße No Reboot: Kein Reboot: No Devices Found Keine Geräte gefunden User mode network stack UDP multicast socket Redirection Weiterleitung Use Redirections: Benutze Weiterleitungen: TFTP Server Prefix: TFTP Server Prefix: SMB Folder: SMB Ordner: ROM File: ROM Datei: Use Linux Boot: Linux Boot benutzen: Kernel bzImage: Kernel bzImage: Initrd File: Initrd Datei: Kernel ComLine: Kernel ComLine: Redirection List is Empty! Please Disable Redirections! Die Weiterleitungsliste ist leer! Bitte Weiterleitungen deaktivieren! Gravis &Ultrasound GF1 Gravis &Ultrasound GF1 &ENSONIQ ES1370 &ENSONIQ ES1370 &Yamaha YM3812 &Yamaha YM3812 PC Speaker PC Lautsprecher AC97 (Intel 82801AA) AC97 (Intel 82801AA) Sound &Blaster 16 Sound &Blaster 16 Optional Images Optionale Images SecureDigital Card Image Образ SecureDigital карты Parallel Flash Image Parallel Flash образ On-Board Flash Image On-Board Flash образ Advanced Erweitert KVM Shadow Memory Disable KVM kernel mode PIT Disable KVM kernel mode PIC/IOAPIC/LAPIC Rotate Graphical Output 90 Deg Left (Only PXA LCD) Use Ctrl-Alt-Shift to Grab Mouse (Default is Ctrl-Alt) Use Ctrl-Alt-Shift to Grab Mouse (Default Ctrl-Alt) Initial Graphical Mode Width Breite Height Höhe Depth Farbtiefe 24 Select On-Board Flash Image On-Board Flash Image wählen Select SecureDigital Card Image SecureDigital Image wählen Select Parallel Flash Image Parallel Flash Image wählen HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) Additional Options Zusätzliche Optionen On-Board Flash Image: On-Board Flash образ: SD Card Image: Образ SD карты: Parallel Flash Image: Образ Parallel Flash: No Frame: Без фрейма: Alt Grab: No Quit: Отключить выход: Portrait Mode: Портретный режим: vc SPICE Machine Name: pty none нет null dev host_port file файл stdio pipe udp tcp telnet unix Additional Settings Дополнительные параметры Protocol: Протокол: &Host Port Порт &хоста Guest Por&t Порт &гостя VM File " Файл ВМ " " is Read Only! Check Permissions! " доступен только для чтения Проверьте права доступа! All Files (*);;Images Files (*.img *.ima) Все файлы (*);;Файлы образов (*.img *.ima) All Files (*);;Images Files (*.iso) Все файлы (*);;Файлы образов (*.iso) Warning Внимание VM With This Name Already Exists! ВМ с этим именем уже существует! To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press "Ignore" button for hide this message in future. Add This Record? UNIX Domain Socket Path Select x509 Certificate Folder Выберите каталог сертификатов x509 Select x509 Verify Certificate Folder Выберите каталог сертификатов x509 для верификации VNC Use TLS Использовать TLS VNC Display Number Номер экрана VNC x509verify Folder Path Путь к каталогу x509verify x509 Folder Path Путь к каталогу x509 Activate VNC Использовать VNC Boot Linux Kernel Загрузка ядра Linux Use &Linux Boot Включить загрузку ядра &Linux Append Command Line: Параметры для ядра: Kernel bzImage File: bzImage файл ядра: Copy Копировать Manage Snapshots Управление снапшотами This Function Work Only On Running VM! Эта функция работает только на включённой ВМ! For Connection Use Port 5900 + VNC Display Number Для подключения используйте порт 5900 + номер экрана VNC UNIX Domain Socket Use Password (You must set a password when you starting the VM) Use Password (You must set a password when you start the VM) Установить пароль (Вы должны будете ввести пароль при запуске ВМ) Show Emulator Control Показать Emulator Control Cannot Change Icon When VM in Save State. Невозможно сменить иконку когда ВМ в сохранённом состоянии. en-us (default) en-us (по умолчанию) dd.MM.yyyy HH:mm:ss Start Date (Day.Month.Year Hour:Minute:Second) Дата запуска (День.Месяц.Год Час.Минута.Секунда) Delete " Удалить " " VM? " ВМ? KVM Options Опции KVM Use If Possible Использовать если возможно No Shutdown Не выключать Check Floppy Disk boot signature in VM BIOS Check Boot Signature For Floppy Disks in VM BIOS BIOS ВМ будет проверять загрузочную сигнатуру на Floppy дисках Check Boot Secto&r on FDD Проверять бут секто&р на FDD Fix Windows 2000 install Bug Fix Installation Windows 2000 Bug Windows 2000 хак (Обходит ошибку инсталляции Windows 2000) Curses (Use a curses/ncurses Interface Instead of SDL) Curses (Использовать curses/ncurses интерфейс вместо SDL) RTC TD Hack (Fix Time Drift in Windows ACPI HAL) RTC TD Hack (Обходит проблемы с Windows ACPI HAL) Hardware Virtualization Аппаратная виртуализация Disable KVM kernel mode PIT interrupt reinjection Nesting (Support for Running a VM Inside other VM (AMD Only) Nesting (Support for Running a VM Inside the VM (AMD Only) Nesting (Поддержка запуска ВМ внутри ВМ (Только для AMD) Disabled (Disable the usage of the QEMU Accelerator module KQEMU) Отключена (Выключает использование модуля KQEMU в QEMU) Use If Possible (AQEMU don't check loaded KQEMU module) Использовать если возможно (AQEMU не будет проверять загружен ли KQEMU модуль) Enabled (AQEMU check loaded KQEMU module, if no loaded QEMU not started) Включена (AQEMU проверяет загружен ли модуль KQEMU, если не загружен QEMU не запустится) Full (Enable full virtualization mode for best performances) Полная (Включает режим полной виртуализации для максимального быстродействия) KQEMU Acceleration Module KQEMU модуль акселерации Warning: Globaly Activated Embedded Display in Emulator Control Window. To Disable This Function in Current VM choose "Don't Use Embedded VNC Display" Warning: Globaly Activated Embedded Display in Emulator Control Window. For Disable This Function in Current VM Set "No Use Embedded VNC Display" Внимание: Поддержка встроенного дисплея в Emulator Control включена глобально. Для того чтобы отключить эту функцию для текущей ВМ отметьте: "Не использовать встроенный VNC дисплей" Don't use embedded VNC Display No Use Embedded VNC Display Не использовать встроенный VNC дисплей &Windows 2K Hack &Windows 2000 хак General &Settings Основные &настройки &Advanced Settings &Дополнительные настройки Start &First Run Wizard Run &First Run Wizard Запустить &мастер первого запуска You must create a new virtual machine Вы должны создать новую виртуальную машину Emulator Type: Тип эмулятора: Emulator Version: Версия эмулятора: Primary Master (HDA): Primary Slave (HDB): Secondary Master (HDC): Secondary Slave (HDD): Display Дисплей Emulator Control Already Show Emulator Control уже отображается QEMU/KVM Arguments: Аргументы QEMU/KVM: QEMU KVM &Keyboard Layout Расклад&ка клавиатуры QEMU/KVM Window Options Опции окна QEMU/KVM Show QEMU/KVM Window Without a Frame and Window Decorations Отобразить QEMU/KVM без фрейма окна Disable QEMU/KVM Window Close Capability Отключить возможность закрытия QEMU/KVM окна Show Cursor (It Works Only in QEMU/KVM SDL Window) Show Cursor (This Work Only in QEMU/KVM SDL Window) Показывать курсор (Это работает только в окне QEMU/KVM с использованием SDL) Additional QEMU/KVM &Arguments Дополнительные &аргументы QEMU/KVM Send Only User Arguments Without AQEMU Arguments Обрабатывать только аргументы пользователя игнорируя аргументы AQEMU Use Emulator Binary File in "Additional QEMU/KVM Arguments" Использовать бинарный файл указанный в дополнительных аргументах Show QEMU/KVM &Arguments Показать &аргументы QEMU/KVM Show QEMU/KVM Error Log Window Показать окно ошибок QEMU/KVM QEMU/KVM Arguments Аргументы QEMU/KVM This VM uses an emulator "%1" which is not installed in the system. The work of the VM is not possible! Эта ВМ использует эмулятор "%1" который не установлен в системе. Работа этой ВМ не возможна! You Sure? Вы уверены? Shutdown VM "%1"? Выключить ВМ "%1"? Reboot VM "%1"? Перезагрузить ВМ "%1"? Image Format: Формат образа: Allocated Disk Space: Размер на диске: Virtual Size: Виртуальный объём: Cluster Size: Размер кластера: Image Format: none Allocated Disk Space: 0 Формат: нет Занимает на диске: 0 Virtual Size: 0 Cluster Size: 0 Виртуальный объём: 0 Размер кластера: 0 Item %1 Элемент %1 NIC User Channel TAP Socket Multicast Socket VDE Dump Unknown Type Item Неизвестный тип элемента This Function Works Only On Running VM! Cannot convert "%1" to size suffix! Valid suffixes are: MB, GB Memory size < 0! Valid size is 1 or more Your memory size %1 MB > %2 MB - all free RAM on this system! To set this value, check "Remove limitation on maximum amount of memory". Free memory on this system is less than 32 MB! All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.qcow2 *.wmdk) CPU count value is not valid digit! Network Settings Настройки сети Create Создать Format Форматировать Network Settings GUI Type: Тин интерфейса настройки: Basic Базовый AQEMU VM (*.aqemu) AQEMU ВМ (*.aqemu) Native Nativ Нативный bzImage Initrd ROM File ROM файл On-Board Flash SecureDigital Card SecureDigital карта Parallel Flash %1 Image "%2" Not Exist! Continue Without It Image? %1 образ "%2" не найден! Продолжить без него? Cannot Open File! Не могу открыть файл! Create Shell Script Создать Shell скрипт VNC x509 Folder Каталог VNC x509 VNC x509verify Folder Каталог VNC x509verify Save VM to Script Сохранить ВМ в скрипт Shell Script Files (*.sh);;All Files (*) Скрипты (*.sh);;Все файлы (*) Memory size < 1! Use default value: 256 MB Объём памяти < 1! Используется значение по умолчанию: 256Мб Memory size > all free memory on this system! Объём памяти > всей свободной памяти в системе! Serial Port %1: Последовательный порт %1: Parallel Port %1: Параллельный порт %1: USB Port %1: USB порт %1: Type: none Size: 0 Тип: нет Объём: 0 Type: Host Device Тип: реальное устройство Type: Image Size: 0 Тип: образ Объём: 0 Byte Байт Kb Кб Gb Гб Type: Image Size: Тип: образ Объём: No boot device found! Нет загрузочного устройства! Error Ошибка Cannot convert "%1" to memory size! Невозможно преобразовать "%1" в объём памяти! Cannot convert "%1" to integer! Невозможно преобразовать "%1" в число! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Невозможно преобразовать "%1" в суффикс объёма! Доступные варианты: MB, GB Memory size < 0! Valid size 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Your memory size %1 MB > %2 MB - all free RAM on this system! For set it size, check "Remove limitation on maximum amount of memory". Ваш объём памяти %1 MB > %2 MB — всей свободной памяти в системе! Для установки этого объёма активируйте: "Убрать ограничение на максимальный объём памяти". Current memory size more of all host memory! Use the maximum available size. Текущий объём памяти больше чем вся свободная память в системе! Используйте максимально доступное значение. Free memory: %1 MB Доступно памяти: %1 MB Free memory on this system is low 32 MB! Объём свободной памяти в системе меньше 32 Мб! CPU count value not valid digit! Количество процессоров не является корректной цифрой! CPU count > max CPU count for this emulator! Количество процессоров > максимально для этого эмулятора! For Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press button "Ignore" for hide this message in future. Add This Record? Для создания сокета с номером порта < 1024 в Unix Вам нужно запустить AQEMU с правами root! Нажмите "Игнорировать" чтобы скрыть это предупреждение в будущем. Добавить эту запись? Updating free memory information Update information about free memory Обновить информацию о объёме свободной памяти Free memory: 768 MB Доступно памяти: 768 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Убрать ограничение на максимальный объём памяти Open Открыть All settings Все параметры Browse Обзор Floppy A Floppy B A&dd item &Добавить элемент D&elete item &Удалить элемент &Clear list &Очистить список Redirect item settings Параметры перенаправления Other network settings Другие сетевые настройки Enable KVM Disabled (Disable KQEMU Accelerator module) Disabled (Disable the usage of the QEMU Accelerator module KQEMU) Use If Possible (AQEMU won't check loaded KQEMU module) Use If Possible (AQEMU don't check loaded KQEMU module) Enabled (AQEMU checks loaded KQEMU module. If it isn't loaded QEMU won't started) Enabled (AQEMU check loaded KQEMU module, if no loaded QEMU not started) Full (Enable full virtualization mode for best performances) General settings Security settings &Delete VM &Удалить ВМ Delete VM And Files Удалить ВМ и файлы Monitor_Window QEMU/KVM Monitor QEMU/KVM Мonitor &Clear &Löschen &Run &Starten Com&mand: Ko&mmando: info network info snapshots info usb info usbhost info cpus info history info irq info pic info pci info tlb info mem info jit info kqemu info profile info capture info mice info vnc Change font Font info version info block info registers Network_Widget Unknown Type Item Неизвестный тип элемента Warning! Внимание! Maximum Network Cards Count is 8. Максимальное количество сетевых карт 8. New Item Новый элемент AQEMU Network Widget Items List: Список элементов: &Add &Добавить &Delete &Удалить Connection Type Тип подключения nic user channel tap socket vde dump ? ? Model Модель macaddr aa:bb:cc:dd:ee Generate New MAC Сгенерировать новый MAC vlan name hostname port:dev fd ifname script ... ... downscript listen connect mcast sock port group mode file len 64Kb (default) 64Kb (по умолчанию) 128Kb 512Kb 1Mb 5Mb 10Mb y n sndbuf vnet_hdr on off vhost vhostfd hostfwd guestfwd -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no '-net' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. -net user[,vlan=n][,hostname=name][,name=name] Use the user mode network stack which requires no administrator privilege to run. 'hostname=name' can be used to specify the client hostname reported by the builtin DHCP server. -net channel,port:dev Forward 'user' TCP connection to port port to character device dev -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] Connect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. 'fd'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is '/etc/qemu-ifup' and the default network deconfigure script is '/etc/qemu-ifdown'. Use 'script=no' or 'downscript=no' to disable script execution. -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] Connect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If 'listen' is specified, QEMU waits for incoming connections on port (host is optional). 'connect' is used to connect to another QEMU instance using the 'listen' option. 'fd'=h specifies an already opened TCP socket. -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] Create a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. NOTES: 1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). 2. mcast support is compatible with User Mode Linux (argument 'ethN=mcast'), see http://user-mode-linux.sf.net. 3. Use 'fd=h' to specify an already opened UDP multicast socket. -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] Connect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled. -net dump[,vlan=n][,file=f][,len=n] dump traffic on vlan 'n' to file 'f' (max n bytes per packet) Select script Skript wählen All Files (*);;Scripts (*.sh) Alle Dateien (*);;Skripte (*.sh) Boot file All Files (*) SMB directory Error! Fehler! Incorrect MAC address! Invalid name! Valid characters are:: a-z A-Z 0-9 _ - Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ - %1 File "%2" doesn't Exist! Continue Without this File? MAC Address Incorrect! Fehlerhafte MAC Adresse! Name Invalid! Valid Characters Are Only: a-z A-Z 0-9 _ - Ungültiger Name! Die gültigen Zeichen sind: a-z A-Z 0-9 _ - Hostname Invalid! Valid Characters Are Only: a-z A-Z 0-9 _ - Ungültiger Hostname! Die gültigen Zeichen sind: a-z A-Z 0-9 _ - %1 File "%2" Not Exist! Continue Without It File? %1 die Datei "%2" existiert nicht! Weiter ohne Datei? addr vectors net host restrict dhcpstart dns tftp bootfile smb smbserver Old_Network_Widget Error Fehler Network Card #% Not Valid! Netzwerkkarte #% ist ungültig! Card Karte Warning! Warnung! Maximum Network Cards Count is 8. Die maximale Anzahl Netzwerkkarten ist 8. Network Cards List is Empty! Die Liste der Netzwerkkarten ist leer! Cannot Delete Network Card! Netzwerkkarte kann nicht gelöscht werden! Select script Skript wählen All Files (*);;Scripts (*.sh) Alle Dateien (*);;Skripte (*.sh) Error! Fehler! IP Address in Card Invalid! Ungültig! MAC Address in Card In Card Old Network Widget Altes Netzwerk Widget Cards List: Liste Karten: Add Hinzufügen &Delete &Löschen Network Card Model: Modell Netzwerkkarte: Connection &Mode: Verbindungst&yp: Use the user mode network stack User Mode Network Stack benutzen Open a TUN/TAP interface TUN/TAP Schnittstelle öffnen Use an already open TUN/TAP interface Bereits geöffnete TUN/TAP Schnittstelle benutzen Open a listening TCP socket Lauschenden TCP socket öffnen Use an already open TCP socket Bereits geöffneten TCP Socket benutzen Connect to listening TCP socket Mit lauschendem TCP Socket verbinden Create shared VLAN via UDP multicast socket Geteiltes VLAN über einen UDP Multicast Socket erstellen Use an already open UDP multicast socket Bereits geöffneten UDP Multicast Socket benutzen No connection Keine Verbindung VM Hostname: VM Hostname: &IP Address: &IP Adresse: &MAC Address: &MAC Adresse: Generate New MAC Neue MAC erzeugen &VLAN: &VLAN: &Port: &Port: &FD: &TUN/TAP Script: &TUN/TAP Skript: ... ... &Interface Name: &Interface Name: TUN/TAP Script File "%1" Not Exists! Continue Without It File? Die TUN/TAP Skriptdatei "%1" existiert nicht! Ohne Datei fortfahren? If the value is 0 then it will not be used Ein Wert von 0 wird nicht benutzt Ports_Tab_Widget Ports Порты COM (Serial Port) COM (Последовательный порт) LPT (Parallel Port) LPT (Параллельный порт) USB Port USB порт Keyboard Клавиатура Mouse Мышь Tablet Wacom Tablet Braille Virtual QEMU/KVM Device: %1 Виртуальное QEMU/KVM устройство: %1 %1 %2 (Vendor ID: %3 Product ID: %4) %1 %2 (ID производителя: %3 ID продукта: %4) %1 %2 (BusAddr: %3) Warning Внимание You can add no more than 4 COM ports Вы не можете добавить больше 4 COM портов You can add no more than 3 LPT ports Вы не можете добавить больше 3 LPT портов Device not select! Устройство не выбрано! Device doesn't selected! Add port Добавить порт Serial (COM) Последовательный (COM) Parallel (LPT) Параллельный (LPT) USB Edit Port Изменить порт Delete Port Удалить порт Ports List Список портов Port type Тип порта Details Описание Properties_Window Image Size: Размер образа: Format: Формат: Virtual Size: Виртуальный объём: On Disk Size: Размер на диске: Cluster Size: Размер кластера: Open Floppy Image File Открыть файл образа Floppy Image file doesn't exist! Open CD\DVD-ROM Image File Открыть файл образа CD\DVD-ROM Open HDD Image File Открыть файл образа HDD Properties Свойства Floppy Floppy ... ... CD/DVD-ROM CD/DVD-ROM Hard Disk Жёсткий диск &Format Exist &Форматировать текущий Create &New Создать &новый Path to Image: Путь к образу: Information Информация Device Name: Имя устройства: Up&date Info Об&новить Инфо &OK &OK &Cancel &Отмена Mb Мб All Files (*);;Images Files (*.img *.ima) Все файлы (*);;Файлы образов (*.img *.ima) All Files (*);;Images Files (*.iso) Все файлы (*);;Файлы образов (*.iso) All Files (*);;Images Files (*.img *.qcow *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.wmdk) Warning Внимание Image File Not Exists! Файл образа не найден! Kb Кб Browse Обзор Advanced settings Дополнительные параметры QObject Error! Ошибка! Error Cannot create directory for log file! Path: %1 This is a first AQEMU start and program running in root mode. In some Linux distributions you may have problems with configuration saving. Close AQEMU? AQEMU will search for emulators after uptating. Please wait. Cannot Find any Emulators installed in your OS! You should choose them In Advanced Settings! Please Select AQEMU Data Folder: Пожалуйста выберите папку данных AQEMU: AQEMU won't Work If Data Folder isn't Selected! AQEMU VM Folder doesn't Exists! Create It? Cannot Start qemu-img! Image not Created! Не могу запустить qemu-img! Образ не создан! qemu-img Cannot Finish! Image not Created! qemu-img не завершена! Образ не создан! Cannot Create Image! Information: Невозможно создать образ! Информация: Complete! Готово! QEMU-IMG is Create HDD Image. Additional Information: QEMU-IMG создал образ HDD. Дополнительная информация: Warning! Внимание! QEMU-IMG is Return non Standard Message!. Additional Information: QEMU-IMG возвратил нестандартное сообщение! Дополнительная информация: Default По умолчанию Standard PC Стандартный PC ISA-only PC Только ISA Integrator/CP (ARM926EJ-S) Integrator/CP (ARM1026EJ-S) Versatile/PB (ARM926EJ-S) Versatile/AB (ARM926EJ-S) RealView (ARM926EJ-S) R4k platform Malta Core LV Heathrow PowerMAC Mac99 PowerMAC PowerPC PREP SPARCstation 2 (Sun4c) SPARCstation 5 (Sun4m) SPARCstation 10 (Sun4m) SPARCstation 20 (Sun4m) SPARCserver 600MP (Sun4m) SPARCserver 1000 (Sun4d) SPARCcenter 2000 (Sun4d) NE2000 PCI NE2000 ISA i82551 i82557B i82559ER PCnet32 PCI RTL8139 SMC91C111 MCF FEC Lance No Video Card Нет видео карты Standard VGA Стандартная VGA Sun4m Akita PDA (PXA270) Spitz PDA (PXA270) Borzoi PDA (PXA270) Terrier PDA (PXA270) Palm Tungsten (OMAP310) Stellaris LM3S811EVB Stellaris LM3S6965EVB Gumstix Connex (PXA255) Gumstix Verdex (PXA270) Mainstone II (PXA27x) Bare ETRAX FS board Acer Pica 61 MIPS MIPSsim platform R4000 VR5432 5Kc 5Kf 20Kc MIPS64R2-generic qemu64 Athlon Ref405ep Taihu Fatal error. It's recommended to close AQEMU Cannot Start qemu-img! Image isn't Created! qemu-img Cannot Finish! Image isn't Created! QEMU-IMG is Creates HDD Image. Additional Information: QEMU-IMG is Returned non Standard Message!. Additional Information: Kb Кб Mb Мб Gb Гб AQEMU Config File is Read Only! Check Permissions For File: Файл конфигурации AQEMU доступен только для чтения! Проверьте права доступа для файла: AQEMU VM Directory is Read Only! Check Permissions For: Каталог ВМ AQEMU доступен только для чтения! Проверьте права доступа для: AQEMU VM Template Directory is Read Only! Check Permissions For: Каталог шаблонов ВМ AQEMU доступен только для чтения! Проверьте права доступа для: AQEMU Log File is Read Only! Check Permissions For File: Файл лога AQEMU доступен только для чтения! Проверьте права доступа для файла: This Fatal Error. Recomend Close AQEMU. Это фатальная ошибка. Рекомендуется закрыть AQEMU. Cannot Locate AQEMU Data Folder! You Should Select This Folder in Next Window! Cannot Find AQEMU Data! AQEMU VM Folder Not Exists! Create It? Папка для ВМ AQEMU не существует! Создать её? shix card r2d-plus board Cirrus CLGD 5446 VMWare Video Card VMWare видео карта None Video Card Без видео карты Core Duo Atom N270 e1000 virtio Phenom Core 2 Duo QEMU 64Bit ARM 1136 R2 Siemens SX1 (OMAP310) V1 Siemens SX1 (OMAP310) V2 Nokia N800 Nokia N810 Marvell 88w8618 / MusicPal Tosa PDA (PXA255) AXIS devboard 88 fseth MCF5206EVB Arnewsh 5206 Dummy board MIPS Malta Core LV MIPS Magnum mips r4k platform MIPS R4000 MIPS VR5432 MIPS 5Kc MIPS 5Kf MIPS 20Kc MIPS MIPS64R2-generic e500v1 Mac99 based PowerMAC PowerPC PREP platform ref405ep taihu bamboo mpc8544ds SH7750R SH7751R SH7785 SPARCstation Voyager (Sun4m) SPARCstation LX (Sun4m) SPARCstation 4 (Sun4m) SPARCClassic (Sun4m) SPARCbook (Sun4m) StdVGA (VESA 2.0) Cannot Find Emulators in This System! You Most Set It In Advanced Settings! Не могу найти эмуляторы в этой системе! Вы должны указать их в окне "Дополнительные настройки"! Cannot Find Emulators in This System! Please Add Emulators Manual! Не могу найти эмуляторы в этой системе! Вы должны добавить их самостоятельно! Sun4u Sun4v Sun4v (Niagara) Spartan 3ADSP1800 xilinx-ethlite AQEMU emulators search AQEMU поиск эмуляторов After the update AQEMU should perform a search of emulators. Please wait. После обновления AQEMU нужно провести поиск эмуляторов. Пожалуйста подождите. Cannot Load AQEMU Icon Theme! File "%1" Not Found! Не могу загрузить тему значков для AQEMU! Файл "%1" не найден! SMP_Settings_Window SMP Settings SMP Einstellungen If any on the values can be omitted. Missing (zero) values will be computed. CPUs count Anzahl CPUs Sockets count Anzahl Sockel Cores per socket Kerne pro Sockel Threads per core Threads pro Kern Max number of hotpluggable CPUs Maximale Anzahl Hotplug-CPUs &OK &OK &Cancel &Abbrechen Select_Icon_Window &OK &OK &Cancel &Abbrechen &Browse... &Durchsuchen... Your Icon Path: You Icon Path: Eigener Icon Pfad: Error! Fehler! Icon File Not Exists! Das Icon existiert nicht! Icon file doesn't exist! Select Icon File: Wähle Icondatei: PNG Images (*.png) PNG Bilder (*.png) Change Icon Icon ändern Other &Icon Anderes &Icon Select Icon For Your VM Wählen Sie ein Icon für Ihre VM Default &Other System Icon Standardicon "&Generisches System" Default &Linux Icon Standard &Linux Icon Default &Windows Icon Standard &Windows Icon &All OS Icons From AQEMU Collection &Alle Icons der AQEMU Kollektion Settings_Window Set your VM folder Set Folder for you VM's Ordner für ihre VMs Information Information Language be set after restart AQEMU Show this message in future? Die Sprache wird erst nach einem Neustart von AQEMU eingestellt Diese Mitteilung erneut anzeigen? General Settings Allgemeine Einstellungen ... ... English Default VM Template: Standard VM Template: Warning Warnung AQEMU VM Templates Not Found! AQEMU ВМ шаблоны не найдены! New template was created! Language will set after restarting AQEMU Show this message in future? AQEMU VM folder doesn't exist! Do you want to create it? Error! Fehler! Invalid Value! Unzulässiger Wert! Folder for AQEMU VM is Not Exists! Create It? Der Ordner für die AQEMU VM existiert nicht! Soll er erstellt werden? Cannot Create New Folder! Es kann kein neuer Ordner erstellt werden! New Template Created! Neues Template erstellt! AQEMU VM Folder: AQEMU VM Ordner: Use Device Manager by Default Gerätemanager als Standard benutzen Use Screenshot for OS Icon in Save Mode Bildschirmfoto als OS Icon im Gesicherten Modus benutzen Create Template Template erzeugen Interface Language: Sprache: Emulator Control Show Mode Emulator Control Anzeigemodus Show In Separate Window In seperatem Fenster zeigen Show Window With Embedded Display In Fenster mit eingebettetem Display zeigen Show In AQEMU Main Window Im AQEMU Hauptfenster Show In AQEMU Main Window With Embedded Display Im AQEMU Heuptfenster mit eingebettetem Display Don't show No Show Nicht anzeigen &OK &OK &Cancel &Abbrechen Support for this feature is not complete! If there is no picture, click "View->Reinit VNC" Show This Message Again? Реализация этой функции не завершена! Если вы не видите изображения, то нажмите "Вид->Перезапустить VNC". Показывать это предупреждение снова? Icons theme be set after restart AQEMU Show this message in future? Das Icon Thema wird erst nach einem Neustart von AQEMU eingestellt Diese Mitteilung erneut anzeigen? Basic Settings Allgemeine Einstellungen View Ansicht GUI Icons Theme: GUI Icon Thema: Crystal SVG (KDE 3) Oxygen (KDE 4) VM Icon Size: VM Icons Size: Размер значков ВМ: 16x16 24x24 32x32 48x48 64x64 Snapshot_Properties_Window Warning Warnung Snapshot name is empty! Name for Snapshot is Empty! Der Name für den Snapshot ist leer! Snapshot Properties Snapshot Eigenschaften &OK &OK &Cancel &Abbrechen Snapshot Description: Snapshot Beschreibung: Snapshot Name: Snapshot Name: Snapshots_Window ID: ID: Size: Größe: Date: Datum: VM Clock: Uhrzeit VM: Warning! Warnung! Please select snapshot that you want to delete! Warning Warnung Delete Current Snapshot? Aktuellen Snapshot löschen? Please select snapshot that you want to start! This VM is Running now! Stop VM and Load Snapshot? This VM Running! Stop VM and Load Snapshot? Diese VM läuft noch! VM abschalten und Snapshot laden? Error! Fehler! You must add HDD image in QCOW2 format if you want to use snapshots! For use snapshots, you most add HDD image in QCOW2 format! Manage VM Snapshots VM Snapshots verwalten Update Info Update Info OK OK Create Erzeugen Delete Löschen Start Starten Properties Einstellungen Snapshot List: Snapshot Liste: For Use Snapshot, You Most Add Hard Drive to This VM! Um Snapshots zu benutzen, müssen sie der VM eine Festplatte hinzufügen! Description: Beschreibung: VM_Wizard_Window &Next &Weiter &Finish &Beenden 2048 MB 2048 МB New Virtual Machine Wizard Assistent für neue Virtuelle Maschinen Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. Geben sie einen Namen für die neue virtuelle Maschine ein. Dieser sollte normalerweise auf die Hard- und Softwarekonfiguration hinweisen. Select the amount of base memory (RAM) in megabytes for virtual machine allocating. Select the amount of base memory (RAM) in megabytes to be allocated to the virtual machine. Wählen sie die Menge an Arbeitsspeicher (RAM) in Megabyte, der der virtuellen Maschine zugewiesen werden soll. 1 MB 1 МB N&ew... N&eu... E&xisting... Bestehende ö&ffnen... &Back &Zurück &Cancel &Abbrechen VM Name and CPU Type VM Name und CPU Typ Memory Speicher Virtual Hard Disk Virtuelle Festplatte Finish! Fertig! Memory size < 0! Valid size is 1 or more Current memory size bigger than all existing host memory! Using maximum available size. Free memory on this system is lower than 32 MB! Select HDD Image HDD Image wählen All Files (*) Alle Dateien (*) Please Select VM Hardware Template Bitte wählen sie eine VM Hardware Vorlage No Selected Nichts ausgewählt Release Date: Releasedatum: 1985-1990 1990-1995 1995-2000 2000-2005 C&omputer Type: C&omputer Typ: OS Type: Betriebssystemtyp: VM Hardware Template VM Hardware Vorlage Wizard Mode Assistentenmodus Virtual Machine Name Name der Virtuellen Maschine Hard Disk Size Festplattengröße Network Netzwerk &Custom &Benutzerdefiniert Create new virtual machine with additional configuration options. Neue Virtuelle Maschine mit zusätzlichen Konfigurationsoptionen erstellen. Create new virtual machine with most common devices and configuration options. Neue Virtuelle Maschine mit den gebräuchlichsten Geräten und Konfigurationseinstellungen erstellen. &Typical (For Beginners) &Typisch (für Einsteiger) Select AQEMU Configuration Mode AQEMU Konfigurationseinstellung wählen Select network type using on your new virtual machine. Select network type using on you new virtual machine. Wählen Sie die Art des Netzwerkes für die neue Virtuelle Maschine. Disk Size in GB (Gigabytes): Diskgröße in GB (Gigabyte): Enter your new virtual machine hard disk capacity. Enter you new virtual machine hard disk capacity. Введите объём для нового виртуального жёсткого диска. Error! Fehler! Cannot Create New VM from Template! Невозможно создать новую ВМ из шаблона! Generate VM Erstelle VМ Template Template Cannot Find QEMU System ID! Не могу найти QEMU System ID! Template For VM Шаблон для ВМ Warning Warnung This VM Name is Already Exists! Der Name der VM existiert bereits! Emulator Type Emulator Please Add One Or More Emulators in Advanced Settings! Bitte fügen sie einen oder mehrere Emulatoren in den Erweiterten Einstellungen hinzu! Cannot Find Emulator System ID! Не могу найти ID эмулятора! <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the steps that are necessary to create a new virtual machine for AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Этот мастер проведёт Вас через несколько шагов в конце которых будет создана новая виртуальная машина AQEMU.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Используйте кнопку <span style=" font-weight:600;">Далее</span> для перехода на новую страницу мастера и кнопку <span style=" font-weight:600;">Назад</span> для возвращения на предыдущую.</p></body></html> Select Emulator Type For Using In New Virtual Machine Select Emulator Type For Use In New Virtual Machine Wählen sie den Emulator für die neue Virtuelle Maschine QEMU KVM VM Name: VM Name: CPU Type: CPU Typ: Select a CPU type for your new virtual machine: Select a CPU type for you new virtual machine: Wählen Sie einen CPU Typ für die neue Virtuelle Maschine: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Выберите образ жесткого диска который будет использован как загрузочный для этой виртуальной машины. Вы можете создать новый образ нажав на кнопку <span style=" font-weight:600;">Новый</span> или выбрать существующий образ нажав на кнопку <span style=" font-weight:600;">Существующий</span>.</p></body></html> Boot Hard Disk (Primary Master) Festplatte booten (Primary Master) &User Mode Network Connection (Uses the user mode network stack) &User Mode Network Connection (Use the user mode network stack) N&o Network (No net cards installed on VM) &Kein Netzwerk <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если Вы считаете, что всё сделано правильно нажмите кнопку <span style=" font-weight:600;">Конец</span> Как только Вы нажмёте эту кнопку виртуальная машина будет создана.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">По окончанию Вы сможете изменить эти и другие настройки в любое время.</p></body></html> Error Fehler Cannot convert "%1" to memory size! Невозможно преобразовать "%1" в объём памяти! Cannot convert "%1" to integer! Невозможно преобразовать "%1" в число! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Невозможно преобразовать "%1" в суффикс объёма! Доступные варианты: MB, GB Memory size < 0! Valid size 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Your memory size %1 MB > %2 MB - all free RAM on this system! To setup this value, check "Remove limitation on maximum amount of memory". Your memory size %1 MB > %2 MB - all free RAM on this system! For set it size, check "Remove limitation on maximum amount of memory". Ваш объём памяти %1 MB > %2 MB — всей свободной памяти в системе! Для установки этого объёма активируйте: "Убрать ограничение на максимальный объём памяти". Current memory size more of all host memory! Use the maximum available size. Текущий объём памяти больше чем вся свободная память в системе! Используйте максимально доступное значение. Free memory: %1 MB Доступно памяти: %1 MB Free memory on this system is low 32 MB! Объём свободной памяти в системе меньше 32 Мб! 2005-2010 Update free memory information Update information about free memory Information zum freien Speicher aktualisieren Free memory: 768 MB Freier Speicher: 768 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Speicherlimit ignorieren VNC_Password_Window VNC Password VNC Passwort Password: Passwort: Confirm: Bestätigen: OK OK Warning Warnung Password is Empty! Passwort ist leer! Password Not Confirmed! Passwort wurde nicht bestätigt! Virtual_Machine Version Invalid! Versionsfehler! Version of this AQEMU VM File isn't 0.5 Load This File anyway? ROM File doesn't Exists! Can't run emulator! KVM Kernel Module Not Loaded! To load this Module, Enter in Terminal with root privileges: "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? KQEMU Kernel Module Not Loaded! This Module Provides Acceleration for QEMU. For Loading KQEMU Module Type: "modprobe kqemu" in root mode Or Disable Acceleration in "Other->Hardware Virtualization" tab. Saving... Speichern... Saving Virtual Machine. Please wait... Speichere virtuelle Maschine. Bitte warten... You must add HDD image in QCOW2 format to save virtual machine! QEMU Error Log QEMU Error Log Error! Fehler! ROM File Not Exists! QEMU Cannot Run! Die ROM Datei existiert nicht! QEMU kann nicht gestartet werden! Loading... Laden... Loading Virtual Machine. Please wait... Lade virtuelle Maschine. Bitte warten... Additional Arguments is Empty! Cannot Use User Arguments! Дополнительные аргументы отсутствуют! Поэтому их невозможно использовать! Warning! Warnung! USB Device %1 %2 (%3 %4) Not Found! USB Gerät %1 %2 (%3 %4) wurde nicht gefunden! KVM Kernel Module Not Loaded! For Loading KVM Module, Enter in Terminal by User "root": "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? Es ist kein KVM Kernelmodul geladen! Um das KVM Modul zu laden, führen sie als "root" auf der Konsole folgenden Befehl aus: "modprobe kvm". Je nachdem, ob sie eine Intel- oder AMD-CPU benutzen, müssen sie danach noch das Modul "kvm-intel" bzw. "kvm-amd" laden. Diesen Fehler ignorieren? KQEMU Kernel Module Not Loaded! This Module Provide Acceleration for QEMU. For Loading KQEMU Module Type In Root Mode: "modprobe kqemu" Or Disable Acceleration in Tab "Other->Hardware Virtualization". Es ist kein KQEMU Kernelmodul geladen! Dieses Modul beschleunigt den QEMU Emulator. Um das KQEMU-Kernelmodul zu laden führen sie als "root"-benutzer "modprobe kqemu" auf der Konsole aus. Sie können die Beschleunigung auch im Tab "Andere-> Hardware Virtualisierung" deaktivieren. Cannot start emulator! Binary path is empty! Es kann kein Emulator gestartet werden! Es wurde kein Pfad zu den Binärdateien angegeben! VncView Password required Passwort erforderlich Please enter the password for the remote desktop: Bitte geben Sie das Passwort für den Remote Desktop ein: aqemu-0.9.2/resources/translations/Russian.ts000066400000000000000000016513021272330227200213710ustar00rootroot00000000000000 About_Window About AQEMU О программе AQEMU <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L';"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> OK OK About О программе Thanks To Благодарности <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> License Лицензия Error! Ошибка! Unable to save the file %1: %2. Не могу сохранить файл %1: %2. Cannot Find AQEMU Links File! Не могу найти файл ссылок AQEMU! Download failed: %1. Загрузка не удалась: %1. Links Ссылки Update Links Form Internet Обновить ссылки через Интернет <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br>Pavel Serebryakov (aka Kronoph) - Correcting English translation <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br>Pavel Serebryakov (aka Kronoph) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Разработчики:</b> <br>Андрей Рыжов (aka RDron) - Автор <br><br><b>Помощники:</b> <br>Максим Бражников - Порт для FreeBSD <br>Борис Савельев - Пакет для ALTLinux <br>Денис Смирнов (aka reMiND) - Пакет для Arch Linux и другая помощь <br>Ignace Mouzannar - Пакет для Debian <br>Michael Brandstetter - Перевод на немецкий и улучшение скриптов <br>Robert Warnke - Немецкий перевод документации по AQEMU <br>Michael Schmöller (aka schmoemi) - Перевод интерфейса на немецкий и исправления английского перевода <br>Guillem Rieu - Исправление для сетевых перенаправлений <br>Karol Krenski - Исправление RegExp для IP адреса <br>Александр Романов (aka romale) - Тестирование, новые идеи и другая помощь <br>Timothy Redaelli - Исправление для CMake скрипта <br>Павел Серебряков (aka Kronoph) - Исправления английского перевода <br><br><b>Отдельное спасибо:</b> <br>Сергей Синица (aka sin) <br>Григорий Пуляев (aka Rodegast) <br>Александр Сайфулин (aka Ne01eX) <br>Михаил Паршин (aka Skeeper) <br>Garret Acott (aka gacott) <br>Дамир Вафин (aka Denver-22) <br><br><b>Спасибо всей группе www.nclug.ru за тестирование и предложения по улучшению.</b> <br><br><b>AQEMU использует код из QtEMU и Krdc спасибо всем разработчикам этих программ:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Значки:</b> <br>Crystal SVG - Тема значков от студии дизайна Everaldo.com <br>Oxygen - Тема значков от команды Oxygen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.8.3 of 2011.07.27</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU это графический интерфейс для QEMU и KVM</p> <p>Версия: 0.9.0 от 2016.04.20</p> <p>Лицензия: General Public License Версия 2</p> <p>Автор: Андрей Рыжов (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Веб сайт: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Поддерживаемые эмуляторы:<br>QEMU 0.9.0-0.14.1 и KVM 60-88-0.14.1</p> </b> </body> </html> Add_New_Device_Window Select You Device Выберите ваше устройство Select your device Выберите ваше устройство All Files (*) Все файлы (*) Error! Ошибка! File does not exist! Файл не найден! "Cyls" value is incorrect! "Cyls" неправильное значение! "Heads" value is incorrect! "Heads" неправильное значение! "Secs" value is incorrect! "Secs" неправильное значение! "Trans" value is incorrect! "Trans" неправильное значение! File Not Exists! Файл не найден! Warning! Внимание! "Cyls" Value Incorrect! "Cyls" неправильное значение! "Heads" Value Incorrect! "Heads" неправильное значение! "Secs" Value Incorrect! "Secs" неправильное значение! "Trans" Value Incorrect! "Trans" неправильное значение! New Storage Device Новое запоминающее устройство Bus, Unit (For SCSI) Bus, Unit (Для SCSI) Index (For IDE, Floppy) Index (Для IDE, Floppy) &Snapshot &Snapshot &OK &OK &Cancel &Отмена Cac&he Cac&he Disk CD-ROM ide scsi sd mtd floppy pflash &Media &Тип носителя &File &Файл &Interface &Интерфейс Settings for -hdachs Option Настройки для опции -hdachs s&ecs &trans c&yls &heads virtio none writeback writethrough AIO threads native on off Boot Add_Port_Window Open File Открыть файл All Files (*) Все файлы (*) Optionally width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C [Linux only] Pseudo TTY (a new PTY is automatically allocated) No device is allocated. Void device [Unix only] standard input/output [Linux only] Use host tty, e.g. /dev/ttyS0. The host serial port parameters are set according to the emulated ones. COMn Use host serial port n filename - Write output to filename. No character can be read. filename - name pipe filename [remote_host]:remote_port[@[src_ip]:src_port] This implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen. [host]:port[,server][,nowait][,nodelay] Example to send tcp console to 192.168.0.2 port 4444 92.168.0.2:4444 Example to listen and wait on port 4444 for connection :4444,server Example to not wait and listen on ip 192.168.0.100 port 4444 192.168.0.100:4444,server,nowait host:port[,server][,nowait][,nodelay] The telnet protocol is used instead of raw tcp sockets. path[,server][,nowait] A unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections. Three button serial mouse. Configure the guest to use Microsoft protocol. mon:dev_string This is a special option to allow the monitor to be multiplexed onto another serial port. Braille device. This will use BrlAPI to display the braille output on a real or fake device. Adding Port Добавление порта Redirect virtual port to: Select redirect virtual port to: Перенаправить виртуальний порт в: Default По умолчанию vc (Virtual console) vc (Виртуальная консоль) pty (Pseudo TTY) pty (Псевдо TTY) none нет null (/dev/null) null (/dev/null) /dev/ /dev/ File Файл stdio Pipe COM UDP msmouse TCP Telnet Unix mon braille Additional Arguments: Дополнительные аргументы: ... Arguments Help: Справка по аргументам: &OK &OK &Cancel &Отмена Add_USB_Port_Window Manufacturer: Производитель: Product: Продукт: Speed: Скорость: bus.addr: Vendor ID: ID производителя: Product ID: ID продукта: Bus.Address: Adding USB Добавление USB Connecting Virtual QEMU/KVM USB Device Подключить виртуальное QEMU/KVM USB устройство Connecting virtual QEMU/KVM USB device Подключить виртуальное QEMU/KVM USB устройство Mouse Мышь Keyboard Клавиатура Tablet Wacom tablet Braille Connecting USB host device Connecting host USB device Подключить USB устройство хоста Show devices Показать устройства All host devices Все устройства хоста Not used in running VM Only not used in running VM Только не занятые в работающих ВМ Selected device Выбранное устройство Bus.Address: Update USB host list Обновить USB Host List Connecting Host USB Device Подключить USB устройство хоста Manufacturer: Производитель: Product: Продукт: bus.addr: Show Devices: Показать устройства: All Host Devices Все устройства хоста Only Not Used in Running VM Только не занятые в работающих ВМ Selected Device Выбранное устройство Speed: Скорость: Vendor ID: ID производителя: Product ID: ID продукта: Update USB Host List Обновить USB Host List &OK &OK &Cancel &Отмена Advanced_Settings_Window Select executable Выбрать программу All Files (*) Все файлы (*) Select or Create Log File Выберите или создайте лог файл Advanced Settings Дополнительные параметры Information in Info Tab Информация на вкладке Инфо Machine Details Описание машины Machine Name Имя машины Network Cards Сетевые карты Redirections Перенаправления TFTP Server Prefix Префикс TFTP сервера SMB Directory SMB директория Serial Port Последовательный порт Parallel Port Параллельный порт USB Ports USB порты ROM File ROM файл GDB Port GDB порт Computer Type Тип компьютера Machine Type Тип машины CPU Type Тип процессора Number of CPU Количество процессоров Acceleration Акселерация Boot Priority Порядок загрузки Video Card Видео карта Keyboard Layout Раскладка клавиатуры Fullscreen Mode Полноэкранный режим Windows 2K Hack Windows 2000 хак Enable ACPI Активировать ACPI Use Local Time Локальное время Check Boot Sector on FDD Бут сектор на FDD Start CPU at Startup Запускать CPU при старте Snapshot Mode Snapshot режим Use QEMU Log Включить лог QEMU No Reboot Без перезагрузки Use Linux Boot Загрузка ядра Linux Show Floppy Отображать Floppy Show CD-ROM Отображать CD-ROM Show HDD Отображать HDD Memory Size Объём памяти Use Sound Использовать звук ... ... &OK &OK &Cancel &Отмена Write log to Писать журнал в Print to STDOUT Писать в STDOUT Valid MAC Address (Especial For Each Network Card model) Правильный MAC адрес (Свой для каждой модели сетевой карты) Don't use default audio driver Не использовать аудио драйвер по умолчанию Start/Stop QEMU/KVM emulator Загрузка/остановка QEMU/KVM Execute Before Starting QEMU/KVM: Выполнять до старта QEMU/KVM: Execute After Stoping QEMU/KVM: Выполнять после остановки QEMU/KVM: QEMU/KVM Monitor Connection Type Тип подключения QEMU/KVM Monitor stdio (Does not work with Windows version of QEMU) stdio (Не работает в Windows версии QEMU) TCP Socket TCP сокет Hostname localhost 127.0.0.1 First port Начальный порт Network Redirections Сетевые перенаправления Serial Ports Последовательный порт VNC Parallel Ports Параллельный порт SPICE No Frame Без фрейма Alt Grab RTC TD Hack No Quit Отключить выход No Shutdown Не выключать Portrait Портрет Curses Show cursor Отображать курсор Initial graphical mode Начальный графический режим Start Date Начальная дата Flash Image Flash образ SD Image Образ SD Parallel Flash Image Образ Parallel Flash General Основные Other Другое AQEMU Logging Журнал AQEMU Save in File Сохранять в файл Print in STDOUT Писать в STDOUT Debug Messages Отладка Warning Messages Предупреждения Error Messages Ошибки Log Path: Путь к журналу: Write Log In Писать журнал в Log Messages Сообщения журнала VM Network Card MAC Address MAC адрес сетевой карты ВМ Random MAC Address Случайный MAC адрес Valid MAC Address (Individualized For Each Model of Network Card) Правильный MAC адрес (Свой для каждой модели сетевой карты) Host Sound System: Звуковая система хоста: alsa oss sdl wav none QEMU Segment MAC Address (52:54:00:XX:XX:XX) MAC адрес из QEMU сегмента (52:54:00:XX:XX:XX) Recent CD-ROM Images Count Сколько последних CD-ROM образов запоминать Show Tab Info Отображать таб Инфо Use Not Default Audio Driver Не использовать аудио драйвер по умолчанию First VNC Port for Embedded Display Начальный VNC порт для встроенного дисплея All Files (*);;Scripts (*.sh) Все файлы (*);;Скрипты (*.sh) Installed Emulators Установленные эмуляторы Add Добавить Delete Удалить Edit Изменить Use Default По умолчанию Name Имя Path Путь File Format: Save Format: Формат файла: Original (PPM) Оригинальный (PPM) JPEG Jpeg PNG Jpeg Quality: Качество Jpeg: Shared screenshot folder Shared Folder to Save All Screenshots Общий каталог для скриншотов Folder Path: Путь к папке: Invalid Value! Недопустимое значение! Shared Folder for Screenshots is Not Exists! Общий каталог для скриншотов не найден! Error! Ошибка! Not Select Default QEMU Emulator! Не выбран QEMU эмуляторов по умолчанию! Not Select Default KVM Emulator! Не выбран KVM эмуляторов по умолчанию! Select Folder for Screenshots Выберите папку для скриншотов Screenshot Settings Настройки скриншотов Advanced Дополнительно Other Settings Другие настройки Show Inside Tab Info Screenshot in Save Mode В сохранённом режиме показывать внутри таба Инфо скриншот Show QEMU/KVM Arguments Показать аргументы QEMU/KVM Emulator Type Тип эмулятора Emulator Version Версия эмулятора Find All Emulators Поиск эмуляторов Add CD/DVD Device Добавить CD/DVD утсройство Enter Device Name. Sample: /dev/cdrom Введите имя устройства. Например: /dev/cdrom Additional CD/DVD Devices Дополнительные CD/DVD устройства Shared screenshot folder doesn't exist! Общий каталог для скриншотов не найден! Yes Да Cannot find any emulators installed on your OS! Please add them manually! Не могу найти эмуляторы в этой системе! Вы должны добавить их самостоятельно! Enter Device Name. Example: /dev/cdrom Введите имя устройства. Например: /dev/cdrom Default QEMU Emulator isn't selected! Не выбран QEMU эмулятор используемый по умолчанию! Default KVM Emulator isn't selected! Не выбран KVM эмулятор используемый по умолчанию! Cannot save emulator "%1"! Невозможно сохранить эмулятор "%1"! No Нет Choose screenshot folder Выберите каталог для скриншотов Type and version Тип и версия Use default По умолчанию qemu-img path Путь к qemu-img pa esd Start and Stop QEMU/KVM Загрузка и остановка QEMU/KVM Execute Before Start QEMU/KVM: Выполнять до старта QEMU/KVM: Execute After Stop QEMU/KVM: Выполнять после остановки QEMU/KVM: Recent Floppy Images Count Сколько последних Floppy образов запоминать Boot_Device_Window Floppy A Floppy B CD-ROM Hard Drive Network 1 Network 2 Network 3 Network 4 Boot settings Параметры загрузки 1 Enable interactive boot &menu Включить интерактивное &меню загрузки &OK &OK &Cancel &Отмена Convert_HDD_Image_Window Convert HDD Image Конвертировать образ HDD File Name is Empty! Имя файла пустое! Please Enter Correct File Name for You HDD Image! Пожалуйста введите корректное имя для вашего образа! Error! Ошибка! Con&vert Кон&вертировать &Cancel &Отмена Cannot Locate Input File! Не могу найти входной файл! Select Base HDD Image File Выберите базовый образ HDD Save Out HDD Image File Сохранить выходной образ HDD Information: Информация: Please Wait. Converting HDD Image... Пожалуйста подождите. Конвертирование образа HDD... Cancel Отмена All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.qcow2 *.wmdk) Image Format: %1 Allocated Disk Space: %2 %3 Формат образа: %1 Занимает на диске: %2 %3 Virtual Size: %1 %2 Cluster Size: %3 Виртуальный объём: %1 %2 Размер кластера: %3 Please Enter Correct HDD Image filename! Пожалуйста введите корректное имя для вашего образа! Cannot get a valid format for current HDD image! Не могу получить информацию о формате этого образа! Conversion completed sucessfuly! Конвертация завершена успешно! Conversion complete sucess! Конвертация завершена успешно! Cannot convert image! Details: %1 Невозможно конвертировать образ! Подробее: %1 Input image Входной образ File name: Имя файла: Image Format: none Allocated Disk Space: 0 Формат: нет Занимает на диске: 0 Virtual Size: 0 Cluster Size: 0 Виртуальный объём: 0 Размер кластера: 0 Output image Выходной образ Format: Формат: QCOW format options Опции формата QCOW Com&press image С&жимать образ &Encrypt image &Шифровать образ Copy_VM_Window Error! Ошибка! This VM Name is Already Used! Это имя ВМ уже используется! Copy VM Копирование ВМ New VM Name: Имя новой ВМ: Copy Disk Images Копировать образы дисков Copy Floppy Images Копировать Floppy образы Copy Hard Drive Images Копировать образы жёских дисков &OK &OK &Cancel &Отмена Create_HDD_Image_Window Create HDD Image Создать образ HDD qcow2 cloop vmdk qcow cow raw KB КБ MB МБ GB ГБ Browse... Обзор... Error! Ошибка! Invalid image size! Объём образа некорректен! Base Image File doesn't Exists! Файл базового образа не найден! Image was Not Created! Образ не создан! QEMU-IMG Supported formats Поддерживаемые QEMU-IMG форматы &Format: &Формат: &Size: &Размер: &Help... &Помощь... New Image &File Name: Имя но&вого образа: Additional features Дополнительные возможности Use &Base HDD Image Использовать &базовый образ HDD C&reate Со&здать &Cancel &Отмена Select Base HDD Image File Выберите базовый образ HDD Create HDD Image File Создать образ HDD Image File Name is Empty! Имя образа пустое! Image Size Invalid! Объём образа некорректен! Base Image File Not Exists! Файл базового образа не найден! Image Not Created! Образ не создан! raw Raw disk image format. This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux. qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots. qcow Old QEMU image format. Left for compatibility. cow User Mode Linux Copy On Write image format. Used to be the only growable image format in QEMU. It is supported only for compatibility with previous versions. It does not work on win32. vmdk VMware 3 and 4 compatible image format. cloop Linux Compressed Loop image, useful only to reuse directly compressed CD-ROM images present for example in the Knoppix CD-ROMs. Image Must be &Encrypted (QCOW Format Only) &Шифровать образ (Только QCOW формат) All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.qcow2 *.wmdk) F&ormat Ф&ормат Create_Template_Window Create Template Создать шаблон New VM Template Name: Имя нового шаблона ВМ: Virtual machine file Файл виртуальной машины Save Floppy and CD-ROM Settings Сохранять параметры Floppy и CD-ROM Save Hard Disks Size or Format Settings Сохранять объём и формат жёстких дисков Save Network Settings Сохранять настройки сети C&reate Со&здать &Cancel &Отмена Warning! Внимание! Template Name is Empty! Имя шаблона пустое! VM File Not Exists! Файл ВМ не найден! Error! Ошибка! Cannot Load VM! Не могу загрузить ВМ! Cannot Create Template! Не могу создать шаблон! Open VM File Открыть ВМ файл AQEMU VM Files (*.aqemu) AQEMU ВМ файлы (*.aqemu) Select Template Folder Выберите папку для шаблона VM file doesn't exist! Файл не найден! Cannot Locate Template Folder! Каталог шаблонов не найден! Replace Переписать Your template name is already used! Do you want replace previous template? Такое имя для шаблона уже используется! Переписать предыдущий шаблон? You Name For Template in Not Unique! Replace Previous Template? Ваше имя для шаблона не уникально! Переписать предыдущий шаблон? Use default folder for new template Использовать стандартную папку для шаблонов Other folder for new template: Другой каталог для шаблонов: Virtual machine file: Файл виртуальной машины: Save Ports (USB/Serial/Parallel) Сохранять порты (USB/Serial/Parallel) Creating Options Опции генерации New VM template name Имя нового шаблона ВМ Files Файлы Delete_VM_Files_Window Screenshot Скриншот Floppy A Floppy B CD-ROM HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) ROM File ROM файл MTDBlock File MTDBlock файл SD Card File Образ SD карты PFlash File PFlash образ Kernel bzImage bzImage файл ядра Kernel Initrd Файл initrd Serial Port Redirection Перенаправления последовательного порта Parallel Port Redirection Перенаправления параллельного порта Storage Device Устройства хранения Confirm Delete Подтвердите удаление Delete " Удалить " " VM and Selected Files? " ВМ и выбранные файлы? An error occurred while deleting files During removal errors occurred В процессе удаления произошли ошибки This Files Not Deleted: Эти файлы не были удалены: Please Check Permissions! Пожалуйста проверьте права на доступ к файлам! Delete VM and Files Удалить ВМ и файлы Show only: Показывать только: &Hard drive images &Образы жёстких дисков &All VM files &Все файлы ВМ Delete Удалить Device name Имя устройства Path Путь &Delete selected &Удалить выбранное &Delete all selected &Удалить всё выбранное &Cancel &Отмена Device_Manager_Widget Devices List: Список устройств: Floppy 1 Floppy 2 CD-ROM HDA HDB HDC HDD Device Manager Widget Add Floppy Добавить Floppy Add CD/DVD-ROM Добавить CD/DVD-ROM Add HDD Добавить HDD Format HDD Форматировать HDD Delete Удалить List Mode В виде списка Icon Mode В виде значков Delete? Удалить? Delete Device? Удалить устройство? Properties Свойства Format? Форматировать? Format Virtual Hard Disk? Форматировать виртуальный жёсткий диск? Quick Format Быстрое форматирование CD/DVD-ROM HDA (First Master) HDB (First Slave) HDC (Second Master) HDD (Second Slave) Error! Ошибка! Incorrect Device! Неправильное устройство! Information: Информация: Add Devices Добавить устройства Manage Devices Управление устройствами View Mode Способ отображения Information Информация Type: Host Device Тип: реальное устройство Type: Image Тип: образ On Disk Size: Объём на диске: Mb Мб KB КБ MB МБ Image Virtual Size: Виртуальный объём образа: Image On Disk Size: Объём образа на диске: Warning! Внимание! Maximum Floppy Disk Count is 2 Maximum Floppy's Disk Count is 2 Максимальное количество Floppy дисков 2 Maximum CD-ROM Disk Count is 1 Максимальное количество CD-ROM дисков 1 Maximum Hard Disk Count is 4 excluding CD-ROM Maximum Hard Disk Count is 4 Without CD-ROM Максимальное количество жёстких дисков 4 (без CD-ROM) Complete! Готово! Cannot Format! Не могу форматировать! Type: Storage Device Тип: Запоминающее устройство Add Storage Device Добавить запоминающее устройство Device List: Список устройств: Add Device Добавить устройство Kb Кб Edit_Emulator_Version_Window Edit Emulator Version Редактировать версию эмулятора &Available Versions: &Доступные версии: &OK &OK &Cancel &Отмена %1 (Located in %2) %1 (Находится в %2) QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Emulator_Control_Window Save Screenshot As... Сохранить Скриншот Как... Open Device or Image File Открыть устройство или файл образа Emulator Control Connect Подключить Disconnect Отключить Send Keys Нажать кнопку Ctrl+O 1 2 3 4 5 6 7 8 9 10 11 12 /dev/fd0 /dev/null Other... Другой... Eject Извлечь Update Device List Обновить список устройств /dev/cdrom All Devices Все устройства Enter You Keys as ctrl-alt-delete or alt-f2 Вводите ваши клавиши так ctrl-alt-delete или alt-f2 &Other Keys... &Другие кнопки... &VM &ВМ Send &Keys Нажать &кнопки Ctrl-Alt-&F# Ctrl-Alt-&F# &Help &Помощь &Connect &Подключить Floppy &B Floppy &B &CD-ROM &CD-ROM &USB &USB Floppy &A Floppy &A Save Screens&hot Сохранить скрин&шот &Save VM Со&хранить ВМ &Load VM &Загрузить ВМ &Pause VM Приост&ановить ВМ &Quit &Выход Save VM S&tate... Сохранить состоя&ние ВМ... Load VM St&ate... Загрузить состоян&ие ВМ... &Reset VM &Перезагрузить ВМ Power &Off В&ыключить &Commit &Сбросить данные на диск Ctrl-Alt-&Delete Ctrl-Alt-&Delete &About Emulator Control... &О Emulator Control... QEMU/KVM &Monitor QEMU/KVM &Монитор About Emulator Control... О Emulator Control... Emulator Control is a Tool for Managing QEMU in Runtime. Emulator Control это примочка для управления QEMU во время выполнения. Ctrl-Alt-Backspace Ctrl-Alt-Backspace null (/dev/null) null (/dev/null) stdio (Standard In Out) stdio (Стандартный ввод вывод) /dev/ttyS0 /dev/ttyS0 Error! Ошибка! Cannot Get USB Information From System! Не могу получить информацию о USB из системы! All Files (*) Все файлы (*) Selected VM is running now. Shutdown anyway? Эта ВМ работает! Всё равно выключить? Are you sure? Вы уверены? Are you sure to shutdown VM "%1"? Выключить ВМ "%1"? Are you sure to reboot VM "%1"? Перезагрузить ВМ "%1"? Cannot Find USB Device! Не могу найти USB устройства! Disconnect USB Отключить USB Enter You Bus.Address VM USB Value Введите Ваше значение Bus.Address ВМ USB By Bus.Address Через Bus.Address All Files (*);;Images Files (*.img *.ima) Все файлы (*);;Файлы образов (*.img *.ima) All Files (*);;Images Files (*.iso) Все файлы (*);;Файлы образов (*.iso) Enter your key combinations such as ctrl-alt-del or alt-f2 Вводите ваши клавиши так ctrl-alt-delete или alt-f2 To enable window mode press Ctrl-Alt-F Do you want to show this message again? Для перехода в оконный режим нажмите Ctrl-Alt-F Показывать это сообщение снова? Warning! Внимание! Manage Snapshots Управление снапшотами In This VM Floppy 2 Not Found! В этой ВМ нет Floppy 2! Recent Files Последние файлы d (Emulator Control) View Вид Display Scaling Масштабировать дисплей Fullscreen Mode Полноэкранный режим Show Status Bar Показать статус бар Power Off This VM? Выключить эту ВМ? This VM is Running, Off Power? Эта ВМ работает, выключить её? Ctrl+Alt+F Reinit VNC Перезапусть VNC You Sure? Вы уверены? Shutdown VM "%1"? Выключить ВМ "%1"? Reboot VM "%1"? Перезагрузить ВМ "%1"? [Paused] [Пауза] [Saved] [Сохранена] Fullscreen mode Полноэкранный режим For switch to window mode press Ctrl-Alt-F Show this message again? Для перехода в оконный режим нажмите Ctrl-Alt-F Показывать это сообщение снова? In This VM Floppy 1 Not Found! В этой ВМ нет Floppy 1! In This VM CD-ROM Not Found! В этой ВМ нет CD-ROM! a Emulator_Options_Window Error! Ошибка! Path is Empty! Путь пуст! Warning Внимание Path is Not Exists! Путь не существует! Select Directory Выберите папку This Enulator Name is Already Used! Это имя эмулятора уже используется! Cannot get emulator info! For file: %1 Не могу получить информацию о эмуляторе! Файл: %1 Cannot get version for emulator! Не могу получить версию эмулятора! QEMU 0.9.0 Path doesn't exist! Путь не существует! Enulator Name is Empty! Имя эмулятора пустое! This emulator name is already used! Это имя эмулятора уже используется! QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Select QEMU Binary File Выберите бинарник QEMU All Files (*) Все файлы (*) Emulator Settings Параметры эмулятора Name (Emulator identifier) Name (This be identifier for it emulator): Имя (Оно будет идентификатором для этого эмулятора) Find emulator Искать эмулятор Emulator type: Тип эмулятора: QEMU KVM (For adding QEMU-KVM, add them one by one) (Чтобы добавить QEMU-KVM, добавляйте эмуляторы по одному) Path to Emutators Binary Directory: Путь к папке с бинарниками эмулятора: ... ... &Find Emulators &Искать эмуляторы Emulators Executables Files Исполняемые файлы эмулятора QEMU/KVM System QEMU/KVM система Binary File Name Имя бинарника Emulator Version Версия эмулятора Use saved available emulator options (Recomended to choose it again after emulator updating) Use saved emulator available options (Recomend refind after update emulator) Использовать сохранённое описание возможностей эмулятора (Рекомендуется после обновления эмулятора выполнить заново поиск) Always check available emulator options while starting AQEMU (Slow) Check available emulator options always start AQEMU (Slowly) Проверять доступные возможности эмулятора при каждом запуске AQEMU (Медленно) Always check emulator version while starting AQEMU Check emulator version always start AQEMU Проверять версию эмулятора при каждом запуске AQEMU Set version and available options manually Указать версию эмулятора вручную &OK &OK &Cancel &Отмена Error_Log_Window Error # Ошибка # QEMU Error Log Лог ошибок QEMU Error Window Show Mode Режим отображения окна ошибок Normal Mode Нормальный режим Do Not Show Until Next VM Started Не показывать по следующего запуска ВМ Do Not Show Until Next AQEMU Started Не показывать по следующего запуска AQEMU Never show it (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Do Not Show Forever (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Вообще не показывать (Для просмотра выберите ВМ ->Показать окно ошибок QEMU/KVM) &OK &OK &Clear Errors List &Очистить список ошибок First_Start_Wizard Warning! Внимание! Finded QEMU in %1, version: %2 Найден QEMU в %1, версия: %2 Finded KVM in %1, version: %2 Найден KVM в %1, версия: %2 &Finish &Конец &Next &Далее Error! Ошибка! Are you sure? You can configure these options later in Settings windows. Вы уверены? Позже Вы сможете настроить это в окне настроек. QEMU Found in "%1", version: %2 Найден QEMU в %1, версия: %2 KVM Found in "%1", version: %2 Найден KVM в %1, версия: %2 Select QEMU emulator directory Выберите каталог с QEMU эмулятором Cannot Create New Folder! Не могу создать новую папку! Error Ошибка Emulator binary files not exists! Please click Back and set it manual. Бинарные файлы эмулятора не найдены! Пожалуйста нажмите "Назад" и укажите путь вручную. Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path Не могу найти qemu-img.exe! Вы можете указать путь к файлу в Файл-Дополнительные настройки-Дополнительно-Путь к qemu-img Welcome Добро пожаловать General Settings Настройки AQEMU Find Emulators Поиск эмуляторов Setup Emulator Установка эмулятора Finish Готово &Back На&зад &Cancel &Отмена Welcome to AQEMU settings wizard! This wizard will help you to choose options that need to AQEMU work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. Добро пожаловать в мастер настройки AQEMU! Этот мастер поможет вам установить параметры, необходимые для правильной работы AQEMU. Нажмите кнопку Далее, чтобы перейти к следующей странице мастера, или кнопку Назад для возврата на предыдущую страницу. Here you can choose interface language Вы можете выбрать язык интерфейса AQEMU Please select folder for AQEMU virtual machines Укажите папку где будут храниться настройки виртуальных машин If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will displayed in virtual machine as icons, like in file manager window. Если включён режим "менеджер устройств", то устройства хранения данных (Floppy, CD/DVD, HDD) будут отображаться в виртуальной машине в виде значков, как в окне файлового менеджера. Use Device manager Использовать Менеджер устройств New experimental work mode is accessible in AQEMU. In this mode QEMU/KVM display will displayed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this function you must mark the "Include Emdedded VNC Display in Main Window" flag. В AQEMU доступен новый экспериментальный режим работы, при котором экран QEMU/KVM отображаться в окне AQEMU. Пока это не совсем стабильная и завершённая функция, поэтому при её работе возможны проблемы. Для её включения отметьте "Встроить VNC дисплей в главное окно". Include Emdedded VNC Display in Main Window Встроить VNC дисплей в главное окно To work correctly, AQEMU must know your emulators' arrangement and its' versions. For searching push the "Search" button. If automatic search can't find out your emulators, you must configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Для правильной работы AQEMU должна знать расположение установленных в вашей системе эмуляторов и их версии. Для поиска нажмите "Поиск". Если автоматический поиск не сможет определить какие эмуляторы установлены, то вам придётся настроить AQEMU в ручную позже. Для этого необходимо открыть "Файл->Дополнительные настройки". Congratulations! The Wizard has got all necessary settings for configuring AQEMU. Push "Finish" button to save your settings. Поздравляю! Мастер получил всё необходимые сведения для настройки AQEMU. Нажмите "Готово" для сохранения настроек. First Start Wizard Мастер первого запуска English QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X You sure? You Can Configure These Options In The Settings Window. Вы уверены? Позже Вы сможете настроить это в окне настроек. &Search &Поиск S&kip Search П&ропустить поиск Set Folder for you VM's Выберите папку для ваших ВМ Emulator Version Modified By User Версия эмулятора изменена пользователем Welcome to AQEMU settings wizard! This wizard will help you to choose options AQEMU needed to work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. Добро пожаловать в мастер настройки AQEMU! Этот мастер поможет вам установить параметры, необходимые для правильной работы AQEMU. Нажмите кнопку Далее, чтобы перейти к следующей странице мастера, или кнопку Назад для возврата на предыдущую страницу. If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will be displayed in virtual machine as icons, like in file manager window. Если включён режим "менеджер устройств", то устройства хранения данных (Floppy, CD/DVD, HDD) будут отображаться в виртуальной машине в виде значков, как в окне файлового менеджера. New experimental work mode is available in AQEMU. In this mode QEMU/KVM display will be showed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this feature you must mark the "Include Emdedded VNC Display in Main Window" flag. В AQEMU доступен новый экспериментальный режим работы, при котором экран QEMU/KVM отображаться в окне AQEMU. Пока это не совсем стабильная и завершённая функция, поэтому при её работе возможны проблемы. Для её включения отметьте "Встроить VNC дисплей в главное окно". For correct working AQEMU must know your emulators locations and versions. For searching push the "Search" button. If automatic search can't find out your emulators, you should configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Для правильной работы AQEMU должна знать расположение установленных в вашей системе эмуляторов и их версии. Для поиска нажмите "Поиск". Если автоматический поиск не сможет определить какие эмуляторы установлены, то вам придётся настроить AQEMU в ручную позже. Для этого необходимо открыть "Файл->Дополнительные настройки". Set &Versions Manualy Установить версию &вручную Search... Поиск... Cancel Отмена Cannot get emulator info! For file: %1 Не могу получить информацию о эмуляторе! Файл: %1 MachineView Error! Ошибка! Cannot Reinit VNC Connection! Невозможно перезапустить VNC подключение! Main_Window Device Manager Менеджер устройств HDD CD/DVD/Floppy 2048 MB 2048 МБ All Files (*) Все файлы (*) Open Floppy Image File Открыть файл образа Floppy Open CD\DVD-ROM Image File Открыть файл образа CD\DVD-ROM Open HDD Image File Открыть файл образа HDD AQEMU Info Инфо General Основные Number of CP&U: Количество CP&U: 1 2 4 8 16 32 64 128 255 Machine &Type: &Тип машины: &CPU Type: Тип про&цессора: Default По умолчанию ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr Floppy CD-ROM Network Сеть Disabled Отключена Enabled Включена Full Полная &Video Card: &Видео карта: B&oot Priority: Порядок &загрузки: Machine &Name: &Имя машины: Options Опции Start in full screen Запускать в полно экранном режиме &Fullscreen Mode Полно&экранный режим Use &Local Time Использовать &локальное время Enable ACP&I Активировать ACP&I Snapshot &Mode &Snapshot режим Memory Size: Количество памяти: Select Disk Image Выбрать образ диска ... ... Floppy 1: Floppy 1: Floppy 2: Floppy 2: CD/DVD-ROM: CD/DVD-ROM: Other Другое &Help &Помощь About AQEMU О программе AQEMU F1 About &Qt О &Qt &Exit Вы&ход Ctrl+Q &Wizard... &Мастер... Ctrl+W &Add New VM &Добавить ВМ Ctrl+N &Create HDD Image &Создать образ HDD Con&vert HDD Image &Конвертировать образ HDD Ctrl+S Ctrl+D Ctrl+P Ctrl+R &File &Файл 1 MB &VM &ВМ &New VM &Новая ВМ &About AQEMU &О программе AQEMU AQEMU &Settings &Настройки AQEMU &Start &Старт Sto&p Сто&п &Pause Па&уза &Reset &Перезагрузить &Load VM From File &Загрузить из файла ВМ Save As &Template Сохранить как &шаблон Convert HDD Image Конвертировать образ HDD Select SMB Directory Выберите SMB папку Protocol Протокол Host Port Хост порт Guest IP Гостевой IP Guest Port Гостевой порт &TCP &TCP &UDP &UDP to &guest IP в &гостевой IP T&FTP Server Prefix: Префикс T&FTP сервера: Allow &SMB Access to: &SMB директория: Network Cards Сетевые карты Use &Network Испо&льзовать сеть &Initrd File: Файл &initrd: &Apply &Применить Ports Порты Sa&ve Сохра&нить Error! Ошибка! Cannot Save This VM to File! Невозможно сохранить эту ВМ в файл! Start CP&U at Startup Запускать CP&U при старте Warning! Внимание! VM be Changed. Discard Changes? ВМ была изменена. Сбросить изменения? VM be Changed. Save Changes? ВМ была изменена. Сохранить изменения? Cannot Delete VM XML File! Невозможно удалить ВМ XML файл! VM Name Имя ВМ New Virtual Machine Name: Имя новой виртуальной машины: You New VM Name is Empty! VM Not Created! Твоё имя для новой ВМ пустое! ВМ не создана! Open AQEMU VM File Открыть AQEMU ВМ файл Cannot Save Settings! Невозможно сохранить настройки! Close AQEMU? Закрыть AQEMU? One or More VM is Running! Terminate All Running VM and Close AQEMU? Одна или больше ВМ работает! Выключить все работающие ВМ и закрыть AQEMU? Delete? Удалить? Change Icon Сменить иконку VM Name is Empty! Имя ВМ пустое! Computer Type: Тип компьютера: Machine State: Состояние машины: Running Работает Power Off Выключена Pause Пауза Saved Сохранена Machine Type: Тип машины: CPU Type: Тип процессора: Boot Priority: Порядок загрузки: Memory size < 1! Using default value: 256 MB Memory size < 1! Using efault value: 256 MB Объём памяти < 1! Используется значение по умолчанию: 256Мб Use Sound: Использовать звук: Yes Да No Нет Use Snapshot Mode: Snapshot режим: Use Network: Использовать сеть: Card: Карта: TUN/TAP Interface TUN/TAP интерфейс TCP Socket TCP сокет VLAN VLAN No Connection Не подключена VNC Port: VNC порт: SPICE Port: SPICE порт: RTC TD Hack: No Shutdown: Не выключать: Start Date: Начальная дата: Curses: Show Cursor: Отображать курсор: Initial Graphical Mode: Начальный графический режим: Current VM was changed. Discard all changes? ВМ была изменена. Сбросить изменения? Current VM was changed. Save all changes? ВМ была изменена. Сохранить изменения? %1 Image "%2" doesn't Exist! Continue Without this Image? %1 образ "%2" не найден! Продолжить без него? Your New VM Name is Empty! VM isn't Created! Твоё имя для новой ВМ пустое! ВМ не создана! Are you sure? Вы уверены? Information Информация New Template Created! Новый шаблон создан! ROM File (For EtherBoot) ROM файл (для EtherBoot) Select Kernel Image File Выберите файл образа ядра Select InitRD File Выберите файл InitRD Select ROM File Выберите ROM файл &Discard Changes &Отменить изменения QEMU running in snapshot mode. VM can not be saved in this mode. QEMU работает в snapshot режиме. ВМ не может быть сохранена в этом режиме. Set real time clock to local time. Default=utc Set the real time clock to local time. Default=utc Переводит часы ВМ на локальное время. По умолчанию=utc No VM Found! Нет виртуальных машин! None Нет Create New HDD Создать новый HDD Mb Мб Machine Details Описание машины Number of CPU: Количество процессоров: Acceleration: Акселерация: Video Card: Видео карта: Keyboard Layout: Раскладка клавиатуры: Fullscreen Mode: Полноэкранный режим: Windows 2000 Hack: Windows 2000 хак: Enable ACPI: Активировать ACPI: Use Local Time: Использовать локальное время: Check Boot Sector on FDD: Проверять загрузочный сектор на FDD: Start CPU at Startup: Запускать CPU при старте: Storage Devices Устройства хранения Exit instead of rebooting При выходе не перезагружать ВМ No Reboot Не перезагружать Audio Cards Звуковые карты CD/DVD-ROM &Redirections Перенаправлени&я Memory Size Объём памяти No Reboot: Без перезагрузки: No Devices Found Устройства не найдены User mode network stack UDP multicast socket Redirection Перенаправление Use Redirections: Использовать перенаправления: TFTP Server Prefix: Префикс TFTP сервера: SMB Folder: Директория SMB: ROM File: ROM файл: Use Linux Boot: Загрузка ядра Linux: Kernel bzImage: bzImage файл ядра: Initrd File: Файл initrd: Kernel ComLine: Команды для ядра: Redirection List is Empty! Please Disable Redirections! Список перенаправлений пуст! Пожалуйста выключите перенаправления! Gravis &Ultrasound GF1 Gravis &Ultrasound GF1 &ENSONIQ ES1370 &ENSONIQ ES1370 &Yamaha YM3812 &Yamaha YM3812 PC Speaker AC97 (Intel 82801AA) AC97 (Intel 82801AA) Sound &Blaster 16 Sound &Blaster 16 Optional Images Опциональные образы SecureDigital Card Image Образ SecureDigital карты Parallel Flash Image Parallel Flash образ On-Board Flash Image On-Board Flash образ Advanced Дополнительно KVM Shadow Memory Disable KVM kernel mode PIT Отключить KVM режима ядра PIT Disable KVM kernel mode PIC/IOAPIC/LAPIC Отключить KVM режима ядра PIC/IOAPIC/LAPIC Rotate Graphical Output 90 Deg Left (Only PXA LCD) Повернуть графический вывод на 90 градусов влево (Только для PXA LCD) Use Ctrl-Alt-Shift to Grab Mouse (Default is Ctrl-Alt) Use Ctrl-Alt-Shift to Grab Mouse (Default Ctrl-Alt) Использовать Ctrl-Alt-Shift для граба мыши (По умолчанию Ctrl-Alt) Initial Graphical Mode Начальный графический режим Width Ширина Height Высота Depth Глубина цвета 24 Select On-Board Flash Image Выберите образ On-Board Flash Select SecureDigital Card Image Выберите образ SecureDigital карты Select Parallel Flash Image Выберите образ Parallel Flash HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) Additional Options Дополнительные опции On-Board Flash Image: On-Board Flash образ: SD Card Image: Образ SD карты: Parallel Flash Image: Образ Parallel Flash: No Frame: Без фрейма: Alt Grab: No Quit: Отключить выход: Portrait Mode: Портретный режим: vc SPICE Machine Name: Имя машины: pty none нет null dev host_port file файл stdio pipe udp tcp telnet unix Additional Settings Дополнительные параметры Protocol: Протокол: &Host Port Порт &хоста Guest Por&t Порт &гостя VM File " Файл ВМ " " is Read Only! Check Permissions! " доступен только для чтения Проверьте права доступа! All Files (*);;Images Files (*.img *.ima) Все файлы (*);;Файлы образов (*.img *.ima) All Files (*);;Images Files (*.iso) Все файлы (*);;Файлы образов (*.iso) Warning Внимание VM With This Name Already Exists! ВМ с этим именем уже существует! To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press "Ignore" button for hide this message in future. Add This Record? Для создания сокета с номером порта < 1024 в Unix Вам нужно запустить AQEMU с правами root! Нажмите "Игнорировать" чтобы скрыть это предупреждение в будущем. Добавить эту запись? UNIX Domain Socket Path Select x509 Certificate Folder Выберите каталог сертификатов x509 Select x509 Verify Certificate Folder Выберите каталог сертификатов x509 для верификации VNC Use TLS Использовать TLS VNC Display Number Номер экрана VNC x509verify Folder Path Путь к каталогу x509verify x509 Folder Path Путь к каталогу x509 Activate VNC Использовать VNC Boot Linux Kernel Загрузка ядра Linux Use &Linux Boot Включить загрузку ядра &Linux Append Command Line: Параметры для ядра: Kernel bzImage File: bzImage файл ядра: Copy Копировать Manage Snapshots Управление снапшотами This Function Work Only On Running VM! Эта функция работает только на включённой ВМ! For Connection Use Port 5900 + VNC Display Number Для подключения используйте порт 5900 + номер экрана VNC UNIX Domain Socket Use Password (You must set a password when you starting the VM) Use Password (You must set a password when you start the VM) Установить пароль (Вы должны будете ввести пароль при запуске ВМ) Show Emulator Control Показать Emulator Control Cannot Change Icon When VM in Save State. Невозможно сменить иконку когда ВМ в сохранённом состоянии. en-us (default) en-us (по умолчанию) dd.MM.yyyy HH:mm:ss Start Date (Day.Month.Year Hour:Minute:Second) Дата запуска (День.Месяц.Год Час.Минута.Секунда) Delete " Удалить " " VM? " ВМ? KVM Options Опции KVM Use If Possible Использовать если возможно No Shutdown Не выключать Check Floppy Disk boot signature in VM BIOS Check Boot Signature For Floppy Disks in VM BIOS BIOS ВМ будет проверять загрузочную сигнатуру на Floppy дисках Check Boot Secto&r on FDD Проверять бут секто&р на FDD Fix Windows 2000 install Bug Fix Installation Windows 2000 Bug Windows 2000 хак (Обходит ошибку инсталляции Windows 2000) Curses (Use a curses/ncurses Interface Instead of SDL) Curses (Использовать curses/ncurses интерфейс вместо SDL) RTC TD Hack (Fix Time Drift in Windows ACPI HAL) RTC TD Hack (Обходит проблемы с Windows ACPI HAL) Hardware Virtualization Аппаратная виртуализация Disable KVM kernel mode PIT interrupt reinjection Nesting (Support for Running a VM Inside other VM (AMD Only) Nesting (Support for Running a VM Inside the VM (AMD Only) Nesting (Поддержка запуска ВМ внутри ВМ (Только для AMD) Disabled (Disable the usage of the QEMU Accelerator module KQEMU) Отключена (Выключает использование модуля KQEMU в QEMU) Use If Possible (AQEMU don't check loaded KQEMU module) Использовать если возможно (AQEMU не будет проверять загружен ли KQEMU модуль) Enabled (AQEMU check loaded KQEMU module, if no loaded QEMU not started) Включена (AQEMU проверяет загружен ли модуль KQEMU, если не загружен QEMU не запустится) Full (Enable full virtualization mode for best performances) Полная (Включает режим полной виртуализации для максимального быстродействия) KQEMU Acceleration Module KQEMU модуль акселерации Warning: Globaly Activated Embedded Display in Emulator Control Window. To Disable This Function in Current VM choose "Don't Use Embedded VNC Display" Warning: Globaly Activated Embedded Display in Emulator Control Window. For Disable This Function in Current VM Set "No Use Embedded VNC Display" Внимание: Поддержка встроенного дисплея в Emulator Control включена глобально. Для того чтобы отключить эту функцию для текущей ВМ отметьте: "Не использовать встроенный VNC дисплей" Don't use embedded VNC Display No Use Embedded VNC Display Не использовать встроенный VNC дисплей &Windows 2K Hack &Windows 2000 хак General &Settings Основные &настройки &Advanced Settings &Дополнительные настройки Start &First Run Wizard Run &First Run Wizard Запустить &мастер первого запуска You must create a new virtual machine Вы должны создать новую виртуальную машину Emulator Type: Тип эмулятора: Emulator Version: Версия эмулятора: Primary Master (HDA): Primary Slave (HDB): Secondary Master (HDC): Secondary Slave (HDD): Display Дисплей Emulator Control Already Show Emulator Control уже отображается QEMU/KVM Arguments: Аргументы QEMU/KVM: QEMU KVM &Keyboard Layout Расклад&ка клавиатуры QEMU/KVM Window Options Опции окна QEMU/KVM Show QEMU/KVM Window Without a Frame and Window Decorations Отобразить QEMU/KVM без фрейма окна Disable QEMU/KVM Window Close Capability Отключить возможность закрытия QEMU/KVM окна Show Cursor (It Works Only in QEMU/KVM SDL Window) Show Cursor (This Work Only in QEMU/KVM SDL Window) Показывать курсор (Это работает только в окне QEMU/KVM с использованием SDL) Additional QEMU/KVM &Arguments Дополнительные &аргументы QEMU/KVM Send Only User Arguments Without AQEMU Arguments Обрабатывать только аргументы пользователя игнорируя аргументы AQEMU Use Emulator Binary File in "Additional QEMU/KVM Arguments" Использовать бинарный файл указанный в дополнительных аргументах Show QEMU/KVM &Arguments Показать &аргументы QEMU/KVM Show QEMU/KVM Error Log Window Показать окно ошибок QEMU/KVM QEMU/KVM Arguments Аргументы QEMU/KVM This VM uses an emulator "%1" which is not installed in the system. The work of the VM is not possible! Эта ВМ использует эмулятор "%1" который не установлен в системе. Работа этой ВМ не возможна! You Sure? Вы уверены? Shutdown VM "%1"? Выключить ВМ "%1"? Reboot VM "%1"? Перезагрузить ВМ "%1"? Image Format: Формат образа: Allocated Disk Space: Занимает на диске: Virtual Size: Объём: Cluster Size: Кластер: Image Format: none Allocated Disk Space: 0 Формат: нет Занимает на диске: 0 Virtual Size: 0 Cluster Size: 0 Виртуальный объём: 0 Размер кластера: 0 Item %1 Элемент %1 NIC User Channel TAP Socket Multicast Socket VDE Dump Unknown Type Item Неизвестный тип элемента This Function Works Only On Running VM! Эта функция работает только на включённой ВМ! Cannot convert "%1" to size suffix! Valid suffixes are: MB, GB Невозможно преобразовать "%1" в суффикс объёма! Доступные варианты: MB, GB Memory size < 0! Valid size is 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Your memory size %1 MB > %2 MB - all free RAM on this system! To set this value, check "Remove limitation on maximum amount of memory". Ваш объём памяти %1 MB > %2 MB — всей свободной памяти в системе! Для установки этого объёма активируйте: "Убрать ограничение на максимальный объём памяти". Free memory on this system is less than 32 MB! Объём свободной памяти в системе меньше 32 Мб! All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.qcow2 *.wmdk) CPU count value is not valid digit! Количество процессоров не является корректной цифрой! Network Settings Настройки сети Create Создать Format Форматировать Network Settings GUI Type: Тин интерфейса настройки: Basic Базовый AQEMU VM (*.aqemu) AQEMU ВМ (*.aqemu) Native Nativ Нативный bzImage Initrd ROM File ROM файл On-Board Flash SecureDigital Card SecureDigital карта Parallel Flash %1 Image "%2" Not Exist! Continue Without It Image? %1 образ "%2" не найден! Продолжить без него? Cannot Open File! Не могу открыть файл! Create Shell Script Создать Shell скрипт VNC x509 Folder Каталог VNC x509 VNC x509verify Folder Каталог VNC x509verify Save VM to Script Сохранить ВМ в скрипт Shell Script Files (*.sh);;All Files (*) Скрипты (*.sh);;Все файлы (*) Memory size < 1! Use default value: 256 MB Объём памяти < 1! Используется значение по умолчанию: 256Мб Memory size > all free memory on this system! Объём памяти > всей свободной памяти в системе! Serial Port %1: Последовательный порт %1: Parallel Port %1: Параллельный порт %1: USB Port %1: USB порт %1: Type: none Size: 0 Тип: нет Объём: 0 Type: Host Device Тип: реальное устройство Type: Image Size: 0 Тип: образ Объём: 0 Byte Байт Kb Кб Gb Гб Type: Image Size: Тип: образ Объём: No boot device found! Нет загрузочного устройства! Error Ошибка Cannot convert "%1" to memory size! Невозможно преобразовать "%1" в объём памяти! Cannot convert "%1" to integer! Невозможно преобразовать "%1" в число! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Невозможно преобразовать "%1" в суффикс объёма! Доступные варианты: MB, GB Memory size < 0! Valid size 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Your memory size %1 MB > %2 MB - all free RAM on this system! For set it size, check "Remove limitation on maximum amount of memory". Ваш объём памяти %1 MB > %2 MB — всей свободной памяти в системе! Для установки этого объёма активируйте: "Убрать ограничение на максимальный объём памяти". Current memory size more of all host memory! Use the maximum available size. Текущий объём памяти больше чем вся свободная память в системе! Используйте максимально доступное значение. Free memory: %1 MB Доступно памяти: %1 MB Free memory on this system is low 32 MB! Объём свободной памяти в системе меньше 32 Мб! CPU count value not valid digit! Количество процессоров не является корректной цифрой! CPU count > max CPU count for this emulator! Количество процессоров > максимально для этого эмулятора! For Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press button "Ignore" for hide this message in future. Add This Record? Для создания сокета с номером порта < 1024 в Unix Вам нужно запустить AQEMU с правами root! Нажмите "Игнорировать" чтобы скрыть это предупреждение в будущем. Добавить эту запись? Updating free memory information Update information about free memory Обновить информацию о объёме свободной памяти Free memory: 768 MB Доступно памяти: 768 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Убрать ограничение на максимальный объём памяти Open Открыть All settings Все параметры Browse Обзор Floppy A Floppy B A&dd item &Добавить элемент D&elete item &Удалить элемент &Clear list &Очистить список Redirect item settings Параметры перенаправления Other network settings Другие сетевые настройки Enable KVM Включить KVM Disabled (Disable KQEMU Accelerator module) Disabled (Disable the usage of the QEMU Accelerator module KQEMU) Отключена (Выключает использование модуля KQEMU в QEMU) Use If Possible (AQEMU won't check loaded KQEMU module) Use If Possible (AQEMU don't check loaded KQEMU module) Использовать если возможно (AQEMU не будет проверять загружен ли KQEMU модуль) Enabled (AQEMU checks loaded KQEMU module. If it isn't loaded QEMU won't started) Enabled (AQEMU check loaded KQEMU module, if no loaded QEMU not started) Включена (AQEMU будет проверять загружен ли модуль KQEMU) Full (Enable full virtualization mode for best performances) Полная (Включает режим полной виртуализации для максимального быстродействия) General settings Основные параметры Security settings Настройки безопасности &Delete VM &Удалить ВМ Delete VM And Files Удалить ВМ и файлы Monitor_Window QEMU/KVM Monitor QEMU/KVM Монитор &Clear &Очистить &Run &Выполнить Com&mand: Ко&манда: info network info snapshots info usb info usbhost info cpus info history info irq info pic info pci info tlb info mem info jit info kqemu info profile info capture info mice info vnc Change font Выбрать шрифт Font Шрифт info version info block info registers Network_Widget Unknown Type Item Неизвестный тип элемента Warning! Внимание! Maximum Network Cards Count is 8. Максимальное количество сетевых карт 8. New Item Новый элемент AQEMU Network Widget Items List: Список элементов: &Add &Добавить &Delete &Удалить Connection Type Тип подключения nic user channel tap socket vde dump ? ? Model Модель macaddr aa:bb:cc:dd:ee Generate New MAC Сгенерировать новый MAC vlan name hostname port:dev fd ifname script ... ... downscript listen connect mcast sock port group mode file len 64Kb (default) 64Kb (по умолчанию) 128Kb 512Kb 1Mb 5Mb 10Mb y n sndbuf vnet_hdr on off vhost vhostfd hostfwd guestfwd -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no '-net' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. -net user[,vlan=n][,hostname=name][,name=name] Use the user mode network stack which requires no administrator privilege to run. 'hostname=name' can be used to specify the client hostname reported by the builtin DHCP server. -net channel,port:dev Forward 'user' TCP connection to port port to character device dev -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] Connect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. 'fd'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is '/etc/qemu-ifup' and the default network deconfigure script is '/etc/qemu-ifdown'. Use 'script=no' or 'downscript=no' to disable script execution. -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] Connect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If 'listen' is specified, QEMU waits for incoming connections on port (host is optional). 'connect' is used to connect to another QEMU instance using the 'listen' option. 'fd'=h specifies an already opened TCP socket. -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] Create a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. NOTES: 1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). 2. mcast support is compatible with User Mode Linux (argument 'ethN=mcast'), see http://user-mode-linux.sf.net. 3. Use 'fd=h' to specify an already opened UDP multicast socket. -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] Connect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled. -net dump[,vlan=n][,file=f][,len=n] dump traffic on vlan 'n' to file 'f' (max n bytes per packet) Select script Выберите скрипт All Files (*);;Scripts (*.sh) Все файлы (*);;Скрипты (*.sh) Boot file All Files (*) Все файлы (*) SMB directory SMB директория Error! Ошибка! Incorrect MAC address! Не правильный MAC адрес! Invalid name! Valid characters are:: a-z A-Z 0-9 _ - Неправильное имя! Доступны только: a-z A-Z 0-9 _ - Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ - Неправильное имя! Доступны только: a-z A-Z 0-9 _ - %1 File "%2" doesn't Exist! Continue Without this File? %1 образ "%2" не найден! Продолжить без него? MAC Address Incorrect! Не правильный MAC адрес! Name Invalid! Valid Characters Are Only: a-z A-Z 0-9 _ - Неправильное имя! Доступны только: a-z A-Z 0-9 _ - Hostname Invalid! Valid Characters Are Only: a-z A-Z 0-9 _ - Неправильное имя хоста! Доступны только: a-z A-Z 0-9 _ - %1 File "%2" Not Exist! Continue Without It File? %1 файл "%2" не найден! Продолжить без него? addr vectors net host restrict dhcpstart dns tftp bootfile smb smbserver Old_Network_Widget Error Ошибка Network Card #% Not Valid! Сетевая карта #% не правильно сконфигурирована! Card Карта Warning! Внимание! Maximum Network Cards Count is 8. Максимальное количество сетевых карт 8. Network Cards List is Empty! Список сетевых карт пуст! Cannot Delete Network Card! Невозможно удалить сетевую карту! Select script Выберите скрипт All Files (*);;Scripts (*.sh) Все файлы (*);;Скрипты (*.sh) Error! Ошибка! IP Address in Card IP адрес в карте Invalid! некорректен! MAC Address in Card MAC адрес в карте In Card В карте Old Network Widget Cards List: Список карт: Add Добавить &Delete &Удалить Network Card Model: Модель сетевой карты: Connection &Mode: Тип по&дключения: Use the user mode network stack Open a TUN/TAP interface Открыть TUN/TAP интерфейс Use an already open TUN/TAP interface Использовать уже открытый TUN/TAP интерфейс Open a listening TCP socket Use an already open TCP socket Connect to listening TCP socket Create shared VLAN via UDP multicast socket Use an already open UDP multicast socket No connection Не подключено VM Hostname: ВМ hostname: &IP Address: &IP адрес: &MAC Address: &MAC адрес: Generate New MAC Сгенерировать новый MAC &VLAN: &VLAN: &Port: &Порт: &FD: &TUN/TAP Script: &TUN/TAP скрипт: ... ... &Interface Name: &Имя интерфейса: TUN/TAP Script File "%1" Not Exists! Continue Without It File? TUN/TAP скрипт "%1" не найден! Продолжить без него? If the value is 0 then it will not be used Если значение 0 - то этот параметр не будет использоваться Ports_Tab_Widget Ports Порты COM (Serial Port) COM (Последовательный порт) LPT (Parallel Port) LPT (Параллельный порт) USB Port USB порт Keyboard Клавиатура Mouse Мышь Tablet Wacom Tablet Braille Virtual QEMU/KVM Device: %1 Виртуальное QEMU/KVM устройство: %1 %1 %2 (Vendor ID: %3 Product ID: %4) %1 %2 (ID производителя: %3 ID продукта: %4) %1 %2 (BusAddr: %3) Warning Внимание You can add no more than 4 COM ports Вы не можете добавить больше 4 COM портов You can add no more than 3 LPT ports Вы не можете добавить больше 3 LPT портов Device not select! Устройство не выбрано! Device doesn't selected! Устройство не выбрано! Add port Добавить порт Serial (COM) Последовательный (COM порт) Parallel (LPT) Параллельный (LPT порт) USB USB порт Edit Port Изменить порт Delete Port Удалить порт Ports List Список портов Port type Тип порта Details Описание Properties_Window Image Size: Размер образа: Format: Формат: Virtual Size: Виртуальный объём: On Disk Size: Размер на диске: Cluster Size: Размер кластера: Open Floppy Image File Открыть файл образа Floppy Image file doesn't exist! Файл образа не найден! Open CD\DVD-ROM Image File Открыть файл образа CD\DVD-ROM Open HDD Image File Открыть файл образа HDD Properties Свойства Floppy Floppy ... ... CD/DVD-ROM CD/DVD-ROM Hard Disk Жёсткий диск &Format Exist &Форматировать текущий Create &New Создать &новый Path to Image: Путь к образу: Information Информация Device Name: Имя устройства: Up&date Info Об&новить Инфо &OK &OK &Cancel &Отмена Mb Мб All Files (*);;Images Files (*.img *.ima) Все файлы (*);;Файлы образов (*.img *.ima) All Files (*);;Images Files (*.iso) Все файлы (*);;Файлы образов (*.iso) All Files (*);;Images Files (*.img *.qcow *.wmdk) Все файлы (*);;Файлы образов (*.img *.qcow *.wmdk) Warning Внимание Image File Not Exists! Файл образа не найден! Kb Кб Browse Обзор Advanced settings Дополнительные параметры QObject Error! Ошибка! Error Ошибка Cannot create directory for log file! Path: %1 Не могу создать каталог для файла журнала Путь %1 This is a first AQEMU start and program running in root mode. In some Linux distributions you may have problems with configuration saving. Close AQEMU? Это первый запуск AQEMU и программа работает с правами пользователя root. В некоторых дистрибутивах Linux это может привести к невозможности сохранить настройки! Закрыть AQEMU? AQEMU will search for emulators after uptating. Please wait. После обновления AQEMU нужно провести поиск эмуляторов. Пожалуйста подождите. Cannot Find any Emulators installed in your OS! You should choose them In Advanced Settings! Не могу найти эмуляторы в этой системе! Вы должны указать их в окне "Дополнительные настройки"! Please Select AQEMU Data Folder: Пожалуйста выберите директорию данных AQEMU: AQEMU won't Work If Data Folder isn't Selected! AQEMU не может работать если каталог данных не выбран! AQEMU VM Folder doesn't Exists! Create It? Папка для ВМ AQEMU не существует! Создать её? Cannot Start qemu-img! Image not Created! Не могу запустить qemu-img! Образ не создан! qemu-img Cannot Finish! Image not Created! qemu-img не завершена! Образ не создан! Cannot Create Image! Information: Невозможно создать образ! Информация: Complete! Готово! QEMU-IMG is Create HDD Image. Additional Information: QEMU-IMG создал образ HDD. Дополнительная информация: Warning! Внимание! QEMU-IMG is Return non Standard Message!. Additional Information: QEMU-IMG возвратил нестандартное сообщение! Дополнительная информация: Default По умолчанию Standard PC Стандартный PC ISA-only PC Только ISA Integrator/CP (ARM926EJ-S) Integrator/CP (ARM1026EJ-S) Versatile/PB (ARM926EJ-S) Versatile/AB (ARM926EJ-S) RealView (ARM926EJ-S) R4k platform Malta Core LV Heathrow PowerMAC Mac99 PowerMAC PowerPC PREP SPARCstation 2 (Sun4c) SPARCstation 5 (Sun4m) SPARCstation 10 (Sun4m) SPARCstation 20 (Sun4m) SPARCserver 600MP (Sun4m) SPARCserver 1000 (Sun4d) SPARCcenter 2000 (Sun4d) NE2000 PCI NE2000 ISA i82551 i82557B i82559ER PCnet32 PCI RTL8139 SMC91C111 MCF FEC Lance No Video Card Нет видео карты Standard VGA Стандартная VGA Sun4m Akita PDA (PXA270) Spitz PDA (PXA270) Borzoi PDA (PXA270) Terrier PDA (PXA270) Palm Tungsten (OMAP310) Stellaris LM3S811EVB Stellaris LM3S6965EVB Gumstix Connex (PXA255) Gumstix Verdex (PXA270) Mainstone II (PXA27x) Bare ETRAX FS board Acer Pica 61 MIPS MIPSsim platform R4000 VR5432 5Kc 5Kf 20Kc MIPS64R2-generic qemu64 Athlon Ref405ep Taihu Fatal error. It's recommended to close AQEMU Это фатальная ошибка. Рекомендуется закрыть AQEMU Cannot Start qemu-img! Image isn't Created! Не могу запустить qemu-img! Образ не создан! qemu-img Cannot Finish! Image isn't Created! qemu-img не завершена! Образ не создан! QEMU-IMG is Creates HDD Image. Additional Information: QEMU-IMG создал образ HDD. Дополнительная информация: QEMU-IMG is Returned non Standard Message!. Additional Information: QEMU-IMG возвратил нестандартное сообщение! Дополнительная информация: Kb Кб Mb Мб Gb Гб AQEMU Config File is Read Only! Check Permissions For File: Файл конфигурации AQEMU доступен только для чтения! Проверьте права доступа для файла: AQEMU VM Directory is Read Only! Check Permissions For: Каталог ВМ AQEMU доступен только для чтения! Проверьте права доступа для: AQEMU VM Template Directory is Read Only! Check Permissions For: Каталог шаблонов ВМ AQEMU доступен только для чтения! Проверьте права доступа для: AQEMU Log File is Read Only! Check Permissions For File: Файл лога AQEMU доступен только для чтения! Проверьте права доступа для файла: This Fatal Error. Recomend Close AQEMU. Это фатальная ошибка. Рекомендуется закрыть AQEMU. This is a first start AQEMU and program running in root mode. In some Linux distributions it can lead to inability to save configuration! Close AQEMU? This is a First Start AQEMU and Program Running in root Mode. In Some Linux Distributions That Can Lead to Inability to Save Configuration! Это первый запуск AQEMU и программа работает с правами пользователя root. В некоторых дистрибутивах Linux это может привести к невозможности сохранить настройки! Закрыть AQEMU? Cannot Locate AQEMU Data Folder! You Should Select This Folder in Next Window! Cannot Find AQEMU Data! AQEMU VM Folder Not Exists! Create It? Папка для ВМ AQEMU не существует! Создать её? shix card r2d-plus board Cirrus CLGD 5446 VMWare Video Card VMWare видео карта None Video Card Без видео карты Core Duo Atom N270 e1000 virtio Phenom Core 2 Duo QEMU 64Bit ARM 1136 R2 Siemens SX1 (OMAP310) V1 Siemens SX1 (OMAP310) V2 Nokia N800 Nokia N810 Marvell 88w8618 / MusicPal Tosa PDA (PXA255) AXIS devboard 88 fseth MCF5206EVB Arnewsh 5206 Dummy board MIPS Malta Core LV MIPS Magnum mips r4k platform MIPS R4000 MIPS VR5432 MIPS 5Kc MIPS 5Kf MIPS 20Kc MIPS MIPS64R2-generic e500v1 Mac99 based PowerMAC PowerPC PREP platform ref405ep taihu bamboo mpc8544ds SH7750R SH7751R SH7785 SPARCstation Voyager (Sun4m) SPARCstation LX (Sun4m) SPARCstation 4 (Sun4m) SPARCClassic (Sun4m) SPARCbook (Sun4m) StdVGA (VESA 2.0) Cannot Find Emulators in This System! You Most Set It In Advanced Settings! Не могу найти эмуляторы в этой системе! Вы должны указать их в окне "Дополнительные настройки"! Cannot Find Emulators in This System! Please Add Emulators Manual! Не могу найти эмуляторы в этой системе! Вы должны добавить их самостоятельно! Sun4u Sun4v Sun4v (Niagara) Spartan 3ADSP1800 xilinx-ethlite AQEMU emulators search AQEMU поиск эмуляторов After the update AQEMU should perform a search of emulators. Please wait. После обновления AQEMU нужно провести поиск эмуляторов. Пожалуйста подождите. Cannot Load AQEMU Icon Theme! File "%1" Not Found! Не могу загрузить тему значков для AQEMU! Файл "%1" не найден! SMP_Settings_Window SMP Settings Параметры SMP If any on the values can be omitted. Missing (zero) values will be computed. Любые значения могут не указываться. Не указанные (нулевые) будут вычислены эмулятором. CPUs count Количество CPU Sockets count Количество сокетов Cores per socket Ядер на сокет Threads per core Потоков на ядро Max number of hotpluggable CPUs Количество подключаемых по горячему CPU &OK &OK &Cancel &Отмена Select_Icon_Window &OK &OK &Cancel &Отмена &Browse... Обзо&р... Your Icon Path: You Icon Path: Путь к твоей иконке: Error! Ошибка! Icon File Not Exists! Файл иконки не существует! Icon file doesn't exist! Файл образа не найден! Select Icon File: Выберите файл иконки: PNG Images (*.png) PNG Изображения (*.png) Change Icon Сменить иконку Other &Icon Другая &иконка Select Icon For Your VM Выберите значок для вашей ВМ Default &Other System Icon Стандартная &другая система Default &Linux Icon Стандартная &Linux Default &Windows Icon Стандартная &Windows &All OS Icons From AQEMU Collection &Все остальные значки из набора AQEMU Settings_Window Set your VM folder Set Folder for you VM's Выберите папку для ваших ВМ Information Информация Language be set after restart AQEMU Show this message in future? Изменения вступят в силу после перезапуска AQEMU Показывать это сообщение в дальнейшем? General Settings Основные настройки ... ... English Default VM Template: Шаблон ВМ по умолчанию: Warning Внимание AQEMU VM Templates Not Found! AQEMU ВМ шаблоны не найдены! New template was created! Новый шаблон создан! Language will set after restarting AQEMU Show this message in future? Изменения вступят в силу после перезапуска AQEMU Показывать это сообщение в дальнейшем? AQEMU VM folder doesn't exist! Do you want to create it? Папка для ВМ AQEMU не существует! Создать её? Error! Ошибка! Invalid Value! Недопустимое значение! Folder for AQEMU VM is Not Exists! Create It? Каталог для AQEMU ВМ не найден! Создать его? Cannot Create New Folder! Не могу создать новую папку! New Template Created! Новый шаблон создан! AQEMU VM Folder: Каталог ВМ AQEMU: Use Device Manager by Default Использовать режим менеджера устройств Use Screenshot for OS Icon in Save Mode Использовать скриншот как иконку ОС в сохранённом режиме Create Template Создать шаблон Interface Language: Язык интерфейса: Emulator Control Show Mode Режим отображения Emulator Control Show In Separate Window Показывать в отдельном окне Show Window With Embedded Display Показывать в окне со встроенным дисплеем Show In AQEMU Main Window Показывать в главном окне AQEMU Show In AQEMU Main Window With Embedded Display Показывать в главном окне AQEMU со встроенным дисплеем Don't show No Show Не показывать &OK &OK &Cancel &Отмена Support for this feature is not complete! If there is no picture, click "View->Reinit VNC" Show This Message Again? Реализация этой функции не завершена! Если вы не видите изображения, то нажмите "Вид->Перезапустить VNC". Показывать это предупреждение снова? Icons theme be set after restart AQEMU Show this message in future? Другая темя значков будет применена при следующем запуске AQEMU Показывать это сообщение снова? Basic Settings Основные настройки View Внешний вид GUI Icons Theme: Тема значков: Crystal SVG (KDE 3) Oxygen (KDE 4) VM Icon Size: VM Icons Size: Размер значков ВМ: 16x16 24x24 32x32 48x48 64x64 Snapshot_Properties_Window Warning Внимание Snapshot name is empty! Имя для снапшота пустое! Name for Snapshot is Empty! Имя для снапшота пустое! Snapshot Properties Свойства снапшота &OK &OK &Cancel &Отмена Snapshot Description: Описание снапшота: Snapshot Name: Имя снапшота: Snapshots_Window ID: ID: Size: Размер: Date: Дата: VM Clock: Часы ВМ: Warning! Внимание! Before Select Snapshot For Delete! Сначало выберите снапшот для удаления! Please select snapshot that you want to delete! Сначало выберите снапшот для удаления! Warning Внимание Delete Current Snapshot? Удалить текущий снапшот? Please select snapshot that you want to start! Сначало выберите снапшот для запуска! This VM is Running now! Stop VM and Load Snapshot? Эта ВМ работает! Остановить ВМ и загрузить снапшот? Before Select Snapshot For Start! Сначало выберите снапшот для запуска! This VM Running! Stop VM and Load Snapshot? Эта ВМ работает! Остановить ВМ и загрузить снапшот? Error! Ошибка! You must add HDD image in QCOW2 format if you want to use snapshots! For use snapshots, you most add HDD image in QCOW2 format! Для использования снапшотов, Вы должны добавить образ жёсткого диска в формате QCOW2! Manage VM Snapshots Управление снапшотами ВМ Update Info Обновить инфо OK OK Create Создать Delete Удалить Start Запустить Properties Свойства Snapshot List: Список снапшотов: For Use Snapshot, You Most Add Hard Drive to This VM! Чтобы использовать снапшоты, Вам нужно добавить жёсткий диск в эту ВМ! Description: Описание: VM_Wizard_Window &Next &Далее &Finish &Конец 2048 MB 2048 МБ New Virtual Machine Wizard Мастер создания виртуальной машины Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. Введите имя для вашей новой виртуальной машины. Это имя будет просто обозначением для вашей конфигурации настроек. Select the amount of base memory (RAM) in megabytes for virtual machine allocating. Select the amount of base memory (RAM) in megabytes to be allocated to the virtual machine. Выберите количество памяти (RAM) в мегабайтах, которое будет выделено виртуальной машине. 1 MB 1 МБ N&ew... Но&вый... E&xisting... Су&ществующий... &Back На&зад &Cancel &Отмена VM Name and CPU Type Имя ВМ и тип процессора Memory Память Virtual Hard Disk Виртуальный жёсткий диск Finish! Конец! Memory size < 0! Valid size is 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Current memory size bigger than all existing host memory! Using maximum available size. Текущий объём памяти больше чем вся свободная память в системе! Используйте максимально доступное значение. Free memory on this system is lower than 32 MB! Объём свободной памяти в системе меньше 32 Мб! Select HDD Image Выберите образ HDD All Files (*) Все файлы (*) Please Select VM Hardware Template Выберите шаблон ВМ оборудования No Selected Не выбрано Release Date: Дата выпуска: 1985-1990 1990-1995 1995-2000 2000-2005 C&omputer Type: Тип &компьютера: OS Type: Тип ОС: VM Hardware Template Шаблон оборудования ВМ Wizard Mode Режим работы мастера Virtual Machine Name Имя виртуальной машины Hard Disk Size Объём жёсткого диска Network Сеть &Custom &Выборочный Create new virtual machine with additional configuration options. Создать новую виртуальную машину используя дополнительные возможности настройки. Create new virtual machine with most common devices and configuration options. Создать новую виртуальную машину используя лишь основные возможности настройки. &Typical (For Beginners) О&бычный (Для начинающих) Select AQEMU Configuration Mode Выберите режим настройки AQEMU Select network type using on your new virtual machine. Select network type using on you new virtual machine. Выберите тип сети используемый для твоей новой ВМ. Disk Size in GB (Gigabytes): Размер диска в GB (Гигабайты): Enter your new virtual machine hard disk capacity. Enter you new virtual machine hard disk capacity. Введите объём для нового виртуального жёсткого диска. Error! Ошибка! Cannot Create New VM from Template! Невозможно создать новую ВМ из шаблона! Generate VM Генерировать ВМ Template Шаблон Cannot Find QEMU System ID! Не могу найти QEMU System ID! Template For VM Шаблон для ВМ Warning Внимание This VM Name is Already Exists! ВМ с таким именем уже существует! Emulator Type Тип эмулятора Please Add One Or More Emulators in Advanced Settings! Пожалуйста добавьте один или больше эмуляторов в окне "Дополнительные настройки"! Cannot Find Emulator System ID! Не могу найти ID эмулятора! <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the steps that are necessary to create a new virtual machine for AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Этот мастер проведёт Вас через несколько шагов в конце которых будет создана новая виртуальная машина AQEMU.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Используйте кнопку <span style=" font-weight:600;">Далее</span> для перехода на новую страницу мастера и кнопку <span style=" font-weight:600;">Назад</span> для возвращения на предыдущую.</p></body></html> Select Emulator Type For Using In New Virtual Machine Select Emulator Type For Use In New Virtual Machine Выберите тип эмулятора для новой виртуальной машины QEMU KVM VM Name: Имя ВМ: CPU Type: Тип процессора: Select a CPU type for your new virtual machine: Select a CPU type for you new virtual machine: Выберите тип CPU для вашей новой виртуальной машины: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Выберите образ жесткого диска который будет использован как загрузочный для этой виртуальной машины. Вы можете создать новый образ нажав на кнопку <span style=" font-weight:600;">Новый</span> или выбрать существующий образ нажав на кнопку <span style=" font-weight:600;">Существующий</span>.</p></body></html> Boot Hard Disk (Primary Master) Загрузочный жёсткий диск (Primary Master) &User Mode Network Connection (Uses the user mode network stack) &User Mode Network Connection (Use the user mode network stack) N&o Network (No net cards installed on VM) &Без сети <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если Вы считаете, что всё сделано правильно нажмите кнопку <span style=" font-weight:600;">Конец</span> Как только Вы нажмёте эту кнопку виртуальная машина будет создана.</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">По окончанию Вы сможете изменить эти и другие настройки в любое время.</p></body></html> Error Ошибка Cannot convert "%1" to memory size! Невозможно преобразовать "%1" в объём памяти! Cannot convert "%1" to integer! Невозможно преобразовать "%1" в число! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Невозможно преобразовать "%1" в суффикс объёма! Доступные варианты: MB, GB Memory size < 0! Valid size 1 or more Объём памяти < 0! Допустимы значение от 1 и выше Your memory size %1 MB > %2 MB - all free RAM on this system! To setup this value, check "Remove limitation on maximum amount of memory". Your memory size %1 MB > %2 MB - all free RAM on this system! For set it size, check "Remove limitation on maximum amount of memory". Ваш объём памяти %1 MB > %2 MB — всей свободной памяти в системе! Для установки этого объёма активируйте: "Убрать ограничение на максимальный объём памяти". Current memory size more of all host memory! Use the maximum available size. Текущий объём памяти больше чем вся свободная память в системе! Используйте максимально доступное значение. Free memory: %1 MB Доступно памяти: %1 MB Free memory on this system is low 32 MB! Объём свободной памяти в системе меньше 32 Мб! 2005-2010 Update free memory information Update information about free memory Обновить информацию о объёме свободной памяти Free memory: 768 MB Доступно памяти: 768 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Убрать ограничение на максимальный объём памяти VNC_Password_Window VNC Password VNC Пароль Password: Пароль: Confirm: Подтверждение: OK OK Warning Внимание Password is Empty! Пароль пуст! Password Not Confirmed! Введённые пароли различны! Virtual_Machine Version Invalid! Версия неверна! Version of this AQEMU VM File isn't 0.5 Load This File anyway? Эта версия файла AQEMU ВМ не 0.5 Загрузить этот файл? ROM File doesn't Exists! Can't run emulator! ROM файл не найден! QEMU не может работать! KVM Kernel Module Not Loaded! To load this Module, Enter in Terminal with root privileges: "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? Модуль ядра KVM не загружен! Для загрузки KVM модуля введите от пользователя "root" в терминале: "modprobe kvm-intel". Или при использовании процессора AMD: "modprobe kvm-amd". Игнорировать эту ошибку? KQEMU Kernel Module Not Loaded! This Module Provides Acceleration for QEMU. For Loading KQEMU Module Type: "modprobe kqemu" in root mode Or Disable Acceleration in "Other->Hardware Virtualization" tab. Модуль ядра KQEMU не загружен! Этот модуль обеспечивает акселерацию для QEMU. Для загрузки KQEMU модуля введите в режиме root: "modprobe kqemu" Или отключите акселерацию на вкладке "Другое->Аппаратная виртуализация". Saving... Сохранение... Saving Virtual Machine. Please wait... Сохранение виртуальной машины. Пожалуйста подождите... You must add HDD image in QCOW2 format to save virtual machine! Чтобы сохранить виртуальную машину, вы должны добавить образ HDD в формате QCOW2! QEMU Error Log Лог ошибок QEMU Error! Ошибка! ROM File Not Exists! QEMU Cannot Run! ROM файл не найден! QEMU не может работать! This Version on AQEMU VM File no 0.5 Load This File? Эта версия файла AQEMU ВМ не 0.5 Загрузить этот файл? Loading... Загрузка... Loading Virtual Machine. Please wait... Загрузка виртуальной машины. Пожалуйста подождите... Additional Arguments is Empty! Cannot Use User Arguments! Дополнительные аргументы отсутствуют! Поэтому их невозможно использовать! Warning! Внимание! USB Device %1 %2 (%3 %4) Not Found! USB устройство %1 %2 (%3 %4) не найдено! KVM Kernel Module Not Loaded! For Loading KVM Module, Enter in Terminal by User "root": "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? Модуль ядра KVM не загружен! Для загрузки KVM модуля введите от пользователя "root" в терминале: "modprobe kvm-intel". Или при использовании процессора AMD: "modprobe kvm-amd". Игнорировать эту ошибку? KQEMU Kernel Module Not Loaded! This Module Provide Acceleration for QEMU. For Loading KQEMU Module Type In Root Mode: "modprobe kqemu" Or Disable Acceleration in Tab "Other->Hardware Virtualization". Модуль ядра KQEMU не загружен! Этот модуль обеспечивает акселерацию для QEMU. Для загрузки KQEMU модуля введите в режиме root: "modprobe kqemu" Или отключите акселерацию на вкладке "Другое->Аппаратная виртуализация". Cannot start emulator! Binary path is empty! Невозможно запустить эмулятор! Путь к бинарнику пуст! To save a virtual machine, you need to add HDD image in QCOW2 format! Чтобы сохранить виртуальную машину, вы должны добавить образ HDD в формате QCOW2! VncView Password required Требуется пароль Please enter the password for the remote desktop: Пожалуйста введите пароль от удалённого рабочего стола: aqemu-0.9.2/resources/translations/Ukrainian.ts000066400000000000000000014767061272330227200217030ustar00rootroot00000000000000 About_Window About AQEMU About <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.9.0 of 2016.04.20</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="https://github.com/tobimensch/aqemu">https://github.com/tobimensch/aqemu</a> <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, a { white-space: pre-wrap; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; color:#3C6E05} </style> </head> <body> <b> <p>AQEMU is Frontend for QEMU and KVM Emulators</p> <p>Version: 0.8.3 of 2011.07.27</p> <p>License: GNU GPL Version 2</p> <p>Author: Andrey Rijov (a.k.a. RDron)</p> <p>E-Mail: <a href="mailto:ANDron142@yandex.ru">ANDron142@yandex.ru</a></p> <p>Web Site: <a href="http://sourceforge.net/projects/aqemu/">http://sourceforge.net/projects/aqemu/</a></p> <p>Supported Emulators:<br>QEMU 0.9.0-0.14.1 and KVM 60-88-0.14.1</p> </b> </body> </html> Thanks To <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html> License <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p></td></tr></table></body></html> Links <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L';"></p></td></tr></table></body></html> Update Links Form Internet <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> OK <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br>Pavel Serebryakov (aka Kronoph) - Correcting English translation <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team <b>Developers:</b> <br>Andrey Rijov (aka RDron) - Author <br><br><b>Contributors:</b> <br>Max Brazhnikov - FreeBSD Port <br>Boris Savelev - ALTLinux Package <br>Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help <br>Ignace Mouzannar - Debian Package <br>Michael Brandstetter - Improvement Scripts <br>Robert Warnke - German AQEMU Documentation Translation <br>Michael Schmöller (aka schmoemi) - German Translation <br>Guillem Rieu - Patch for Network Redirections <br>Karol Krenski - IP Address RegExp Fix <br>Alexander Romanov (aka romale) - Testing, New Ideas and Other Help <br>Timothy Redaelli - Patch for CMake <br><br><b>Special thanks:</b> <br>Sergey Sinitsa (aka sin) <br>Grigory Pulyaev (aka Rodegast) <br>Alexander Saifulin (aka Ne01eX) <br>Mihail Parshin (aka Skeeper) <br>Garret Acott (aka gacott) <br>Damir Vafin (aka Denver-22) <br>Pavel Serebryakov (aka Kronoph) <br><br><b>Thanks all www.nclug.ru group for testing and suggestions for improvement.</b> <br><br><b>AQEMU used code from QtEMU and Krdc thanks all developers:</b> <br>Tim Jansen (tim@tjansen.de) <br>Urs Wolfer (uwolfer@kde.org) <br>Ben Klopfenstein (benklop@gmail.com) <br><br><b>Icons:</b> <br>Crystal SVG - Icon Theme From Everaldo.com Design Studio <br>Oxygen - Icon Theme From Oxygen Team Error! Unable to save the file %1: %2. Cannot Find AQEMU Links File! Download failed: %1. Add_New_Device_Window New Storage Device &File &Interface ide scsi sd mtd floppy pflash virtio Index (For IDE, Floppy) Bus, Unit (For SCSI) &Media Disk CD-ROM Cac&he none writeback writethrough AIO threads native &Snapshot on off Boot Settings for -hdachs Option s&ecs &trans c&yls &heads &OK &Cancel Select your device All Files (*) Error! File does not exist! "Cyls" value is incorrect! "Heads" value is incorrect! "Secs" value is incorrect! "Trans" value is incorrect! Warning! Add_Port_Window Adding Port Redirect virtual port to: Select redirect virtual port to: Default vc (Virtual console) pty (Pseudo TTY) none null (/dev/null) /dev/ File stdio Pipe COM UDP msmouse TCP Telnet Unix mon braille Additional Arguments: ... Arguments Help: &OK &Cancel Open File All Files (*) Optionally width and height can be given in pixel with 800x600 It is also possible to specify width or height in characters: 80Cx24C [Linux only] Pseudo TTY (a new PTY is automatically allocated) No device is allocated. Void device [Unix only] standard input/output [Linux only] Use host tty, e.g. /dev/ttyS0. The host serial port parameters are set according to the emulated ones. COMn Use host serial port n filename - Write output to filename. No character can be read. filename - name pipe filename [remote_host]:remote_port[@[src_ip]:src_port] This implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen. [host]:port[,server][,nowait][,nodelay] Example to send tcp console to 192.168.0.2 port 4444 92.168.0.2:4444 Example to listen and wait on port 4444 for connection :4444,server Example to not wait and listen on ip 192.168.0.100 port 4444 192.168.0.100:4444,server,nowait host:port[,server][,nowait][,nodelay] The telnet protocol is used instead of raw tcp sockets. path[,server][,nowait] A unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections. Three button serial mouse. Configure the guest to use Microsoft protocol. mon:dev_string This is a special option to allow the monitor to be multiplexed onto another serial port. Braille device. This will use BrlAPI to display the braille output on a real or fake device. Add_USB_Port_Window Adding USB Connecting virtual QEMU/KVM USB device Mouse Keyboard Tablet Wacom tablet Braille Connecting USB host device Connecting host USB device Manufacturer: Product: bus.addr: Show devices All host devices Not used in running VM Only not used in running VM Selected device Speed: Bus.Address: Vendor ID: Product ID: Update USB host list &OK &Cancel Manufacturer: Product: Speed: bus.addr: Vendor ID: Product ID: Bus.Address: Advanced_Settings_Window Advanced Settings &OK &Cancel General Screenshot Settings File Format: Save Format: Original (PPM) JPEG Jpeg PNG Jpeg Quality: Shared screenshot folder Shared Folder to Save All Screenshots Folder Path: Installed Emulators Find All Emulators Add Delete Edit Use Default Name Type and version Path Use default Advanced AQEMU Logging Save in File Log Messages Debug Messages Warning Messages Error Messages Log Path: qemu-img path VM Network Card MAC Address Random MAC Address QEMU Segment MAC Address (52:54:00:XX:XX:XX) Host Sound System: alsa oss pa esd sdl wav none Other Other Settings Recent CD-ROM Images Count Recent Floppy Images Count First VNC Port for Embedded Display Additional CD/DVD Devices Information in Info Tab Show Tab Info Show Inside Tab Info Screenshot in Save Mode Show QEMU/KVM Arguments Machine Details Machine Name Emulator Type Emulator Version Computer Type Machine Type CPU Type Number of CPU Acceleration Boot Priority Write log to Print to STDOUT Valid MAC Address (Especial For Each Network Card model) Don't use default audio driver Start/Stop QEMU/KVM emulator Execute Before Starting QEMU/KVM: Execute After Stoping QEMU/KVM: QEMU/KVM Monitor Connection Type stdio (Does not work with Windows version of QEMU) TCP Socket Hostname localhost 127.0.0.1 First port Video Card Keyboard Layout Network Redirections Serial Ports VNC Parallel Ports SPICE Use Linux Boot RTC TD Hack No Shutdown Curses Show cursor Initial graphical mode Start Date ROM File Parallel Flash Image Memory Size Use Sound Fullscreen Mode Enable ACPI Use Local Time Start CPU at Startup Snapshot Mode No Reboot USB Ports Flash Image SD Image Show Floppy Show CD-ROM Show HDD Network Cards No Frame Alt Grab No Quit Portrait Windows 2K Hack Check Boot Sector on FDD Invalid Value! Shared screenshot folder doesn't exist! Select executable All Files (*);;Scripts (*.sh) Select or Create Log File All Files (*) Yes Cannot find any emulators installed on your OS! Please add them manually! Add CD/DVD Device Enter Device Name. Example: /dev/cdrom Enter Device Name. Sample: /dev/cdrom Default QEMU Emulator isn't selected! Default KVM Emulator isn't selected! Choose screenshot folder Error! Cannot save emulator "%1"! No Boot_Device_Window Boot settings 1 Enable interactive boot &menu &OK &Cancel Floppy A Floppy B CD-ROM Hard Drive Network 1 Network 2 Network 3 Network 4 Convert_HDD_Image_Window Convert HDD Image Input image File name: Image Format: none Allocated Disk Space: 0 Virtual Size: 0 Cluster Size: 0 Output image Format: QCOW format options Com&press image &Encrypt image Con&vert &Cancel Select Base HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Error! Cannot Locate Input File! Image Format: %1 Allocated Disk Space: %2 %3 Virtual Size: %1 %2 Cluster Size: %3 Save Out HDD Image File File Name is Empty! Please Enter Correct HDD Image filename! Conversion completed sucessfuly! Cannot get a valid format for current HDD image! Please Wait. Converting HDD Image... Cancel Information: Cannot convert image! Details: %1 Copy_VM_Window Copy VM New VM Name: Copy Disk Images Copy Floppy Images Copy Hard Drive Images &OK &Cancel Error! This VM Name is Already Used! Create_HDD_Image_Window Create HDD Image New Image &File Name: Browse... &Format: qcow2 qcow vmdk cow raw cloop &Help... &Size: KB MB GB Additional features Image Must be &Encrypted (QCOW Format Only) Use &Base HDD Image C&reate &Cancel F&ormat Select Base HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Create HDD Image File Error! Image File Name is Empty! Invalid image size! Base Image File doesn't Exists! Image was Not Created! QEMU-IMG Supported formats raw Raw disk image format. This format has the advantage of being simple and easily exportable to all other emulators. If your file system supports holes (for example in ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux. qcow2 QEMU image format, the most versatile format. Use it to have smaller images (useful if your filesystem does not supports holes, for example on Windows), optional AES encryption, zlib based compression and support of multiple VM snapshots. qcow Old QEMU image format. Left for compatibility. cow User Mode Linux Copy On Write image format. Used to be the only growable image format in QEMU. It is supported only for compatibility with previous versions. It does not work on win32. vmdk VMware 3 and 4 compatible image format. cloop Linux Compressed Loop image, useful only to reuse directly compressed CD-ROM images present for example in the Knoppix CD-ROMs. Create_Template_Window Create Template New VM template name Files Virtual machine file Use default folder for new template Other folder for new template: Creating Options Save Floppy and CD-ROM Settings Save Hard Disks Size or Format Settings Save Network Settings Save Ports (USB/Serial/Parallel) C&reate &Cancel Open VM File AQEMU VM Files (*.aqemu) Select Template Folder Warning! Template Name is Empty! VM file doesn't exist! Cannot Locate Template Folder! Error! Cannot Load VM! Cannot Create Template! Replace Your template name is already used! Do you want replace previous template? You Name For Template in Not Unique! Replace Previous Template? Delete_VM_Files_Window Delete VM and Files Show only: &Hard drive images &All VM files Delete Device name Path &Delete selected &Cancel Screenshot Floppy A Floppy B CD-ROM HDA (Primary Master) HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) ROM File MTDBlock File SD Card File PFlash File Kernel bzImage Kernel Initrd Serial Port Redirection Parallel Port Redirection Storage Device Confirm Delete Delete " " VM and Selected Files? An error occurred while deleting files During removal errors occurred This Files Not Deleted: Please Check Permissions! Device_Manager_Widget Device Manager Widget View Mode Icon Mode List Mode Manage Devices Properties Delete Format HDD Quick Format Add Devices Add Floppy Add CD/DVD-ROM Add HDD Add Storage Device Device List: Information: Add Device Type: Host Device Type: Image On Disk Size: KB MB Image Virtual Size: Image On Disk Size: Type: Storage Device Floppy 1 Floppy 2 Warning! Maximum Floppy Disk Count is 2 Maximum Floppy's Disk Count is 2 CD/DVD-ROM CD-ROM Maximum CD-ROM Disk Count is 1 HDA (First Master) HDA HDB (First Slave) HDB HDC (Second Master) HDC HDD (Second Slave) HDD Maximum Hard Disk Count is 4 excluding CD-ROM Maximum Hard Disk Count is 4 Without CD-ROM Delete? Delete Device? Error! Incorrect Device! Format? Format Virtual Hard Disk? Information Complete! Cannot Format! Edit_Emulator_Version_Window Edit Emulator Version &Available Versions: &OK &Cancel %1 (Located in %2) QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Emulator_Control_Window Emulator Control &Help &VM Send &Keys Ctrl-Alt-&F# &Connect Floppy &B Recent Files Floppy &A &USB Connect Disconnect &CD-ROM View Save Screens&hot &Save VM &Load VM Ctrl+O &Pause VM &Quit Save VM S&tate... Load VM St&ate... &Reset VM Power &Off &Commit Ctrl-Alt-&Delete 1 2 3 4 5 6 7 8 9 10 11 12 /dev/fd0 /dev/null Other... Eject Update Device List &About Emulator Control... /dev/cdrom Save Screenshot As... All Devices &Other Keys... QEMU/KVM &Monitor Ctrl-Alt-Backspace null (/dev/null) stdio (Standard In Out) /dev/ttyS0 By Bus.Address Manage Snapshots d Display Scaling Fullscreen Mode Ctrl+Alt+F Show Status Bar Reinit VNC a [Paused] [Saved] Power Off This VM? (Emulator Control) All Files (*) Selected VM is running now. Shutdown anyway? Are you sure? Are you sure to shutdown VM "%1"? Are you sure to reboot VM "%1"? Open Device or Image File All Files (*);;Images Files (*.img *.ima) All Files (*);;Images Files (*.iso) Error! Cannot Find USB Device! Cannot Get USB Information From System! Disconnect USB Enter You Bus.Address VM USB Value Send Keys Enter your key combinations such as ctrl-alt-del or alt-f2 To enable window mode press Ctrl-Alt-F Do you want to show this message again? Fullscreen mode About Emulator Control... Emulator Control is a Tool for Managing QEMU in Runtime. Warning! In This VM Floppy 1 Not Found! In This VM Floppy 2 Not Found! In This VM CD-ROM Not Found! Emulator_Options_Window Emulator Settings Name (Emulator identifier) Name (This be identifier for it emulator): Find emulator Emulator type: QEMU KVM (For adding QEMU-KVM, add them one by one) Path to Emutators Binary Directory: ... &Find Emulators Emulators Executables Files QEMU/KVM System Binary File Name Emulator Version Use saved available emulator options (Recomended to choose it again after emulator updating) Use saved emulator available options (Recomend refind after update emulator) Always check available emulator options while starting AQEMU (Slow) Check available emulator options always start AQEMU (Slowly) Always check emulator version while starting AQEMU Check emulator version always start AQEMU Set version and available options manually &OK &Cancel Error! Path is Empty! Warning Select Directory Path doesn't exist! Enulator Name is Empty! This emulator name is already used! QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X KVM 7X KVM 8X KVM 0.11.X KVM 0.12.X KVM 0.13.X Select QEMU Binary File All Files (*) Cannot get emulator info! For file: %1 Cannot get version for emulator! Error_Log_Window QEMU Error Log Error Window Show Mode Normal Mode Do Not Show Until Next VM Started Do Not Show Until Next AQEMU Started Never show it (For View Error Log Select VM->Show QEMU/KVM Error Log Window) Do Not Show Forever (For View Error Log Select VM->Show QEMU/KVM Error Log Window) &Clear Errors List &OK Error # First_Start_Wizard First Start Wizard English QEMU 0.9.0 QEMU 0.9.1 QEMU 0.10.X QEMU 0.11.X QEMU 0.12.X QEMU 0.13.X Warning! Set Folder for you VM's Search... Cancel Error! Cannot get emulator info! For file: %1 Are you sure? You can configure these options later in Settings windows. QEMU Found in "%1", version: %2 KVM Found in "%1", version: %2 Emulator Version Modified By User Select QEMU emulator directory &Finish &Next Cannot Create New Folder! Error Emulator binary files not exists! Please click Back and set it manual. Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path Welcome General Settings Find Emulators Setup Emulator Finish &Back &Cancel Welcome to AQEMU settings wizard! This wizard will help you to choose options AQEMU needed to work correctly. Push the "Next" button to go to next page or "Back" button to go back to previous page. If the "Device manager" mode is active, storage devices (Floppy, CD/DVD, HDD) will be displayed in virtual machine as icons, like in file manager window. New experimental work mode is available in AQEMU. In this mode QEMU/KVM display will be showed in AQEMU main window. Note that this mode is still unstable so here may be some problems. If you want to enable this feature you must mark the "Include Emdedded VNC Display in Main Window" flag. For correct working AQEMU must know your emulators locations and versions. For searching push the "Search" button. If automatic search can't find out your emulators, you should configure AQEMU yourself later. You can do it in "File->Advanced Settings" menu. Here you can choose interface language Please select folder for AQEMU virtual machines Use Device manager Include Emdedded VNC Display in Main Window &Search S&kip Search Set &Versions Manualy Congratulations! The Wizard has got all necessary settings for configuring AQEMU. Push "Finish" button to save your settings. MachineView Error! Cannot Reinit VNC Connection! Main_Window AQEMU Info General Machine &Name: Emulator Type: Emulator Version: Computer Type: Machine &Type: B&oot Priority: Floppy HDD CD-ROM Network None &CPU Type: Number of CP&U: 1 2 4 8 16 32 64 128 255 &Video Card: &Keyboard Layout en-us (default) ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr Memory Size 1 MB Updating free memory information Update information about free memory Free memory: 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory Audio Cards Sound &Blaster 16 &ENSONIQ ES1370 &Yamaha YM3812 AC97 (Intel 82801AA) Gravis &Ultrasound GF1 PC Speaker Options Start in full screen &Fullscreen Mode Snapshot &Mode Set real time clock to local time. Default=utc Set the real time clock to local time. Default=utc Use &Local Time HDA (Primary Master) Select Disk Image Open Create New HDD Create Image Format: none Allocated Disk Space: 0 Virtual Size: 0 Cluster Size: 0 Format All settings HDB (Primary Slave) HDC (Secondary Master) HDD (Secondary Slave) CD/DVD/Floppy CD/DVD-ROM Browse Type: none Size: 0 Floppy A Floppy B Use &Network Network Settings GUI Type: Basic Native Nativ Additional Settings &Redirections Protocol Host Port Guest IP Guest Port A&dd item D&elete item &Clear list Redirect item settings Protocol: &TCP &UDP &Host Port to &guest IP Guest Por&t Other network settings T&FTP Server Prefix: Allow &SMB Access to: ... Advanced Additional Options Fix Windows 2000 install Bug Fix Installation Windows 2000 Bug &Windows 2K Hack RTC TD Hack (Fix Time Drift in Windows ACPI HAL) No Shutdown Exit instead of rebooting No Reboot Start CP&U at Startup Check Floppy Disk boot signature in VM BIOS Check Boot Signature For Floppy Disks in VM BIOS Check Boot Secto&r on FDD Enable ACP&I Start Date (Day.Month.Year Hour:Minute:Second) dd.MM.yyyy HH:mm:ss QEMU/KVM Window Options Show QEMU/KVM Window Without a Frame and Window Decorations Use Ctrl-Alt-Shift to Grab Mouse (Default is Ctrl-Alt) Use Ctrl-Alt-Shift to Grab Mouse (Default Ctrl-Alt) Disable QEMU/KVM Window Close Capability Rotate Graphical Output 90 Deg Left (Only PXA LCD) Curses (Use a curses/ncurses Interface Instead of SDL) Show Cursor (It Works Only in QEMU/KVM SDL Window) Show Cursor (This Work Only in QEMU/KVM SDL Window) Initial Graphical Mode Width Height Depth 24 Send Only User Arguments Without AQEMU Arguments Use Emulator Binary File in "Additional QEMU/KVM Arguments" Additional QEMU/KVM &Arguments Other Hardware Virtualization KVM Options Enable KVM Disable KVM kernel mode PIC/IOAPIC/LAPIC Disable KVM kernel mode PIT Disable KVM kernel mode PIT interrupt reinjection Nesting (Support for Running a VM Inside other VM (AMD Only) Nesting (Support for Running a VM Inside the VM (AMD Only) KVM Shadow Memory Mb KQEMU Acceleration Module Disabled (Disable KQEMU Accelerator module) Disabled (Disable the usage of the QEMU Accelerator module KQEMU) Use If Possible (AQEMU won't check loaded KQEMU module) Use If Possible (AQEMU don't check loaded KQEMU module) Enabled (AQEMU checks loaded KQEMU module. If it isn't loaded QEMU won't started) Enabled (AQEMU check loaded KQEMU module, if no loaded QEMU not started) Full (Enable full virtualization mode for best performances) VNC Activate VNC General settings VNC Display Number For Connection Use Port 5900 + VNC Display Number UNIX Domain Socket Security settings Use Password (You must set a password when you starting the VM) Use Password (You must set a password when you start the VM) Use TLS x509 Folder Path x509verify Folder Path Warning: Globaly Activated Embedded Display in Emulator Control Window. To Disable This Function in Current VM choose "Don't Use Embedded VNC Display" Warning: Globaly Activated Embedded Display in Emulator Control Window. For Disable This Function in Current VM Set "No Use Embedded VNC Display" Don't use embedded VNC Display No Use Embedded VNC Display Optional Images ROM File (For EtherBoot) On-Board Flash Image SecureDigital Card Image Parallel Flash Image Boot Linux Kernel Use &Linux Boot Kernel bzImage File: &Initrd File: Append Command Line: &Apply &Discard Changes &VM &New VM &Help &File &About AQEMU About AQEMU F1 About &Qt &Delete VM &Exit Ctrl+Q &Wizard... Ctrl+W &Add New VM Ctrl+N &Create HDD Image Con&vert HDD Image Convert HDD Image General &Settings AQEMU &Settings &Start Ctrl+S Sto&p Ctrl+D &Pause Ctrl+P &Reset Ctrl+R &Load VM From File Save As &Template Show QEMU/KVM &Arguments Sa&ve Change Icon Copy Manage Snapshots Show Emulator Control Show QEMU/KVM Error Log Window &Advanced Settings Start &First Run Wizard Run &First Run Wizard Create Shell Script Delete VM And Files SPICE Ports Cannot Save Settings! Close AQEMU? One or More VM is Running! Terminate All Running VM and Close AQEMU? Error! VM Name is Empty! Redirection List is Empty! Please Disable Redirections! Device Manager VM File " " is Read Only! Check Permissions! Memory size > all free memory on this system! You must create a new virtual machine This VM uses an emulator "%1" which is not installed in the system. The work of the VM is not possible! Machine Details Machine State: Running Power Off Pause Saved Machine Type: CPU Type: Memory Size: Number of CPU: Acceleration: Use If Possible Disabled Enabled Full Boot Priority: Video Card: Keyboard Layout: Use Sound: Yes No Fullscreen Mode: Enable ACPI: Use Local Time: Start CPU at Startup: Use Snapshot Mode: No Reboot: Storage Devices Memory size < 1! Using default value: 256 MB Memory size < 1! Using efault value: 256 MB Floppy 1: Floppy 2: CD/DVD-ROM: Primary Master (HDA): Primary Slave (HDB): Secondary Master (HDC): Secondary Slave (HDD): Use Network: Card: User mode network stack TUN/TAP Interface TCP Socket VLAN UDP multicast socket No Connection Item %1 NIC User Channel TAP Socket Multicast Socket VDE Dump Unknown Type Item Redirection Use Redirections: Serial Port %1: Default vc pty none null dev host_port file stdio pipe udp tcp telnet unix Parallel Port %1: USB Port %1: Use Linux Boot: Kernel bzImage: Initrd File: Kernel ComLine: ROM File: On-Board Flash Image: SD Card Image: Parallel Flash Image: No Frame: Alt Grab: No Quit: Portrait Mode: %1 Image "%2" doesn't Exist! Continue Without this Image? Your New VM Name is Empty! VM isn't Created! Are you sure? This Function Works Only On Running VM! Cannot convert "%1" to size suffix! Valid suffixes are: MB, GB Memory size < 0! Valid size is 1 or more Your memory size %1 MB > %2 MB - all free RAM on this system! To set this value, check "Remove limitation on maximum amount of memory". Free memory on this system is less than 32 MB! CPU count value is not valid digit! To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode! Press "Ignore" button for hide this message in future. Add This Record? Check Boot Sector on FDD: Machine Name: VNC Port: SPICE Port: RTC TD Hack: Windows 2000 Hack: No Shutdown: Start Date: Curses: Show Cursor: Initial Graphical Mode: QEMU/KVM Arguments Type: Host Device Type: Image Size: 0 Byte Kb Gb Type: Image Size: Display Warning! VM be Changed. Save Changes? Warning Current VM was changed. Discard all changes? Current VM was changed. Save all changes? Cannot Change Icon When VM in Save State. bzImage Initrd ROM File On-Board Flash SecureDigital Card Parallel Flash VNC x509 Folder VNC x509verify Folder No boot device found! Delete? Delete " " VM? Cannot Delete VM XML File! VM Name New Virtual Machine Name: QEMU running in snapshot mode. VM can not be saved in this mode. Shutdown VM "%1"? Reboot VM "%1"? Open AQEMU VM File AQEMU VM (*.aqemu) VM With This Name Already Exists! Information New Template Created! Emulator Control Already Show QEMU/KVM Arguments: No VM Found! Save VM to Script Shell Script Files (*.sh);;All Files (*) Cannot Open File! Error Cannot convert "%1" to memory size! Cannot convert "%1" to integer! Current memory size more of all host memory! Use the maximum available size. Free memory: %1 MB Open Floppy Image File All Files (*);;Images Files (*.img *.ima) Open CD\DVD-ROM Image File All Files (*);;Images Files (*.iso) Open HDD Image File All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk) Image Format: Allocated Disk Space: Virtual Size: Cluster Size: QEMU KVM CPU count > max CPU count for this emulator! Cannot Save This VM to File! Network Settings Network Cards Select SMB Directory UNIX Domain Socket Path All Files (*) Select x509 Certificate Folder Select x509 Verify Certificate Folder Select Kernel Image File Select InitRD File Select ROM File Select On-Board Flash Image Select SecureDigital Card Image Select Parallel Flash Image Monitor_Window QEMU/KVM Monitor Com&mand: info version info network info block info registers info cpus info history info irq info pic info pci info tlb info mem info jit info kqemu info usb info usbhost info profile info capture info snapshots info mice info vnc &Run &Clear Change font Font Network_Widget AQEMU Network Widget Items List: &Add &Delete Connection Type ? Model macaddr aa:bb:cc:dd:ee Generate New MAC vlan name hostname port:dev fd ifname script ... downscript listen connect mcast sock port group mode file len 64Kb (default) 128Kb 512Kb 1Mb 5Mb 10Mb addr vectors net host restrict y n sndbuf vnet_hdr on off vhost vhostfd hostfwd guestfwd dhcpstart dns tftp bootfile smb smbserver Unknown Type Item Warning! Maximum Network Cards Count is 8. New Item nic -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no '-net' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. user -net user[,vlan=n][,hostname=name][,name=name] Use the user mode network stack which requires no administrator privilege to run. 'hostname=name' can be used to specify the client hostname reported by the builtin DHCP server. channel -net channel,port:dev Forward 'user' TCP connection to port port to character device dev tap -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] Connect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. 'fd'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is '/etc/qemu-ifup' and the default network deconfigure script is '/etc/qemu-ifdown'. Use 'script=no' or 'downscript=no' to disable script execution. socket -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] Connect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If 'listen' is specified, QEMU waits for incoming connections on port (host is optional). 'connect' is used to connect to another QEMU instance using the 'listen' option. 'fd'=h specifies an already opened TCP socket. -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] Create a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. NOTES: 1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). 2. mcast support is compatible with User Mode Linux (argument 'ethN=mcast'), see http://user-mode-linux.sf.net. 3. Use 'fd=h' to specify an already opened UDP multicast socket. vde -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] Connect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled. dump -net dump[,vlan=n][,file=f][,len=n] dump traffic on vlan 'n' to file 'f' (max n bytes per packet) Select script All Files (*);;Scripts (*.sh) Boot file All Files (*) SMB directory Error! Incorrect MAC address! Invalid name! Valid characters are:: a-z A-Z 0-9 _ - Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ - %1 File "%2" doesn't Exist! Continue Without this File? Old_Network_Widget Old Network Widget Cards List: Add &Delete Network Card Model: Connection &Mode: Use the user mode network stack Open a TUN/TAP interface Use an already open TUN/TAP interface Open a listening TCP socket Use an already open TCP socket Connect to listening TCP socket Create shared VLAN via UDP multicast socket Use an already open UDP multicast socket No connection VM Hostname: &IP Address: &MAC Address: Generate New MAC &VLAN: &Port: &FD: If the value is 0 then it will not be used &TUN/TAP Script: ... &Interface Name: Error Network Card #% Not Valid! Card Warning! Maximum Network Cards Count is 8. Network Cards List is Empty! Cannot Delete Network Card! Select script All Files (*);;Scripts (*.sh) Error! IP Address in Card Invalid! MAC Address in Card In Card TUN/TAP Script File "%1" Not Exists! Continue Without It File? Ports_Tab_Widget Ports Add port Serial (COM) Parallel (LPT) USB Edit Port Delete Port Ports List Port type Details COM (Serial Port) LPT (Parallel Port) USB Port Keyboard Mouse Tablet Wacom Tablet Braille Virtual QEMU/KVM Device: %1 %1 %2 (Vendor ID: %3 Product ID: %4) %1 %2 (BusAddr: %3) Warning You can add no more than 4 COM ports You can add no more than 3 LPT ports Device not select! Device doesn't selected! Properties_Window Properties Floppy Browse Advanced settings CD/DVD-ROM Hard Disk Path to Image: ... Create &New &Format Exist Information Device Name: Up&date Info &OK &Cancel Warning Image file doesn't exist! Image Size: Kb Mb Open Floppy Image File All Files (*);;Images Files (*.img *.ima) Open CD\DVD-ROM Image File All Files (*);;Images Files (*.iso) Open HDD Image File All Files (*);;Images Files (*.img *.qcow *.wmdk) Format: Virtual Size: On Disk Size: Cluster Size: QObject Error! Standard PC ISA-only PC Integrator/CP (ARM926EJ-S) Integrator/CP (ARM1026EJ-S) Versatile/PB (ARM926EJ-S) Versatile/AB (ARM926EJ-S) RealView (ARM926EJ-S) R4k platform Malta Core LV Heathrow PowerMAC Mac99 PowerMAC PowerPC PREP SPARCstation 2 (Sun4c) SPARCstation 5 (Sun4m) SPARCstation 10 (Sun4m) SPARCstation 20 (Sun4m) SPARCserver 600MP (Sun4m) SPARCserver 1000 (Sun4d) SPARCcenter 2000 (Sun4d) NE2000 PCI NE2000 ISA i82551 i82557B i82559ER PCnet32 PCI RTL8139 SMC91C111 MCF FEC shix card r2d-plus board Lance No Video Card Cirrus CLGD 5446 Standard VGA Sun4m qemu64 Athlon Akita PDA (PXA270) Spitz PDA (PXA270) Borzoi PDA (PXA270) Terrier PDA (PXA270) Palm Tungsten (OMAP310) Stellaris LM3S811EVB Stellaris LM3S6965EVB Gumstix Connex (PXA255) Gumstix Verdex (PXA270) Mainstone II (PXA27x) Bare ETRAX FS board Acer Pica 61 MIPS MIPSsim platform R4000 VR5432 5Kc 5Kf 20Kc MIPS64R2-generic Ref405ep Taihu StdVGA (VESA 2.0) VMWare Video Card None Video Card Core Duo Atom N270 e1000 virtio Phenom Core 2 Duo QEMU 64Bit ARM 1136 R2 Siemens SX1 (OMAP310) V1 Siemens SX1 (OMAP310) V2 Nokia N800 Nokia N810 Marvell 88w8618 / MusicPal Tosa PDA (PXA255) AXIS devboard 88 fseth MCF5206EVB Arnewsh 5206 Dummy board MIPS Malta Core LV MIPS Magnum mips r4k platform MIPS R4000 MIPS VR5432 MIPS 5Kc MIPS 5Kf MIPS 20Kc MIPS MIPS64R2-generic Spartan 3ADSP1800 xilinx-ethlite e500v1 Mac99 based PowerMAC PowerPC PREP platform ref405ep taihu bamboo mpc8544ds SH7750R SH7751R SH7785 SPARCstation Voyager (Sun4m) SPARCstation LX (Sun4m) SPARCstation 4 (Sun4m) SPARCClassic (Sun4m) SPARCbook (Sun4m) Sun4u Sun4v Sun4v (Niagara) This Fatal Error. Recomend Close AQEMU. Cannot Create Image! Information: Complete! Warning! Fatal error. It's recommended to close AQEMU Cannot Start qemu-img! Image isn't Created! qemu-img Cannot Finish! Image isn't Created! QEMU-IMG is Creates HDD Image. Additional Information: QEMU-IMG is Returned non Standard Message!. Additional Information: Kb Mb Gb AQEMU Config File is Read Only! Check Permissions For File: AQEMU VM Directory is Read Only! Check Permissions For: AQEMU VM Template Directory is Read Only! Check Permissions For: AQEMU Log File is Read Only! Check Permissions For File: Default AQEMU emulators search Error Cannot create directory for log file! Path: %1 This is a first AQEMU start and program running in root mode. In some Linux distributions you may have problems with configuration saving. Close AQEMU? AQEMU will search for emulators after uptating. Please wait. Cannot Find any Emulators installed in your OS! You should choose them In Advanced Settings! Cannot Find AQEMU Data! Cannot Locate AQEMU Data Folder! You Should Select This Folder in Next Window! Please Select AQEMU Data Folder: AQEMU won't Work If Data Folder isn't Selected! AQEMU VM Folder doesn't Exists! Create It? Cannot Load AQEMU Icon Theme! File "%1" Not Found! SMP_Settings_Window SMP Settings If any on the values can be omitted. Missing (zero) values will be computed. CPUs count Sockets count Cores per socket Threads per core Max number of hotpluggable CPUs &OK &Cancel Select_Icon_Window Change Icon Select Icon For Your VM Default &Other System Icon Default &Linux Icon Default &Windows Icon &All OS Icons From AQEMU Collection Other &Icon Your Icon Path: You Icon Path: &Browse... &OK &Cancel Error! Icon file doesn't exist! Select Icon File: PNG Images (*.png) Settings_Window General Settings Basic Settings AQEMU VM Folder: ... Default VM Template: Create Template View Interface Language: English GUI Icons Theme: Crystal SVG (KDE 3) Oxygen (KDE 4) VM Icon Size: VM Icons Size: 16x16 24x24 32x32 48x48 64x64 Use Screenshot for OS Icon in Save Mode Use Device Manager by Default Emulator Control Show Mode Show In Separate Window Show Window With Embedded Display Show In AQEMU Main Window Show In AQEMU Main Window With Embedded Display Don't show No Show &OK &Cancel Warning AQEMU VM Templates Not Found! Information New template was created! Language will set after restarting AQEMU Show this message in future? AQEMU VM folder doesn't exist! Do you want to create it? Set your VM folder Set Folder for you VM's Icons theme be set after restart AQEMU Show this message in future? Invalid Value! Error! Cannot Create New Folder! Support for this feature is not complete! If there is no picture, click "View->Reinit VNC" Show This Message Again? Snapshot_Properties_Window Snapshot Properties Snapshot Name: Snapshot Description: &OK &Cancel Warning Snapshot name is empty! Snapshots_Window Manage VM Snapshots Description: Size: VM Clock: ID: Date: Properties Start Delete Create OK Update Info Snapshot List: Warning! Please select snapshot that you want to delete! Warning Delete Current Snapshot? Please select snapshot that you want to start! This VM is Running now! Stop VM and Load Snapshot? Error! You must add HDD image in QCOW2 format if you want to use snapshots! For use snapshots, you most add HDD image in QCOW2 format! VM_Wizard_Window New Virtual Machine Wizard &Back &Next &Cancel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the steps that are necessary to create a new virtual machine for AQEMU.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p></body></html> Select AQEMU Configuration Mode &Typical (For Beginners) Create new virtual machine with most common devices and configuration options. &Custom Create new virtual machine with additional configuration options. Select Emulator Type For Using In New Virtual Machine Select Emulator Type For Use In New Virtual Machine QEMU KVM Please Select VM Hardware Template Template OS Type: No Selected Generate VM C&omputer Type: Release Date: 1985-1990 1990-1995 1995-2000 2000-2005 2005-2010 VM Name: Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. CPU Type: Select a CPU type for your new virtual machine: Select a CPU type for you new virtual machine: Select the amount of base memory (RAM) in megabytes for virtual machine allocating. Select the amount of base memory (RAM) in megabytes to be allocated to the virtual machine. 1 MB Update free memory information Update information about free memory Free memory: 768 MB 2048 MB 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Remove limitation on maximum amount of memory <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> Boot Hard Disk (Primary Master) N&ew... E&xisting... Select network type using on your new virtual machine. Select network type using on you new virtual machine. &User Mode Network Connection (Uses the user mode network stack) &User Mode Network Connection (Use the user mode network stack) N&o Network (No net cards installed on VM) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> Enter your new virtual machine hard disk capacity. Enter you new virtual machine hard disk capacity. Disk Size in GB (Gigabytes): Emulator Type Wizard Mode VM Hardware Template VM Name and CPU Type Virtual Machine Name Memory Hard Disk Size Virtual Hard Disk Network Error! Please Add One Or More Emulators in Advanced Settings! Template For VM Cannot Create New VM from Template! Cannot Find Emulator System ID! Warning This VM Name is Already Exists! &Finish Finish! Cannot Find QEMU System ID! Error Cannot convert "%1" to memory size! Cannot convert "%1" to integer! Cannot convert "%1" to size suffix! Valid suffixes: MB, GB Memory size < 0! Valid size is 1 or more Current memory size bigger than all existing host memory! Using maximum available size. Free memory on this system is lower than 32 MB! Your memory size %1 MB > %2 MB - all free RAM on this system! To setup this value, check "Remove limitation on maximum amount of memory". Your memory size %1 MB > %2 MB - all free RAM on this system! For set it size, check "Remove limitation on maximum amount of memory". Free memory: %1 MB Select HDD Image All Files (*) VNC_Password_Window VNC Password Password: Confirm: OK Warning Password is Empty! Password Not Confirmed! Virtual_Machine Version Invalid! Warning! USB Device %1 %2 (%3 %4) Not Found! Error! Additional Arguments is Empty! Cannot Use User Arguments! Version of this AQEMU VM File isn't 0.5 Load This File anyway? ROM File doesn't Exists! Can't run emulator! KVM Kernel Module Not Loaded! To load this Module, Enter in Terminal with root privileges: "modprobe kvm-intel". Or If Use AMD Processor: "modprobe kvm-amd". Ignore This Error? KQEMU Kernel Module Not Loaded! This Module Provides Acceleration for QEMU. For Loading KQEMU Module Type: "modprobe kqemu" in root mode Or Disable Acceleration in "Other->Hardware Virtualization" tab. Cannot start emulator! Binary path is empty! QEMU Error Log Loading... Loading Virtual Machine. Please wait... Saving... Saving Virtual Machine. Please wait... You must add HDD image in QCOW2 format to save virtual machine! VncView Password required Please enter the password for the remote desktop: aqemu-0.9.2/src/000077500000000000000000000000001272330227200134215ustar00rootroot00000000000000aqemu-0.9.2/src/About_Window.cpp000066400000000000000000000077531272330227200165420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include "Utils.h" #include "About_Window.h" About_Window::About_Window( QWidget *parent ): QDialog( parent ) { ui.setupUi( this ); // Minimum Size resize( width(), minimumSizeHint().height() ); // Thanks HTML Text ui.Edit_Thanks_To_Text->setHtml( tr( "Developers:\n" "
Andrey Rijov (aka RDron) - Original Author (Up until version 0.8.2)\n" "
Tobias Gläßer - Maintainer/Developer (Version 0.9.0 and up)\n" "

Contributors:\n" "
Georg Schlisio - Arch Linux Packaging and Testing\n" "
Eli Carter - Sound card support patches\n" "
Max Brazhnikov - FreeBSD Port\n" "
Boris Savelev - ALTLinux Package\n" "
Denis Smirnov (aka reMiND) - Arch Linux Package and Other Help\n" "
Ignace Mouzannar - Debian Package\n" "
Michael Brandstetter - Improvement Scripts\n" "
Robert Warnke - German AQEMU Documentation Translation\n" "
Michael Schmöller (aka schmoemi) - German Translation and Correcting English translation\n" "
Guillem Rieu - Patch for Network Redirections\n" "
Karol Krenski - IP Address RegExp Fix\n" "
Alexander Romanov (aka romale) - Testing, New Ideas and Other Help\n" "
Timothy Redaelli - Patch for CMake\n" "
Pavel Serebryakov (aka Kronoph) - Correcting English translation\n" "

Special thanks:\n" "
Sergey Sinitsa (aka sin)\n" "
Grigory Pulyaev (aka Rodegast)\n" "
Alexander Saifulin (aka Ne01eX)\n" "
Mihail Parshin (aka Skeeper)\n" "
Garret Acott (aka gacott)\n" "
Damir Vafin (aka Denver-22)\n" "

Thanks all www.nclug.ru group for testing and suggestions for improvement.\n" "

AQEMU used code from QtEMU and Krdc thanks all developers:\n" "
Tim Jansen (tim@tjansen.de)\n" "
Urs Wolfer (uwolfer@kde.org)\n" "
Ben Klopfenstein (benklop@gmail.com)\n" "

Icons:\n" "
Oxygen - Icon Theme From Oxygen Team\n") ); // Load Links QSettings settings; QFileInfo logFileDir( settings.fileName() ); linksFilePath = QDir::toNativeSeparators( logFileDir.absolutePath() + "/links.html" ); Show_Links_File(); ui.Tabs->setCurrentIndex(0); } void About_Window::Show_Links_File() { QSettings settings; QString show_url; if( QFile::exists(linksFilePath) ) { show_url = linksFilePath; } else if( QFile::exists(QDir::toNativeSeparators(settings.value("AQEMU_Data_Folder", "").toString() + "/docs/links.html")) ) { show_url = QDir::toNativeSeparators( settings.value("AQEMU_Data_Folder", "").toString() + "/docs/links.html" ); } else { AQGraphic_Warning( tr("Error!"), tr("Cannot Find AQEMU Links File!") ); return; } QFile links_file( show_url ); if( ! links_file.open(QIODevice::ReadOnly | QIODevice::Text) ) { AQError( "void About_Window::Show_Links_File()", "Cannot Open \"docs/links.html\" File!" ); return; } else { QTextStream out( &links_file ); QString all = out.readAll(); ui.Links_View->setHtml( all ); } } aqemu-0.9.2/src/About_Window.h000066400000000000000000000024271272330227200162000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ABOUT_WINDOW_H #define ABOUT_WINDOW_H #include #include "ui_About_Window.h" class About_Window: public QDialog { Q_OBJECT public: About_Window( QWidget *parent = 0 ); private slots: void Show_Links_File(); private: Ui::About_Window ui; QString linksFilePath; }; #endif aqemu-0.9.2/src/About_Window.ui000066400000000000000000002354201272330227200163670ustar00rootroot00000000000000 Andrey Rijov About_Window 0 0 791 736 About AQEMU :/help.png:/help.png /*QDialog { background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(230, 230, 230, 255), stop:0.324607 rgba(183, 183, 183, 255), stop:0.670157 rgba(218, 218, 218, 255), stop:1 rgba(199, 199, 199, 255)); } QPushButton { color: rgb(0, 0, 0); background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dadada, stop: 0.4 #b4b4b4, stop: 0.5 #b4b4b4, stop: 1.0 #dadada); border: 1px solid #707070; border-radius: 4px; min-width: 10ex; padding: 4px; } QPushButton:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eaeaea, stop: 0.4 #c4c4c4, stop: 0.5 #c4c4c4, stop: 1.0 #eaeaea); } QPushButton:pressed { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eFeFeF, stop: 0.4 #d4d4d4, stop: 0.5 #d4d4d4, stop: 1.0 #eFeFeF); }*/ QTabWidget::pane { border: 1px solid #707070; /* position: absolute; top: -1px;*/ border-top-left-radius: 18px; border-top-right-radius: 18px; } QTabWidget::tab-bar { alignment: center; } /*QTabBar::tab { color: rgb(0, 0, 0); background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dadada, stop: 0.4 #b4b4b4, stop: 0.5 #b4b4b4, stop: 1.0 #dadada); border: 1px solid #808080; border-top-left-radius: 4px; border-top-right-radius: 4px; min-width: 10ex; padding: 3px; } QTabBar::tab:selected, QTabBar::tab:hover { color: rgb(0, 0, 0); border-color: #707070; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eaeaea, stop: 0.4 #c4c4c4, stop: 0.5 #c4c4c4, stop: 1.0 #eaeaea); }*/ 0 About 0 0 0 0 QWidget { /*background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(214, 214, 214, 255), stop:1 rgba(234, 234, 234, 255));*/ background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(230, 230, 230, 255), stop:0.324607 rgba(183, 183, 183, 255), stop:0.670157 rgba(218, 218, 218, 255), stop:1 rgba(199, 199, 199, 255)); border-top-left-radius: 18px; border-top-right-radius: 18px; } 0 0 16777215 16777215 background-color: rgba(255, 255, 255, 0); :/aqemu_logo.png true Qt::AlignCenter Monospace background-color: rgba(255, 255, 255, 0); <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Monospace'; font-size:11pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">a frontend for QEMU</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Version </span><span style=" font-size:10pt; font-weight:600; color:#000000;">0.9.2 (2016.05.31)</span><span style=" font-size:10pt; font-weight:600; color:#3c6e05;"> License: </span><span style=" font-size:10pt; font-weight:600; color:#000000;">GNU GPLv2</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#3c6e05;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Active maintainer </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Tobias Gläßer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Original author </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Andrey Rijov (a.k.a. RDron)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#3c6e05;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Github </span><a href="https://github.com/tobimensch/aqemu/"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/tobimensch/</span></a></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Git repository </span><a href="https://github.com/tobimensch/aqemu.git"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/tobimensch/aqemu.git</span></a></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Issue tracker </span><a href="https://github.com/tobimensch/aqemu/issues/"><span style=" text-decoration: underline; color:#0000ff;">https://github.com/tobimensch/aqemu/issues/</span></a></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Website </span><a href="https://sourceforge.net/projects/aqemu/"><span style=" text-decoration: underline; color:#0000ff;">https://sourceforge.net/projects/aqemu/</span></a></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; text-decoration: underline; color:#3c6e05;"><br /></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#3c6e05;"><br /></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#3c6e05;">Supported QEMU versions: </span><span style=" font-size:10pt; font-weight:600; color:#000000;">2.0 and up</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true Qt::TextBrowserInteraction Thanks To Qt::ScrollBarAlwaysOff true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p></td></tr></table></body></html> License Qt::ScrollBarAlwaysOn Qt::ScrollBarAlwaysOff <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:10pt; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:10pt; font-weight:600;">Version 2, June 1991</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Copyright (C) 1989, 1991 Free Software Foundation, Inc.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Everyone is permitted to copy and distribute verbatim copies</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> of this license document, but changing it is not allowed.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Preamble</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The licenses for most software are designed to take away your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">freedom to share and change it. By contrast, the GNU General Public</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">License is intended to guarantee your freedom to share and change free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software--to make sure the software is free for all its users. This</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">General Public License applies to most of the Free Software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Foundation's software and to any other program whose authors commit to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">using it. (Some other Free Software Foundation software is covered by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the GNU Library General Public License instead.) You can apply it to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your programs, too.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> When we speak of free software, we are referring to freedom, not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">price. Our General Public Licenses are designed to make sure that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">have the freedom to distribute copies of free software (and charge for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this service if you wish), that you receive source code or can get it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">if you want it, that you can change the software or use pieces of it</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">in new free programs; and that you know you can do these things.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> To protect your rights, we need to make restrictions that forbid</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anyone to deny you these rights or to ask you to surrender the rights.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These restrictions translate to certain responsibilities for you if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute copies of the software, or if you modify it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> For example, if you distribute copies of such a program, whether</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">gratis or for a fee, you must give the recipients all the rights that</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you have. You must make sure that they, too, receive or can get the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code. And you must show them these terms so they know their</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">rights.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> We protect your rights with two steps: (1) copyright the software, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">(2) offer you this license which gives you legal permission to copy,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute and/or modify the software.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Also, for each author's protection and ours, we want to make certain</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that everyone understands that there is no warranty for this free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">software. If the software is modified by someone else and passed on, we</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">want its recipients to know that what they have is not the original, so</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that any problems introduced by others will not reflect on the original</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">authors' reputations.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> Finally, any free program is threatened constantly by software</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patents. We wish to avoid the danger that redistributors of a free</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program will individually obtain patent licenses, in effect making the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">program proprietary. To prevent this, we have made it clear that any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">patent must be licensed for everyone's free use or not licensed at all.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> The precise terms and conditions for copying, distribution and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">modification follow.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 0. This License applies to any program or other work which contains</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a notice placed by the copyright holder saying it may be distributed</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under the terms of this General Public License. The &quot;Program&quot;, below,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">refers to any such program or work, and a &quot;work based on the Program&quot;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">means either the Program or any derivative work under copyright law:</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">that is to say, a work containing the Program or a portion of it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">either verbatim or with modifications and/or translated into another</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">language. (Hereinafter, translation is included without limitation in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Activities other than copying, distribution and modification are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">covered by this License; they are outside its scope. The act of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">running the Program is not restricted, and the output from the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">is covered only if its contents constitute a work based on the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Program (independent of having been made by running the Program).</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Whether that is true depends on what the Program does.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1. You may copy and distribute verbatim copies of the Program's</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">source code as you receive it, in any medium, provided that you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">conspicuously and appropriately publish on each copy an appropriate</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">copyright notice and disclaimer of warranty; keep intact all the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">notices that refer to this License and to the absence of any warranty;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and give any other recipients of the Program a copy of this License</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">along with the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You may charge a fee for the physical act of transferring a copy, and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">you may at your option offer warranty protection in exchange for a fee.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 2. You may modify your copy or copies of the Program or any portion</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">of it, thus forming a work based on the Program, and copy and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute such modifications or work under the terms of Section 1</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">above, provided that you also meet all of these conditions:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) You must cause the modified files to carry prominent notices</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> stating that you changed the files and the date of any change.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) You must cause any work that you distribute or publish, that in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> whole or in part contains or is derived from the Program or any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> part thereof, to be licensed as a whole at no charge to all third</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> parties under the terms of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) If the modified program normally reads commands interactively</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> when run, you must cause it, when started running for such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> interactive use in the most ordinary way, to print or display an</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> announcement including an appropriate copyright notice and a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> notice that there is no warranty (or else, saying that you provide</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a warranty) and that users may redistribute the program under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> these conditions, and telling the user how to view a copy of this</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> License. (Exception: if the Program itself is interactive but</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> does not normally print such an announcement, your work based on</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> the Program is not required to print an announcement.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">These requirements apply to the modified work as a whole. If</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">identifiable sections of that work are not derived from the Program,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">and can be reasonably considered independent and separate works in</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">themselves, then this License, and its terms, do not apply to those</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">sections when you distribute them as separate works. But when you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribute the same sections as part of a whole which is a work based</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">on the Program, the distribution of the whole must be on the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License, whose permissions for other licensees extend to the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">entire whole, and thus to each and every part regardless of who wrote it.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Thus, it is not the intent of this section to claim rights or contest</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">your rights to work written entirely by you; rather, the intent is to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">exercise the right to control the distribution of derivative or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">collective works based on the Program.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">In addition, mere aggregation of another work not based on the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">with the Program (or with a work based on the Program) on a volume of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">a storage or distribution medium does not bring the other work under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">the scope of this License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 3. You may copy and distribute the Program (or a work based on it,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">under Section 2) in object code or executable form under the terms of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Sections 1 and 2 above provided that you also do one of the following:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> a) Accompany it with the complete corresponding machine-readable</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> source code, which must be distributed under the terms of Sections</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 1 and 2 above on a medium customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> b) Accompany it with a written offer, valid for at least three</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> years, to give any third party, for a charge no more than your</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> cost of physically performing source distribution, a complete</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> machine-readable copy of the corresponding source code, to be</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> distributed under the terms of Sections 1 and 2 above on a medium</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> customarily used for software interchange; or,</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> c) Accompany it with the information you received as to the offer</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> to distribute corresponding source code. (This alternative is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> allowed only for noncommercial distribution and only if you</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> received the program in object code or executable form with such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> an offer, in accord with Subsection b above.)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">The source code for a work means the preferred form of the work for</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">making modifications to it. For an executable work, complete source</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">code means all the source code for all modules it contains, plus any</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">associated interface definition files, plus the scripts used to</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">control compilation and installation of the executable. However, as a</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">special exception, the source code distributed need not include</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">anything that is normally distributed (in either source or binary</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">form) with the major components (compiler, kernel, and so on) of the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">operating system on which the executable runs, unless that component</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">itself accompanies the executable.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">If distribution of executable or object code is made by offering</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy from a designated place, then offering equivalent</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">access to copy the source code from the same place counts as</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">distribution of the source code, even though third parties are not</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">compelled to copy the source along with the object code.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 4. You may not copy, modify, sublicense, or distribute the Program</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">except as expressly provided under this License. Any attempt</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">otherwise to copy, modify, sublicense or distribute the Program is</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">void, and will automatically terminate your rights under this License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">However, parties who have received copies, or rights, from you under</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">this License will not have their licenses terminated so long as such</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">parties remain in full compliance.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;"> 5. You are not required to accept this License, since you have not</span></p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></td></tr></table></body></html> Links QFrame::StyledPanel QFrame::Sunken <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'DejaVu Sans'; font-size:10pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Nimbus Sans L'; font-size:10pt;"><br /></p></td></tr></table></body></html> true background-color: rgba(255, 255, 255, 0); <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Bitstream Vera Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Nimbus Sans L'; font-weight:600; color:#aa0000;"></span></p></td></tr></table></body></html> Qt::Horizontal 151 27 OK Tabs Button_OK Edit_Thanks_To_Text Edit_GPL Button_OK clicked() About_Window accept() 341 223 398 205 10 10 true true false aqemu-0.9.2/src/Add_New_Device_Window.cpp000066400000000000000000000272271272330227200202460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Utils.h" #include "Add_New_Device_Window.h" Add_New_Device_Window::Add_New_Device_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } VM_Nativ_Storage_Device Add_New_Device_Window::Get_Device() const { return Device; } void Add_New_Device_Window::Set_Device( const VM_Nativ_Storage_Device &dev ) { Device = dev; // Update View... ui.CH_Interface->setChecked( Device.Use_Interface() ); // Interface switch( Device.Get_Interface() ) { case VM::DI_IDE: ui.CB_Interface->setCurrentIndex( 0 ); break; case VM::DI_SCSI: ui.CB_Interface->setCurrentIndex( 1 ); break; case VM::DI_SD: ui.CB_Interface->setCurrentIndex( 2 ); break; case VM::DI_MTD: ui.CB_Interface->setCurrentIndex( 3 ); break; case VM::DI_Floppy: ui.CB_Interface->setCurrentIndex( 4 ); break; case VM::DI_PFlash: ui.CB_Interface->setCurrentIndex( 5 ); break; case VM::DI_Virtio: ui.CB_Interface->setCurrentIndex( 6 ); break; default: AQError( "void Add_New_Device_Window::Set_Device( const VM_Nativ_Storage_Device &dev )", "Interface Default Section! Use IDE!" ); break; } // Media ui.CH_Media->setChecked( Device.Use_Media() ); switch( Device.Get_Media() ) { case VM::DM_Disk: ui.CB_Media->setCurrentIndex( 0 ); break; case VM::DM_CD_ROM: ui.CB_Media->setCurrentIndex( 1 ); break; default: AQError( "void Add_New_Device_Window::Set_Device( const VM_Nativ_Storage_Device &dev )", "Media Default Section! Use Disk!" ); break; } // File Path ui.CH_File->setChecked( Device.Use_File_Path() ); ui.Edit_File_Path->setText( Device.Get_File_Path() ); // Index ui.CH_Index->setChecked( Device.Use_Index() ); ui.SB_Index->setValue( Device.Get_Index() ); // Bus, Unit ui.CH_Bus_Unit->setChecked( Device.Use_Bus_Unit() ); ui.SB_Bus->setValue( Device.Get_Bus() ); ui.SB_Unit->setValue( Device.Get_Unit() ); // Snapshot ui.CH_Snapshot->setChecked( Device.Use_Snapshot() ); ui.CB_Snapshot->setCurrentIndex( Device.Get_Snapshot() ? 0 : 1 ); // Cache ui.CH_Cache->setChecked( Device.Use_Cache() ); int index = ui.CB_Cache->findText( Device.Get_Cache() ); if( index != -1 ) ui.CB_Cache->setCurrentIndex( index ); else AQError( "void Add_New_Device_Window::Set_Device( const VM_Nativ_Storage_Device &dev )", "Cache: " + Device.Get_Cache() ); // AIO ui.CH_AIO->setChecked( Device.Use_AIO() ); index = ui.CB_AIO->findText( Device.Get_AIO() ); if( index != -1 ) ui.CB_AIO->setCurrentIndex( index ); else AQError( "void Add_New_Device_Window::Set_Device( const VM_Nativ_Storage_Device &dev )", "AIO: " + Device.Get_AIO() ); // Boot ui.CH_Boot->setChecked( Device.Use_Boot() ); ui.CB_Boot->setCurrentIndex( Device.Get_Boot() ? 0 : 1 ); // cyls, heads, secs, trans ui.GB_hdachs_Settings->setChecked( Device.Use_hdachs() ); ui.Edit_Cyls->setText( QString::number(Device.Get_Cyls()) ); ui.Edit_Heads->setText( QString::number(Device.Get_Heads()) ); ui.Edit_Secs->setText( QString::number(Device.Get_Secs()) ); ui.Edit_Trans->setText( QString::number(Device.Get_Trans()) ); } void Add_New_Device_Window::Set_Emulator_Devices( const Available_Devices &devices ) { if( devices.PSO_Drive_File ) { ui.CH_File->setVisible( true ); ui.Edit_File_Path->setVisible( true ); ui.TB_File_Path_Browse->setVisible( true ); } else { ui.CH_File->setVisible( false ); ui.Edit_File_Path->setVisible( false ); ui.TB_File_Path_Browse->setVisible( false ); } if( devices.PSO_Drive_If ) { ui.CH_Interface->setVisible( true ); ui.CB_Interface->setVisible( true ); } else { ui.CH_Interface->setVisible( false ); ui.CB_Interface->setVisible( false ); } if( devices.PSO_Drive_Bus_Unit ) { ui.CH_Bus_Unit->setVisible( true ); ui.SB_Bus->setVisible( true ); ui.SB_Unit->setVisible( true ); } else { ui.CH_Bus_Unit->setVisible( false ); ui.SB_Bus->setVisible( false ); ui.SB_Unit->setVisible( false ); } if( devices.PSO_Drive_Index ) { ui.CH_Index->setVisible( true ); ui.SB_Index->setVisible( true ); } else { ui.CH_Index->setVisible( false ); ui.SB_Index->setVisible( false ); } if( devices.PSO_Drive_Media ) { ui.CH_Media->setVisible( true ); ui.CB_Media->setVisible( true ); } else { ui.CH_Media->setVisible( false ); ui.CB_Media->setVisible( false ); } if( devices.PSO_Drive_Cyls_Heads_Secs_Trans ) ui.GB_hdachs_Settings->setVisible( true ); else ui.GB_hdachs_Settings->setVisible( false ); if( devices.PSO_Drive_Snapshot ) { ui.CH_Snapshot->setVisible( true ); ui.CB_Snapshot->setVisible( true ); } else { ui.CH_Snapshot->setVisible( false ); ui.CB_Snapshot->setVisible( false ); } if( devices.PSO_Drive_Cache ) { ui.CH_Cache->setVisible( true ); ui.CB_Cache->setVisible( true ); } else { ui.CH_Cache->setVisible( false ); ui.CB_Cache->setVisible( false ); } if( devices.PSO_Drive_AIO ) { ui.CH_AIO->setVisible( true ); ui.CB_AIO->setVisible( true ); } else { ui.CH_AIO->setVisible( false ); ui.CB_AIO->setVisible( false ); } /* FIXME if( devices.PSO_Drive_Format ) { ui.->setVisible( true ); ui.->setVisible( true ); } else { ui.->setVisible( false ); ui.->setVisible( false ); } if( devices.PSO_Drive_Serial ) { ui.->setVisible( true ); ui.->setVisible( true ); } else { ui.->setVisible( false ); ui.->setVisible( false ); } if( devices.PSO_Drive_ADDR ) { ui.->setVisible( true ); ui.->setVisible( true ); } else { ui.->setVisible( false ); ui.->setVisible( false ); }*/ if( devices.PSO_Drive_Boot ) { ui.CH_Boot->setVisible( true ); ui.CB_Boot->setVisible( true ); } else { ui.CH_Boot->setVisible( false ); ui.CB_Boot->setVisible( false ); } // Minimum Size resize( minimumSizeHint().width(), minimumSizeHint().height() ); } void Add_New_Device_Window::Set_Enabled( bool enabled ) { ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled( enabled ); } void Add_New_Device_Window::on_CB_Interface_currentIndexChanged( const QString &text ) { if( text == "ide" || text == "floppy" ) { ui.CH_Index->setEnabled( true ); ui.SB_Index->setEnabled( true ); ui.CH_Bus_Unit->setEnabled( false ); ui.SB_Bus->setEnabled( false ); ui.SB_Unit->setEnabled( false ); } else if( text == "scsi" ) { ui.CH_Index->setEnabled( false ); ui.SB_Index->setEnabled( false ); ui.CH_Bus_Unit->setEnabled( true ); ui.SB_Bus->setEnabled( true ); ui.SB_Unit->setEnabled( true ); } else if( text == "virtio" ) { ui.CH_Index->setEnabled( true ); ui.SB_Index->setEnabled( true ); ui.CH_Bus_Unit->setEnabled( true ); ui.SB_Bus->setEnabled( true ); ui.SB_Unit->setEnabled( true ); } else { ui.CH_Index->setEnabled( false ); ui.SB_Index->setEnabled( false ); ui.CH_Bus_Unit->setEnabled( false ); ui.SB_Bus->setEnabled( false ); ui.SB_Unit->setEnabled( false ); } } void Add_New_Device_Window::on_TB_File_Path_Browse_clicked() { QString file_name = QFileDialog::getOpenFileName( this, tr("Select your device"), Get_Last_Dir_Path(ui.Edit_File_Path->text()), tr("All Files (*)") ); if( ! file_name.isEmpty() ) ui.Edit_File_Path->setText( QDir::toNativeSeparators(file_name) ); } void Add_New_Device_Window::done(int r) { if ( r == QDialog::Accepted ) { // Interface switch( ui.CB_Interface->currentIndex() ) { case 0: Device.Set_Interface( VM::DI_IDE ); break; case 1: Device.Set_Interface( VM::DI_SCSI ); break; case 2: Device.Set_Interface( VM::DI_SD ); break; case 3: Device.Set_Interface( VM::DI_MTD ); break; case 4: Device.Set_Interface( VM::DI_Floppy ); break; case 5: Device.Set_Interface( VM::DI_PFlash ); break; case 6: Device.Set_Interface( VM::DI_Virtio ); break; default: AQError( "void Add_New_Device_Window::done(int)", "Invalid Interface Index! Use IDE" ); Device.Set_Interface( VM::DI_IDE ); break; } Device.Use_Interface( ui.CH_Interface->isChecked() ); // Media switch( ui.CB_Media->currentIndex() ) { case 0: Device.Set_Media( VM::DM_Disk ); break; case 1: Device.Set_Media( VM::DM_CD_ROM ); break; default: AQError( "void Add_New_Device_Window::done(int)", "Invalid Media Index! Use Disk" ); Device.Set_Media( VM::DM_Disk ); break; } Device.Use_Media( ui.CH_Media->isChecked() ); // File Path if( ui.CH_File->isChecked() ) { if( ! QFile::exists(ui.Edit_File_Path->text()) ) { AQGraphic_Warning( tr("Error!"), tr("File does not exist!") ); return; } } Device.Use_File_Path( ui.CH_File->isChecked() ); Device.Set_File_Path( ui.Edit_File_Path->text() ); // Index Device.Use_Index( ui.CH_Index->isChecked() ); Device.Set_Index( ui.SB_Index->value() ); // Bus, Unit Device.Use_Bus_Unit( ui.CH_Bus_Unit->isChecked() ); Device.Set_Bus( ui.SB_Bus->value() ); Device.Set_Unit( ui.SB_Unit->value() ); // Snapshot Device.Use_Snapshot( ui.CH_Snapshot->isChecked() ); Device.Set_Snapshot( (ui.CB_Snapshot->currentIndex() == 0) ? true : false ); // Cache Device.Use_Cache( ui.CH_Cache->isChecked() ); Device.Set_Cache( ui.CB_Cache->currentText() ); // AIO Device.Use_AIO( ui.CH_AIO->isChecked() ); Device.Set_AIO( ui.CB_AIO->currentText() ); // Boot Device.Use_Boot( ui.CH_Boot->isChecked() ); Device.Set_Boot( (ui.CB_Boot->currentIndex() == 0) ? true : false ); // hdachs if( ui.GB_hdachs_Settings->isChecked() ) { bool ok; qulonglong cyls = ui.Edit_Cyls->text().toULongLong( &ok, 10 ); if( ! ok ) { AQGraphic_Warning( tr("Warning!"), tr("\"Cyls\" value is incorrect!") ); return; } qulonglong heads = ui.Edit_Heads->text().toULongLong( &ok, 10 ); if( ! ok ) { AQGraphic_Warning( tr("Warning!"), tr("\"Heads\" value is incorrect!") ); return; } qulonglong secs = ui.Edit_Secs->text().toULongLong( &ok, 10) ; if( ! ok ) { AQGraphic_Warning( tr("Warning!"), tr("\"Secs\" value is incorrect!") ); return; } qulonglong trans = ui.Edit_Trans->text().toULongLong( &ok, 10 ); if( ! ok ) { AQGraphic_Warning( tr("Warning!"), tr("\"Trans\" value is incorrect!") ); return; } Device.Use_hdachs( ui.GB_hdachs_Settings->isChecked() ); Device.Set_Cyls( cyls ); Device.Set_Heads( heads ); Device.Set_Secs( secs ); Device.Set_Trans( trans ); } } QDialog::done(r); } aqemu-0.9.2/src/Add_New_Device_Window.h000066400000000000000000000031601272330227200177010ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ADD_NEW_DEVICE_WINDOW_H #define ADD_NEW_DEVICE_WINDOW_H #include "VM.h" #include "VM_Devices.h" #include "ui_Add_New_Device_Window.h" class Add_New_Device_Window: public QDialog { Q_OBJECT public: Add_New_Device_Window( QWidget *parent = 0 ); VM_Nativ_Storage_Device Get_Device() const; void Set_Device( const VM_Nativ_Storage_Device &dev ); void Set_Emulator_Devices( const Available_Devices &devices ); void Set_Enabled( bool enabled ); private slots: void on_CB_Interface_currentIndexChanged( const QString &text ); void on_TB_File_Path_Browse_clicked(); void done(int); private: VM_Nativ_Storage_Device Device; Ui::Add_New_Device_Window ui; }; #endif aqemu-0.9.2/src/Add_New_Device_Window.ui000066400000000000000000000417121272330227200200740ustar00rootroot00000000000000 Andrey Rijov Add_New_Device_Window 0 0 387 558 New Storage Device :/blockdevice.png:/blockdevice.png QLayout::SetMaximumSize &File false false :/open-file.png:/open-file.png &Interface false ide scsi sd mtd floppy pflash virtio Index (For IDE, Floppy) false Bus, Unit (For SCSI) false false &Media false Disk CD-ROM Cac&he false none writeback writethrough AIO false threads native &Snapshot false on off Boot false on off Qt::Vertical QSizePolicy::Fixed 200 5 Settin&gs for -hdachs Option true false QLayout::SetMaximumSize 6 6 6 6 6 Qt::Horizontal QSizePolicy::Fixed 10 20 0 0 0 0 6 s&ecs Edit_Secs &trans Edit_Trans 0 0 0 0 6 c&yls Edit_Cyls &heads Edit_Heads QLayout::SetMaximumSize Qt::Horizontal 120 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox

Dialog_Button_Box.h
CH_File Edit_File_Path TB_File_Path_Browse CH_Interface CB_Interface CH_Index SB_Index CH_Bus_Unit SB_Bus SB_Unit CH_Media CB_Media CH_Cache CB_Cache CH_AIO CB_AIO CH_Snapshot CB_Snapshot CH_Boot CB_Boot GB_hdachs_Settings Edit_Cyls Edit_Secs Edit_Heads Edit_Trans CH_Interface toggled(bool) CB_Interface setEnabled(bool) 67 59 168 52 CH_Media toggled(bool) CB_Media setEnabled(bool) 63 147 177 149 CH_File toggled(bool) Edit_File_Path setEnabled(bool) 44 30 199 30 CH_File toggled(bool) TB_File_Path_Browse setEnabled(bool) 47 30 303 34 CH_Index toggled(bool) SB_Index setEnabled(bool) 106 80 222 92 CH_Bus_Unit toggled(bool) SB_Bus setEnabled(bool) 104 114 212 110 CH_Bus_Unit toggled(bool) SB_Unit setEnabled(bool) 63 118 293 119 CH_Cache toggled(bool) CB_Cache setEnabled(bool) 51 172 142 167 CH_AIO toggled(bool) CB_AIO setEnabled(bool) 33 200 120 196 CH_Snapshot toggled(bool) CB_Snapshot setEnabled(bool) 65 226 127 228 CH_Boot toggled(bool) CB_Boot setEnabled(bool) 51 261 167 257 buttonBox rejected() Add_New_Device_Window reject() 182 529 314 331 buttonBox accepted() Add_New_Device_Window accept() 285 529 193 278 aqemu-0.9.2/src/Add_Port_Window.cpp000066400000000000000000000221751272330227200171570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Add_Port_Window.h" #include "Utils.h" Add_Port_Window::Add_Port_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); #ifdef Q_OS_UNIX ui.RB_stdio->setEnabled( true ); #endif #ifdef Q_OS_LINUX ui.RB_pty->setEnabled( true ); ui.RB_Dev->setEnabled( true ); #endif #ifdef Q_OS_WIN32 ui.RB_COM->setEnabled( true ); #endif Connect_Slots(); } VM_Port Add_Port_Window::Get_Port() const { VM_Port port; if( ui.RB_Default->isChecked() ) port.Set_Port_Redirection( VM::PR_Default ); else if( ui.RB_vc->isChecked() ) port.Set_Port_Redirection( VM::PR_vc ); else if( ui.RB_pty->isChecked() ) port.Set_Port_Redirection( VM::PR_pty ); else if( ui.RB_none->isChecked() ) port.Set_Port_Redirection( VM::PR_none ); else if( ui.RB_null->isChecked() ) port.Set_Port_Redirection( VM::PR_null ); else if( ui.RB_stdio->isChecked() ) port.Set_Port_Redirection( VM::PR_stdio ); else if( ui.RB_Dev->isChecked() ) port.Set_Port_Redirection( VM::PR_dev ); else if( ui.RB_File->isChecked() ) port.Set_Port_Redirection( VM::PR_file ); else if( ui.RB_Pipe->isChecked() ) port.Set_Port_Redirection( VM::PR_pipe ); else if( ui.RB_UDP->isChecked() ) port.Set_Port_Redirection( VM::PR_udp ); else if( ui.RB_TCP->isChecked() ) port.Set_Port_Redirection( VM::PR_tcp ); else if( ui.RB_Telnet->isChecked() ) port.Set_Port_Redirection( VM::PR_telnet ); else if( ui.RB_Unix->isChecked() ) port.Set_Port_Redirection( VM::PR_unix ); else if( ui.RB_COM->isChecked() ) port.Set_Port_Redirection( VM::PR_com ); else if( ui.RB_msmouse->isChecked() ) port.Set_Port_Redirection( VM::PR_msmouse ); else if( ui.RB_mon->isChecked() ) port.Set_Port_Redirection( VM::PR_mon ); else if( ui.RB_braille->isChecked() ) port.Set_Port_Redirection( VM::PR_braille ); else { AQError( "VM_Port Add_Port_Window::Get_Port() const", "Invalid Port Redirection!" ); } // Set Parametrs port.Set_Parametrs_Line( ui.Edit_Args->text() ); return port; } void Add_Port_Window::Set_Port( const VM_Port &port ) { switch( port.Get_Port_Redirection() ) { case VM::PR_vc: ui.RB_vc->setChecked( true ); break; case VM::PR_pty: ui.RB_pty->setChecked( true ); break; case VM::PR_none: ui.RB_none->setChecked( true ); break; case VM::PR_null: ui.RB_null->setChecked( true ); break; case VM::PR_dev: ui.RB_Dev->setChecked( true ); break; case VM::PR_file: ui.RB_File->setChecked( true ); break; case VM::PR_stdio: ui.RB_stdio->setChecked( true ); break; case VM::PR_pipe: ui.RB_Pipe->setChecked( true ); break; case VM::PR_udp: ui.RB_UDP->setChecked( true ); break; case VM::PR_tcp: ui.RB_TCP->setChecked( true ); break; case VM::PR_telnet: ui.RB_Telnet->setChecked( true ); break; case VM::PR_unix: ui.RB_Unix->setChecked( true ); break; case VM::PR_com: ui.RB_COM->setChecked( true ); break; case VM::PR_msmouse: ui.RB_msmouse->setChecked( true ); break; case VM::PR_mon: ui.RB_mon->setChecked( true ); break; case VM::PR_braille: ui.RB_braille->setChecked( true ); break; default: ui.RB_Default->setChecked( true ); break; } ui.Edit_Args->setText( port.Get_Parametrs_Line() ); } void Add_Port_Window::Connect_Slots() { connect( ui.RB_Default, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_Dev, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_File, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_Unix, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_UDP, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_vc, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_null, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_pty, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_TCP, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_stdio, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_none, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_Telnet, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_Pipe, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_COM, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_msmouse, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_mon, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); connect( ui.RB_braille, SIGNAL(toggled(bool)), this, SLOT(Show_Arg_Help()) ); } void Add_Port_Window::on_TB_Browse_clicked() { QString po = QFileDialog::getOpenFileName( this, tr("Open File"), Get_Last_Dir_Path(ui.Edit_Args->text()), tr("All Files (*)") ); if( ! po.isEmpty() ) ui.Edit_Args->setText( QDir::toNativeSeparators(po) ); } void Add_Port_Window::Show_Arg_Help() { // FIXME strings QStringList argsHelp; argsHelp << tr( "" ); argsHelp << tr( "Optionally width and height can be given in pixel with\n800x600\nIt is also possible to specify width or height in characters:\n80Cx24C" ); argsHelp << tr( "[Linux only] Pseudo TTY (a new PTY is automatically allocated)" ); argsHelp << tr( "No device is allocated." ); argsHelp << tr( "Void device" ); argsHelp << tr( "[Unix only] standard input/output" ); argsHelp << tr( "[Linux only] Use host tty, e.g. /dev/ttyS0.\nThe host serial port parameters are set according to the emulated ones." ); argsHelp << tr( "COMn Use host serial port n" ); argsHelp << tr( "filename - Write output to filename. No character can be read." ); argsHelp << tr( "filename - name pipe filename" ); argsHelp << tr( "[remote_host]:remote_port[@[src_ip]:src_port]\nThis implements UDP Net Console. When remote_host or src_ip are not specified they default to 0.0.0.0. When not using a specified src_port a random port is automatically chosen." ); argsHelp << tr( "[host]:port[,server][,nowait][,nodelay]\nExample to send tcp console to 192.168.0.2 port 4444\n92.168.0.2:4444\nExample to listen and wait on port 4444 for connection\n:4444,server\nExample to not wait and listen on ip 192.168.0.100 port 4444\n192.168.0.100:4444,server,nowait" ); argsHelp << tr( "host:port[,server][,nowait][,nodelay]\nThe telnet protocol is used instead of raw tcp sockets." ); argsHelp << tr( "path[,server][,nowait]\nA unix domain socket is used instead of a tcp socket. The option works the same as if you had specified -serial tcp except the unix domain socket path is used for connections." ); argsHelp << tr( "Three button serial mouse. Configure the guest to use Microsoft protocol." ); argsHelp << tr( "mon:dev_string\nThis is a special option to allow the monitor to be multiplexed onto another serial port." ); argsHelp << tr( "Braille device.\nThis will use BrlAPI to display the braille output on a real or fake device." ); if( ui.RB_Default->isChecked() ) ui.Label_Help->setText( argsHelp[0] ); else if( ui.RB_vc->isChecked() ) ui.Label_Help->setText( argsHelp[1] ); else if( ui.RB_pty->isChecked() ) ui.Label_Help->setText( argsHelp[2] ); else if( ui.RB_none->isChecked() ) ui.Label_Help->setText( argsHelp[3] ); else if( ui.RB_null->isChecked() ) ui.Label_Help->setText( argsHelp[4] ); else if( ui.RB_stdio->isChecked() ) ui.Label_Help->setText( argsHelp[5] ); else if( ui.RB_Dev->isChecked() ) ui.Label_Help->setText( argsHelp[6] ); else if( ui.RB_COM->isChecked() ) ui.Label_Help->setText( argsHelp[7] ); else if( ui.RB_File->isChecked() ) ui.Label_Help->setText( argsHelp[8] ); else if( ui.RB_Pipe->isChecked() ) ui.Label_Help->setText( argsHelp[9] ); else if( ui.RB_UDP->isChecked() ) ui.Label_Help->setText( argsHelp[10] ); else if( ui.RB_TCP->isChecked() ) ui.Label_Help->setText( argsHelp[11] ); else if( ui.RB_Telnet->isChecked() ) ui.Label_Help->setText( argsHelp[12] ); else if( ui.RB_Unix->isChecked() ) ui.Label_Help->setText( argsHelp[13] ); else if( ui.RB_msmouse->isChecked() ) ui.Label_Help->setText( argsHelp[14] ); else if( ui.RB_mon->isChecked() ) ui.Label_Help->setText( argsHelp[15] ); else if( ui.RB_braille->isChecked() ) ui.Label_Help->setText( argsHelp[16] ); else { ui.Label_Help->setText( "" ); AQError( "void Add_Port_Window::Show_Arg_Help()", "Invalid Port Redirection!" ); } } aqemu-0.9.2/src/Add_Port_Window.h000066400000000000000000000025361272330227200166230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ADD_PORT_WINDOW_H #define ADD_PORT_WINDOW_H #include "ui_Add_Port_Window.h" #include "VM_Devices.h" class Add_Port_Window: public QDialog { Q_OBJECT public: Add_Port_Window( QWidget *parent = 0 ); VM_Port Get_Port() const; void Set_Port( const VM_Port &port ); private slots: void Connect_Slots(); void Show_Arg_Help(); void on_TB_Browse_clicked(); private: Ui::Add_Port_Window ui; }; #endif aqemu-0.9.2/src/Add_Port_Window.ui000066400000000000000000000276761272330227200170250ustar00rootroot00000000000000 Add_Port_Window 0 0 464 484 Adding Port :/port.png:/port.png 0 0 Redirect virtual port to: Qt::Horizontal 10 &Default true vc (Virtual console) false pt&y (Pseudo TTY) &none nu&ll (/dev/null) false /dev/ Qt::Horizontal 18 20 File false stdio Pipe false COM &UDP msmouse Qt::Horizontal 40 20 &TCP Telnet Uni&x mon braille Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Fixed 40 10 0 0 Additional Arguments: Qt::Horizontal 10 ... :/open-file.png:/open-file.png Qt::Vertical QSizePolicy::Fixed 40 10 0 0 Arguments Help: Qt::Horizontal 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
RB_Default RB_vc RB_pty RB_none RB_null RB_Dev RB_File RB_stdio RB_Pipe RB_COM RB_UDP RB_msmouse RB_TCP RB_Telnet RB_Unix RB_mon RB_braille Edit_Args TB_Browse buttonBox accepted() Add_Port_Window accept() 167 455 231 241 buttonBox rejected() Add_Port_Window reject() 167 455 231 241
aqemu-0.9.2/src/Add_USB_Port_Window.cpp000066400000000000000000000157321272330227200176710ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Add_USB_Port_Window.h" #include "System_Info.h" Add_USB_Port_Window::Add_USB_Port_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Table_Host_USB ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Table_Host_USB->setVerticalHeader( hv ); /*hv = new QHeaderView( Qt::Horizontal, ui.Table_Host_USB ); hv->setResizeMode( QHeaderView::Interactive ); ui.Table_Host_USB->setHorizontalHeader( hv );*/ on_Button_Update_Host_USB_clicked(); } VM_USB Add_USB_Port_Window::Get_Port() const { if( ui.RB_QEMU_USB->isChecked() ) Current_Item.Set_Use_Host_Device( false ); else Current_Item.Set_Use_Host_Device( true ); bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; if( ui.RB_QEMU_Keyboard->isChecked() ) usb_k = true; else if( ui.RB_QEMU_Mouse->isChecked() ) usb_m = true; else if( ui.RB_QEMU_Tablet->isChecked() ) usb_t = true; else if( ui.RB_QEMU_WacomTablet->isChecked() ) usb_wt = true; else if( ui.RB_QEMU_Braille->isChecked() ) usb_b = true; Current_Item.Set_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); return Current_Item; } void Add_USB_Port_Window::Set_Port( const VM_USB &port ) { Current_Item = port; if( port.Get_Use_Host_Device() == false ) on_RB_QEMU_USB_clicked( true ); else on_RB_Host_USB_clicked( true ); bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; port.Get_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); if( usb_k ) ui.RB_QEMU_Keyboard->setChecked( true ); else if( usb_m ) ui.RB_QEMU_Mouse->setChecked( true ); else if( usb_t ) ui.RB_QEMU_Tablet->setChecked( true ); else if( usb_wt ) ui.RB_QEMU_WacomTablet->setChecked( true ); else if( usb_b ) ui.RB_QEMU_Braille->setChecked( true ); else { AQError( "void Add_USB_Port_Window::Set_Port( const VM_USB &port )", "No QEMU USB Device!" ); } ui.S_Manufacturer->setText( tr("Manufacturer: ") + port.Get_Manufacturer_Name() ); ui.S_Product->setText( tr("Product: ") + port.Get_Product_Name() ); ui.S_Speed->setText( tr("Speed: ") + port.Get_Speed() ); ui.S_BusAddr->setText( tr("bus.addr.path: %1.%2.%3").arg(port.Get_Bus()).arg(port.Get_Bus()).arg(port.Get_DevPath()) ); ui.S_Vendor_ID->setText( tr("Vendor ID: ") + port.Get_Vendor_ID() ); ui.S_Product_ID->setText( tr("Product ID: ") + port.Get_Product_ID() ); } void Add_USB_Port_Window::on_Button_Update_Host_USB_clicked() { // Update USB Info System_Info::Update_Host_USB(); // Update User Interface ui.Table_Host_USB->clearContents(); for( int rx = 0; rx < ui.Table_Host_USB->rowCount(); ) ui.Table_Host_USB->removeRow( rx ); if( ui.RB_Show_All->isChecked() ) { USB_Host_List = System_Info::Get_All_Host_USB(); } else { USB_Host_List = System_Info::Get_All_Host_USB(); QList used_USB_List = System_Info::Get_Used_USB_List(); for( int ix = 0; ix < used_USB_List.count(); ix++ ) { USB_Host_List.removeOne( used_USB_List[ix] ); } } if( USB_Host_List.count() < 1 ) { AQWarning( "void Add_USB_Port_Window::on_Button_Update_Host_USB_clicked()", "No Devices Found!" ); return; } // Add new items for( int ux = 0; ux < USB_Host_List.count(); ++ux ) { ui.Table_Host_USB->insertRow( ui.Table_Host_USB->rowCount() ); QTableWidgetItem *newItem; // Manufacturer if( USB_Host_List[ux].Get_Manufacturer_Name().isEmpty() ) newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Vendor_ID() ); else newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Manufacturer_Name() ); ui.Table_Host_USB->setItem( ui.Table_Host_USB->rowCount()-1, 0, newItem ); // Product if( USB_Host_List[ux].Get_Product_Name().isEmpty() ) newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Product_ID() ); else newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Product_Name() ); ui.Table_Host_USB->setItem( ui.Table_Host_USB->rowCount()-1, 1, newItem ); // Bus newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Bus() ); ui.Table_Host_USB->setItem( ui.Table_Host_USB->rowCount()-1, 2, newItem ); // Addr newItem = new QTableWidgetItem( USB_Host_List[ux].Get_Addr() ); ui.Table_Host_USB->setItem( ui.Table_Host_USB->rowCount()-1, 3, newItem ); // Path newItem = new QTableWidgetItem( USB_Host_List[ux].Get_DevPath() ); ui.Table_Host_USB->setItem( ui.Table_Host_USB->rowCount()-1, 4, newItem ); } ui.Table_Host_USB->resizeColumnsToContents(); } void Add_USB_Port_Window::on_RB_QEMU_USB_clicked( bool checked ) { ui.Widget_QEMU_Devices->setEnabled( true ); ui.Widget_Host_Devices->setEnabled( false ); ui.RB_QEMU_USB->setCheckable( true ); ui.RB_QEMU_USB->setChecked( true ); ui.RB_Host_USB->setChecked( false ); ui.RB_Host_USB->setCheckable( false ); } void Add_USB_Port_Window::on_RB_Host_USB_clicked( bool checked ) { ui.Widget_QEMU_Devices->setEnabled( false ); ui.Widget_Host_Devices->setEnabled( true ); ui.RB_Host_USB->setCheckable( true ); ui.RB_Host_USB->setChecked( true ); ui.RB_QEMU_USB->setChecked( false ); ui.RB_QEMU_USB->setCheckable( false ); } void Add_USB_Port_Window::on_Table_Host_USB_currentItemChanged( QTableWidgetItem *current, QTableWidgetItem *previous ) { if( ui.Table_Host_USB->currentRow() >= 0 && ui.Table_Host_USB->currentRow() < USB_Host_List.count() ) { Current_Item = USB_Host_List[ ui.Table_Host_USB->currentRow() ]; ui.S_Manufacturer->setText( tr("Manufacturer: ") + Current_Item.Get_Manufacturer_Name() ); ui.S_Product->setText( tr("Product: ") + Current_Item.Get_Product_Name() ); ui.S_Speed->setText( tr("Speed: ") + Current_Item.Get_Speed() ); ui.S_BusAddr->setText( tr("bus.addr.path: %1.%2.%3").arg(Current_Item.Get_Bus()).arg(Current_Item.Get_Bus()).arg(Current_Item.Get_DevPath()) ); ui.S_Vendor_ID->setText( tr("Vendor ID: ") + Current_Item.Get_Vendor_ID() ); ui.S_Product_ID->setText( tr("Product ID: ") + Current_Item.Get_Product_ID() ); } } void Add_USB_Port_Window::on_RB_Show_All_toggled( bool on ) { on_Button_Update_Host_USB_clicked(); } aqemu-0.9.2/src/Add_USB_Port_Window.h000066400000000000000000000031741272330227200173330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ADD_USB_PORT_WINDOW_H #define ADD_USB_PORT_WINDOW_H #include "ui_Add_USB_Port_Window.h" #include "VM_Devices.h" class Add_USB_Port_Window: public QDialog { Q_OBJECT public: Add_USB_Port_Window( QWidget *parent = 0 ); VM_USB Get_Port() const; void Set_Port( const VM_USB &port ); private slots: void on_Button_Update_Host_USB_clicked(); void on_RB_QEMU_USB_clicked( bool checked ); void on_RB_Host_USB_clicked( bool checked ); void on_Table_Host_USB_currentItemChanged( QTableWidgetItem *current, QTableWidgetItem *previous ); void on_RB_Show_All_toggled( bool on ); private: Ui::Add_USB_Port_Window ui; QList USB_Host_List; mutable VM_USB Current_Item; }; #endif aqemu-0.9.2/src/Add_USB_Port_Window.ui000066400000000000000000000370131272330227200175200ustar00rootroot00000000000000 Add_USB_Port_Window 0 0 490 496 Adding USB :/usb.png:/usb.png 0 0 Connecting virtual &QEMU USB device false false false Qt::Horizontal 10 0 0 Mouse true &Keyboard Qt::Horizontal 83 20 &Tablet Wacom tablet Qt::Horizontal 83 20 Braille Qt::Horizontal 40 20 0 0 Connecting &USB host device false false Qt::Horizontal 10 0 0 0 QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel Manufacturer: Product: bus: addr: path: 0 0 Show devices Qt::Horizontal 10 A&ll host devices true Qt::Horizontal 13 18 &Not used in running VM Qt::Vertical QSizePolicy::Fixed 100 10 0 0 Selected device Qt::Horizontal 10 Manufacturer: Product: Qt::Horizontal 123 20 Speed: Bus.Address: Qt::Horizontal 122 20 Vendor ID: Product ID: Qt::Horizontal 0 0 Update USB host list :/update.png:/update.png Qt::Horizontal 68 26 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
RB_QEMU_USB RB_QEMU_Mouse RB_QEMU_Keyboard RB_QEMU_Tablet RB_QEMU_WacomTablet RB_QEMU_Braille RB_Host_USB Table_Host_USB RB_Show_All RB_Show_Not_Used_Runtime Button_Update_Host_USB buttonBox accepted() Add_USB_Port_Window accept() 389 467 244 247 buttonBox rejected() Add_USB_Port_Window reject() 389 467 244 247
aqemu-0.9.2/src/Advanced_Options.ui000066400000000000000000000165571272330227200172160ustar00rootroot00000000000000 Advanced_Options 0 0 553 463 Advanced Options Advanced Options RTC TD hack (Fixes time drift in windows ACPI HAL) No shutdown Exit instead of rebooting No reboot Start CP&U at startup Check Floppy Disk boot signature in VM BIOS Check boot secto&r on FDD 0 0 Enable ACP&I 0 0 Start date (Day.Month.Year Hour:Minute:Second) false 2009 1 20 2100 12 31 1975 1 1 dd.MM.yyyy HH:mm:ss Fix Windows 2000 install Bug Windows &2K hack Custom QEMU Command Line Arguments Use only custom arguments without AQEMU arguments false Use emulator binary file in "Custom QEMU Command Line Arguments" 0 0 16777215 60 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
buttonBox accepted() Advanced_Options accept() 248 254 157 274 buttonBox rejected() Advanced_Options reject() 316 260 286 274 CH_Only_User_Args toggled(bool) CH_Use_User_Binary setEnabled(bool) 280 368 280 399
aqemu-0.9.2/src/Advanced_Settings_Window.cpp000066400000000000000000001132451272330227200210470ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include "Advanced_Settings_Window.h" #include "System_Info.h" #include "Utils.h" #include "Emulator_Options_Window.h" #include "First_Start_Wizard.h" #include "Create_Template_Window.h" #include "Settings_Widget.h" Advanced_Settings_Window::Advanced_Settings_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); settings_widget = new Settings_Widget( ui.All_Tabs, QBoxLayout::TopToBottom, true, false ); QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Emulators_Table ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Emulators_Table->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Emulators_Table ); hv->setSectionResizeMode( QHeaderView::Stretch ); ui.Emulators_Table->setHorizontalHeader( hv ); // Minimum Size resize( minimumSizeHint().width(), minimumSizeHint().height() ); // Execute Before Start QEMU ui.Edit_Before_Start_Command->setText( Settings.value("Run_Before_QEMU", "").toString() ); // Execute After Stop QEMU ui.Edit_After_Stop_Command->setText( Settings.value("Run_After_QEMU", "").toString() ); // Use Shared Folder For All Screenshots ui.CH_Screenshot_Folder->setChecked( Settings.value("Use_Screenshots_Folder", "no").toString() == "yes" ); // Screenshots Shared Folder Path ui.Edit_Screenshot_Folder->setText( Settings.value("Screenshot_Folder_Path", "").toString() ); // Screenshot save format QString fmt = Settings.value( "Screenshot_Save_Format", "PNG" ).toString(); if( fmt == "PNG" ) ui.RB_Format_PNG->setChecked( true ); else if( fmt == "JPEG" ) ui.RB_Format_Jpeg->setChecked( true ); else ui.RB_Format_PPM->setChecked( true ); // Jpeg Quality ui.HS_Jpeg_Quality->setValue( Settings.value("Jpeg_Quality", "75").toString().toInt() ); // Additional CDROM int cdrom_count = Settings.value( "Additional_CDROM_Devices/Count", "0" ).toString().toInt(); for( int ix = 0; ix < cdrom_count; ix++ ) { ui.CDROM_List->addItem( Settings.value("Additional_CDROM_Devices/Device" + QString::number(ix), "").toString() ); } // Information in Info Tab // ui.CH_Show_Tab_Info->setChecked( Settings.value("Info/Show_Tab_Info", "yes").toString() == "yes" ); ui.CH_Show_QEMU_Args->setChecked( Settings.value("Info/Show_QEMU_Args", "no").toString() == "yes" ); ui.CH_Show_Screenshot_in_Save_Mode->setChecked( Settings.value("Info/Show_Screenshot_in_Save_Mode", "no").toString() == "yes" ); ui.CH_Machine_Details->setChecked( Settings.value("Info/Machine_Details", "yes").toString() == "yes" ); ui.CH_Machine_Name->setChecked( Settings.value("Info/Machine_Name", "yes").toString() == "yes" ); ui.CH_Machine_Accelerator->setChecked( Settings.value("Info/Machine_Accelerator", "yes").toString() == "yes" ); ui.CH_Computer_Type->setChecked( Settings.value("Info/Computer_Type", "yes").toString() == "yes" ); ui.CH_Machine_Type->setChecked( Settings.value("Info/Machine_Type", "no").toString() == "yes" ); ui.CH_Boot_Priority->setChecked( Settings.value("Info/Boot_Priority", "yes").toString() == "yes" ); ui.CH_CPU_Type->setChecked( Settings.value("Info/CPU_Type", "no").toString() == "yes" ); ui.CH_Number_of_CPU->setChecked( Settings.value("Info/Number_of_CPU", "yes").toString() == "yes" ); ui.CH_Video_Card->setChecked( Settings.value("Info/Video_Card", "yes").toString() == "yes" ); ui.CH_Keyboard_Layout->setChecked( Settings.value("Info/Keyboard_Layout", "no").toString() == "yes" ); ui.CH_Memory_Size->setChecked( Settings.value("Info/Memory_Size", "yes").toString() == "yes" ); ui.CH_Use_Sound->setChecked( Settings.value("Info/Use_Sound", "yes").toString() == "yes" ); ui.CH_Fullscreen->setChecked( Settings.value("Info/Fullscreen", "yes").toString() == "yes" ); ui.CH_Snapshot->setChecked( Settings.value("Info/Snapshot", "yes").toString() == "yes" ); ui.CH_Localtime->setChecked( Settings.value("Info/Localtime", "yes").toString() == "yes" ); ui.CH_Show_FDD->setChecked( Settings.value("Info/Show_FDD", "yes").toString() == "yes" ); ui.CH_Show_CD->setChecked( Settings.value("Info/Show_CD", "yes").toString() == "yes" ); ui.CH_Show_HDD->setChecked( Settings.value("Info/Show_HDD", "yes").toString() == "yes" ); ui.CH_Network_Cards->setChecked( Settings.value("Info/Network_Cards", "yes").toString() == "yes" ); ui.CH_Redirections->setChecked( Settings.value("Info/Redirections", "no").toString() == "yes" ); ui.CH_Serial_Port->setChecked( Settings.value("Info/Serial_Port", "yes").toString() == "yes" ); ui.CH_Parallel_Port->setChecked( Settings.value("Info/Parallel_Port", "yes").toString() == "yes" ); ui.CH_USB_Port->setChecked( Settings.value("Info/USB_Port", "yes").toString() == "yes" ); ui.CH_Win2K_Hack->setChecked( Settings.value("Info/Win2K_Hack", "no").toString() == "yes" ); ui.CH_RTC_TD_Hack->setChecked( Settings.value("Info/RTC_TD_Hack", "no").toString() == "yes" ); ui.CH_No_Shutdown->setChecked( Settings.value("Info/No_Shutdown", "no").toString() == "yes" ); ui.CH_No_Reboot->setChecked( Settings.value("Info/No_Reboot", "no").toString() == "yes" ); ui.CH_Start_CPU->setChecked( Settings.value("Info/Start_CPU", "no").toString() == "yes" ); ui.CH_Check_Boot_on_FDD->setChecked( Settings.value("Info/Check_Boot_on_FDD", "no").toString() == "yes" ); ui.CH_ACPI->setChecked( Settings.value("Info/ACPI", "no").toString() == "yes" ); ui.CH_Start_Date->setChecked( Settings.value("Info/Start_Date", "no").toString() == "yes" ); ui.CH_No_Frame->setChecked( Settings.value("Info/No_Frame", "no").toString() == "yes" ); ui.CH_Alt_Grab->setChecked( Settings.value("Info/Alt_Grab", "no").toString() == "yes" ); ui.CH_No_Quit->setChecked( Settings.value("Info/No_Quit", "no").toString() == "yes" ); ui.CH_Portrait->setChecked( Settings.value("Info/Portrait", "no").toString() == "yes" ); ui.CH_Curses->setChecked( Settings.value("Info/Curses", "no").toString() == "yes" ); ui.CH_Show_Cursor->setChecked( Settings.value("Info/Show_Cursor", "no").toString() == "yes" ); ui.CH_Init_Graphical_Mode->setChecked( Settings.value("Info/Init_Graphical_Mode", "no").toString() == "yes" ); ui.CH_ROM_File->setChecked( Settings.value("Info/ROM_File", "no").toString() == "yes" ); ui.CH_MTDBlock->setChecked( Settings.value("Info/MTDBlock", "no").toString() == "yes" ); ui.CH_SD_Image->setChecked( Settings.value("Info/SD_Image", "no").toString() == "yes" ); ui.CH_PFlash->setChecked( Settings.value("Info/PFlash", "no").toString() == "yes" ); ui.CH_Linux_Boot->setChecked( Settings.value("Info/Linux_Boot", "no").toString() == "yes" ); ui.CH_VNC->setChecked( Settings.value("Info/VNC", "no").toString() == "yes" ); ui.CH_SPICE->setChecked( Settings.value("Info/SPICE", "no").toString() == "yes" ); // MAC Address Generation Mode ui.RB_MAC_Random->setChecked( Settings.value("MAC_Generation_Mode", "Model").toString() == "Random" ); ui.RB_MAC_QEMU->setChecked( Settings.value("MAC_Generation_Mode", "Model").toString() == "QEMU_Segment" ); ui.RB_MAC_Valid->setChecked( Settings.value("MAC_Generation_Mode", "Model").toString() == "Model" ); // Save to Log File ui.CH_Log_Save_in_File->setChecked( Settings.value("Log/Save_In_File", "yes").toString() == "yes" ); // Print In StdOut ui.CH_Log_Print_in_STDIO->setChecked( Settings.value("Log/Print_In_STDOUT", "yes").toString() == "yes" ); // Log File Path ui.Edit_Log_Path->setText( Settings.value("Log/Log_Path", Settings.value("VM_Directory", "").toString() + "aqemu.log").toString() ); // Save to AQEMU Log ui.CH_Log_Debug->setChecked( Settings.value("Log/Save_Debug", "no").toString() == "yes" ); ui.CH_Log_Warning->setChecked( Settings.value("Log/Save_Warning", "yes").toString() == "yes" ); ui.CH_Log_Error->setChecked( Settings.value("Log/Save_Error", "yes").toString() == "yes" ); // QEMU-IMG Path ui.Edit_QEMU_IMG_Path->setText( Settings.value("QEMU-IMG_Path", "qemu-img").toString() ); // First VNC Port for Embedded Display ui.SB_First_VNC_Port->setValue( Settings.value("First_VNC_Port", "5910").toString().toInt() ); // QEMU Monitor Type #ifdef Q_OS_WIN32 ui.RB_Monitor_STDIO->setEnabled( false ); ui.RB_Monitor_TCP->setChecked( true ); #else ui.RB_Monitor_TCP->setChecked( Settings.value("Emulator_Monitor_Type", "stdio").toString() == "tcp" ); #endif ui.CB_Monitor_Hostname->setEditText( Settings.value("Emulator_Monitor_Hostname", "localhost").toString() ); ui.SB_Monitor_Port->setValue( Settings.value("Emulator_MonGitor_Port", 6000).toInt() ); // QEMU_AUDIO ui.CH_Audio_Default->setChecked( Settings.value("QEMU_AUDIO/Use_Default_Driver", "yes").toString() == "no" ); // QEMU_AUDIO_DRV for( int ix = 0; ix < ui.CB_Host_Sound_System->count(); ++ix ) { if( ui.CB_Host_Sound_System->itemText(ix) == Settings.value("QEMU_AUDIO/QEMU_AUDIO_DRV", "alsa").toString() ) { ui.CB_Host_Sound_System->setCurrentIndex( ix ); } } // Tab USB ui.RB_USB_Style_device->setChecked( Settings.value("USB_Style", "device").toString() == "device" ); QString usbID = Settings.value( "USB_ID_Style", "BusPath" ).toString(); if( usbID == "BusAdd" ) ui.RB_USB_ID_BusAddr->setChecked( true ); else if( usbID == "VendorProduct" ) ui.RB_USB_ID_VendorProduct->setChecked( true ); else ui.RB_USB_ID_BusPath->setChecked( true ); // Update emulators list if( Load_Emulators_Info() ) Update_Emulators_Info(); /////////////////////// // Old Settings Window // Minimum Size resize( width(), minimumSizeHint().height() ); // Emulator Control bool emul_show = Settings.value( "Show_Emulator_Control_Window", "yes" ).toString() == "yes"; bool emul_vnc = Settings.value( "Use_VNC_Display", "no" ).toString() == "yes"; bool emul_include = Settings.value( "Include_Emulator_Control", "yes" ).toString() == "yes"; if( emul_show == true && emul_vnc == false && emul_include == false ) { ui.RB_Emul_Show_Window->setChecked( true ); } else if( emul_show == true && emul_vnc == true && emul_include == false ) { ui.RB_Emul_Show_VNC->setChecked( true ); } else if( emul_show == true && emul_vnc == false && emul_include == true ) { ui.RB_Emul_Show_In_Main_Window->setChecked( true ); } else if( emul_show == true && emul_vnc == true && emul_include == true ) { ui.RB_Emul_Show_VNC_In_Main_Window->setChecked( true ); } else if( emul_show == false && emul_vnc == false && emul_include == false ) { ui.RB_Emul_No_Show->setChecked( true ); } #ifndef VNC_DISPLAY ui.RB_Emul_Show_VNC->setEnabled( false ); ui.RB_Emul_Show_VNC_In_Main_Window->setEnabled( false ); if( ui.RB_Emul_Show_VNC->isChecked() ) ui.RB_Emul_Show_Window->setChecked( true ); else if( ui.RB_Emul_Show_VNC_In_Main_Window->isChecked() ) ui.RB_Emul_Show_In_Main_Window->setChecked( true ); #endif // Virtual Machines Folder ui.Edit_VM_Folder->setText( QDir::toNativeSeparators(Settings.value("VM_Directory", QDir::homePath() + "/.aqemu/").toString()) ); // Use New Emulator Control Removable Device Menu ui.CH_Use_New_Device_Changer->setChecked( Settings.value("Use_New_Device_Changer", "no").toString() == "yes" ); // Find All Language Files (*.qm) QDir data_dir( Settings.value("AQEMU_Data_Folder", "/usr/share/aqemu/").toString() ); QFileInfoList lang_files = data_dir.entryInfoList( QStringList("*.qm"), QDir::Files, QDir::Name ); if( lang_files.count() > 0 ) { // Add Languages to List for( int dd = 0; dd < lang_files.count(); ++dd ) { ui.CB_Language->addItem( lang_files[dd].completeBaseName() ); if( lang_files[dd].completeBaseName() == Settings.value( "Language", "en" ).toString() ) { ui.CB_Language->setCurrentIndex( dd + 1 ); // First Item 'English' } } } // VM Icons Size switch( Settings.value("VM_Icons_Size", "48").toInt() ) { case 16: ui.CB_VM_Icons_Size->setCurrentIndex( 0 ); break; case 24: ui.CB_VM_Icons_Size->setCurrentIndex( 1 ); break; case 32: ui.CB_VM_Icons_Size->setCurrentIndex( 2 ); break; case 48: ui.CB_VM_Icons_Size->setCurrentIndex( 3 ); break; case 64: ui.CB_VM_Icons_Size->setCurrentIndex( 4 ); break; default: ui.CB_VM_Icons_Size->setCurrentIndex( 3 ); break; } // Screenshot for OS Logo ui.CH_Screenshot_for_OS_Logo->setChecked( Settings.value("Use_Screenshot_for_OS_Logo", "yes").toString() == "yes" ); Load_Templates(); connect( ui.RB_Emul_Show_VNC, SIGNAL(toggled(bool)), this, SLOT(VNC_Warning(bool)) ); connect( ui.RB_Emul_Show_VNC_In_Main_Window, SIGNAL(toggled(bool)), this, SLOT(VNC_Warning(bool)) ); connect( ui.CB_Language, SIGNAL(currentIndexChanged(int)), this, SLOT(CB_Language_currentIndexChanged(int)) ); } Advanced_Settings_Window::~Advanced_Settings_Window() { delete settings_widget; } void Advanced_Settings_Window::Load_Templates() { QList all_templates = Get_Templates_List(); ui.CB_Default_VM_Template->clear(); for( int ix = 0; ix < all_templates.count(); ++ix ) { QFileInfo tmp_info = QFileInfo( all_templates[ix] ); ui.CB_Default_VM_Template->addItem( tmp_info.completeBaseName() ); } // no items found if( ui.CB_Default_VM_Template->count() < 1 ) { AQGraphic_Warning( tr("Warning"), tr("AQEMU VM Templates Not Found!") ); } else { // Find default template for( int ix = 0; ix < ui.CB_Default_VM_Template->count(); ++ix ) { if( ui.CB_Default_VM_Template->itemText(ix) == Settings.value("Default_VM_Template", "Linux 2.6").toString() ) { ui.CB_Default_VM_Template->setCurrentIndex( ix ); } } } } void Advanced_Settings_Window::on_Button_Create_Template_from_VM_clicked() { Create_Template_Window *templ_win = new Create_Template_Window(); if( templ_win->exec() == QDialog::Accepted ) { Load_Templates(); QMessageBox::information( this, tr("Information"), tr("New template was created!") ); } delete templ_win; } void Advanced_Settings_Window::on_TB_VM_Folder_clicked() { QString folder = QFileDialog::getExistingDirectory( this, tr("Set your VM folder"), Get_Last_Dir_Path(ui.Edit_VM_Folder->text()) ); if( ! folder.isEmpty() ) { if( ! (folder.endsWith("/") || folder.endsWith("\\")) ) folder += "/"; ui.Edit_VM_Folder->setText( QDir::toNativeSeparators(folder) ); } } void Advanced_Settings_Window::CB_Language_currentIndexChanged( int index ) { if( Settings.value("Show_Language_Warning", "yes").toString() == "yes" ) { if( QMessageBox::information(this, tr("Information"), tr("Language will set after restarting AQEMU\nShow this message in future?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No ) { Settings.setValue( "Show_Language_Warning", "no" ); } } } void Advanced_Settings_Window::CB_Icons_Theme_currentIndexChanged( int index ) { if( Settings.value("Show_Icons_Theme_Warning", "yes").toString() == "yes" ) { if( QMessageBox::information(this, tr("Information"), tr("Icons theme be set after restart AQEMU\nShow this message in future?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No ) { Settings.setValue( "Show_Icons_Theme_Warning", "no" ); } } } void Advanced_Settings_Window::VNC_Warning( bool state ) { if( ! state ) return; if( Settings.value("Show_VNC_Warning", "yes").toString() == "yes" ) { if( QMessageBox::information(this, tr("Information"), tr("Support for this feature is not complete! If there is no picture, click \"View->Reinit VNC\"\nShow This Message Again?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No ) { Settings.setValue( "Show_VNC_Warning", "no" ); } } } void Advanced_Settings_Window::done(int r) { if ( r == QDialog::Accepted ) { // Execute Before Start QEMU Settings.setValue( "Run_Before_QEMU", ui.Edit_Before_Start_Command->text() ); // Execute After Stop QEMU Settings.setValue( "Run_After_QEMU", ui.Edit_After_Stop_Command->text() ); // Use Shared Folder For All Screenshots if( ui.CH_Screenshot_Folder->isChecked() ) { Settings.setValue( "Use_Screenshots_Folder", "yes" ); QDir dir; // For Check on valid // Screenshots Shared Folder Path if( dir.exists(ui.Edit_Screenshot_Folder->text()) ) { Settings.setValue( "Screenshot_Folder_Path", ui.Edit_Screenshot_Folder->text() ); } else { AQGraphic_Warning( tr("Invalid Value!"), tr("Shared screenshot folder doesn't exist!") ); return; } } else { Settings.setValue( "Use_Screenshots_Folder", "no" ); // Screenshots Shared Folder Path Settings.setValue( "Screenshot_Folder_Path", ui.Edit_Screenshot_Folder->text() ); } // Screenshot save format if( ui.RB_Format_PNG->isChecked() ) Settings.setValue( "Screenshot_Save_Format", "PNG" ); else if( ui.RB_Format_Jpeg->isChecked() ) Settings.setValue( "Screenshot_Save_Format", "JPEG" ); else Settings.setValue( "Screenshot_Save_Format", "PPM" ); // Jpeg Quality Settings.setValue( "Jpeg_Quality", QString::number(ui.HS_Jpeg_Quality->value()) ); // Additional CDROM int old_count = Settings.value( "Additional_CDROM_Devices/Count", "0" ).toString().toInt(); if( old_count > ui.CDROM_List->count() ) { // Delete Old Items for( int dx = ui.CDROM_List->count()-1; dx < old_count; dx++ ) { Settings.remove( "Additional_CDROM_Devices/Device" + QString::number(dx) ); } } Settings.setValue( "Additional_CDROM_Devices/Count", QString::number(ui.CDROM_List->count()) ); for( int ix = 0; ix < ui.CDROM_List->count(); ix++ ) { Settings.setValue( "Additional_CDROM_Devices/Device" + QString::number(ix), ui.CDROM_List->item(ix)->text() ); } // Settings.setValue( "Info/Show_Tab_Info", ui.CH_Show_Tab_Info->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_QEMU_Args", ui.CH_Show_QEMU_Args->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_Screenshot_in_Save_Mode", ui.CH_Show_Screenshot_in_Save_Mode->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Machine_Details", ui.CH_Machine_Details->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Machine_Name", ui.CH_Machine_Name->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Machine_Accelerator", ui.CH_Machine_Accelerator->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Computer_Type", ui.CH_Computer_Type->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Machine_Type", ui.CH_Machine_Type->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Boot_Priority", ui.CH_Boot_Priority->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/CPU_Type", ui.CH_CPU_Type->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Number_of_CPU", ui.CH_Number_of_CPU->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Video_Card", ui.CH_Video_Card->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Keyboard_Layout", ui.CH_Keyboard_Layout->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Memory_Size", ui.CH_Memory_Size->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Use_Sound", ui.CH_Use_Sound->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Fullscreen", ui.CH_Fullscreen->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Snapshot", ui.CH_Snapshot->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Localtime", ui.CH_Localtime->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_FDD", ui.CH_Show_FDD->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_CD", ui.CH_Show_CD->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_HDD", ui.CH_Show_HDD->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Network_Cards", ui.CH_Network_Cards->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Redirections", ui.CH_Redirections->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Serial_Port", ui.CH_Serial_Port->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Parallel_Port", ui.CH_Parallel_Port->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/USB_Port", ui.CH_USB_Port->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Win2K_Hack", ui.CH_Win2K_Hack->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/RTC_TD_Hack", ui.CH_RTC_TD_Hack->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/No_Shutdown", ui.CH_No_Shutdown->isChecked()? "yes" : "no" ); Settings.setValue( "Info/No_Reboot", ui.CH_No_Reboot->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Start_CPU", ui.CH_Start_CPU->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Check_Boot_on_FDD", ui.CH_Check_Boot_on_FDD->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/ACPI", ui.CH_ACPI->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Start_Date", ui.CH_Start_Date->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/No_Frame", ui.CH_No_Frame->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Alt_Grab", ui.CH_Alt_Grab->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/No_Quit", ui.CH_No_Quit->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Portrait", ui.CH_Portrait->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Curses", ui.CH_Curses->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Show_Cursor", ui.CH_Show_Cursor->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Init_Graphical_Mode", ui.CH_Init_Graphical_Mode->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/ROM_File", ui.CH_ROM_File->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/MTDBlock", ui.CH_MTDBlock->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/SD_Image", ui.CH_SD_Image->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/PFlash", ui.CH_PFlash->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/Linux_Boot", ui.CH_Linux_Boot->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/VNC", ui.CH_VNC->isChecked() ? "yes" : "no" ); Settings.setValue( "Info/SPICE", ui.CH_SPICE->isChecked() ? "yes" : "no" ); // MAC Address Generation Mode if( ui.RB_MAC_Random->isChecked() ) Settings.setValue( "MAC_Generation_Mode", "Random" ); else if( ui.RB_MAC_QEMU->isChecked() ) Settings.setValue( "MAC_Generation_Mode", "QEMU_Segment" ); else if( ui.RB_MAC_Valid->isChecked() ) Settings.setValue( "MAC_Generation_Mode", "Model" ); // Save to Log File if( ui.CH_Log_Save_in_File->isChecked() ) Settings.setValue( "Log/Save_In_File", "yes" ); else Settings.setValue( "Log/Save_In_File", "no" ); // Print In StdOut if( ui.CH_Log_Print_in_STDIO->isChecked() ) Settings.setValue( "Log/Print_In_STDOUT", "yes" ); else Settings.setValue( "Log/Print_In_STDOUT", "no" ); // Log File Path Settings.setValue( "Log/Log_Path", ui.Edit_Log_Path->text() ); // Save to AQEMU Log if( ui.CH_Log_Debug->isChecked() ) Settings.setValue( "Log/Save_Debug", "yes" ); else Settings.setValue( "Log/Save_Debug", "no" ); if( ui.CH_Log_Warning->isChecked() ) Settings.setValue( "Log/Save_Warning", "yes" ); else Settings.setValue( "Log/Save_Warning", "no" ); if( ui.CH_Log_Error->isChecked() ) Settings.setValue( "Log/Save_Error", "yes" ); else Settings.setValue( "Log/Save_Error", "no" ); // QEMU-IMG Path Settings.setValue( "QEMU-IMG_Path", ui.Edit_QEMU_IMG_Path->text() ); // QEMU_AUDIO if( ui.CH_Audio_Default->isChecked() ) Settings.setValue( "QEMU_AUDIO/Use_Default_Driver", "no" ); else Settings.setValue( "QEMU_AUDIO/Use_Default_Driver", "yes" ); // QEMU_AUDIO_DRV Settings.setValue( "QEMU_AUDIO/QEMU_AUDIO_DRV", ui.CB_Host_Sound_System->currentText() ); // First VNC Port for Embedded Display Settings.setValue( "First_VNC_Port", QString::number(ui.SB_First_VNC_Port->value()) ); // QEMU Monitor Type #ifdef Q_OS_WIN32 Settings.setValue( "Emulator_Monitor_Type", "tcp" ); #else Settings.setValue( "Emulator_Monitor_Type", ui.RB_Monitor_TCP->isChecked() ? "tcp" : "stdio" ); #endif Settings.setValue( "Emulator_Monitor_Hostname", ui.CB_Monitor_Hostname->currentText() ); Settings.setValue( "Emulator_Monitor_Port", ui.SB_Monitor_Port->value() ); // USB if( ui.RB_USB_Style_device->isChecked() ) Settings.setValue( "USB_Style", "device" ); else Settings.setValue( "USB_Style", "usbdevice" ); if( ui.RB_USB_ID_BusAddr->isChecked() ) Settings.setValue( "USB_ID_Style", "BusAddr" ); else if( ui.RB_USB_ID_BusPath->isChecked() ) Settings.setValue( "USB_ID_Style", "BusPath" ); else if( ui.RB_USB_ID_VendorProduct->isChecked() ) Settings.setValue( "USB_ID_Style", "VendorProduct" ); // All OK? if( Settings.status() != QSettings::NoError ) AQError( "void Advanced_Settings_Window::done(int)", "QSettings Error!" ); QDir dir; // For Check on valid Settings.setValue( "Default_VM_Template", ui.CB_Default_VM_Template->currentText() ); ui.Edit_VM_Folder->setText( QDir::toNativeSeparators(ui.Edit_VM_Folder->text()) ); // VM Folder if( ! (ui.Edit_VM_Folder->text().endsWith("/") || ui.Edit_VM_Folder->text().endsWith("\\")) ) ui.Edit_VM_Folder->setText( ui.Edit_VM_Folder->text() + QDir::toNativeSeparators("/") ); if( dir.exists(ui.Edit_VM_Folder->text()) ) { if( ! dir.exists(ui.Edit_VM_Folder->text() + QDir::toNativeSeparators("/os_templates/")) ) dir.mkdir( ui.Edit_VM_Folder->text() + QDir::toNativeSeparators("/os_templates/") ); Settings.setValue( "VM_Directory", ui.Edit_VM_Folder->text() ); } else { int mes_res = QMessageBox::question( this, tr("Invalid Value!"), tr("AQEMU VM folder doesn't exist! Do you want to create it?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if( mes_res == QMessageBox::Yes ) { if( ! (dir.mkdir(ui.Edit_VM_Folder->text()) && dir.mkdir(ui.Edit_VM_Folder->text() + QDir::toNativeSeparators("/os_templates/"))) ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Create New Folder!") ); return; } else Settings.setValue( "VM_Directory", ui.Edit_VM_Folder->text() ); } else return; } // Use New Emulator Control Removable Device Menu if( ui.CH_Use_New_Device_Changer->isChecked() ) Settings.setValue( "Use_New_Device_Changer", "yes" ); else Settings.setValue( "Use_New_Device_Changer", "no" ); // Interface Language if( ui.CB_Language->currentIndex() == 0 ) Settings.setValue( "Language", "en" ); else Settings.setValue( "Language", ui.CB_Language->itemText(ui.CB_Language->currentIndex()) ); // VM Icons Size switch( ui.CB_VM_Icons_Size->currentIndex() ) { case 0: Settings.setValue( "VM_Icons_Size", 16 ); break; case 1: Settings.setValue( "VM_Icons_Size", 24 ); break; case 2: Settings.setValue( "VM_Icons_Size", 32 ); break; case 3: Settings.setValue( "VM_Icons_Size", 48 ); break; case 4: Settings.setValue( "VM_Icons_Size", 64 ); break; default: Settings.setValue( "VM_Icons_Size", 48 ); break; } /* // USB Support if( ui.CH_Use_USB->isChecked() ) Settings.setValue( "Use_USB", "yes" ); else Settings.setValue( "Use_USB", "no" ); */ // Screenshot for OS Logo if( ui.CH_Screenshot_for_OS_Logo->isChecked() ) Settings.setValue( "Use_Screenshot_for_OS_Logo", "yes" ); else Settings.setValue( "Use_Screenshot_for_OS_Logo", "no" ); /* // 64x64 Icons if( ui.CH_64_Icons->isChecked() ) Settings.setValue( "64x64_Icons", "yes" ); else Settings.setValue( "64x64_Icons", "no" );*/ Settings.sync(); if( Settings.status() != QSettings::NoError ) { AQError( "void Settings_Window::on_Button_Box_clicked( QAbstractButton* button )", "QSettings Error!" ); } // Emulator Control if( ui.RB_Emul_Show_Window->isChecked() ) { Settings.setValue( "Show_Emulator_Control_Window", "yes" ); Settings.setValue( "Use_VNC_Display", "no" ); Settings.setValue( "Include_Emulator_Control", "no" ); } else if( ui.RB_Emul_Show_VNC->isChecked() ) { Settings.setValue( "Show_Emulator_Control_Window", "yes" ); Settings.setValue( "Use_VNC_Display", "yes" ); Settings.setValue( "Include_Emulator_Control", "no" ); } else if( ui.RB_Emul_Show_In_Main_Window->isChecked() ) { Settings.setValue( "Show_Emulator_Control_Window", "yes" ); Settings.setValue( "Use_VNC_Display", "no" ); Settings.setValue( "Include_Emulator_Control", "yes" ); } else if( ui.RB_Emul_Show_VNC_In_Main_Window->isChecked() ) { Settings.setValue( "Show_Emulator_Control_Window", "yes" ); Settings.setValue( "Use_VNC_Display", "yes" ); Settings.setValue( "Include_Emulator_Control", "yes" ); } else if( ui.RB_Emul_No_Show->isChecked() ) { Settings.setValue( "Show_Emulator_Control_Window", "no" ); Settings.setValue( "Use_VNC_Display", "no" ); Settings.setValue( "Include_Emulator_Control", "no" ); } } QDialog::done(r); } void Advanced_Settings_Window::on_TB_Browse_Before_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select executable"), Get_Last_Dir_Path(ui.Edit_Before_Start_Command->text()), tr("All Files (*);;Scripts (*.sh)") ); if( ! fileName.isEmpty() ) ui.Edit_Before_Start_Command->setText( QDir::toNativeSeparators(fileName) ); } void Advanced_Settings_Window::on_TB_Browse_After_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select executable"), Get_Last_Dir_Path(ui.Edit_After_Stop_Command->text()), tr("All Files (*);;Scripts (*.sh)") ); if( ! fileName.isEmpty() ) ui.Edit_After_Stop_Command->setText( QDir::toNativeSeparators(fileName) ); } void Advanced_Settings_Window::on_TB_Log_File_clicked() { QString fileName = QFileDialog::getSaveFileName( this, tr("Select or Create Log File"), Get_Last_Dir_Path(ui.Edit_Log_Path->text()), tr("All Files (*)") ); if( ! fileName.isEmpty() ) ui.Edit_Log_Path->setText( QDir::toNativeSeparators(fileName) ); } void Advanced_Settings_Window::on_TB_QEMU_IMG_Browse_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select executable"), Get_Last_Dir_Path(ui.Edit_After_Stop_Command->text()), tr("All Files (*)") ); if( ! fileName.isEmpty() ) ui.Edit_QEMU_IMG_Path->setText( QDir::toNativeSeparators(fileName) ); } void Advanced_Settings_Window::on_TB_Add_Emulator_clicked() { Emulator_Options_Window *emulatorOptionsWin = new Emulator_Options_Window( this ); emulatorOptionsWin->Set_All_Emulators_Names( Get_All_Emulators_Names() ); emulatorOptionsWin->Set_Emulator( Emulator() ); if( emulatorOptionsWin->exec() == QDialog::Accepted ) { Emulator new_emul = emulatorOptionsWin->Get_Emulator(); // Is there a default emulator already? bool found = false; for( int ix = 0; ix < Emulators.count(); ix++ ) { if( Emulators[ix].Get_Default() ) { found = true; break; } } if( found == false ) new_emul.Set_Default( true ); Emulators << new_emul; Update_Emulators_Info(); } delete emulatorOptionsWin; } void Advanced_Settings_Window::on_TB_Delete_Emulator_clicked() { int cur_index = ui.Emulators_Table->currentRow(); if( cur_index >= 0 && cur_index < Emulators.count() ) { Emulators.removeAt( cur_index ); ui.Emulators_Table->removeRow( cur_index ); for( int ex = 0; ex < Emulators.count(); ++ex ) { Emulators[ ex ].Set_Default( true ); ui.Emulators_Table->item( ex, 3 )->setText( tr("Yes") ); break; } } } void Advanced_Settings_Window::on_TB_Edit_Emulator_clicked() { int cur_index = ui.Emulators_Table->currentRow(); if( cur_index >= 0 && cur_index < Emulators.count() ) { Emulator_Options_Window *emulatorOptionsWin = new Emulator_Options_Window( this ); emulatorOptionsWin->Set_All_Emulators_Names( Get_All_Emulators_Names() ); emulatorOptionsWin->Set_Emulator( Emulators[cur_index] ); if( emulatorOptionsWin->exec() == QDialog::Accepted ) { Emulators[ cur_index ] = emulatorOptionsWin->Get_Emulator(); Update_Emulators_Info(); } delete emulatorOptionsWin; } } void Advanced_Settings_Window::on_TB_Use_Default_clicked() { int cur_index = ui.Emulators_Table->currentRow(); if( cur_index >= 0 && cur_index < Emulators.count() ) { Emulators[ cur_index ].Set_Default( true ); for( int ix = 0; ix < Emulators.count(); ix++ ) { Emulators[ ix ].Set_Default( false ); } Update_Emulators_Info(); } } void Advanced_Settings_Window::on_TB_Find_All_Emulators_clicked() { First_Start_Wizard *first_start_win = new First_Start_Wizard( NULL ); if( first_start_win->Find_Emulators() ) { AQDebug( "void Advanced_Settings_Window::on_TB_Find_All_Emulators_clicked()", "Find Emulators and Save Settings Complete" ); // Update Emulators List if( Load_Emulators_Info() ) Update_Emulators_Info(); // QEMU-IMG Path ui.Edit_QEMU_IMG_Path->setText( Settings.value("QEMU-IMG_Path", "qemu-img").toString() ); } else { AQGraphic_Error( "void Advanced_Settings_Window::on_TB_Find_All_Emulators_clicked()", tr("Error!"), tr("Cannot find any emulators installed on your OS! Please add them manually!"), false ); } delete first_start_win; } void Advanced_Settings_Window::on_Emulators_Table_cellDoubleClicked( int row, int column ) { on_TB_Edit_Emulator_clicked(); } void Advanced_Settings_Window::on_Button_CDROM_Add_clicked() { bool ok = false; QString text = QInputDialog::getText( this, tr("Add CD/DVD Device"), tr("Enter Device Name. Example: /dev/cdrom"), QLineEdit::Normal, "", &ok ); if( ok && ! text.isEmpty() ) ui.CDROM_List->addItem( text ); } void Advanced_Settings_Window::on_Button_CDROM_Edit_clicked() { if( ui.CDROM_List->currentRow() >= 0 ) { bool ok = false; QString text = QInputDialog::getText( this, tr("Add CD/DVD Device"), tr("Enter Device Name. Sample: /dev/cdrom"), QLineEdit::Normal, ui.CDROM_List->currentItem()->text(), &ok ); if( ok && ! text.isEmpty() ) ui.CDROM_List->currentItem()->setText( text ); } } void Advanced_Settings_Window::on_Button_CDROM_Delete_clicked() { if( ui.CDROM_List->currentRow() >= 0 ) ui.CDROM_List->takeItem( ui.CDROM_List->currentRow() ); } bool Advanced_Settings_Window::Load_Emulators_Info() { if( Emulators.count() > 0 ) Emulators.clear(); Emulators = Get_Emulators_List(); if( Emulators.count() <= 0 ) return false; else return true; } bool Advanced_Settings_Window::Save_Emulators_Info() { // FIXME save only if emulators changed // Check defaults emulators bool installed_qemu, default_qemu; installed_qemu = default_qemu = false; for( int ix = 0; ix < Emulators.count(); ++ix ) { installed_qemu = true; if( Emulators[ix].Get_Default() ) default_qemu = true; } if( installed_qemu && default_qemu == false ) { AQGraphic_Warning( tr("Error!"), tr("Default QEMU Emulator isn't selected!") ); return false; } // Remove old emulators files if( ! Remove_All_Emulators_Files() ) { AQWarning( "bool Advanced_Settings_Window::Save_Emulators_Info()", "Not all old emulators files removed!" ); } // Save new files for( int ix = 0; ix < Emulators.count(); ++ix ) { if( ! Emulators[ ix ].Save() ) { AQGraphic_Warning( tr("Error!"), tr("Cannot save emulator \"%1\"!").arg(Emulators[ix].Get_Name()) ); } } return true; } void Advanced_Settings_Window::Update_Emulators_Info() { ui.Emulators_Table->clearContents(); while( ui.Emulators_Table->rowCount() > 0 ) ui.Emulators_Table->removeRow( 0 ); for( int ix = 0; ix < Emulators.count(); ++ix ) { ui.Emulators_Table->insertRow( ui.Emulators_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Emulators[ix].Get_Name() ); ui.Emulators_Table->setItem( ui.Emulators_Table->rowCount()-1, 0, newItem ); newItem = new QTableWidgetItem( Emulator_Version_To_String(Emulators[ix].Get_Version()) ); // FIXME version,check,force ui.Emulators_Table->setItem( ui.Emulators_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( Emulators[ix].Get_Path() ); ui.Emulators_Table->setItem( ui.Emulators_Table->rowCount()-1, 2, newItem ); newItem = new QTableWidgetItem( Emulators[ix].Get_Default() ? tr("Yes") : tr("No") ); ui.Emulators_Table->setItem( ui.Emulators_Table->rowCount()-1, 3, newItem ); } } void Advanced_Settings_Window::on_TB_Screenshot_Folder_clicked() { QString folder = QFileDialog::getExistingDirectory( this, tr("Choose Screenshot Folder"), Settings.value("Screenshot_Folder_Path", "~").toString() ); if( ! folder.isEmpty() ) ui.Edit_Screenshot_Folder->setText( QDir::toNativeSeparators(folder) ); } QStringList Advanced_Settings_Window::Get_All_Emulators_Names() const { QStringList list; for( int ix = 0; ix < Emulators.count(); ix++ ) list << Emulators[ ix ].Get_Name(); return list; } aqemu-0.9.2/src/Advanced_Settings_Window.h000066400000000000000000000047621272330227200205170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ADVANCED_SETTINGS_WINDOW_H #define ADVANCED_SETTINGS_WINDOW_H #include #include "VM_Devices.h" #include "ui_Advanced_Settings_Window.h" class Settings_Widget; class Advanced_Settings_Window: public QDialog { Q_OBJECT public: Advanced_Settings_Window( QWidget *parent = 0 ); ~Advanced_Settings_Window(); public slots: void done(int); private slots: /// Old Setttings Window void on_Button_Create_Template_from_VM_clicked(); void on_TB_VM_Folder_clicked(); void CB_Language_currentIndexChanged( int index ); void CB_Icons_Theme_currentIndexChanged( int index ); void VNC_Warning( bool state ); void Load_Templates(); /// void on_TB_Browse_Before_clicked(); void on_TB_Browse_After_clicked(); void on_TB_Log_File_clicked(); void on_TB_Screenshot_Folder_clicked(); void on_TB_QEMU_IMG_Browse_clicked(); void on_TB_Add_Emulator_clicked(); void on_TB_Delete_Emulator_clicked(); void on_TB_Edit_Emulator_clicked(); void on_TB_Use_Default_clicked(); void on_TB_Find_All_Emulators_clicked(); void on_Emulators_Table_cellDoubleClicked( int row, int column ); void on_Button_CDROM_Add_clicked(); void on_Button_CDROM_Edit_clicked(); void on_Button_CDROM_Delete_clicked(); bool Load_Emulators_Info(); bool Save_Emulators_Info(); void Update_Emulators_Info(); QStringList Get_All_Emulators_Names() const; private: Ui::Advanced_Settings_Window ui; QSettings Settings; Settings_Widget* settings_widget; QList Emulators; }; #endif aqemu-0.9.2/src/Advanced_Settings_Window.ui000066400000000000000000002730201272330227200207000ustar00rootroot00000000000000 Andrey Rijov, 2016 Tobias Gläßer Advanced_Settings_Window 0 0 673 745 0 0 AQEMU Settings :/configure.png:/configure.png 11 11 11 11 0 Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok 6 :/qemu-black-and-orange.png:/qemu-black-and-orange.png Emulator QLayout::SetMinimumSize 11 0 0 0 7 0 0 0 0 0 0 0 0 Find QEMU :/system-search.png:/system-search.png 24 24 Qt::ToolButtonTextUnderIcon 0 0 Add :/add.png:/add.png 24 24 Qt::ToolButtonTextUnderIcon 0 0 Delete :/remove.png:/remove.png 24 24 Qt::ToolButtonTextUnderIcon 0 0 Edit :/edit.png:/edit.png 24 24 Qt::ToolButtonTextUnderIcon 0 0 Set Default :/apply.png:/apply.png 24 24 Qt::ToolButtonTextUnderIcon QAbstractItemView::NoEditTriggers QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel true 130 true false Name Version Path Default Qt::Vertical 20 226 0 0 <html><head/><body><p><span style=" font-size:10pt; font-weight:600; color:#ed1f1f;">Required:</span><span style=" font-size:10pt;"> QEMU needs to be installed </span></p></body></html> :/windows-actions.png:/windows-actions.png User Interface 11 0 0 0 Basic Settings 10 0 0 AQEMU VM folder: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 0 0 &Default VM template: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Default_VM_Template 0 0 ... :/open-folder.png:/open-folder.png Create Template :/add.png:/add.png User Interface 10 0 0 Language: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter New removable device menu 0 0 Use screenshot as VM icon true 0 0 English 0 0 VM icon size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 4 16x16 24x24 32x32 48x48 64x64 Qt::Horizontal QSizePolicy::MinimumExpanding 24 24 Qt::Horizontal 40 20 VM User Interface 10 Embedded in VM window &None 0 0 1 0 In separa&te windows true In AQEM&U main window with embedded display Qt::Horizontal QSizePolicy::Minimum 40 20 Qt::Horizontal QSizePolicy::Fixed 40 20 In A&QEMU main window Qt::Vertical 20 40 :/camera-photo.png:/camera-photo.png Screenshots 11 0 0 0 Format And Folder Qt::Vertical QSizePolicy::Fixed 20 24 Qt::Horizontal P&NG &JPEG PPM (Native) 10 false JPEG &quality: SB_Jpeg_Quality false 20 100 5 75 Qt::Horizontal QSlider::TicksBelow false 20 100 5 85 0 0 Shared screenshot folder 10 Qt::Horizontal QSizePolicy::Minimum 40 20 false Path: Edit_Screenshot_Folder false false :/open-folder.png:/open-folder.png Qt::Vertical 78 308 :/utilities-system-monitoring.png:/utilities-system-monitoring.png Logs And Monitoring 11 0 0 0 AQEMU Logs 10 10 Print to stdout Save in file Qt::Vertical QSizePolicy::Fixed 20 8 10 Error messages true Warning messages true Debug messages true Qt::Vertical QSizePolicy::Fixed 20 8 4 10 Log path: :/open-file.png:/open-file.png QEMU Monitor Settings 10 stdio (Does not work with Windows version of &QEMU) true TCP soc&ket Qt::Horizontal QSizePolicy::Fixed 18 20 false Hostname false localhost 127.0.0.1 Qt::Horizontal QSizePolicy::Fixed 13 20 false First port false 6000 65000 Qt::Horizontal 40 20 Qt::Vertical 20 48 :/preferences-system-network.png:/preferences-system-network.png Network 11 0 0 0 VM Network Card MAC Address 10 Ra&ndom MAC address &QEMU segment MAC address (52:54:00:XX:XX:XX) Valid MAC address (Especiall&y for each network card model) true Qt::Vertical 20 438 :/preferences-other.png:/preferences-other.png Other 11 0 0 0 Start/Exit QEMU 10 0 0 E&xecute at start: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Before_Start_Command 0 0 :/open-file.png:/open-file.png 0 0 Execute at exit: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_After_Stop_Command :/open-file.png:/open-file.png Misc 10 0 0 First embedded VNC port: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 0 Host sound s&ystem: CB_Host_Sound_System false 0 0 true alsa oss pa esd sdl wav none 0 0 5901 65000 5910 0 0 qemu-img path: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter :/open-file.png:/open-file.png 0 0 Don't use default audio driver Qt::Vertical QSizePolicy::Fixed 20 24 Qt::Horizontal Qt::Vertical 20 40 :/help-about.png:/help-about.png Info Tab 11 0 0 0 true QFrame::NoFrame QFrame::Plain true 0 0 623 1010 Qt::Vertical Show floppy Qt::Horizontal Start date Flash image Parallel flash image ROM file SD image Number of CPU Computer type Video card Acceleration Boot order Keyboard layout Machine type CPU type true 0 0 Show screenshot in save mode Machine details Machine name Memory size Network cards Use sound Network redirections Qt::Horizontal Fullscreen mode Snapshot mode Show CD-ROM Qt::Horizontal Show HDD Use local time Serial ports Parallel ports Qt::Vertical Qt::Vertical VNC SPICE Qt::Horizontal USB ports Use Linux boot No frame Windows 2K hack RTC TD hack Alt grab No quit No shutdown Portrait No reboot Curses Start CPU at startup Show cursor Check boot sector on FDD Initial graphical mode Qt::Horizontal Enable ACPI Qt::Horizontal true 0 0 Show QEMU arguments Qt::Vertical Qt::Vertical Qt::Vertical Qt::Vertical :/usb.png:/usb.png USB 11 0 0 0 QEMU USB Mode 10 -device (New style) Recommend for QEMU/KVM version &0.15 or higher. Supports USB 2.0 and USB 3.0 controllers emulation. true -usbdevice (Old style) For old QEMU or if you have a problem with -device mode. Supports only USB &1.1 controller emulation. USB Device ID 10 Bus + Device Path - Default choice. When you connect &the USB device to another port - Bus.Path value is changed. Update it in USB settings. true Vendor_ID + Product_ID - Recomend If you do &not connect multiple identical USB devices to the host system. Bus + Address - When &you connect the USB device to another port - Bus.Path value is changed. Update it in USB settings. There may be problems with devices connected via a hub. Qt::Vertical 20 104 :/blockdevice.png:/blockdevice.png Additional Devices 11 0 0 0 Additional CDROM Devices: 10 0 0 Edit :/edit.png:/edit.png Qt::ToolButtonTextUnderIcon 0 0 Add :/add.png:/add.png Qt::ToolButtonTextUnderIcon 0 0 Delete :/remove.png:/remove.png Qt::ToolButtonTextUnderIcon Qt::Horizontal Qt::Vertical 108 380 Qt::Vertical QSizePolicy::Fixed 20 11 Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
All_Tabs CH_Log_Save_in_File CH_Log_Print_in_STDIO CH_Log_Debug CH_Log_Warning CH_Log_Error Edit_Log_Path TB_Log_File Edit_Before_Start_Command TB_Browse_Before Edit_After_Stop_Command TB_Browse_After SB_First_VNC_Port CH_No_Quit CH_Portrait CH_Win2K_Hack CH_Check_Boot_on_FDD CH_PFlash CH_Memory_Size CH_Use_Sound CH_Fullscreen CH_ACPI CH_Localtime CH_Start_CPU CH_Snapshot CH_No_Reboot CH_Serial_Port CH_Linux_Boot CH_ROM_File CH_Machine_Details CH_Machine_Name CH_Parallel_Port CH_USB_Port CH_MTDBlock CH_SD_Image CH_Show_FDD CH_Show_CD CH_Show_HDD CH_Network_Cards CH_Redirections CH_No_Frame CH_Alt_Grab RB_Monitor_TCP toggled(bool) Label_Monitor_Hostname setEnabled(bool) 55 293 154 295 RB_Monitor_TCP toggled(bool) Label_Monitor_Port setEnabled(bool) 78 295 305 294 RB_Monitor_TCP toggled(bool) SB_Monitor_Port setEnabled(bool) 83 297 384 294 RB_Monitor_TCP toggled(bool) CB_Monitor_Hostname setEnabled(bool) 89 294 216 296 RB_Format_Jpeg toggled(bool) SB_Jpeg_Quality setEnabled(bool) 256 141 614 138 RB_Format_Jpeg toggled(bool) Label_Jpeg_Quality setEnabled(bool) 256 141 516 101 RB_Format_Jpeg toggled(bool) HS_Jpeg_Quality setEnabled(bool) 256 141 485 138 HS_Jpeg_Quality valueChanged(int) SB_Jpeg_Quality setValue(int) 485 138 614 138 SB_Jpeg_Quality valueChanged(int) HS_Jpeg_Quality setValue(int) 614 138 485 138 CH_Screenshot_Folder toggled(bool) Edit_Screenshot_Folder setEnabled(bool) 129 156 356 189 CH_Screenshot_Folder toggled(bool) TB_Screenshot_Folder setEnabled(bool) 129 156 562 189 CH_Screenshot_Folder toggled(bool) Label_Folder_Path setEnabled(bool) 129 156 128 189 buttonBox accepted() Advanced_Settings_Window accept() 516 757 347 392 buttonBox rejected() Advanced_Settings_Window reject() 516 757 347 392 CH_Audio_Default toggled(bool) Label_Host_Sound_System setEnabled(bool) 402 336 357 366 CH_Audio_Default toggled(bool) CB_Host_Sound_System setEnabled(bool) 402 336 471 366
aqemu-0.9.2/src/Architecture_Options.ui000066400000000000000000000071721272330227200201240ustar00rootroot00000000000000 Architecture_Options 0 0 384 141 Architecture Options 0 0 Machine &Type: CB_Machine_Type 0 0 64 QComboBox::AdjustToMinimumContentsLength 0 0 CPU T&ype: CB_CPU_Type 0 0 -1 1024 QComboBox::AdjustToMinimumContentsLength Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
buttonBox accepted() Architecture_Options accept() 248 254 157 274 buttonBox rejected() Architecture_Options reject() 316 260 286 274
aqemu-0.9.2/src/Boot_Device_Window.cpp000066400000000000000000000121161272330227200176370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Boot_Device_Window.h" #include "Utils.h" Boot_Device_Window::Boot_Device_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } QList Boot_Device_Window::data() const { QList list; for( int ix = 0; ix < ui.Boot_Devices_List->topLevelItemCount(); ix++ ) { QTreeWidgetItem *item = ui.Boot_Devices_List->topLevelItem( ix ); if( item != NULL ) { VM::Boot_Order tmpDev; if( item->checkState(0) == Qt::Checked ) tmpDev.Enabled = true; else tmpDev.Enabled = false; QString typeStr = item->data( 0, Qt::UserRole ).toString(); if( typeStr == "FDA" ) tmpDev.Type = VM::Boot_From_FDA; else if( typeStr == "FDB" ) tmpDev.Type = VM::Boot_From_FDB; else if( typeStr == "CDROM" ) tmpDev.Type = VM::Boot_From_CDROM; else if( typeStr == "HDD" ) tmpDev.Type = VM::Boot_From_HDD; else if( typeStr == "Network1" ) tmpDev.Type = VM::Boot_From_Network1; else if( typeStr == "Network2" ) tmpDev.Type = VM::Boot_From_Network2; else if( typeStr == "Network3" ) tmpDev.Type = VM::Boot_From_Network3; else if( typeStr == "Network4" ) tmpDev.Type = VM::Boot_From_Network4; else { AQError( "QList Boot_Device_Window::data() const", "Incorrent boot device type \"" + typeStr + "\"!" ); } list << tmpDev; } } return list; } void Boot_Device_Window::setData( const QList &list ) { ui.Boot_Devices_List->clear(); ui.Boot_Devices_List->resizeColumnToContents( 0 ); for( int ix = 0; ix < list.count(); ix++ ) { QTreeWidgetItem *item = new QTreeWidgetItem( ui.Boot_Devices_List ); if( list[ix].Enabled ) item->setCheckState( 0, Qt::Checked ); else item->setCheckState( 0, Qt::Unchecked ); switch( list[ix].Type ) { case VM::Boot_From_FDA: item->setText( 0, tr("Floppy A") ); item->setData( 0, Qt::UserRole, "FDA" ); break; case VM::Boot_From_FDB: item->setText( 0, tr("Floppy B") ); item->setData( 0, Qt::UserRole, "FDB" ); break; case VM::Boot_From_CDROM: item->setText( 0, tr("CD-ROM") ); item->setData( 0, Qt::UserRole, "CDROM" ); break; case VM::Boot_From_HDD: item->setText( 0, tr("Hard Drive") ); item->setData( 0, Qt::UserRole, "HDD" ); break; case VM::Boot_From_Network1: item->setText( 0, tr("Network 1") ); item->setData( 0, Qt::UserRole, "Network1" ); break; case VM::Boot_From_Network2: item->setText( 0, tr("Network 2") ); item->setData( 0, Qt::UserRole, "Network2" ); break; case VM::Boot_From_Network3: item->setText( 0, tr("Network 3") ); item->setData( 0, Qt::UserRole, "Network3" ); break; case VM::Boot_From_Network4: item->setText( 0, tr("Network 4") ); item->setData( 0, Qt::UserRole, "Network4" ); break; default: AQWarning( "void Boot_Device_Window::setData( QList &list )", "Incorrect boot device type!" ); break; } } } bool Boot_Device_Window::useBootMenu() const { return ui.CH_Boot_Menu->isChecked(); } void Boot_Device_Window::setUseBootMenu( bool use ) { ui.CH_Boot_Menu->setChecked( use ); } void Boot_Device_Window::on_TB_Up_clicked() { int index = Get_Current_Index(); if( index < 1 || index > ui.Boot_Devices_List->topLevelItemCount() ) return; QTreeWidgetItem *item = ui.Boot_Devices_List->takeTopLevelItem( index ); ui.Boot_Devices_List->insertTopLevelItem( index - 1, item ); ui.Boot_Devices_List->setCurrentItem( item ); } void Boot_Device_Window::on_TB_Down_clicked() { int index = Get_Current_Index(); if( index < 0 || index > ui.Boot_Devices_List->topLevelItemCount()-2 ) return; QTreeWidgetItem *item = ui.Boot_Devices_List->takeTopLevelItem( index ); ui.Boot_Devices_List->insertTopLevelItem( index + 1, item ); ui.Boot_Devices_List->setCurrentItem( item ); } int Boot_Device_Window::Get_Current_Index() { QTreeWidgetItem *currentItem = ui.Boot_Devices_List->currentItem(); if( ! currentItem ) return -1; for( int ix = 0; ix < ui.Boot_Devices_List->topLevelItemCount(); ++ix ) { if( ui.Boot_Devices_List->topLevelItem(ix) == currentItem ) return ix; } return -1; // not found } aqemu-0.9.2/src/Boot_Device_Window.h000066400000000000000000000027151272330227200173100ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef BOOT_DEVICE_WINDOW_H #define BOOT_DEVICE_WINDOW_H #include "ui_Boot_Device_Window.h" #include "VM_Devices.h" class Boot_Device_Window: public QDialog { Q_OBJECT public: Boot_Device_Window( QWidget *parent = 0 ); QList data() const; void setData( const QList &list ); bool useBootMenu() const; void setUseBootMenu( bool use ); private slots: void on_TB_Up_clicked(); void on_TB_Down_clicked(); int Get_Current_Index(); private: Ui::Boot_Device_Window ui; }; #endif aqemu-0.9.2/src/Boot_Device_Window.ui000066400000000000000000000110061272330227200174670ustar00rootroot00000000000000 Andrey Rijov Boot_Device_Window 0 0 312 248 Boot Order :/terminal.png:/terminal.png Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers true QAbstractItemView::DragOnly true false true true 1 :/up.png:/up.png 18 18 :/down.png:/down.png 18 18 Qt::Vertical 20 45 Enable interactive boot &menu QDialogButtonBox::Cancel|QDialogButtonBox::Ok true Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
Boot_Devices_List TB_Up TB_Down CH_Boot_Menu buttonBox rejected() Boot_Device_Window reject() 141 219 155 123 buttonBox accepted() Boot_Device_Window accept() 141 219 155 123
aqemu-0.9.2/src/Convert_HDD_Image_Window.cpp000066400000000000000000000215111272330227200206550ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include "Utils.h" #include "VM_Devices.h" #include "Convert_HDD_Image_Window.h" // Convert_HDD_Thread ------------------------------------------------------- Convert_HDD_Thread::Convert_HDD_Thread() { Error_Message = ""; } void Convert_HDD_Thread::Set_Args( const QStringList &args ) { Arguments = args; } const QString &Convert_HDD_Thread::Get_Error_Message() const { return Error_Message; } void Convert_HDD_Thread::run() { QProcess *proc = new QProcess(); QSettings settings; proc->start( settings.value("QEMU-IMG_Path", "qemu-img").toString(), Arguments ); if( ! proc->waitForStarted(2000) ) AQError( "void Convert_HDD_Thread::run()", "Cannot Start qemu-img!" ); if( ! proc->waitForFinished(-1) ) AQError( "void Convert_HDD_Thread::run()", "Cannot Finish qemu-img!" ); QString err_str = proc->readAllStandardError(); delete proc; if( err_str.count() > 0 ) { AQError( "void Convert_HDD_Thread::run()", "qemu-img Send Error String!\nDetalis: " + err_str ); Error_Message = err_str; emit Conversion_Complete( false ); } else { AQDebug( "void Convert_HDD_Thread::run()", "Conversion complete!" ); emit Conversion_Complete( true ); } } //=========================================================================== Convert_HDD_Image_Window::Convert_HDD_Image_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); resize( width(), minimumSizeHint().height() ); HDD_Info = new HDD_Image_Info(); connect( HDD_Info, SIGNAL(Completed(bool)), this, SLOT(Update_Info(bool)) ); Valid_Info = false; //Possible_Encrypte = false; if( ! Get_QEMU_IMG_Info() ) { AQWarning( "Convert_HDD_Image_Window::Convert_HDD_Image_Window( QWidget *parent )", "Cannot get qemu-img info!" ); QStringList formats; formats << "qcow2" << "qcow" << "vmdk" << "cow" << "raw" << "cloop"; ui.CB_Output_Format->addItems( formats ); } } void Convert_HDD_Image_Window::on_Button_Browse_Base_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select Base HDD Image File"), Get_Last_Dir_Path(ui.Edit_Base_File_Name->text()), tr("All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk)") ); if( fileName.isEmpty() ) return; fileName = QDir::toNativeSeparators( fileName ); ui.Edit_Base_File_Name->setText( fileName ); if( ! QFile::exists(fileName) ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Locate Input File!") ); return; } // Get info about image HDD_Info->Update_Disk_Info( fileName ); } void Convert_HDD_Image_Window::Update_Info( bool ok ) { Valid_Info = ok; if( ok ) { ui.Label_HDD_Info_L->setText( tr("Image Format: %1\nAllocated Disk Space: %2 %3") .arg(HDD_Info->Get_Disk_Info().Disk_Format) .arg(HDD_Info->Get_Disk_Info().Disk_Size.Size) .arg(Get_TR_Size_Suffix(HDD_Info->Get_Disk_Info().Disk_Size)) ); ui.Label_HDD_Info_R->setText( tr("Virtual Size: %1 %2\nCluster Size: %3") .arg(HDD_Info->Get_Disk_Info().Virtual_Size.Size) .arg(Get_TR_Size_Suffix(HDD_Info->Get_Disk_Info().Virtual_Size)) .arg(HDD_Info->Get_Disk_Info().Cluster_Size) ); } else { ui.Label_HDD_Info_L->setText( "Image Format: none\nAllocated Disk Space: 0" ); ui.Label_HDD_Info_R->setText( "Virtual Size: 0\nCluster Size: 0" ); } } void Convert_HDD_Image_Window::on_Button_Browse_Output_clicked() { QString fileName = QFileDialog::getSaveFileName( this, tr("Save Out HDD Image File"), Get_Last_Dir_Path(ui.Edit_Output_File_Name->text()), tr("All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk)") ); if( ! fileName.isEmpty() ) ui.Edit_Output_File_Name->setText( QDir::toNativeSeparators(fileName) ); } void Convert_HDD_Image_Window::on_CB_Output_Format_currentIndexChanged( const QString &text ) { if( text.contains("qcow", Qt::CaseInsensitive) ) { ui.CH_Compressed->setEnabled( true ); } else { ui.CH_Compressed->setEnabled( false ); } } void Convert_HDD_Image_Window::on_Button_Convert_clicked() { if( ui.Edit_Output_File_Name->text().isEmpty() ) { AQGraphic_Warning( tr("File Name is Empty!"), tr("Please Enter Correct HDD Image filename!") ); return; } if( ! Valid_Info ) { AQGraphic_Warning( tr("Error!"), tr("Cannot get a valid format for current HDD image!") ); return; } QStringList args; args << "convert"; // compressed if( ui.CH_Compressed->isEnabled() && ui.CH_Compressed->isChecked() ) args << "-c"; /* // encrypted if( ui.CH_Encrypted->isEnabled() && ui.CH_Encrypted->isChecked() ) args << "-e";*/ args << "-f" << HDD_Info->Get_Disk_Info().Disk_Format; // Input format args << ui.Edit_Base_File_Name->text(); // In file name args << "-O" << ui.CB_Output_Format->currentText(); // Output format args << ui.Edit_Output_File_Name->text(); // Output File name connect( &Conv_Thread, SIGNAL(Conversion_Complete(bool)), this, SLOT(Conversion_Done(bool)) ); Conv_Thread.Set_Args( args ); Conv_Thread.start(); ProgDial = new QProgressDialog( tr("Please Wait. Converting HDD Image..."), tr("Cancel"), 0, 0, this ); connect( ProgDial, SIGNAL(canceled()), this, SLOT(Cancel_Convertion()) ); ProgDial->setWindowModality( Qt::WindowModal ); ProgDial->setValue( 0 ); ProgDial->exec(); } void Convert_HDD_Image_Window::Conversion_Done( bool ok ) { if( ok ) { ProgDial->accept(); Conv_Thread.terminate(); QMessageBox::information( this, tr("Information:"), tr("Conversion completed sucessfuly!") ); accept(); } else { ProgDial->accept(); Conv_Thread.terminate(); AQGraphic_Warning( tr("Error!"), tr("Cannot convert image!\nDetails:\n%1").arg(Conv_Thread.Get_Error_Message()) ); } } void Convert_HDD_Image_Window::Cancel_Convertion() { Conv_Thread.terminate(); } bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info() { // Start process QSettings settings; QProcess *qemuImgProc = new QProcess( this ); qemuImgProc->start( settings.value("QEMU-IMG_Path", "qemu-img").toString(), QStringList("-h") ); if( ! qemuImgProc->waitForStarted(2000) ) AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "Cannot start qemu-img!" ); if( ! qemuImgProc->waitForFinished(3000) ) AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "Cannot finish qemu-img!" ); // Read all output text QString allText = qemuImgProc->readAllStandardError(); allText += qemuImgProc->readAllStandardOutput(); delete qemuImgProc; if( allText.isEmpty() ) { AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "qemu-img not send text!" ); return false; } else // Parse text { /* // Encryption QRegExp possibleEncrypte = QRegExp( "-e\\s+" ); if( possibleEncrypte.exactMatch(allText) ) Possible_Encrypte = true; else Possible_Encrypte = false; */ // Formats QRegExp formats = QRegExp( ".*Supported formats:\\s+(.*)\n" ); if( ! formats.exactMatch(allText) ) { AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "Cannot match RegExp!" ); return false; } QStringList tmpList = formats.capturedTexts(); if( tmpList.count() < 2 ) { AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "Captured text lines < 2" ); return false; } QStringList formatsList = tmpList[ 1 ].split( ' ', QString::SkipEmptyParts ); if( formatsList.isEmpty() ) { AQError( "bool Convert_HDD_Image_Window::Get_QEMU_IMG_Info()", "Formats list is empty!" ); return false; } // Add formats formatsList.sort(); ui.CB_Output_Format->addItems( formatsList ); // qcow2 - is default format int qcow2 = ui.CB_Output_Format->findText( "qcow2" ); if( qcow2 != -1 ) ui.CB_Output_Format->setCurrentIndex( qcow2 ); else { // qcow2 not available use qcow int qcow = ui.CB_Output_Format->findText( "qcow" ); if( qcow != -1 ) ui.CB_Output_Format->setCurrentIndex( qcow ); } return true; } } aqemu-0.9.2/src/Convert_HDD_Image_Window.h000066400000000000000000000040431272330227200203230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef CONVERT_HDD_IMAGE_WINDOW_H #define CONVERT_HDD_IMAGE_WINDOW_H #include #include #include "ui_Convert_HDD_Image_Window.h" #include "HDD_Image_Info.h" class Convert_HDD_Thread : public QThread { Q_OBJECT public: Convert_HDD_Thread(); void Set_Args( const QStringList &args ); const QString &Get_Error_Message() const; protected: void run(); signals: void Conversion_Complete( bool ok ); private: QString Error_Message; QStringList Arguments; }; class Convert_HDD_Image_Window: public QDialog { Q_OBJECT public: Convert_HDD_Image_Window( QWidget *parent = 0 ); private slots: void on_Button_Browse_Base_clicked(); void on_Button_Browse_Output_clicked(); void on_CB_Output_Format_currentIndexChanged( const QString &text ); void on_Button_Convert_clicked(); void Update_Info( bool ok ); void Conversion_Done( bool ok ); void Cancel_Convertion(); bool Get_QEMU_IMG_Info(); private: Ui::Convert_HDD_Image_Window ui; Convert_HDD_Thread Conv_Thread; QProgressDialog *ProgDial; HDD_Image_Info *HDD_Info; bool Valid_Info; }; #endif aqemu-0.9.2/src/Convert_HDD_Image_Window.ui000066400000000000000000000205061272330227200205130ustar00rootroot00000000000000 Andrey Rijov Convert_HDD_Image_Window 0 0 390 423 Convert HDD Image :/hdd.png:/hdd.png Input image File name: :/open-file.png:/open-file.png QLayout::SetMinimumSize Image Format: none Allocated Disk Space: 0 Qt::TextSelectableByMouse Qt::Horizontal 10 15 Virtual Size: 0 Cluster Size: 0 Qt::Vertical QSizePolicy::Fixed 368 10 Output image File name: :/open-file.png:/open-file.png 0 0 Forma&t: CB_Output_Format Qt::Vertical QSizePolicy::Fixed 30 10 0 0 QCOW format options Qt::Horizontal 10 Com&press image Qt::Horizontal 40 20 Qt::Horizontal 141 29 Con&vert :/go.png:/go.png &Cancel :/cancel.png:/cancel.png Edit_Base_File_Name Button_Browse_Base Edit_Output_File_Name Button_Browse_Output CB_Output_Format CH_Compressed Button_Convert Button_Cancel Button_Cancel clicked() Convert_HDD_Image_Window reject() 457 379 137 315 aqemu-0.9.2/src/Copy_VM_Window.cpp000066400000000000000000000037071272330227200167770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "Utils.h" #include "Copy_VM_Window.h" Copy_VM_Window::Copy_VM_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); All_Machine_Names.clear(); } QString Copy_VM_Window::Get_New_VM_Name() const { return ui.Edit_New_VM_Name->text(); } bool Copy_VM_Window::Get_Copy_Disk_Images() const { return ui.CH_Copy_Disk_Images->isChecked(); } bool Copy_VM_Window::Get_Copy_Floppy() const { return ui.CH_Copy_Floppy->isChecked(); } bool Copy_VM_Window::Get_Copy_Hard_Drive() const { return ui.CH_Copy_Hard_Drive->isChecked(); } void Copy_VM_Window::Add_VM_Machine_Name( const QString &name ) { All_Machine_Names << name; } void Copy_VM_Window::done(int r) { if ( r == QDialog::Accepted ) { for( int ix = 0; ix < All_Machine_Names.count(); ++ix ) { if( All_Machine_Names[ix] == ui.Edit_New_VM_Name->text() ) { AQGraphic_Warning( tr("Error!"), tr("This VM Name Is Already Used!") ); return; } } // OK, New Name Unuque } QDialog::done(r); } aqemu-0.9.2/src/Copy_VM_Window.h000066400000000000000000000026401272330227200164370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef COPY_VM_WINDOW_H #define COPY_VM_WINDOW_H #include "ui_Copy_VM_Window.h" class Copy_VM_Window: public QDialog { Q_OBJECT public: Copy_VM_Window( QWidget *parent = 0 ); QString Get_New_VM_Name() const; bool Get_Copy_Disk_Images() const; bool Get_Copy_Floppy() const; bool Get_Copy_Hard_Drive() const; void Add_VM_Machine_Name( const QString &name ); private slots: void done(int); private: Ui::Copy_VM_Window ui; QStringList All_Machine_Names; }; #endif aqemu-0.9.2/src/Copy_VM_Window.ui000066400000000000000000000105171272330227200166270ustar00rootroot00000000000000 Andrey Rijov Copy_VM_Window 0 0 453 173 Copy VM :/copy.png:/copy.png &New VM name: Edit_New_VM_Name Copy disk images true 10 Copy floppy images Copy hard drive images true Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
Edit_New_VM_Name CH_Copy_Disk_Images CH_Copy_Floppy CH_Copy_Hard_Drive CH_Copy_Disk_Images toggled(bool) CH_Copy_Floppy setEnabled(bool) 89 45 82 68 CH_Copy_Disk_Images toggled(bool) CH_Copy_Hard_Drive setEnabled(bool) 155 48 131 95 buttonBox rejected() Copy_VM_Window reject() 335 144 226 86 buttonBox accepted() Copy_VM_Window accept() 335 144 226 86
aqemu-0.9.2/src/Create_HDD_Image_Window.cpp000066400000000000000000000136211272330227200204430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include "Utils.h" #include "VM_Devices.h" #include "Create_HDD_Image_Window.h" Create_HDD_Image_Window::Create_HDD_Image_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); resize( width(), minimumSizeHint().height() ); } const QString &Create_HDD_Image_Window::Get_Image_File_Name() { Image_File_Name = ui.Edit_File_Name->text(); return Image_File_Name; } void Create_HDD_Image_Window::Set_Image_File_Name( const QString &path ) { Image_File_Name = path; ui.Edit_File_Name->setText( path ); } void Create_HDD_Image_Window::Set_Image_Info( VM::Disk_Info info ) { // This function word only in format mode. Change button caption ui.Button_Create->setText( tr("F&ormat") ); // Format int format_ix = ui.CB_Format->findText( info.Disk_Format ); if( format_ix != -1 ) { ui.CB_Format->setCurrentIndex( format_ix ); } else { AQError( "void Create_HDD_Image_Window::Set_Image_Info( VM::Disk_Info info )", "Cannot Find Format" ); } // Size switch( info.Virtual_Size.Suffix ) { case VM::Size_Suf_Mb: // MB ui.CB_Suffix->setCurrentIndex( 1 ); break; case VM::Size_Suf_Gb: // GB ui.CB_Suffix->setCurrentIndex( 2 ); break; default: // KG ui.CB_Suffix->setCurrentIndex( 0 ); break; } ui.SB_Size->setValue( info.Virtual_Size.Size ); } void Create_HDD_Image_Window::Set_Image_Size( double gb ) { ui.SB_Size->setValue( gb ); } void Create_HDD_Image_Window::on_Button_Browse_Base_Image_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select Base HDD Image File"), Get_Last_Dir_Path(ui.Edit_Base_Image_File_Name->text()), tr("All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk)") ); if( ! fileName.isEmpty() ) ui.Edit_Base_Image_File_Name->setText( QDir::toNativeSeparators(fileName) ); } void Create_HDD_Image_Window::on_Button_Browse_New_Image_clicked() { QString fileName = QFileDialog::getSaveFileName( this, tr("Create HDD Image File"), Get_Last_Dir_Path(ui.Edit_File_Name->text()), tr("All Files (*);;Images Files (*.img *.qcow *.qcow2 *.wmdk)") ); if( ! fileName.isEmpty() ) ui.Edit_File_Name->setText( QDir::toNativeSeparators(fileName) ); } void Create_HDD_Image_Window::on_CB_Format_currentIndexChanged( const QString &text ) { /*if( text == "qcow2" || text == "qcow" ) { ui.CH_Encrypted->setEnabled( true ); } else { ui.CH_Encrypted->setEnabled( false ); }*/ } void Create_HDD_Image_Window::on_Button_Create_clicked() { if( ui.Edit_File_Name->text().isEmpty() ) { AQGraphic_Warning( tr("Error!"), tr("Image File Name is Empty!") ); return; } if( ui.SB_Size->value() < 1 || ui.SB_Size->value() > 1024 ) { AQGraphic_Warning( tr("Error!"), tr("Invalid image size!") ); return; } bool Create_OK = false; VM::Device_Size hd_size; hd_size.Size = ui.SB_Size->value(); switch( ui.CB_Suffix->currentIndex() ) { case 1: // MB hd_size.Suffix = VM::Size_Suf_Mb; break; case 2: // GB hd_size.Suffix = VM::Size_Suf_Gb; break; default: // KG hd_size.Suffix= VM::Size_Suf_Kb; break; } if( ui.CH_Base_Image->isChecked() ) { if( ! QFile::exists(ui.Edit_Base_Image_File_Name->text()) ) { AQGraphic_Warning( tr("Error!"), tr("Base Image File doesn't Exists!") ); return; } else { Create_OK = Create_New_HDD_Image( false, ui.Edit_Base_Image_File_Name->text(), ui.Edit_File_Name->text(), ui.CB_Format->currentText(), hd_size, true ); } } else { Create_OK = Create_New_HDD_Image( false, "", ui.Edit_File_Name->text(), ui.CB_Format->currentText(), hd_size, true ); } if( Create_OK ) { accept(); } else { AQGraphic_Warning( tr("Error!"), tr("Image was Not Created!") ); return; } } void Create_HDD_Image_Window::on_Button_Format_Help_clicked() { QMessageBox::information( this, tr("QEMU-IMG Supported formats"), tr( "raw\nRaw disk image format. This format has the advantage of being simple and easily " "exportable to all other emulators. If your file system supports holes (for example in " "ext2 or ext3 on Linux or NTFS on Windows), then only the written sectors will reserve " "space. Use qemu-img info to know the real size used by the image or ls -ls on Unix/Linux." "\n\nqcow2\nQEMU image format, the most versatile format. Use it to have smaller images " "(useful if your filesystem does not supports holes, for example on Windows), optional " "AES encryption, zlib based compression and support of multiple VM snapshots." "\n\nqcow\nOld QEMU image format. Left for compatibility." "\n\ncow\nUser Mode Linux Copy On Write image format. Used to be the only growable image " "format in QEMU. It is supported only for compatibility with previous versions. " "It does not work on win32." "\n\nvmdk\nVMware 3 and 4 compatible image format." "\n\ncloop\nLinux Compressed Loop image, useful only to reuse directly compressed CD-ROM " "images present for example in the Knoppix CD-ROMs." ) ); } aqemu-0.9.2/src/Create_HDD_Image_Window.h000066400000000000000000000032501272330227200201050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef CREATE_HDD_IMAGE_WINDOW_H #define CREATE_HDD_IMAGE_WINDOW_H #include "ui_Create_HDD_Image_Window.h" #include "VM_Devices.h" class Create_HDD_Image_Window: public QDialog { Q_OBJECT public: Create_HDD_Image_Window( QWidget *parent = 0 ); const QString &Get_Image_File_Name(); void Set_Image_File_Name( const QString &path ); void Set_Image_Info( VM::Disk_Info info ); void Set_Image_Size( double gb ); private slots: void on_Button_Browse_Base_Image_clicked(); void on_Button_Browse_New_Image_clicked(); void on_CB_Format_currentIndexChanged( const QString &text ); void on_Button_Create_clicked(); void on_Button_Format_Help_clicked(); private: Ui::Create_HDD_Image_Window ui; QString Image_File_Name; }; #endif aqemu-0.9.2/src/Create_HDD_Image_Window.ui000066400000000000000000000247451272330227200203070ustar00rootroot00000000000000 Andrey Rijov Create_HDD_Image_Window 0 0 446 468 Create HDD Image :/hdd.png:/hdd.png 0 0 &New Image File Name: Edit_File_Name 10 Browse... Qt::Vertical QSizePolicy::Fixed 40 5 Forma&t: CB_Format 10 0 0 32 qcow2 qcow vmdk cow raw cloop &Help... Qt::Vertical QSizePolicy::Fixed 40 5 Si&ze: SB_Size 10 1 1.000000000000000 9999.000000000000000 1.000000000000000 10.000000000000000 0 0 2 KB MB GB Qt::Vertical QSizePolicy::Fixed 40 5 0 0 Additional features Qt::Horizontal 10 0 0 Use &Base HDD Image 10 false false Browse... 6 Qt::Horizontal 201 29 C&reate :/go.png:/go.png &Cancel :/cancel.png:/cancel.png Edit_File_Name Button_Browse_New_Image CB_Format Button_Format_Help SB_Size CB_Suffix CH_Base_Image Edit_Base_Image_File_Name Button_Browse_Base_Image Button_Create Button_Cancel Button_Cancel clicked() Create_HDD_Image_Window reject() 371 578 170 411 CH_Base_Image clicked(bool) Edit_Base_Image_File_Name setEnabled(bool) 99 22 73 56 CH_Base_Image clicked(bool) Button_Browse_Base_Image setEnabled(bool) 134 23 339 59 aqemu-0.9.2/src/Create_Template_Window.cpp000066400000000000000000000132541272330227200205170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include "VM.h" #include "Utils.h" Create_Template_Window::Create_Template_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); ui.Edit_Template_Folder->setText( QDir::toNativeSeparators(Settings.value("VM_Directory","").toString() + "/os_templates/") ); } void Create_Template_Window::Set_VM_Path( const QString &path ) { ui.Edit_VM_File->setText( path ); } void Create_Template_Window::on_TB_VM_File_Browse_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Open VM File"), QDir::toNativeSeparators(Settings.value("VM_Directory","").toString() + "/os_templates/"), tr("AQEMU VM Files (*.aqemu)") ); if( ! fileName.isEmpty() ) ui.Edit_VM_File->setText( QDir::toNativeSeparators(fileName) ); } void Create_Template_Window::on_TB_Template_Folder_Browse_clicked() { QString fileName = QFileDialog::getExistingDirectory( this,tr("Select Template Folder"), Get_Last_Dir_Path(ui.Edit_Template_Folder->text()), QFileDialog::ShowDirsOnly ); if( ! fileName.isEmpty() ) ui.Edit_Template_Folder->setText( QDir::toNativeSeparators(fileName) ); } void Create_Template_Window::on_Button_Create_clicked() { // Check Values if( ui.Edit_Template_Name->text().isEmpty() ) { AQGraphic_Warning( tr("Warning!"), tr("Template Name is Empty!") ); return; } if( ! Name_is_Unique() ) { AQWarning( "Create_Template_Window::on_Button_Create_clicked()", "Template Name Not Unique!" ); return; } if( ! QFile::exists(ui.Edit_VM_File->text()) ) { AQGraphic_Warning( tr("Warning!"), tr("VM file doesn't exist!") ); return; } if( ! QFile::exists(ui.Edit_Template_Folder->text()) ) { AQGraphic_Warning( tr("Warning!"), tr("Cannot Locate Template Folder!") ); return; } if( ui.Edit_Template_Folder->text().at(ui.Edit_Template_Folder->text().count()-1) != '/' ) { ui.Edit_Template_Folder->setText( QDir::toNativeSeparators(ui.Edit_Template_Folder->text() + "/") ); } // All OK. Creating new template Virtual_Machine *tmp_vm = new Virtual_Machine(); if( ! tmp_vm->Load_VM(ui.Edit_VM_File->text()) ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Load VM!") ); delete tmp_vm; return; } Template_Options tmp_options = Template_Save_Default; if( ui.CH_FDD_CD->isChecked() ) { tmp_options = tmp_options | Template_Save_FDD_CD; } if( ui.CH_HDD->isChecked() ) { tmp_options = tmp_options | Template_Save_HDD; } if( ui.CH_Network->isChecked() ) { tmp_options = tmp_options | Template_Save_Network; } if( ui.CH_Ports->isChecked() ) { tmp_options = tmp_options | Template_Save_Ports; } // Create FS Valid File Name QString new_template_name = ui.Edit_Template_Name->text(); QRegExp VM_Name_Val = QRegExp( "[^a-zA-Z0-9_]" ); new_template_name = new_template_name.replace( VM_Name_Val, "_" ); new_template_name = new_template_name.replace( "__", "_" ); if( ! tmp_vm->Create_Template(ui.Edit_Template_Folder->text() + new_template_name + ".aqvmt", ui.Edit_Template_Name->text(), tmp_options ) ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Create Template!") ); delete tmp_vm; return; } delete tmp_vm; accept(); } bool Create_Template_Window::Name_is_Unique() { if( ui.CH_Use_Default_Folder->isChecked() || ui.Edit_Template_Folder->text() == QDir::toNativeSeparators(Settings.value("VM_Directory", "").toString() + "/os_templates/") ) { List_Templates = Get_Templates_List(); for( int ix = 0; ix < List_Templates.count(); ++ix ) { QFileInfo tmp_info = QFileInfo( List_Templates[ix] ); // Create FS Valid File Name QString new_template_name = ui.Edit_Template_Name->text(); QRegExp VM_Name_Val = QRegExp( "[^a-zA-Z0-9_]" ); new_template_name = new_template_name.replace( VM_Name_Val, "_" ); new_template_name = new_template_name.replace( "__", "_" ); if( tmp_info.completeBaseName() == new_template_name ) { int mes_ret = QMessageBox::question( this, tr("Replace"), tr("Your template name is already used! Do you want replace previous template?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::Yes ) { return true; } else { return false; } } } return true; } else { // Other Folder if( QFile::exists(ui.Edit_Template_Folder->text()) ) { int mes_ret = QMessageBox::question( this, tr("Replace"), tr("You Name For Template in Not Unique! Replace Previous Template?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::Yes ) { return true; } else { return false; } } else { return true; } } } aqemu-0.9.2/src/Create_Template_Window.h000066400000000000000000000035761272330227200201720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef CREATE_TEMPLATE_WINDOW_H #define CREATE_TEMPLATE_WINDOW_H #include #include #include #include "ui_Create_Template_Window.h" class Create_Template_Window: public QDialog { Q_OBJECT public: Create_Template_Window( QWidget *parent = 0 ); void Set_VM_Path( const QString &path ); // Options For Create Templates enum Template_Option { Template_Save_FDD_CD=0x2, Template_Save_HDD=0x40, Template_Save_Network=0x800, Template_Save_Default=0x16000, Template_Save_Ports=0x320000 }; Q_DECLARE_FLAGS( Template_Options, Template_Option ) private slots: void on_TB_VM_File_Browse_clicked(); void on_TB_Template_Folder_Browse_clicked(); void on_Button_Create_clicked(); private: bool Name_is_Unique(); QSettings Settings; QList List_Templates; Ui::Create_Template_Window ui; }; Q_DECLARE_OPERATORS_FOR_FLAGS( Create_Template_Window::Template_Options ) #endif aqemu-0.9.2/src/Create_Template_Window.ui000066400000000000000000000245551272330227200203600ustar00rootroot00000000000000 Andrey Rijov Create_Template_Window 0 0 356 395 0 0 Create Template :/view_detailed.png:/view_detailed.png Create Template 10 Use default folder for new template true 10 false false :/open-folder.png:/open-folder.png false Folder: 10 0 0 Name: File: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 :/open-file.png:/open-file.png Qt::Horizontal Qt::Vertical QSizePolicy::Preferred 100 10 Options 10 Save floppy and CD-ROM settings true Save hard disks size and format settings true Save network settings true Save ports (USB/Serial/Parallel) true Qt::Horizontal 6 0 0 0 0 Qt::Horizontal 291 20 C&reate :/ok.png:/ok.png &Cancel :/cancel.png:/cancel.png Edit_Template_Name CH_Use_Default_Folder Edit_Template_Folder TB_Template_Folder_Browse CH_FDD_CD CH_HDD CH_Network CH_Ports Button_Create Button_Cancel Button_Cancel clicked() Create_Template_Window reject() 353 349 207 357 CH_Use_Default_Folder toggled(bool) Label_Template_Folder setDisabled(bool) 182 168 182 193 CH_Use_Default_Folder toggled(bool) Edit_Template_Folder setDisabled(bool) 182 168 182 220 CH_Use_Default_Folder toggled(bool) TB_Template_Folder_Browse setDisabled(bool) 182 168 367 220 aqemu-0.9.2/src/Delete_VM_Files_Window.cpp000066400000000000000000000237651272330227200204170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "Delete_VM_Files_Window.h" #include "Utils.h" #include #include #include Delete_VM_Files_Window::Delete_VM_Files_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Files_List ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Files_List->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Files_List ); hv->setStretchLastSection( true ); hv->setSectionResizeMode( QHeaderView::ResizeToContents ); ui.Files_List->setHorizontalHeader( hv ); } Delete_VM_Files_Window::Delete_VM_Files_Window( Virtual_Machine *vm, QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Files_List ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Files_List->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Files_List ); hv->setStretchLastSection( true ); hv->setSectionResizeMode( QHeaderView::ResizeToContents ); ui.Files_List->setHorizontalHeader( hv ); Set_VM( vm ); } void Delete_VM_Files_Window::Set_VM( Virtual_Machine *vm ) { if( vm == NULL ) { AQError( "void Delete_VM_Files_Window::Set_VM( Virtual_Machine *vm )", "vm == NULL" ); return; } // Clear List Clear_List(); VM_Name = vm->Get_Machine_Name(); File_List_Item tmp; // VM File VM_Path = vm->Get_VM_XML_File_Path(); // Screenshot if( Path_Valid(vm->Get_Screenshot_Path()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Screenshot" ); tmp.Path = vm->Get_Screenshot_Path(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // FD0 if( Path_Valid(vm->Get_FD0().Get_File_Name()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Floppy A" ); tmp.Path = vm->Get_FD0().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // FD1 if( Path_Valid(vm->Get_FD1().Get_File_Name()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Floppy B" ); tmp.Path = vm->Get_FD1().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // CD-ROM if( Path_Valid(vm->Get_CD_ROM().Get_File_Name()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "CD-ROM" ); tmp.Path = vm->Get_CD_ROM().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // HDA if( Path_Valid(vm->Get_HDA().Get_File_Name()) ) { tmp.Hard_Drive = true; tmp.Name = tr( "HDA (Primary Master)" ); tmp.Path = vm->Get_HDA().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // HDB if( Path_Valid(vm->Get_HDB().Get_File_Name()) ) { tmp.Hard_Drive = true; tmp.Name = tr( "HDB (Primary Slave)" ); tmp.Path = vm->Get_HDB().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // HDC if( Path_Valid(vm->Get_HDC().Get_File_Name()) ) { tmp.Hard_Drive = true; tmp.Name = tr( "HDC (Secondary Master)" ); tmp.Path = vm->Get_HDC().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // HDD if( Path_Valid(vm->Get_HDD().Get_File_Name()) ) { tmp.Hard_Drive = true; tmp.Name = tr( "HDD (Secondary Slave)" ); tmp.Path = vm->Get_HDD().Get_File_Name(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // ROM File if( Path_Valid(vm->Get_ROM_File()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "ROM File" ); tmp.Path = vm->Get_ROM_File(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // MTDBlock File if( Path_Valid(vm->Get_MTDBlock_File()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "MTDBlock File" ); tmp.Path = vm->Get_MTDBlock_File(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // SD Card File if( Path_Valid(vm->Get_SecureDigital_File()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "SD Card File" ); tmp.Path = vm->Get_SecureDigital_File(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // PFlash File if( Path_Valid(vm->Get_PFlash_File()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "PFlash File" ); tmp.Path = vm->Get_PFlash_File(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // bzImage if( Path_Valid(vm->Get_bzImage_Path()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Kernel bzImage" ); tmp.Path = vm->Get_bzImage_Path(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // Initrd if( Path_Valid(vm->Get_Initrd_Path()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Kernel Initrd" ); tmp.Path = vm->Get_Initrd_Path(); File_List_Items << tmp; Add_To_Files_List( tmp ); } // Serial Ports if( vm->Get_Serial_Ports().count() > 0 ) { QList tmp_port = vm->Get_Serial_Ports(); for( int ix = 0; ix < tmp_port.count(); ix++ ) { if( tmp_port[ix].Get_Port_Redirection() == VM::PR_file ) { if( Path_Valid(tmp_port[ix].Get_Parametrs_Line()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Serial Port Redirection" ); tmp.Path = tmp_port[ix].Get_Parametrs_Line(); File_List_Items << tmp; Add_To_Files_List( tmp ); } } } } // Parallel Ports if( vm->Get_Parallel_Ports().count() > 0 ) { QList tmp_port = vm->Get_Parallel_Ports(); for( int ix = 0; ix < tmp_port.count(); ix++ ) { if( tmp_port[ix].Get_Port_Redirection() == VM::PR_file ) { if( Path_Valid(tmp_port[ix].Get_Parametrs_Line()) ) { tmp.Hard_Drive = false; tmp.Name = tr( "Parallel Port Redirection" ); tmp.Path = tmp_port[ix].Get_Parametrs_Line(); File_List_Items << tmp; Add_To_Files_List( tmp ); } } } } // Storage Devices if( vm->Get_Storage_Devices_List().count() > 0 ) { QList tmp_dev = vm->Get_Storage_Devices_List(); for( int ix = 0; ix < tmp_dev.count(); ix++ ) { if( Path_Valid(tmp_dev[ix].Get_File_Path()) ) { if( tmp_dev[ix].Get_Media() == VM::DM_Disk ) tmp.Hard_Drive = true; else tmp.Hard_Drive = false; tmp.Name = tr( "Storage Device" ); tmp.Path = tmp_dev[ix].Get_File_Path(); File_List_Items << tmp; Add_To_Files_List( tmp ); } } } } void Delete_VM_Files_Window::on_Button_Delete_clicked() { int mes_ret = QMessageBox::question( this, tr("Confirm Delete"), tr("Delete \"") + VM_Name + tr("\" VM and Selected Files?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); QString no_Delete_Files_List; if( mes_ret == QMessageBox::Yes ) { // Delete VM XML File if( ! QFile::remove(VM_Path) ) { AQError( "void Delete_VM_Files_Window::on_Button_Delete_clicked()", "Cannot Delete VM File: \"" + VM_Path + "\"" ); no_Delete_Files_List += VM_Path + "\n"; } // Delete Files for( int ix = 0; ix < ui.Files_List->rowCount(); ix++ ) { QTableWidgetItem *item_CheckBox = ui.Files_List->item( ix, 0 ); QTableWidgetItem *item_Text = ui.Files_List->item( ix, 2 ); if( item_CheckBox == NULL || item_Text == NULL ) { AQError( "void Delete_VM_Files_Window::on_Button_Delete_clicked()", "item_CheckBox == NULL || item_Text == NULL" ); continue; } // Cheked? if( item_CheckBox->checkState() == Qt::Checked ) { if( ! QFile::remove(item_Text->text()) ) { AQError( "void Delete_VM_Files_Window::on_Button_Delete_clicked()", "Cannot Delete File: \"" + item_Text->text() + "\"" ); no_Delete_Files_List += item_Text->text() + "\n"; continue; } } } // Show Errors if( ! no_Delete_Files_List.isEmpty() ) { QMessageBox::information( this, tr("An error occurred while deleting files"), tr("This Files Not Deleted:\n") + no_Delete_Files_List + tr("Please Check Permissions!"), QMessageBox::Ok ); } // Send accept accept(); } } void Delete_VM_Files_Window::on_RB_Show_HDD_toggled( bool checked ) { static bool old = false; if( old == checked ) return; else old = checked; Clear_List(); for( int ix = 0; ix < File_List_Items.count(); ix++ ) { if( checked ) { if( File_List_Items[ix].Hard_Drive ) Add_To_Files_List( File_List_Items[ix] ); } else { Add_To_Files_List( File_List_Items[ix] ); } } } void Delete_VM_Files_Window::Add_To_Files_List( const File_List_Item &item ) { if( item.Name.isEmpty() || item.Path.isEmpty() ) return; QTableWidgetItem *it = new QTableWidgetItem(); ui.Files_List->insertRow( ui.Files_List->rowCount() ); // CheckBox it->setFlags( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ); it->setCheckState( Qt::Checked ); ui.Files_List->setItem( ui.Files_List->rowCount()-1, 0, it ); // Name it = new QTableWidgetItem( item.Name ); ui.Files_List->setItem( ui.Files_List->rowCount()-1, 1, it ); // Path it = new QTableWidgetItem( item.Path ); ui.Files_List->setItem( ui.Files_List->rowCount()-1, 2, it ); } bool Delete_VM_Files_Window::Path_Valid( const QString &path ) { if( path.isEmpty() ) return false; if( ! QFile::exists(path) ) return false; if( path.startsWith("/dev/") ) return false; // FIXME Windows version return true; // All OK } void Delete_VM_Files_Window::Clear_List() { ui.Files_List->clearContents(); while( ui.Files_List->rowCount() > 0 ) ui.Files_List->removeRow( 0 ); } aqemu-0.9.2/src/Delete_VM_Files_Window.h000066400000000000000000000032671272330227200200570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef DELETE_VM_FILES_WINDOW_H #define DELETE_VM_FILES_WINDOW_H #include "ui_Delete_VM_Files_Window.h" #include "VM.h" struct File_List_Item { bool Hard_Drive; QString Name; QString Path; }; class Delete_VM_Files_Window: public QDialog { Q_OBJECT public: Delete_VM_Files_Window( QWidget *parent = 0 ); Delete_VM_Files_Window( Virtual_Machine *vm, QWidget *parent = 0 ); void Set_VM( Virtual_Machine *vm ); private slots: void on_Button_Delete_clicked(); void on_RB_Show_HDD_toggled( bool checked ); void Add_To_Files_List( const File_List_Item &item ); bool Path_Valid( const QString &path ); void Clear_List(); private: Ui::Delete_VM_Files_Window ui; QList File_List_Items; QString VM_Name; QString VM_Path; }; #endif aqemu-0.9.2/src/Delete_VM_Files_Window.ui000066400000000000000000000131111272330227200202320ustar00rootroot00000000000000 Andrey Rijov Delete_VM_Files_Window 0 0 549 284 Delete VM and Files :/remove.png:/remove.png Show only: Qt::Horizontal QSizePolicy::Fixed 10 10 Hard drive ima&ges false Qt::Horizontal QSizePolicy::Fixed 10 10 A&ll VM files true Qt::Horizontal 178 17 QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel true 0 3 Delete Device name Path Qt::Horizontal 40 20 &Delete selected :/go.png:/go.png &Cancel :/cancel.png:/cancel.png RB_Show_HDD RB_Show_All Files_List Button_Delete Button_Cancel Button_Cancel clicked() Delete_VM_Files_Window reject() 507 255 546 248 aqemu-0.9.2/src/Device_Manager_Widget.cpp000066400000000000000000001044201272330227200202620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyirght (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Device_Manager_Widget.h" #include "Add_New_Device_Window.h" #include "Utils.h" #include "Create_HDD_Image_Window.h" #include "System_Info.h" Device_Manager_Widget::Device_Manager_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); Enabled = true; HDA_Info = new HDD_Image_Info(); HDB_Info = new HDD_Image_Info(); HDC_Info = new HDD_Image_Info(); HDD_Info = new HDD_Image_Info(); connect( HDA_Info, SIGNAL(Completed(bool)), this, SLOT(Update_HDA(bool)) ); connect( HDB_Info, SIGNAL(Completed(bool)), this, SLOT(Update_HDB(bool)) ); connect( HDC_Info, SIGNAL(Completed(bool)), this, SLOT(Update_HDC(bool)) ); connect( HDD_Info, SIGNAL(Completed(bool)), this, SLOT(Update_HDD(bool)) ); pw = new Properties_Window( this ); Context_Menu = new QMenu( ui.Devices_List ); ui.Devices_List->setSpacing( 3 ); ui.Devices_List->setFlow( QListView::TopToBottom ); ui.Devices_List->setViewMode( QListView::ListMode ); } Device_Manager_Widget::~Device_Manager_Widget() { delete pw; delete Context_Menu; delete HDA_Info; delete HDB_Info; delete HDC_Info; delete HDD_Info; } void Device_Manager_Widget::Set_VM( const Virtual_Machine &vm ) { ui.Devices_List->clear(); ui.Label_Connected_To->setText( "" ); if( vm.Get_Current_Emulator_Devices()->PSO_Drive ) ui.TB_Add_Device->setEnabled( true ); Floppy1 = VM_Storage_Device( vm.Get_FD0() ); Floppy2 = VM_Storage_Device( vm.Get_FD1() ); CD_ROM = VM_Storage_Device( vm.Get_CD_ROM() ); HDA = VM_HDD( vm.Get_HDA() ); HDB = VM_HDD( vm.Get_HDB() ); HDC = VM_HDD( vm.Get_HDC() ); HDD = VM_HDD( vm.Get_HDD() ); if( QFile::exists(HDA.Get_File_Name()) ) HDA_Info->Update_Disk_Info( HDA.Get_File_Name() ); if( QFile::exists(HDB.Get_File_Name()) ) HDB_Info->Update_Disk_Info( HDB.Get_File_Name() ); if( QFile::exists(HDC.Get_File_Name()) ) HDC_Info->Update_Disk_Info( HDC.Get_File_Name() ); if( QFile::exists(HDD.Get_File_Name()) ) HDD_Info->Update_Disk_Info( HDD.Get_File_Name() ); Storage_Devices.clear(); for( int ix = 0; ix < vm.Get_Storage_Devices_List().count(); ++ix ) { Storage_Devices << vm.Get_Storage_Devices_List()[ix]; } Update_Icons(); Update_Enabled_Actions(); Current_Machine_Devices = vm.Get_Current_Emulator_Devices(); } void Device_Manager_Widget::Set_Enabled( bool on ) { Enabled = on; ui.Label_Add_Devices->setEnabled( on ); ui.TB_Add_Floppy->setEnabled( on ); ui.TB_Add_CDROM->setEnabled( on ); ui.TB_Add_HDD->setEnabled( on ); ui.TB_Add_Device->setEnabled( on ); ui.Label_Manage_Devices->setEnabled( on ); ui.TB_Edit_Device->setEnabled( on ); ui.TB_Delete_Device->setEnabled( on ); ui.TB_Format_HDD->setEnabled( on ); ui.TB_Quick_Format->setEnabled( on ); ui.Label_View_Mode->setEnabled( on ); ui.TB_Icon_Mode->setEnabled( on ); ui.TB_List_Mode->setEnabled( on ); //ui.Label_Devices_List->setEnabled( on ); ui.Label_Information->setEnabled( on ); ui.Label_Connected_To->setEnabled( on ); } void Device_Manager_Widget::Update_Enabled_Actions() { // Adds if( Floppy1.Get_Enabled() && Floppy2.Get_Enabled() ) { ui.actionAdd_Floppy->setEnabled( false ); ui.TB_Add_Floppy->setEnabled( false ); } else { ui.actionAdd_Floppy->setEnabled( true ); ui.TB_Add_Floppy->setEnabled( true ); } if( CD_ROM.Get_Enabled() ) { ui.actionAdd_CD_ROM->setEnabled( false ); ui.TB_Add_CDROM->setEnabled( false ); } else { ui.actionAdd_CD_ROM->setEnabled( true ); ui.TB_Add_CDROM->setEnabled( true ); } if( HDA.Get_Enabled() && HDB.Get_Enabled() && HDC.Get_Enabled() && HDD.Get_Enabled() ) { ui.actionAdd_HDD->setEnabled( false ); ui.TB_Add_HDD->setEnabled( false ); } else if( HDA.Get_Enabled() && HDB.Get_Enabled() && HDD.Get_Enabled() && CD_ROM.Get_Enabled() ) { ui.actionAdd_HDD->setEnabled( false ); ui.TB_Add_HDD->setEnabled( false ); } else { ui.actionAdd_HDD->setEnabled( true ); ui.TB_Add_HDD->setEnabled( true ); } // Update Information if( ui.Devices_List->currentItem() != NULL ) { // item type if( ui.Devices_List->currentItem()->data(512).toString() == "fd1" || ui.Devices_List->currentItem()->data(512).toString() == "fd2" ) { ui.TB_Edit_Device->setEnabled( true ); ui.actionProperties->setEnabled( true ); ui.TB_Delete_Device->setEnabled( true ); ui.actionDelete->setEnabled( true ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); if( ui.Devices_List->currentItem()->data(512).toString() == "fd1" ) { if( It_Host_Device(Floppy1.Get_File_Name()) ) { ui.Label_Connected_To->setText( tr("Type: Host Device") ); } else { QFileInfo fd_img = QFileInfo( Floppy1.Get_File_Name() ); if( fd_img.exists() ) { qint64 size_in_bytes = fd_img.size(); if( size_in_bytes <= 0 ) { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("KB") ); } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number((int)size_in_bytes / 1024.0) + tr("KB") ); } } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("KB") ); } } } else { if( It_Host_Device(Floppy2.Get_File_Name()) ) { ui.Label_Connected_To->setText( tr("Type: Host Device") ); } else { QFileInfo fd_img = QFileInfo( Floppy2.Get_File_Name() ); if( fd_img.exists() ) { qint64 size_in_bytes = fd_img.size(); if( size_in_bytes <= 0 ) { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("KB") ); } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number((int)size_in_bytes / 1024.0) + tr("KB") ); } } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("MB") ); } } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "cd" ) { ui.TB_Edit_Device->setEnabled( true ); ui.actionProperties->setEnabled( true ); ui.TB_Delete_Device->setEnabled( true ); ui.actionDelete->setEnabled( true ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); if( It_Host_Device(CD_ROM.Get_File_Name()) ) { ui.Label_Connected_To->setText( tr("Type: Host Device") ); } else { QFileInfo cd_img = QFileInfo( CD_ROM.Get_File_Name() ); if( cd_img.exists() ) { qint64 size_in_bytes = cd_img.size(); if( size_in_bytes <= 0 ) { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("MB") ); } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number((float)(size_in_bytes / 1024.0 / 1024.0), 'f', 2) + tr("MB") ); } } else { ui.Label_Connected_To->setText( tr("Type: Image") + "\n" + tr("On Disk Size: ") + QString::number(0) + tr("MB") ); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hda" || ui.Devices_List->currentItem()->data(512).toString() == "hdb" || ui.Devices_List->currentItem()->data(512).toString() == "hdc" || ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { ui.TB_Edit_Device->setEnabled( true ); ui.actionProperties->setEnabled( true ); ui.TB_Delete_Device->setEnabled( true ); ui.actionDelete->setEnabled( true ); ui.TB_Format_HDD->setEnabled( true ); ui.actionFormat_HDD->setEnabled( true ); ui.TB_Quick_Format->setEnabled( true ); ui.actionQuick_Format->setEnabled( true ); if( ui.Devices_List->currentItem()->data(512).toString() == "hda" ) { HDA_Info->Update_Disk_Info( HDA.Get_File_Name() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDA.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDA.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDA.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDA.Get_Disk_Size()) ); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdb" ) { HDB_Info->Update_Disk_Info( HDB.Get_File_Name() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDB.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDB.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDB.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDB.Get_Disk_Size()) ); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdc" ) { HDC_Info->Update_Disk_Info( HDC.Get_File_Name() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDC.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDC.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDC.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDC.Get_Disk_Size())); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { HDD_Info->Update_Disk_Info( HDD.Get_File_Name() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDD.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDD.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDD.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDD.Get_Disk_Size())); } } else { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Devices_List->currentItem()->data(512).toString() == "device" + QString::number(fx) ) { found = true; ui.Label_Connected_To->setText( tr("Type: Storage Device") ); ui.TB_Edit_Device->setEnabled( true ); ui.actionProperties->setEnabled( true ); ui.TB_Delete_Device->setEnabled( true ); ui.actionDelete->setEnabled( true ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); } } if( ! found ) { ui.TB_Edit_Device->setEnabled( false ); ui.actionProperties->setEnabled( false); ui.TB_Delete_Device->setEnabled( false ); ui.actionDelete->setEnabled( false ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); } } } else { ui.TB_Edit_Device->setEnabled( false ); ui.actionProperties->setEnabled( false); ui.TB_Delete_Device->setEnabled( false ); ui.actionDelete->setEnabled( false ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); } // Disable widgets if( ! Enabled ) { ui.actionAdd_Floppy->setEnabled( false ); ui.TB_Add_Floppy->setEnabled( false ); ui.actionAdd_CD_ROM->setEnabled( false ); ui.TB_Add_CDROM->setEnabled( false ); ui.actionAdd_HDD->setEnabled( false ); ui.TB_Add_HDD->setEnabled( false ); ui.TB_Delete_Device->setEnabled( false ); ui.actionDelete->setEnabled( false ); ui.TB_Format_HDD->setEnabled( false ); ui.actionFormat_HDD->setEnabled( false ); ui.TB_Quick_Format->setEnabled( false ); ui.actionQuick_Format->setEnabled( false ); } } void Device_Manager_Widget::Update_List_Mode() { if( ui.Devices_List->viewMode() == QListView::IconMode ) { ui.Devices_List->setSpacing( 10 ); ui.Devices_List->setFlow( QListView::LeftToRight ); ui.Devices_List->setViewMode( QListView::IconMode ); } else { ui.Devices_List->setSpacing( 3 ); ui.Devices_List->setFlow( QListView::TopToBottom ); ui.Devices_List->setViewMode( QListView::ListMode ); } } void Device_Manager_Widget::on_Devices_List_customContextMenuRequested( const QPoint &pos ) { QListWidgetItem *it = ui.Devices_List->itemAt( pos ); if( it != NULL ) { if( it->data(512).toString() == "fd1" || it->data(512).toString() == "fd2" ) { Context_Menu = new QMenu( ui.Devices_List ); Context_Menu->addAction( ui.actionProperties ); Context_Menu->addAction( ui.actionDelete ); Context_Menu->exec( ui.Devices_List->mapToGlobal(pos) ); } else if( it->data(512).toString() == "cd" ) { Context_Menu = new QMenu( ui.Devices_List ); Context_Menu->addAction( ui.actionProperties ); Context_Menu->addAction( ui.actionDelete ); Context_Menu->exec( ui.Devices_List->mapToGlobal(pos) ); } else if( it->data(512).toString() == "hda" || it->data(512).toString() == "hdb" || it->data(512).toString() == "hdc" || it->data(512).toString() == "hdd" ) { Context_Menu = new QMenu( ui.Devices_List ); Context_Menu->addAction( ui.actionProperties ); Context_Menu->addAction( ui.actionDelete ); Context_Menu->addAction( ui.actionFormat_HDD ); Context_Menu->addAction( ui.actionQuick_Format ); Context_Menu->exec( ui.Devices_List->mapToGlobal(pos) ); } else { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Devices_List->currentItem()->data(512).toString() == "device" + QString::number(fx) ) { found = true; Context_Menu = new QMenu( ui.Devices_List ); Context_Menu->addAction( ui.actionProperties ); Context_Menu->addAction( ui.actionDelete ); Context_Menu->exec( ui.Devices_List->mapToGlobal(pos) ); } } if( ! found ) { AQError( "void Device_Manager_Widget::on_Devices_List_customContextMenuRequested( const QPoint &pos )", "Incorrect Device!" ); } } } else { Context_Menu = new QMenu( ui.Devices_List ); Context_Menu->addAction( ui.actionAdd_Floppy ); Context_Menu->addAction( ui.actionAdd_CD_ROM ); Context_Menu->addAction( ui.actionAdd_HDD ); Context_Menu->addSeparator(); Context_Menu->addAction( ui.actionIcon_Mode ); Context_Menu->addAction( ui.actionList_Mode ); Context_Menu->exec( ui.Devices_List->mapToGlobal(pos) ); } } void Device_Manager_Widget::on_Devices_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ) { Update_Enabled_Actions(); } void Device_Manager_Widget::on_Devices_List_itemDoubleClicked( QListWidgetItem *item ) { on_actionProperties_triggered(); } void Device_Manager_Widget::Add_Floppy(VM_Storage_Device& dev, int num) { dev = pw->Get_Floppy(); QString dev_name = dev.Get_File_Name(); if ( ! QFileInfo(dev_name).exists() ) return; QListWidgetItem *fdit = new QListWidgetItem( QIcon(":/fdd.png"), tr("Floppy") + " " + QString::number(num) + " (" + dev_name + ")" ); fdit->setData( 512, "fd" + QString::number(num) ); ui.Devices_List->addItem( fdit ); emit Device_Changed(); } void Device_Manager_Widget::on_actionAdd_Floppy_triggered() { if( ! Floppy1.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Floppy( Floppy1, tr("Floppy 1") ); if( pw->exec() == QDialog::Accepted ) { Add_Floppy(Floppy1,1); } } else if( ! Floppy2.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Floppy( Floppy2, tr("Floppy 2") ); if( pw->exec() == QDialog::Accepted ) { Add_Floppy(Floppy2,2); } } else { AQGraphic_Warning( tr("Warning!"), tr("Maximum Floppy Disk Count is 2") ); } } void Device_Manager_Widget::on_actionAdd_CD_ROM_triggered() { if( ! CD_ROM.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); pw->Set_CD_ROM( CD_ROM, tr("CD/DVD-ROM") ); if( pw->exec() == QDialog::Accepted ) { CD_ROM = pw->Get_CD_ROM(); CD_ROM.Set_Enabled( true ); QString dev_name = CD_ROM.Get_File_Name(); if ( ! QFileInfo(dev_name).exists() ) return; QListWidgetItem *cdit = new QListWidgetItem( QIcon(":/cdrom.png"), tr("CD-ROM") + " (" + dev_name + ")" , ui.Devices_List ); cdit->setData( 512, "cd" ); ui.Devices_List->addItem( cdit ); emit Device_Changed(); } } else { AQGraphic_Warning( tr("Warning!"), tr("Maximum CD-ROM Disk Count is 1") ); } } void Device_Manager_Widget::Add_HDD(VM_HDD& dev,QString letter) { dev = pw->Get_HDD(); QString dev_name = dev.Get_File_Name(); if ( ! QFileInfo(dev_name).exists() ) return; QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/hdd.png"), tr("HD") + letter.toUpper() + " (" + dev_name + ")", ui.Devices_List ); hdit->setData( 512, "hd"+letter.toLower() ); ui.Devices_List->addItem( hdit ); emit Device_Changed(); } void Device_Manager_Widget::on_actionAdd_HDD_triggered() { if( ! HDA.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); pw->Set_HDD( HDA, tr("HDA (First Master)") ); if( pw->exec() == QDialog::Accepted ) { Add_HDD(HDA,"A"); } } else if( ! HDB.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); pw->Set_HDD( HDB, tr("HDB (First Slave)") ); if( pw->exec() == QDialog::Accepted ) { Add_HDD(HDB,"B"); } } else if( HDC.Get_Enabled() == false && CD_ROM.Get_Enabled() == false ) { pw = new Properties_Window(this); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); pw->Set_HDD( HDC, tr("HDC (Second Master)") ); if( pw->exec() == QDialog::Accepted ) { Add_HDD(HDC,"C"); } } else if( ! HDD.Get_Enabled() ) { pw = new Properties_Window(this); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); pw->Set_HDD( HDD, tr("HDD (Second Slave)") ); if( pw->exec() == QDialog::Accepted ) { Add_HDD(HDD,"D"); } } else { AQGraphic_Warning( tr("Warning!"), tr("Maximum Hard Disk Count is 4 excluding CD-ROM") ); } } void Device_Manager_Widget::on_actionAdd_Device_triggered() { Add_New_Device_Window Device_Window; VM_Nativ_Storage_Device tmp_dev; Device_Window.Set_Emulator_Devices( *Current_Machine_Devices ); Device_Window.Set_Device( tmp_dev ); if( Device_Window.exec() == QDialog::Accepted ) { Storage_Devices << Device_Window.Get_Device(); QListWidgetItem *devit = new QListWidgetItem( QIcon(":blockdevice.png"), Device_Window.Get_Device().Get_QEMU_Device_Name(), ui.Devices_List ); devit->setData( 512, "device" + QString::number(Storage_Devices.count() - 1) ); ui.Devices_List->addItem( devit ); emit Device_Changed(); } } void Device_Manager_Widget::on_actionProperties_triggered() { if( ui.Devices_List->currentItem()->data(512).toString() == "fd1" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_Floppy( Floppy1, tr("Floppy 1") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( Floppy1 != pw->Get_Floppy() ) { Floppy1 = pw->Get_Floppy(); ui.Devices_List->currentItem()->setText( tr("Floppy 1") + " (" + Floppy1.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "fd2" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_Floppy( Floppy2, tr("Floppy 2") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( Floppy2 != pw->Get_Floppy() ) { Floppy2 = pw->Get_Floppy(); ui.Devices_List->currentItem()->setText( tr("Floppy 2") + " (" + Floppy2.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "cd" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_CD_ROM( CD_ROM, tr("CD/DVD-ROM") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( CD_ROM != pw->Get_CD_ROM() ) { CD_ROM = pw->Get_CD_ROM(); ui.Devices_List->currentItem()->setText( tr("CD-ROM") + " (" + CD_ROM.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hda" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_HDD( HDA, tr("HDA (First Master)") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( HDA != pw->Get_HDD() ) { HDA = pw->Get_HDD(); ui.Devices_List->currentItem()->setText( tr("HDA") + " (" + HDA.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdb" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_HDD( HDB, tr("HDB (First Slave)") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( HDB != pw->Get_HDD() ) { HDB = pw->Get_HDD(); ui.Devices_List->currentItem()->setText( tr("HDB") + " (" + HDB.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdc" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_HDD( HDC, tr("HDC (Second Master)") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( HDC != pw->Get_HDD() ) { HDC = pw->Get_HDD(); ui.Devices_List->currentItem()->setText( tr("HDC") + " (" + HDC.Get_File_Name() + ")" ); emit Device_Changed(); } } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { pw = new Properties_Window(this); pw->Set_Enabled( Enabled ); pw->Set_HDD( HDD, tr("HDD (Second Slave)") ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); pw->Set_Current_Machine_Devices( Current_Machine_Devices ); if( pw->exec() == QDialog::Accepted ) { if( HDD != pw->Get_HDD() ) { HDD = pw->Get_HDD(); ui.Devices_List->currentItem()->setText( tr("HDD") + " (" + HDC.Get_File_Name() + ")" ); emit Device_Changed(); } } } else { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Devices_List->currentItem()->data(512).toString() == "device" + QString::number(fx) ) { found = true; Add_New_Device_Window Device_Window ; Device_Window.Set_Enabled( Enabled ); Device_Window.Set_Device( Storage_Devices[fx] ); if( ! Current_Machine_Devices ) AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Current_Machine_Devices == NULL" ); Device_Window.Set_Emulator_Devices( *Current_Machine_Devices ); if( Device_Window.exec() == QDialog::Accepted ) { if( Storage_Devices[fx] != Device_Window.Get_Device() ) { Storage_Devices[fx] = Device_Window.Get_Device(); emit Device_Changed(); } } } } if( ! found ) { AQError( "void Device_Manager_Widget::on_actionProperties_triggered()", "Incorrect Device!" ); return; } } Update_Enabled_Actions(); } void Device_Manager_Widget::on_actionDelete_triggered() { int mes_ret = QMessageBox::question( this, tr("Delete?"), tr("Delete Device?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::No ) return; if( ui.Devices_List->currentItem()->data(512).toString() == "fd1" ) { Floppy1 = VM_Storage_Device(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "fd2" ) { Floppy2 = VM_Storage_Device(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "cd" ) { CD_ROM = VM_Storage_Device(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hda" ) { HDA = VM_HDD( false, "" ); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdb" ) { HDB = VM_HDD( false, "" ); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdc" ) { HDC = VM_HDD( false, "" ); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { HDD = VM_HDD( false, "" ); } else { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Devices_List->currentItem()->data(512).toString() == "device" + QString::number(fx) ) { found = true; Storage_Devices.removeAt( fx ); ui.Devices_List->takeItem( ui.Devices_List->currentRow() ); break; } } if( ! found ) { AQError( "void Device_Manager_Widget::on_actionDelete_triggered()", "Incorrect Device!" ); return; } else { // Rename items for( int ix = 0, count = 0; ix < ui.Devices_List->count(); ++ix ) { if( ui.Devices_List->item(ix)->data(512).toString().contains("device") ) { ui.Devices_List->item(ix)->setData( 512, QString("device%1").arg(count) ); ++count; } } emit Device_Changed(); return; } } ui.Devices_List->takeItem( ui.Devices_List->currentRow() ); emit Device_Changed(); } void Device_Manager_Widget::on_actionFormat_HDD_triggered() { Create_HDD_Image_Window *hdd_win = new Create_HDD_Image_Window( this ); if( ui.Devices_List->currentItem()->data(512).toString() == "hda" ) { hdd_win->Set_Image_File_Name( HDA.Get_File_Name() ); hdd_win->Set_Image_Info( HDA_Info->Get_Disk_Info() ); hdd_win->exec(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdb" ) { hdd_win->Set_Image_File_Name( HDB.Get_File_Name() ); hdd_win->Set_Image_Info( HDB_Info->Get_Disk_Info() ); hdd_win->exec(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdc" ) { hdd_win->Set_Image_File_Name( HDC.Get_File_Name() ); hdd_win->Set_Image_Info( HDC_Info->Get_Disk_Info() ); hdd_win->exec(); } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { hdd_win->Set_Image_File_Name( HDD.Get_File_Name() ); hdd_win->Set_Image_Info( HDD_Info->Get_Disk_Info() ); hdd_win->exec(); } else { AQGraphic_Error( "void Device_Manager_Widget::on_actionFormat_HDD_triggered()", tr("Error!"), tr("Incorrect Device!"), false ); return; } delete hdd_win; Update_Enabled_Actions(); emit Device_Changed(); } void Device_Manager_Widget::on_actionQuick_Format_triggered() { int mes_ret = QMessageBox::question( this, tr("Format?"), tr("Format Virtual Hard Disk?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::No ) return; if( ui.Devices_List->currentItem()->data(512).toString() == "hda" ) { if( Format_HDD_Image(HDA.Get_File_Name(), HDA_Info->Get_Disk_Info()) ) { QMessageBox::information( this, tr("Information"), tr("Complete!") ); } else { QMessageBox::critical( this, tr("Error!"), tr("Cannot Format!") ); } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdb" ) { if( Format_HDD_Image(HDB.Get_File_Name(), HDB_Info->Get_Disk_Info()) ) { QMessageBox::information( this, tr("Information"), tr("Complete!") ); } else { QMessageBox::critical( this, tr("Error!"), tr("Cannot Format!") ); } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdc" ) { if( Format_HDD_Image(HDC.Get_File_Name(), HDC_Info->Get_Disk_Info()) ) { QMessageBox::information( this, tr("Information"), tr("Complete!") ); } else { QMessageBox::critical( this, tr("Error!"), tr("Cannot Format!") ); } } else if( ui.Devices_List->currentItem()->data(512).toString() == "hdd" ) { if( Format_HDD_Image(HDD.Get_File_Name(), HDD_Info->Get_Disk_Info()) ) { QMessageBox::information( this, tr("Information"), tr("Complete!") ); } else { QMessageBox::critical( this, tr("Error!"), tr("Cannot Format!") ); } } else { AQGraphic_Error( "void Device_Manager_Widget::on_actionQuick_Format_triggered()", tr("Error!"), tr("Incorrect Device!"), false ); return; } Update_Enabled_Actions(); emit Device_Changed(); } void Device_Manager_Widget::on_actionIcon_Mode_triggered() { ui.Devices_List->setSpacing( 10 ); ui.Devices_List->setFlow( QListView::LeftToRight ); ui.Devices_List->setViewMode( QListView::IconMode ); } void Device_Manager_Widget::on_actionList_Mode_triggered() { ui.Devices_List->setSpacing( 3 ); ui.Devices_List->setFlow( QListView::TopToBottom ); ui.Devices_List->setViewMode( QListView::ListMode ); } void Device_Manager_Widget::Update_Icons() { ui.Devices_List->clear(); if( Floppy1.Get_Enabled() ) { QListWidgetItem *fdit = new QListWidgetItem( QIcon(":/fdd.png"), tr("Floppy 1") + " (" + Floppy1.Get_File_Name() + ")" ); fdit->setData( 512, "fd1" ); ui.Devices_List->addItem( fdit ); } if( Floppy2.Get_Enabled() ) { QListWidgetItem *fdit = new QListWidgetItem( QIcon(":/fdd.png"), tr("Floppy 2") + " (" + Floppy2.Get_File_Name() + ")" ); fdit->setData( 512, "fd2" ); ui.Devices_List->addItem( fdit ); } if( CD_ROM.Get_Enabled() ) { QListWidgetItem *cdit = new QListWidgetItem( QIcon(":/cdrom.png"), tr("CD-ROM") + " (" + CD_ROM.Get_File_Name() + ")" , ui.Devices_List ); cdit->setData( 512, "cd" ); ui.Devices_List->addItem( cdit ); } if( HDA.Get_Enabled() ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/hdd.png"), tr("HDA") + " (" + HDA.Get_File_Name() + ")", ui.Devices_List ); hdit->setData( 512, "hda" ); ui.Devices_List->addItem( hdit ); } if( HDB.Get_Enabled() ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/hdd.png"), tr("HDB") + " (" + HDB.Get_File_Name() + ")", ui.Devices_List ); hdit->setData( 512, "hdb" ); ui.Devices_List->addItem( hdit ); } if( HDC.Get_Enabled() ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/hdd.png"), tr("HDC") + " (" + HDC.Get_File_Name() + ")", ui.Devices_List ); hdit->setData( 512, "hdc" ); ui.Devices_List->addItem( hdit ); } if( HDD.Get_Enabled() ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/hdd.png"), tr("HDD") + " (" + HDD.Get_File_Name() + ")", ui.Devices_List ); hdit->setData( 512, "hdd" ); ui.Devices_List->addItem( hdit ); } // Storage Devices if( Storage_Devices.count() ) { for( int ix = 0; ix < Storage_Devices.count(); ++ix ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/blockdevice.png"), Storage_Devices[ix].Get_QEMU_Device_Name(), ui.Devices_List ); hdit->setData( 512, "device" + QString::number(ix) ); ui.Devices_List->addItem( hdit ); } } } void Device_Manager_Widget::Update_HDA( bool ok ) { HDA.Set_Disk_Info( HDA_Info->Get_Disk_Info() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDA.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDA.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDA.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDA.Get_Disk_Size()) ); } void Device_Manager_Widget::Update_HDB( bool ok ) { HDB.Set_Disk_Info( HDB_Info->Get_Disk_Info() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDB.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDB.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDB.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDB.Get_Disk_Size()) ); } void Device_Manager_Widget::Update_HDC( bool ok ) { HDC.Set_Disk_Info( HDC_Info->Get_Disk_Info() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDC.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDC.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDC.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDC.Get_Disk_Size())); } void Device_Manager_Widget::Update_HDD( bool ok ) { HDD.Set_Disk_Info( HDD_Info->Get_Disk_Info() ); ui.Label_Connected_To->setText( tr("Image Virtual Size: ") + QString::number(HDD.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(HDD.Get_Virtual_Size()) + "\n" + tr("Image On Disk Size: ") + QString::number(HDD.Get_Disk_Size().Size) + Get_TR_Size_Suffix(HDD.Get_Disk_Size())); } aqemu-0.9.2/src/Device_Manager_Widget.h000066400000000000000000000060001272330227200177220ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef DEVICE_MANAGER_WIDGET_H #define DEVICE_MANAGER_WIDGET_H #include "VM.h" #include "Add_New_Device_Window.h" #include "Properties_Window.h" #include "ui_Device_Manager_Widget.h" #include "HDD_Image_Info.h" class Device_Manager_Widget: public QWidget { friend class Folder_Sharing_Widget; friend class Ports_Tab_Widget; Q_OBJECT public: Device_Manager_Widget( QWidget *parent = 0 ); ~Device_Manager_Widget(); void Set_VM( const Virtual_Machine &vm ); void Set_Enabled( bool on ); VM_Storage_Device Floppy1; // FD0 VM_Storage_Device Floppy2; // FD1 VM_Storage_Device CD_ROM; // cdrom device ide2 VM_HDD HDA; // ide0 VM_HDD HDB; // ide1 VM_HDD HDC; // ide2 if cdrom is enabled, hdc be disibled VM_HDD HDD; // ide3 QList Storage_Devices; public slots: void Update_Enabled_Actions(); void Update_List_Mode(); signals: void Device_Changed(); private slots: // For Context Menu void on_Devices_List_customContextMenuRequested( const QPoint &pos ); void on_Devices_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ); void on_Devices_List_itemDoubleClicked( QListWidgetItem *item ); void on_actionAdd_Floppy_triggered(); void on_actionAdd_CD_ROM_triggered(); void on_actionAdd_HDD_triggered(); void on_actionAdd_Device_triggered(); void on_actionProperties_triggered(); void on_actionDelete_triggered(); void on_actionFormat_HDD_triggered(); void on_actionQuick_Format_triggered(); void on_actionIcon_Mode_triggered(); void on_actionList_Mode_triggered(); void Update_Icons(); void Update_HDA( bool ok ); void Update_HDB( bool ok ); void Update_HDC( bool ok ); void Update_HDD( bool ok ); private: void Add_Floppy(VM_Storage_Device&,int); void Add_HDD(VM_HDD&,QString); bool Enabled; Properties_Window *pw; Ui::Device_Manager_Widget ui; QMenu *Context_Menu; HDD_Image_Info* HDA_Info; HDD_Image_Info* HDB_Info; HDD_Image_Info* HDC_Info; HDD_Image_Info* HDD_Info; const Available_Devices *Current_Machine_Devices; }; #endif aqemu-0.9.2/src/Device_Manager_Widget.ui000066400000000000000000000523461272330227200201260ustar00rootroot00000000000000 Andrey Rijov Device_Manager_Widget 0 0 589 273 Device Manager Widget 9 9 9 9 6 Qt::Horizontal 20 20 Qt::Vertical Qt::Vertical Qt::Horizontal 6 0 0 0 0 Qt::CustomContextMenu Qt::ScrollBarAlwaysOn 32 32 Qt::ElideMiddle QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel QListView::Static QListView::LeftToRight 10 QListView::IconMode 0 0 true Information: 6 1 1 1 1 Add Devices 6 0 0 0 0 Add Floppy :/fdd.png:/fdd.png 32 32 Add CD/DVD-ROM :/cdrom.png:/cdrom.png 32 32 Add HDD :/hdd.png:/hdd.png 32 32 false Add Storage Device :/blockdevice.png:/blockdevice.png 32 32 6 1 1 1 1 Manage Devices 6 0 0 0 0 Properties :/edit.png:/edit.png 32 32 Delete :/remove.png:/remove.png 32 32 Format HDD :/exec.png:/exec.png 32 32 Quick Format Quick Format :/eraser.png:/eraser.png 32 32 1 1 1 1 6 View Mode 6 0 0 0 0 Icon Mode :/view_icon.png:/view_icon.png 32 32 List Mode :/view_detailed.png:/view_detailed.png 32 32 :/fdd.png:/fdd.png Add Floppy :/cdrom.png:/cdrom.png Add CD/DVD-ROM :/hdd.png:/hdd.png Add HDD :/eraser.png:/eraser.png Format HDD :/edit.png:/edit.png Properties Properties Properties :/remove.png:/remove.png Delete :/view_detailed.png:/view_detailed.png List Mode :/view_icon.png:/view_icon.png Icon Mode :/eraser.png:/eraser.png Quick Format :/blockdevice.png:/blockdevice.png Add Device Add Device Add Device TB_Add_Floppy TB_Add_CDROM TB_Add_HDD TB_Edit_Device TB_Delete_Device TB_Format_HDD TB_Quick_Format TB_Icon_Mode TB_List_Mode Devices_List TB_Add_CDROM clicked() actionAdd_CD_ROM trigger() 88 55 -1 -1 TB_Add_Device clicked() actionAdd_Device trigger() 196 55 -1 -1 TB_Format_HDD clicked() actionFormat_HDD trigger() 371 55 -1 -1 TB_Delete_Device clicked() actionDelete trigger() 317 55 -1 -1 TB_List_Mode clicked() actionList_Mode trigger() 546 55 -1 -1 TB_Icon_Mode clicked() actionIcon_Mode trigger() 492 55 -1 -1 TB_Quick_Format clicked() actionQuick_Format trigger() 425 55 -1 -1 TB_Edit_Device clicked() actionProperties trigger() 263 55 -1 -1 TB_Add_HDD clicked() actionAdd_HDD trigger() 142 55 -1 -1 TB_Add_Floppy clicked() actionAdd_Floppy trigger() 34 55 -1 -1 aqemu-0.9.2/src/Dialog_Button_Box.cpp000066400000000000000000000031321272330227200174660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Dialog_Button_Box.h" Dialog_Button_Box::Dialog_Button_Box(QWidget* parent) : QDialogButtonBox(parent) { } Dialog_Button_Box::Dialog_Button_Box() : QDialogButtonBox() { } void Dialog_Button_Box::init() { if ( button(QDialogButtonBox::Ok) ) button(QDialogButtonBox::Ok)->setIcon(QIcon(":/ok.png")); if ( button(QDialogButtonBox::Cancel) ) button(QDialogButtonBox::Cancel)->setIcon(QIcon(":/cancel.png")); if ( button(QDialogButtonBox::Save) ) button(QDialogButtonBox::Save)->setIcon(QIcon(":/save.png")); } Dialog_Button_Box::~Dialog_Button_Box() { } void Dialog_Button_Box::showEvent(QShowEvent* e) { init(); e->accept(); } aqemu-0.9.2/src/Dialog_Button_Box.h000066400000000000000000000026521272330227200171410ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef DIALOG_BUTTON_BOX_H #define DIALOG_BUTTON_BOX_H #include #include #include #include #include class QTabWidget; class QStackedWidget; class QBoxLayout; class QSize; class QSplitter; class QPaintEvent; class Dialog_Button_Box : public QDialogButtonBox { Q_OBJECT public: Dialog_Button_Box(QWidget*); Dialog_Button_Box(); ~Dialog_Button_Box(); private: void init(); void showEvent(QShowEvent*); }; #endif aqemu-0.9.2/src/Edit_Emulator_Version_Window.cpp000066400000000000000000000060101272330227200217130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "Edit_Emulator_Version_Window.h" #include "Utils.h" Edit_Emulator_Version_Window::Edit_Emulator_Version_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); Emulators = Get_Emulators_List(); Load_Emulators(); } void Edit_Emulator_Version_Window::Load_Emulators() { ui.List_Emulators->clear(); for( int ix = 0; ix < Emulators.count(); ++ix ) { new QListWidgetItem( tr("%1 (Located in %2)").arg(Emulator_Version_To_String(Emulators[ix].Get_Version())).arg(Emulators[ix].Get_Path()), ui.List_Emulators ); } } void Edit_Emulator_Version_Window::done(int r) { if ( QDialog::Accepted == r ) { // FIXME Optimize: save only changes // Delete old emulators Remove_All_Emulators_Files(); // Save New Emulators for( int ix = 0; ix < Emulators.count(); ++ix ) Emulators[ ix ].Save(); } QDialog::done(r); } void Edit_Emulator_Version_Window::on_List_Emulators_currentRowChanged( int currentRow ) { disconnect( ui.CB_Versions, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CB_Versions_currentIndexChanged(const QString &)) ); if( currentRow >= 0 && currentRow < ui.List_Emulators->count() ) { int item_index = -1; item_index = ui.CB_Versions->findText( Emulator_Version_To_String(Emulators[currentRow].Get_Version()) ); // Select Version if( item_index < 0 ) AQError( "void Edit_Emulator_Version_Window::on_List_Emulators_currentRowChanged( int currentRow )", "Cannot Find Version: " + Emulator_Version_To_String(Emulators[currentRow].Get_Version()) ); else ui.CB_Versions->setCurrentIndex( item_index ); } connect( ui.CB_Versions, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CB_Versions_currentIndexChanged(const QString &)) ); } void Edit_Emulator_Version_Window::CB_Versions_currentIndexChanged( const QString &text ) { if( ui.List_Emulators->currentRow() < 0 ) return; Emulators[ ui.List_Emulators->currentRow() ].Set_Name( text ); Emulators[ ui.List_Emulators->currentRow() ].Set_Version( String_To_Emulator_Version(text) ); Load_Emulators(); } aqemu-0.9.2/src/Edit_Emulator_Version_Window.h000066400000000000000000000027351272330227200213720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef EDIT_EMULATOR_VERSION_WINDOW_H #define EDIT_EMULATOR_VERSION_WINDOW_H #include "ui_Edit_Emulator_Version_Window.h" #include "VM_Devices.h" class Edit_Emulator_Version_Window: public QDialog { Q_OBJECT public: Edit_Emulator_Version_Window( QWidget *parent = 0 ); void Load_Emulators(); private slots: void done(int); void on_List_Emulators_currentRowChanged( int currentRow ); void CB_Versions_currentIndexChanged( const QString &text ); private: Ui::Edit_Emulator_Version_Window ui; QList Emulators; }; #endif aqemu-0.9.2/src/Edit_Emulator_Version_Window.ui000066400000000000000000000077131272330227200215610ustar00rootroot00000000000000 Andrey Rijov Edit_Emulator_Version_Window 0 0 345 202 Edit Emulator Version :/view_detailed.png:/view_detailed.png 0 0 Avai&lable Versions: CB_Versions Qt::Horizontal QSizePolicy::Fixed 10 20 0 0 Qt::Horizontal Qt::Horizontal 177 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
List_Emulators CB_Versions buttonBox accepted() Edit_Emulator_Version_Window accept() 244 173 172 100 buttonBox rejected() Edit_Emulator_Version_Window reject() 244 173 172 100
aqemu-0.9.2/src/Embedded_Display/000077500000000000000000000000001272330227200165775ustar00rootroot00000000000000aqemu-0.9.2/src/Embedded_Display/Machine_View.cpp000066400000000000000000000173211272330227200216450ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008 Ben Klopfenstein ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of QtEMU, AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU Library General Public License ** along with this library; see the file COPYING.LIB. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include "Utils.h" #include "Machine_View.h" #include "VM.h" MachineView::MachineView( QWidget *parent, Virtual_Machine* cur_vm ) : QScrollArea( parent ) { View = new VncView( this ); Cur_VM = cur_vm; splashShown = true; fullscreenEnabled = false; showSplash( true ); setFrameShape( QFrame::NoFrame ); Scaling = false; Reinit_Timer = new QTimer( this ); VNC_Connected = false; Init_Count = 0; VNC_Width = 0; VNC_Height = 0; } void MachineView::on_MouseEnteredFromTheLeft() { Cur_VM->Send_Emulator_Command("mouse_move -1000 0\n"); } void MachineView::on_MouseEnteredFromTheRight() { Cur_VM->Send_Emulator_Command("mouse_move 1000 0\n"); } void MachineView::on_MouseEnteredFromTheTop() { Cur_VM->Send_Emulator_Command("mouse_move 0 -1000\n"); } void MachineView::on_MouseEnteredFromTheBottom() { Cur_VM->Send_Emulator_Command("mouse_move 0 1000\n"); } void MachineView::Set_VNC_URL( const QString &host, int port ) { VNC_Host = host; VNC_Port = port; } void MachineView::Set_Scaling( bool s ) { Scaling = s; if( Scaling ) newViewSize( maximumViewportSize().width(), maximumViewportSize().height() ); else newViewSize( -1, -1 ); } void MachineView::Set_Fullscreen( bool on ) { fullscreen( on ); } void MachineView::resizeEvent( QResizeEvent *event ) { resizeView( event->size().width(), event->size().height() ); QScrollArea::resizeEvent( event ); } void MachineView::resizeView( int widgetWidth, int widgetHeight ) { View->blockSignals( true ); if( Scaling ) { View->enableScaling( true ); View->scaleResize( widgetWidth, widgetHeight ); } else { View->enableScaling( false ); } View->blockSignals( false ); } void MachineView::initView() { AQDebug("void MachineView::initView()","void MachineView::initView()"); if ( Cur_VM != nullptr) { auto state = Cur_VM->Get_State(); if ( state != VM::VMS_Running && state != VM::VMS_Pause ) { return; } } showSplash( true ); delete View; QUrl url; url.setScheme( "vnc" ); url.setHost( VNC_Host ); url.setPort( VNC_Port ); View = new VncView( this, url ); View->start(); showSplash( false ); connectView(); // This is for auto reiniting VNC QTimer::singleShot( 1000, this, SLOT(Check_Connection()) ); } void MachineView::connectView() { connect( View, SIGNAL(connected()), this, SIGNAL(Connected()) ); connect( View, SIGNAL(connected()), this, SLOT(VNC_Connected_OK()) ); connect( View, SIGNAL(framebufferSizeChanged(int, int)), this, SLOT(newViewSize(int, int)) ); connect(View,SIGNAL(MouseEnteredFromTheLeft()),this,SLOT(on_MouseEnteredFromTheLeft())); connect(View,SIGNAL(MouseEnteredFromTheRight()),this,SLOT(on_MouseEnteredFromTheRight())); connect(View,SIGNAL(MouseEnteredFromTheTop()),this,SLOT(on_MouseEnteredFromTheTop())); connect(View,SIGNAL(MouseEnteredFromTheBottom()),this,SLOT(on_MouseEnteredFromTheBottom())); } void MachineView::Check_Connection() { if( ! VNC_Connected ) { connect( Reinit_Timer, SIGNAL(timeout()), this, SLOT(initView()) ); // FIXME reinitVNC() Reinit_Timer->start( 1000 ); } } void MachineView::reinitVNC() { if( stop_reinit ) return; AQWarning( "void MachineView::reinitVNC()", "Reinit VNC. Attempt #" + QString::number(Init_Count+1) ); if( Init_Count < 10 ) { ++Init_Count; disconnect( View, SIGNAL(connected()), this, SIGNAL(Connected()) ); disconnect( View, SIGNAL(connected()), this, SLOT(VNC_Connected_OK()) ); disconnect( View, SIGNAL(framebufferSizeChanged(int, int)), this, SLOT(newViewSize(int, int)) ); /* View = new VncView( this ); splashShown = true; fullscreenEnabled = false; showSplash( true ); setFrameShape( QFrame::NoFrame ); Scaling = false;*/ // FIXME this code from initView() showSplash( true ); delete View; QUrl url; url.setScheme( "vnc" ); url.setHost( VNC_Host ); url.setPort( VNC_Port ); View = new VncView( this, url ); View->start(); showSplash( false ); connectView(); } else { Reinit_Timer->stop(); AQGraphic_Error( "void MachineView::reinitVNC()", tr("Error!"), tr("Cannot Reinit VNC Connection!"), false ); } } void MachineView::disconnectVNC() { stop_reinit = true; disconnect( Reinit_Timer, SIGNAL(timeout()), this, SLOT(reinitVNC()) ); Reinit_Timer->stop(); } void MachineView::VNC_Connected_OK() { disconnect( Reinit_Timer, SIGNAL(timeout()), this, SLOT(reinitVNC()) ); Reinit_Timer->stop(); VNC_Connected = true; } void MachineView::showSplash( bool show ) { if( ! show ) { takeWidget(); setWidget( View ); splashShown = false; View->show(); } else { fullscreen( false ); View->hide(); takeWidget(); splashShown = true; } } void MachineView::fullscreen( bool enable ) { if( splashShown ) return; if( enable ) { setWindowFlags( Qt::Window ); showFullScreen(); QPalette p; p.setColor( QPalette::Background, QColor(22,22,22) ); setPalette( p ); } else if( fullscreenEnabled ) { setWindowFlags( Qt::Widget ); showNormal(); setPalette( QPalette() ); } fullscreenEnabled = enable; emit fullscreenToggled( enable ); show(); View->switchFullscreen( enable ); } void MachineView::captureAllKeys( bool enabled ) { View->setGrabAllKeys( enabled ); } void MachineView::captureAllMouseEvents() { View->grabMouse(); } void MachineView::sendKey( QKeyEvent *event ) { View->keyEvent( event ); } void MachineView::newViewSize( int w, int h ) { if( w > 0 && h > 0 ) { VNC_Width = w; VNC_Height = h; } resizeView( maximumViewportSize().width(), maximumViewportSize().height() ); emit Full_Size( VNC_Width, VNC_Height ); } bool MachineView::event( QEvent *event ) { if( event->type() == QEvent::DynamicPropertyChange ) { //any property changes dealt with in here QDynamicPropertyChangeEvent *propEvent = static_cast( event ); if( propEvent->propertyName() == "scaleEmbeddedDisplay" ) { newViewSize( -1, -1 ); } return false; } else if( event->type() == QEvent::Enter && splashShown == false ) { View->setFocus(); View->grabKeyboard(); return true; } else if( event->type() == QEvent::Leave ) { View->clearFocus(); View->releaseKeyboard(); return true; } else if( event->type() == QEvent::KeyPress ) { QKeyEvent *ke = static_cast( event ); if( ke->key() == Qt::Key_Return && ke->modifiers() == Qt::ControlModifier + Qt::AltModifier ) { fullscreen( false ); return true; } } return QScrollArea::event( event ); } aqemu-0.9.2/src/Embedded_Display/Machine_View.h000066400000000000000000000053601272330227200213120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008 Ben Klopfenstein ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of QtEMU, AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU Library General Public License ** along with this library; see the file COPYING.LIB. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef MACHINE_VIEW_H #define MACHINE_VIEW_H #include "vncview.h" #include #include #include #include #include #include #include #include "VM.h" /** @author Ben Klopfenstein @author Andrey Rijov */ class MachineView : public QScrollArea { Q_OBJECT public: MachineView( QWidget *parent = 0, Virtual_Machine* = 0); void Set_VNC_URL( const QString &host, int port ); void Set_Scaling( bool s ); void Set_Fullscreen( bool on ); void showSplash( bool show ); void captureAllKeys( bool enabled ); void sendKey( QKeyEvent *event ); void captureAllMouseEvents(); protected: bool event( QEvent *event ); public slots: void on_MouseEnteredFromTheLeft(); void on_MouseEnteredFromTheRight(); void on_MouseEnteredFromTheTop(); void on_MouseEnteredFromTheBottom(); void newViewSize( int w, int h ); void fullscreen( bool enable ); void initView(); void Check_Connection(); void VNC_Connected_OK(); void reinitVNC(); void disconnectVNC(); signals: void fullscreenToggled( bool enabled ); void Full_Size( int width, int height ); void Connected(); private: void resizeEvent( QResizeEvent *event ); void resizeView( int widgetWidth, int widgetHeight ); void connectView(); bool VNC_Connected; Virtual_Machine* Cur_VM; VncView *View; int VNC_Port; QString VNC_Host; bool Scaling; bool splashShown; bool fullscreenEnabled; int Port; QTimer *Reinit_Timer; bool stop_reinit; QAction *scaleAction; int Init_Count; int VNC_Width; int VNC_Height; }; #endif aqemu-0.9.2/src/Embedded_Display/remoteview.cpp000066400000000000000000000145261272330227200215010ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2002-2003 Tim Jansen ** Copyright (C) 2007-2008 Urs Wolfer ** Copyright (C) 2010 Andrey Rijov ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "remoteview.h" #ifndef QTONLY #include #include #endif #include #include #include RemoteView::RemoteView(QWidget *parent) : QWidget(parent), m_status(Disconnected), m_host(QString()), m_port(0), m_viewOnly(false), m_grabAllKeys(false), m_scale(false), m_keyboardIsGrabbed(false), #ifndef QTONLY m_wallet(0), #endif m_dotCursorState(CursorOff) { } RemoteView::~RemoteView() { #ifndef QTONLY delete m_wallet; #endif } RemoteView::RemoteStatus RemoteView::status() { return m_status; } void RemoteView::setStatus(RemoteView::RemoteStatus s) { if (m_status == s) return; if (((1+ m_status) != s) && (s != Disconnected)) { // follow state transition rules if (s == Disconnecting) { if (m_status == Disconnected) return; } else { Q_ASSERT(((int) s) >= 0); if (m_status > s) { m_status = Disconnected; emit statusChanged(Disconnected); } // smooth state transition RemoteStatus origState = m_status; for (int i = origState; i < s; ++i) { m_status = (RemoteStatus) i; emit statusChanged((RemoteStatus) i); } } } m_status = s; emit statusChanged(m_status); } bool RemoteView::supportsScaling() const { return false; } bool RemoteView::supportsLocalCursor() const { return false; } QString RemoteView::host() { return m_host; } QSize RemoteView::framebufferSize() { return QSize(0, 0); } void RemoteView::startQuitting() { } bool RemoteView::isQuitting() { return false; } int RemoteView::port() { return m_port; } void RemoteView::updateConfiguration() { } void RemoteView::keyEvent(QKeyEvent *) { } bool RemoteView::viewOnly() { return m_viewOnly; } void RemoteView::setViewOnly(bool viewOnly) { m_viewOnly = viewOnly; } bool RemoteView::grabAllKeys() { return m_grabAllKeys; } void RemoteView::setGrabAllKeys(bool grabAllKeys) { m_grabAllKeys = grabAllKeys; if (grabAllKeys) { m_keyboardIsGrabbed = true; grabKeyboard(); } else if (m_keyboardIsGrabbed) { releaseKeyboard(); } } void RemoteView::showDotCursor(DotCursorState state) { m_dotCursorState = state; } RemoteView::DotCursorState RemoteView::dotCursorState() const { return m_dotCursorState; } bool RemoteView::scaling() const { return m_scale; } void RemoteView::enableScaling(bool scale) { m_scale = scale; } void RemoteView::switchFullscreen(bool) { } void RemoteView::scaleResize(int, int) { } KUrl RemoteView::url() { return m_url; } #ifndef QTONLY QString RemoteView::readWalletPassword(bool fromUserNameOnly) { const QString KRDCFOLDER = "KRDC"; window()->setDisabled(true); // WORKAROUND: disable inputs so users cannot close the current tab (see #181230) m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), window()->winId()); window()->setDisabled(false); if (m_wallet) { bool walletOK = m_wallet->hasFolder(KRDCFOLDER); if (!walletOK) { walletOK = m_wallet->createFolder(KRDCFOLDER); kDebug(5010) << "Wallet folder created"; } if (walletOK) { kDebug(5010) << "Wallet OK"; m_wallet->setFolder(KRDCFOLDER); QString password; QString key; if (fromUserNameOnly) key = m_url.userName(); else key = m_url.prettyUrl(KUrl::RemoveTrailingSlash); if (m_wallet->hasEntry(key) && !m_wallet->readPassword(key, password)) { kDebug(5010) << "Password read OK"; return password; } } } return QString(); } void RemoteView::saveWalletPassword(const QString &password, bool fromUserNameOnly) { QString key; if (fromUserNameOnly) key = m_url.userName(); else key = m_url.prettyUrl(KUrl::RemoveTrailingSlash); if (m_wallet && m_wallet->isOpen() && !m_wallet->hasEntry(key)) { kDebug(5010) << "Write wallet password"; m_wallet->writePassword(key, password); } } #endif QCursor RemoteView::localDotCursor() const { #ifdef QTONLY QBitmap cursorBitmap( ":pointcursor.png" ); QBitmap cursorMask( ":pointcursormask.png" ); return QCursor( cursorBitmap, cursorMask ); #else QBitmap cursorBitmap(KGlobal::dirs()->findResource("appdata", "pics/pointcursor.png")); QBitmap cursorMask(KGlobal::dirs()->findResource("appdata", "pics/pointcursormask.png")); return QCursor(cursorBitmap, cursorMask); #endif } void RemoteView::focusInEvent(QFocusEvent *event) { if (m_grabAllKeys) { m_keyboardIsGrabbed = true; grabKeyboard(); } QWidget::focusInEvent(event); } void RemoteView::focusOutEvent(QFocusEvent *event) { if (m_grabAllKeys || m_keyboardIsGrabbed) { m_keyboardIsGrabbed = false; releaseKeyboard(); } QWidget::focusOutEvent(event); } //#include "moc_remoteview.cpp" aqemu-0.9.2/src/Embedded_Display/remoteview.h000066400000000000000000000271321272330227200211430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2002-2003 Tim Jansen ** Copyright (C) 2007-2008 Urs Wolfer ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef REMOTEVIEW_H #define REMOTEVIEW_H #ifdef QTONLY #include #define KUrl QUrl #define KDE_EXPORT #else #include #include #endif #include class HostPreferences; /** * Generic widget that displays a remote framebuffer. * Implement this if you want to add another backend. * * Things to take care of: * @li The RemoteView is responsible for its size. In * non-scaling mode, set the fixed size of the widget * to the remote resolution. In scaling mode, set the * maximum size to the remote size and minimum size to the * smallest resolution that your scaler can handle. * @li if you override mouseMoveEvent() * you must ignore the QEvent, because the KRDC widget will * need it for stuff like toolbar auto-hide and bump * scrolling. If you use x11Event(), make sure that * MotionNotify events will be forwarded. * */ class KDE_EXPORT RemoteView : public QWidget { Q_OBJECT public: Q_ENUMS(Quality) enum Quality { Unknown, High, Medium, Low }; /** * Describes the state of a local cursor, if there is such a concept in the backend. * With local cursors, there are two cursors: the cursor on the local machine (client), * and the cursor on the remote machine (server). Because there is usually some lag, * some backends show both cursors simultanously. In the VNC backend the local cursor * is a dot and the remote cursor is the 'real' cursor, usually an arrow. */ Q_ENUMS(DotCursorState) enum DotCursorState { CursorOn, ///< Always show local cursor (and the remote one). CursorOff, ///< Never show local cursor, only the remote one. /// Try to measure the lag and enable the local cursor if the latency is too high. CursorAuto }; /** * State of the connection. The state of the connection is returned * by @ref RemoteView::status(). * * Not every state transition is allowed. You are only allowed to transition * a state to the following state, with three exceptions: * @li You can move from every state directly to Disconnected * @li You can move from every state except Disconnected to * Disconnecting * @li You can move from Disconnected to Connecting * * @ref RemoteView::setStatus() will follow this rules for you. * (If you add/remove a state here, you must adapt it) */ Q_ENUMS(RemoteStatus) enum RemoteStatus { Connecting = 0, Authenticating = 1, Preparing = 2, Connected = 3, Disconnecting = -1, Disconnected = -2 }; Q_ENUMS(ErrorCode) enum ErrorCode { None = 0, Internal, Connection, Protocol, IO, Name, NoServer, ServerBlocked, Authentication }; virtual ~RemoteView(); /** * Checks whether the backend supports scaling. The * default implementation returns false. * @return true if scaling is supported * @see scaling() */ virtual bool supportsScaling() const; /** * Checks whether the widget is in scale mode. The * default implementation always returns false. * @return true if scaling is activated. Must always be * false if @ref supportsScaling() returns false * @see supportsScaling() */ virtual bool scaling() const; /** * Checks whether the backend supports the concept of local cursors. The * default implementation returns false. * @return true if local cursors are supported/known * @see DotCursorState * @see showDotCursor() * @see dotCursorState() */ virtual bool supportsLocalCursor() const; /** * Sets the state of the dot cursor, if supported by the backend. * The default implementation does nothing. * @param state the new state (CursorOn, CursorOff or * CursorAuto) * @see dotCursorState() * @see supportsLocalCursor() */ virtual void showDotCursor(DotCursorState state); /** * Returns the state of the local cursor. The default implementation returns * always CursorOff. * @return true if local cursors are supported/known * @see showDotCursor() * @see supportsLocalCursor() */ virtual DotCursorState dotCursorState() const; /** * Checks whether the view is in view-only mode. This means * that all input is ignored. */ virtual bool viewOnly(); /** * Checks whether grabbing all possible keys is enabled. */ virtual bool grabAllKeys(); /** * Returns the resolution of the remote framebuffer. * It should return a null @ref QSize when the size * is not known. * The backend must also emit a @ref framebufferSizeChanged() * when the size of the framebuffer becomes available * for the first time or the size changed. * @return the remote framebuffer size, a null QSize * if unknown */ virtual QSize framebufferSize(); /** * Initiate the disconnection. This doesn't need to happen * immediately. The call must not block. * @see isQuitting() */ virtual void startQuitting(); /** * Checks whether the view is currently quitting. * @return true if it is quitting * @see startQuitting() * @see setStatus() */ virtual bool isQuitting(); /** * @return the host the view is connected to */ virtual QString host(); /** * @return the port the view is connected to */ virtual int port(); /** * Initialize the view (for example by showing configuration * dialogs to the user) and start connecting. Should not block * without running the event loop (so displaying a dialog is ok). * When the view starts connecting the application must call * @ref setStatus() with the status Connecting. * @return true if successful (so far), false * otherwise * @see connected() * @see disconnected() * @see disconnectedError() * @see statusChanged() */ virtual bool start() = 0; /** * Called when the configuration is changed. * The default implementation does nothing. */ virtual void updateConfiguration(); #ifndef QTONLY /** * Returns the current host preferences of this view. */ virtual HostPreferences* hostPreferences() = 0; #endif /** * Returns the current status of the connection. * @return the status of the connection * @see setStatus() */ RemoteStatus status(); /** * @return the current url */ KUrl url(); public slots: /** * Called to enable or disable scaling. * Ignored if @ref supportsScaling() is false. * The default implementation does nothing. * @param s true to enable, false to disable. * @see supportsScaling() * @see scaling() */ virtual void enableScaling(bool scale); /** * Enables/disables the view-only mode. * Ignored if @ref supportsScaling() is false. * The default implementation does nothing. * @param viewOnly true to enable, false to disable. * @see supportsScaling() * @see viewOnly() */ virtual void setViewOnly(bool viewOnly); /** * Enables/disables grabbing all possible keys. * @param grabAllKeys true to enable, false to disable. * Default is false. * @see grabAllKeys() */ virtual void setGrabAllKeys(bool grabAllKeys); /** * Called to let the backend know it when * we switch from/to fullscreen. * @param on true when switching to fullscreen, * false when switching from fullscreen. */ virtual void switchFullscreen(bool on); /** * Sends a QKeyEvent to the remote server. * @param event the key to send */ virtual void keyEvent(QKeyEvent *event); /** * Called when the visible place changed so remote * view can resize itself. */ virtual void scaleResize(int w, int h); signals: /** * Emitted when the size of the remote screen changes. Also * called when the size is known for the first time. * @param x the width of the screen * @param y the height of the screen */ void framebufferSizeChanged(int w, int h); /** * Emitted when the view connected successfully. */ void connected(); /** * Emitted when the view disconnected without error. */ void disconnected(); /** * Emitted when the view disconnected with error. */ void disconnectedError(); /** * Emitted when the view has a specific error. */ void errorMessage(const QString &title, const QString &message); /** * Emitted when the status of the view changed. * @param s the new status */ void statusChanged(RemoteView::RemoteStatus s); /** * Emitted when the password dialog is shown or hidden. * @param b true when the dialog is shown, false when it has been hidden */ void showingPasswordDialog(bool b); /** * Emitted when the mouse on the remote side has been moved. * @param x the new x coordinate * @param y the new y coordinate * @param buttonMask the mask of mouse buttons (bit 0 for first mouse * button, 1 for second button etc)a */ void mouseStateChanged(int x, int y, int buttonMask); protected: RemoteView(QWidget *parent = 0); void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); /** * The status of the remote view. */ RemoteStatus m_status; /** * Set the status of the connection. * Emits a statusChanged() signal. * Note that the states need to be set in a certain order, * see @ref Status. setStatus() will try to do this * transition automatically, so if you are in Connecting * and call setStatus(Preparing), setStatus() will * emit a Authenticating and then Preparing. * If you transition backwards, it will emit a * Disconnected before doing the transition. * @param s the new status */ virtual void setStatus(RemoteStatus s); QCursor localDotCursor() const; QString m_host; int m_port; bool m_viewOnly; bool m_grabAllKeys; bool m_scale; bool m_keyboardIsGrabbed; KUrl m_url; #ifndef QTONLY QString readWalletPassword(bool fromUserNameOnly = false); void saveWalletPassword(const QString &password, bool fromUserNameOnly = false); KWallet::Wallet *m_wallet; #endif DotCursorState m_dotCursorState; }; #endif aqemu-0.9.2/src/Embedded_Display/vncclientthread.cpp000066400000000000000000000231271272330227200224650ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2007-2008 Urs Wolfer ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "vncclientthread.h" #include #include #include "Utils.h" static QString outputErrorMessageString; // FIXME test it (static?) rfbBool VncClientThread::newclient(rfbClient *cl) { VncClientThread *t = (VncClientThread*)rfbClientGetClientData(cl, 0); Q_ASSERT(t); const int width = cl->width, height = cl->height, depth = cl->format.bitsPerPixel; const int size = width * height * (depth / 8); if (t->frameBuffer) delete [] t->frameBuffer; // do not leak if we get a new framebuffer size t->frameBuffer = new uint8_t[size]; cl->frameBuffer = t->frameBuffer; memset(cl->frameBuffer, '\0', size); cl->format.bitsPerPixel = 32; cl->format.redShift = 16; cl->format.greenShift = 8; cl->format.blueShift = 0; cl->format.redMax = 0xff; cl->format.greenMax = 0xff; cl->format.blueMax = 0xff; switch (t->quality()) { case RemoteView::High: cl->appData.useBGR233 = 0; cl->appData.encodingsString = "copyrect hextile raw"; cl->appData.compressLevel = 0; cl->appData.qualityLevel = 9; break; case RemoteView::Medium: cl->appData.useBGR233 = 0; cl->appData.encodingsString = "tight zrle ultra copyrect hextile zlib corre rre raw"; cl->appData.compressLevel = 5; cl->appData.qualityLevel = 7; break; case RemoteView::Low: case RemoteView::Unknown: default: cl->appData.useBGR233 = 1; cl->appData.encodingsString = "tight zrle ultra copyrect hextile zlib corre rre raw"; cl->appData.compressLevel = 9; cl->appData.qualityLevel = 1; } SetFormatAndEncodings(cl); return true; } void VncClientThread::updatefb(rfbClient* cl, int x, int y, int w, int h) { // kDebug(5011) << "updated client: x: " << x << ", y: " << y << ", w: " << w << ", h: " << h; const int width = cl->width, height = cl->height; const QImage img(cl->frameBuffer, width, height, QImage::Format_RGB32); if (img.isNull()) { kDebug(5011) << "image not loaded"; } VncClientThread *t = (VncClientThread*)rfbClientGetClientData(cl, 0); Q_ASSERT(t); t->setImage(img); t->emitUpdated(x, y, w, h); } void VncClientThread::cuttext(rfbClient* cl, const char *text, int textlen) { const QString cutText = QString::fromUtf8(text, textlen); kDebug(5011) << cutText; if (!cutText.isEmpty()) { VncClientThread *t = (VncClientThread*)rfbClientGetClientData(cl, 0); Q_ASSERT(t); t->emitGotCut(cutText); } } char *VncClientThread::passwdHandler(rfbClient *cl) { kDebug(5011) << "password request" << kBacktrace(); VncClientThread *t = (VncClientThread*)rfbClientGetClientData(cl, 0); Q_ASSERT(t); t->passwordRequest(); t->m_passwordError = true; return strdup(t->password().toLocal8Bit()); } void VncClientThread::outputHandler(const char *format, ...) { va_list args; va_start(args, format); QString message; message.vsprintf(format, args); va_end(args); message = message.trimmed(); kDebug(5011) << message; if ((message.contains("Couldn't convert ")) || (message.contains("Unable to connect to VNC server"))) outputErrorMessageString = i18n("Server not found."); if ((message.contains("VNC connection failed: Authentication failed, too many tries")) || (message.contains("VNC connection failed: Too many authentication failures"))) outputErrorMessageString = i18n("VNC authentication failed because of too many authentication tries."); if (message.contains("VNC connection failed: Authentication failed")) outputErrorMessageString = i18n("VNC authentication failed."); if (message.contains("VNC server closed connection")) outputErrorMessageString = i18n("VNC server closed connection."); // internal messages, not displayed to user if (message.contains("VNC server supports protocol version 3.889")) // see http://bugs.kde.org/162640 outputErrorMessageString = "INTERNAL:APPLE_VNC_COMPATIBILTY"; } VncClientThread::VncClientThread(QObject *parent) : QThread(parent) , frameBuffer(0) { QMutexLocker locker(&mutex); m_stopped = false; QTimer *outputErrorMessagesCheckTimer = new QTimer(this); outputErrorMessagesCheckTimer->setInterval(500); connect(outputErrorMessagesCheckTimer, SIGNAL(timeout()), this, SLOT(checkOutputErrorMessage())); outputErrorMessagesCheckTimer->start(); } VncClientThread::~VncClientThread() { stop(); const bool quitSuccess = wait(500); kDebug(5011) << "Quit VNC thread success:" << quitSuccess; delete [] frameBuffer; } void VncClientThread::checkOutputErrorMessage() { if (!outputErrorMessageString.isEmpty()) { kDebug(5011) << outputErrorMessageString; QString errorMessage = outputErrorMessageString; outputErrorMessageString.clear(); // show authentication failure error only after the 3rd unsuccessful try if ((errorMessage != i18n("VNC authentication failed.")) || m_passwordError) outputErrorMessage(errorMessage); } } void VncClientThread::setHost(const QString &host) { QMutexLocker locker(&mutex); m_host = host; } void VncClientThread::setPort(int port) { QMutexLocker locker(&mutex); m_port = port; } void VncClientThread::setQuality(RemoteView::Quality quality) { m_quality = quality; } RemoteView::Quality VncClientThread::quality() const { return m_quality; } void VncClientThread::setImage(const QImage &img) { QMutexLocker locker(&mutex); m_image = img; } const QImage VncClientThread::image(int x, int y, int w, int h) { QMutexLocker locker(&mutex); if (w == 0) // full image requested return m_image; else return m_image.copy(x, y, w, h); } void VncClientThread::emitUpdated(int x, int y, int w, int h) { emit imageUpdated(x, y, w, h); } void VncClientThread::emitGotCut(const QString &text) { emit gotCut(text); } void VncClientThread::stop() { QMutexLocker locker(&mutex); m_stopped = true; } void VncClientThread::run() { QMutexLocker locker(&mutex); while (!m_stopped) { // try to connect as long as the server allows m_passwordError = false; rfbClientLog = outputHandler; rfbClientErr = outputHandler; cl = rfbGetClient(8, 3, 4); cl->MallocFrameBuffer = newclient; cl->canHandleNewFBSize = true; cl->GetPassword = passwdHandler; cl->GotFrameBufferUpdate = updatefb; cl->GotXCutText = cuttext; rfbClientSetClientData(cl, 0, this); cl->serverHost = strdup(m_host.toUtf8().constData()); if (m_port < 0 || !m_port) // port is invalid or empty... m_port = 5900; // fallback: try an often used VNC port if (m_port >= 0 && m_port < 100) // the user most likely used the short form (e.g. :1) m_port += 5900; cl->serverPort = m_port; kDebug(5011) << "--------------------- trying init ---------------------"; if (rfbInitClient(cl, 0, 0)) break; if (m_passwordError) continue; return; } locker.unlock(); // Main VNC event loop while (!m_stopped) { const int i = WaitForMessage(cl, 500); if (i < 0) break; if (i) if (!HandleRFBServerMessage(cl)) break; locker.relock(); while (!m_eventQueue.isEmpty()) { ClientEvent* clientEvent = m_eventQueue.dequeue(); clientEvent->fire(cl); delete clientEvent; } locker.unlock(); } // Cleanup allocated resources locker.relock(); rfbClientCleanup(cl); m_stopped = true; } ClientEvent::~ClientEvent() { } void PointerClientEvent::fire(rfbClient* cl) { SendPointerEvent(cl, m_x, m_y, m_buttonMask); } void KeyClientEvent::fire(rfbClient* cl) { SendKeyEvent(cl, m_key, m_pressed); } void ClientCutEvent::fire(rfbClient* cl) { SendClientCutText(cl, text.toUtf8().data(), text.size()); } void VncClientThread::mouseEvent(int x, int y, int buttonMask) { QMutexLocker lock(&mutex); if (m_stopped) return; m_eventQueue.enqueue(new PointerClientEvent(x, y, buttonMask)); } void VncClientThread::keyEvent(int key, bool pressed) { QMutexLocker lock(&mutex); if (m_stopped) return; m_eventQueue.enqueue(new KeyClientEvent(key, pressed)); } void VncClientThread::clientCut(const QString &text) { QMutexLocker lock(&mutex); if (m_stopped) return; m_eventQueue.enqueue(new ClientCutEvent(text)); } //#include "moc_vncclientthread.cpp" aqemu-0.9.2/src/Embedded_Display/vncclientthread.h000066400000000000000000000073151272330227200221330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2007-2008 Urs Wolfer ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VNCCLIENTTHREAD_H #define VNCCLIENTTHREAD_H #ifdef QTONLY #include #define kDebug(n) qDebug() #define kBacktrace() "" #define i18n tr #else #include #include #endif #include "remoteview.h" #include #include #include #include extern "C" { #include } class ClientEvent { public: virtual ~ClientEvent(); virtual void fire(rfbClient*) = 0; }; class KeyClientEvent : public ClientEvent { public: KeyClientEvent(int key, int pressed) : m_key(key), m_pressed(pressed) {} void fire(rfbClient*); private: int m_key; int m_pressed; }; class PointerClientEvent : public ClientEvent { public: PointerClientEvent(int x, int y, int buttonMask) : m_x(x), m_y(y), m_buttonMask(buttonMask) {} void fire(rfbClient*); private: int m_x; int m_y; int m_buttonMask; }; class ClientCutEvent : public ClientEvent { public: ClientCutEvent(const QString &text) : text(text) {} void fire(rfbClient*); private: QString text; }; class VncClientThread: public QThread { Q_OBJECT public: explicit VncClientThread(QObject *parent = 0); ~VncClientThread(); const QImage image(int x = 0, int y = 0, int w = 0, int h = 0); void setImage(const QImage &img); void emitUpdated(int x, int y, int w, int h); void emitGotCut(const QString &text); void stop(); void setHost(const QString &host); void setPort(int port); void setQuality(RemoteView::Quality quality); void setPassword(const QString &password) { m_password = password; } const QString password() const { return m_password; } RemoteView::Quality quality() const; uint8_t *frameBuffer; signals: void imageUpdated(int x, int y, int w, int h); void gotCut(const QString &text); void passwordRequest(); void outputErrorMessage(const QString &message); public slots: void mouseEvent(int x, int y, int buttonMask); void keyEvent(int key, bool pressed); void clientCut(const QString &text); protected: void run(); private: static rfbBool newclient(rfbClient *cl); static void updatefb(rfbClient *cl, int x, int y, int w, int h); static void cuttext(rfbClient *cl, const char *text, int textlen); static char* passwdHandler(rfbClient *cl); static void outputHandler(const char *format, ...); QImage m_image; rfbClient *cl; QString m_host; QString m_password; int m_port; QMutex mutex; RemoteView::Quality m_quality; QQueue m_eventQueue; volatile bool m_stopped; volatile bool m_passwordError; private slots: void checkOutputErrorMessage(); }; #endif aqemu-0.9.2/src/Embedded_Display/vncview.cpp000066400000000000000000000451571272330227200210000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2007-2008 Urs Wolfer ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "vncview.h" #include "Utils.h" #include #ifdef QTONLY #include #include #define KMessageBox QMessageBox /* #define error(parent, message, caption) \ critical(parent, caption, message)*/ #else #include "settings.h" #include #include #include #include #include #endif #include #include #include #include // Definition of key modifier mask constants #define KMOD_Alt_R 0x01 #define KMOD_Alt_L 0x02 #define KMOD_Meta_L 0x04 #define KMOD_Control_L 0x08 #define KMOD_Shift_L 0x10 VncView::VncView(QWidget *parent, const KUrl &url, KConfigGroup configGroup) : RemoteView(parent), m_initDone(false), m_buttonMask(0), m_repaint(false), m_quitFlag(false), m_firstPasswordTry(true), m_authenticaionCanceled(false), m_dontSendClipboard(false), m_horizontalFactor(1.0), m_verticalFactor(1.0), m_forceLocalCursor(false) { m_url = url; m_host = url.host(); m_port = url.port(); connect(&vncThread, SIGNAL(imageUpdated(int, int, int, int)), this, SLOT(updateImage(int, int, int, int)), Qt::BlockingQueuedConnection); connect(&vncThread, SIGNAL(gotCut(const QString&)), this, SLOT(setCut(const QString&)), Qt::BlockingQueuedConnection); connect(&vncThread, SIGNAL(passwordRequest()), this, SLOT(requestPassword()), Qt::BlockingQueuedConnection); connect(&vncThread, SIGNAL(outputErrorMessage(QString)), this, SLOT(outputErrorMessage(QString))); m_clipboard = QApplication::clipboard(); connect(m_clipboard, SIGNAL(selectionChanged()), this, SLOT(clipboardSelectionChanged())); connect(m_clipboard, SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged())); #ifndef QTONLY m_hostPreferences = new VncHostPreferences(configGroup, this); #else Q_UNUSED(configGroup); #endif } VncView::~VncView() { unpressModifiers(); // Disconnect all signals so that we don't get any more callbacks from the client thread disconnect(&vncThread, SIGNAL(imageUpdated(int, int, int, int)), this, SLOT(updateImage(int, int, int, int))); disconnect(&vncThread, SIGNAL(gotCut(const QString&)), this, SLOT(setCut(const QString&))); disconnect(&vncThread, SIGNAL(passwordRequest()), this, SLOT(requestPassword())); disconnect(&vncThread, SIGNAL(outputErrorMessage(QString)), this, SLOT(outputErrorMessage(QString))); startQuitting(); } bool VncView::eventFilter(QObject *obj, QEvent *event) { if (m_viewOnly) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease || event->type() == QEvent::MouseButtonDblClick || event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::Wheel || event->type() == QEvent::MouseMove) return true; } return RemoteView::eventFilter(obj, event); } QSize VncView::framebufferSize() { return m_frame.size(); } QSize VncView::sizeHint() const { return size(); } QSize VncView::minimumSizeHint() const { return size(); } void VncView::scaleResize(int w, int h) { RemoteView::scaleResize(w, h); kDebug(5011) << w << h; if (m_scale) { m_verticalFactor = (qreal) h / m_frame.height(); m_horizontalFactor = (qreal) w / m_frame.width(); #ifndef QTONLY if (Settings::keepAspectRatio()) { m_verticalFactor = m_horizontalFactor = qMin(m_verticalFactor, m_horizontalFactor); } #else m_verticalFactor = m_horizontalFactor = qMin(m_verticalFactor, m_horizontalFactor); #endif const qreal newW = m_frame.width() * m_horizontalFactor; const qreal newH = m_frame.height() * m_verticalFactor; setMaximumSize(newW, newH); //This is a hack to force Qt to center the view in the scroll area resize(newW, newH); } } void VncView::updateConfiguration() { RemoteView::updateConfiguration(); // Update the scaling mode in case KeepAspectRatio changed scaleResize(parentWidget()->width(), parentWidget()->height()); } void VncView::startQuitting() { kDebug(5011) << "about to quit"; const bool connected = status() == RemoteView::Connected; setStatus(Disconnecting); m_quitFlag = true; if (connected) { vncThread.stop(); } vncThread.quit(); const bool quitSuccess = vncThread.wait(500); kDebug(5011) << "Quit VNC thread success:" << quitSuccess; setStatus(Disconnected); } bool VncView::isQuitting() { return m_quitFlag; } bool VncView::start() { vncThread.setHost(m_host); vncThread.setPort(m_port); RemoteView::Quality quality; #ifdef QTONLY quality = RemoteView::High; #else quality = m_hostPreferences->quality(); #endif vncThread.setQuality(quality); // set local cursor on by default because low quality mostly means slow internet connection if (quality == RemoteView::Low) { showDotCursor(RemoteView::CursorOn); #ifndef QTONLY // KRDC does always just have one main window, so at(0) is safe KXMLGUIClient *mainWindow = dynamic_cast(KMainWindow::memberList().at(0)); if (mainWindow) mainWindow->actionCollection()->action("show_local_cursor")->setChecked(true); #endif } setStatus(Connecting); vncThread.start(); return true; } bool VncView::supportsScaling() const { return true; } bool VncView::supportsLocalCursor() const { return true; } void VncView::requestPassword() { kDebug(5011) << "request password"; if (m_authenticaionCanceled) { startQuitting(); return; } setStatus(Authenticating); #ifndef QTONLY if (m_hostPreferences->walletSupport()) { QString walletPassword = readWalletPassword(); if (!walletPassword.isNull()) { vncThread.setPassword(walletPassword); return; } } #endif if (!m_url.password().isNull()) { vncThread.setPassword(m_url.password()); return; } #ifdef QTONLY bool ok; QString password = QInputDialog::getText(this, //krazy:exclude=qclasses tr("Password required"), tr("Please enter the password for the remote desktop:"), QLineEdit::Password, QString(), &ok); m_firstPasswordTry = false; if (ok) vncThread.setPassword(password); else m_authenticaionCanceled = true; #else KPasswordDialog dialog(this); dialog.setPrompt(m_firstPasswordTry ? i18n("Access to the system requires a password.") : i18n("Authentication failed. Please try again.")); if (dialog.exec() == KPasswordDialog::Accepted) { m_firstPasswordTry = false; vncThread.setPassword(dialog.password()); } else { kDebug(5011) << "password dialog not accepted"; m_authenticaionCanceled = true; } #endif } void VncView::outputErrorMessage(const QString &message) { kDebug(5011) << message; if (message == "INTERNAL:APPLE_VNC_COMPATIBILTY") { setCursor(localDotCursor()); m_forceLocalCursor = true; return; } startQuitting(); #ifndef QTONLY KMessageBox::error(this, message, i18n("VNC failure")); #endif emit errorMessage(i18n("VNC failure"), message); } #ifndef QTONLY HostPreferences* VncView::hostPreferences() { return m_hostPreferences; } #endif void VncView::updateImage(int x, int y, int w, int h) { // kDebug(5011) << "got update" << width() << height(); m_x = x; m_y = y; m_w = w; m_h = h; if (m_horizontalFactor != 1.0 || m_verticalFactor != 1.0) { // If the view is scaled, grow the update rectangle to avoid artifacts m_x-=1; m_y-=1; m_w+=2; m_h+=2; } m_frame = vncThread.image(); if (!m_initDone) { setAttribute(Qt::WA_StaticContents); setAttribute(Qt::WA_OpaquePaintEvent); installEventFilter(this); setCursor(((m_dotCursorState == CursorOn) || m_forceLocalCursor) ? localDotCursor() : Qt::BlankCursor); setMouseTracking(true); // get mouse events even when there is no mousebutton pressed setFocusPolicy(Qt::WheelFocus); setStatus(Connected); // emit framebufferSizeChanged(m_frame.width(), m_frame.height()); emit connected(); if (m_scale) { if (parentWidget()) scaleResize(parentWidget()->width(), parentWidget()->height()); } m_initDone = true; #ifndef QTONLY if (m_hostPreferences->walletSupport()) { saveWalletPassword(vncThread.password()); } #endif } if ((y == 0 && x == 0) && (m_frame.size() != size())) { kDebug(5011) << "Updating framebuffer size"; if (m_scale) { setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); if (parentWidget()) scaleResize(parentWidget()->width(), parentWidget()->height()); } else { kDebug(5011) << "Resizing: " << m_frame.width() << m_frame.height(); resize(m_frame.width(), m_frame.height()); setMaximumSize(m_frame.width(), m_frame.height()); //This is a hack to force Qt to center the view in the scroll area setMinimumSize(m_frame.width(), m_frame.height()); } emit framebufferSizeChanged(m_frame.width(), m_frame.height()); } m_repaint = true; repaint(qRound(m_x * m_horizontalFactor), qRound(m_y * m_verticalFactor), qRound(m_w * m_horizontalFactor), qRound(m_h * m_verticalFactor)); m_repaint = false; } void VncView::setViewOnly(bool viewOnly) { RemoteView::setViewOnly(viewOnly); m_dontSendClipboard = viewOnly; if (viewOnly) setCursor(Qt::ArrowCursor); else setCursor(m_dotCursorState == CursorOn ? localDotCursor() : Qt::BlankCursor); } void VncView::showDotCursor(DotCursorState state) { RemoteView::showDotCursor(state); setCursor(state == CursorOn ? localDotCursor() : Qt::BlankCursor); } void VncView::enableScaling(bool scale) { RemoteView::enableScaling(scale); if (scale) { setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); setMinimumSize(1, 1); if (parentWidget()) scaleResize(parentWidget()->width(), parentWidget()->height()); } else { m_verticalFactor = 1.0; m_horizontalFactor = 1.0; setMaximumSize(m_frame.width(), m_frame.height()); //This is a hack to force Qt to center the view in the scroll area setMinimumSize(m_frame.width(), m_frame.height()); resize(m_frame.width(), m_frame.height()); } } void VncView::setCut(const QString &text) { m_dontSendClipboard = true; m_clipboard->setText(text, QClipboard::Clipboard); m_clipboard->setText(text, QClipboard::Selection); m_dontSendClipboard = false; } void VncView::paintEvent(QPaintEvent *event) { // kDebug(5011) << "paint event: x: " << m_x << ", y: " << m_y << ", w: " << m_w << ", h: " << m_h; if (m_frame.isNull() || m_frame.format() == QImage::Format_Invalid) { kDebug(5011) << "no valid image to paint"; RemoteView::paintEvent(event); return; } event->accept(); QPainter painter(this); if (m_repaint) { // kDebug(5011) << "normal repaint"; painter.drawImage(QRect(qRound(m_x*m_horizontalFactor), qRound(m_y*m_verticalFactor), qRound(m_w*m_horizontalFactor), qRound(m_h*m_verticalFactor)), m_frame.copy(m_x, m_y, m_w, m_h).scaled(qRound(m_w*m_horizontalFactor), qRound(m_h*m_verticalFactor), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } else { // kDebug(5011) << "resize repaint"; QRect rect = event->rect(); if (rect.width() != width() || rect.height() != height()) { // kDebug(5011) << "Partial repaint"; const int sx = rect.x()/m_horizontalFactor; const int sy = rect.y()/m_verticalFactor; const int sw = rect.width()/m_horizontalFactor; const int sh = rect.height()/m_verticalFactor; painter.drawImage(rect, m_frame.copy(sx, sy, sw, sh).scaled(rect.width(), rect.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } else { // kDebug(5011) << "Full repaint" << width() << height() << m_frame.width() << m_frame.height(); painter.drawImage(QRect(0, 0, width(), height()), m_frame.scaled(m_frame.width() * m_horizontalFactor, m_frame.height() * m_verticalFactor, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } } RemoteView::paintEvent(event); } void VncView::resizeEvent(QResizeEvent *event) { RemoteView::resizeEvent(event); update(); } bool VncView::event(QEvent *event) { switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: // kDebug(5011) << "keyEvent"; keyEventHandler(static_cast(event)); return true; break; case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: // kDebug(5011) << "mouseEvent"; mouseEventHandler(static_cast(event)); return true; break; case QEvent::Wheel: // kDebug(5011) << "wheelEvent"; wheelEventHandler(static_cast(event)); return true; break; default: return RemoteView::event(event); } } #include void VncView::enterEvent( QEvent* event ) { auto enter = static_cast(event); int x = enter->globalX(); int y = enter->globalY(); int mx = enter->x(); int my = enter->y(); int th = 70; //treshold if ( mx < th ) { //Entered from the left emit MouseEnteredFromTheLeft(); } else if ( mx > ( m_frame.width() - th ) ) { //Entered from the right emit MouseEnteredFromTheRight(); } if ( my < th ) { //Entered from the top emit MouseEnteredFromTheTop(); } else if ( my > ( m_frame.height() - th ) ) { //Entered from the bottom emit MouseEnteredFromTheBottom(); } } void VncView::mouseEventHandler(QMouseEvent *e) { if (e->type() != QEvent::MouseMove) { if ((e->type() == QEvent::MouseButtonPress) || (e->type() == QEvent::MouseButtonDblClick)) { if (e->button() & Qt::LeftButton) m_buttonMask |= 0x01; if (e->button() & Qt::MidButton) m_buttonMask |= 0x02; if (e->button() & Qt::RightButton) m_buttonMask |= 0x04; } else if (e->type() == QEvent::MouseButtonRelease) { if (e->button() & Qt::LeftButton) m_buttonMask &= 0xfe; if (e->button() & Qt::MidButton) m_buttonMask &= 0xfd; if (e->button() & Qt::RightButton) m_buttonMask &= 0xfb; } } vncThread.mouseEvent(qRound(e->x() / m_horizontalFactor), qRound(e->y() / m_verticalFactor), m_buttonMask); } void VncView::wheelEventHandler(QWheelEvent *event) { int eb = 0; if (event->delta() < 0) eb |= 0x10; else eb |= 0x8; const int x = qRound(event->x() / m_horizontalFactor); const int y = qRound(event->y() / m_verticalFactor); vncThread.mouseEvent(x, y, eb | m_buttonMask); vncThread.mouseEvent(x, y, m_buttonMask); } void VncView::keyEventHandler(QKeyEvent *e) { // strip away autorepeating KeyRelease; see bug #206598 if (e->isAutoRepeat() && (e->type() == QEvent::KeyRelease)) return; // parts of this code are based on http://italc.sourcearchive.com/documentation/1.0.9.1/vncview_8cpp-source.html rfbKeySym k = e->nativeVirtualKey(); // we do not handle Key_Backtab separately as the Shift-modifier // is already enabled if (e->key() == Qt::Key_Backtab) { k = XK_Tab; } const bool pressed = (e->type() == QEvent::KeyPress); // handle modifiers if (k == XK_Shift_L || k == XK_Control_L || k == XK_Meta_L || k == XK_Alt_L) { if (pressed) { m_mods[k] = true; } else if (m_mods.contains(k)) { m_mods.remove(k); } else { unpressModifiers(); } } if (k) { vncThread.keyEvent(k, pressed); } } void VncView::unpressModifiers() { const QList keys = m_mods.keys(); QList::const_iterator it = keys.constBegin(); while (it != keys.end()) { vncThread.keyEvent(*it, false); it++; } m_mods.clear(); } void VncView::clipboardSelectionChanged() { kDebug(5011); if (m_status != Connected) return; if (m_clipboard->ownsSelection() || m_dontSendClipboard) return; const QString text = m_clipboard->text(QClipboard::Selection); vncThread.clientCut(text); } void VncView::clipboardDataChanged() { kDebug(5011); if (m_status != Connected) return; if (m_clipboard->ownsClipboard() || m_dontSendClipboard) return; const QString text = m_clipboard->text(QClipboard::Clipboard); vncThread.clientCut(text); } //#include "moc_vncview.cpp" aqemu-0.9.2/src/Embedded_Display/vncview.h000066400000000000000000000062331272330227200204350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2007-2008 Urs Wolfer ** ** This file is part of KDE. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; see the file COPYING. If not, write to ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VNCVIEW_H #define VNCVIEW_H #include "remoteview.h" #include "vncclientthread.h" #ifdef QTONLY class KConfigGroup{}; #else #include "vnchostpreferences.h" #endif #include extern "C" { #include } class VncView: public RemoteView { Q_OBJECT public: explicit VncView(QWidget *parent = 0, const KUrl &url = KUrl(), KConfigGroup configGroup = KConfigGroup()); ~VncView(); QSize framebufferSize(); QSize sizeHint() const; QSize minimumSizeHint() const; void startQuitting(); bool isQuitting(); bool start(); bool supportsScaling() const; bool supportsLocalCursor() const; #ifndef QTONLY HostPreferences* hostPreferences(); #endif void setViewOnly(bool viewOnly); void showDotCursor(DotCursorState state); void enableScaling(bool scale); virtual void updateConfiguration(); public slots: void scaleResize(int w, int h); protected: void enterEvent( QEvent* event); void paintEvent(QPaintEvent *event); bool event(QEvent *event); void resizeEvent(QResizeEvent *event); bool eventFilter(QObject *obj, QEvent *event); private: VncClientThread vncThread; QClipboard *m_clipboard; bool m_initDone; int m_buttonMask; QMap m_mods; int m_x, m_y, m_w, m_h; bool m_repaint; bool m_quitFlag; bool m_firstPasswordTry; bool m_authenticaionCanceled; bool m_dontSendClipboard; qreal m_horizontalFactor; qreal m_verticalFactor; #ifndef QTONLY VncHostPreferences *m_hostPreferences; #endif QImage m_frame; bool m_forceLocalCursor; void keyEventHandler(QKeyEvent *e); void unpressModifiers(); void wheelEventHandler(QWheelEvent *event); void mouseEventHandler(QMouseEvent *event); private slots: void updateImage(int x, int y, int w, int h); void setCut(const QString &text); void requestPassword(); void outputErrorMessage(const QString &message); void clipboardSelectionChanged(); void clipboardDataChanged(); signals: void MouseEnteredFromTheLeft(); void MouseEnteredFromTheRight(); void MouseEnteredFromTheTop(); void MouseEnteredFromTheBottom(); }; #endif aqemu-0.9.2/src/Emulator_Control_Window.cpp000066400000000000000000001267001272330227200207520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 // FIXME #else #include #endif #include "Utils.h" #include "Ports_Tab_Widget.h" #include "Emulator_Control_Window.h" #include "System_Info.h" #include "Snapshots_Window.h" #include "VM_Devices.h" Emulator_Control_Window::Emulator_Control_Window( QWidget *parent ) : QMainWindow( parent ) { ui.setupUi( this ); First_Start = true; Fullscreen_Menu_Added = false; Show_Close_Warning = true; Mon_Win = new Monitor_Window(); connect( ui.menuConnectNew, SIGNAL(aboutToShow()), this, SLOT(Get_Removable_Devices_List()) ); // Use new removable device menu? // FIXME update this settings after settings are changet if( Settings.value("Use_New_Device_Changer", "no").toString() == "yes" ) ui.menubar->removeAction( ui.menuConnect->menuAction() ); else ui.menubar->removeAction( ui.menuConnectNew->menuAction() ); } void Emulator_Control_Window::Apply_Full_Size( int w, int h ) { if( ! ui.actionDisplay_Scaling->isChecked() ) { setMaximumSize( w, h + menuWidget()->height() ); QDesktopWidget desktop; if( desktop.screenGeometry(desktop.primaryScreen()).width() > w ) resize( w, h + menuWidget()->height() ); } else { setMaximumSize( 4096, 2048 ); } } void Emulator_Control_Window::QEMU_Quit() { #ifdef VNC_DISPLAY if( Machine_View && Use_VNC() ) Machine_View->disconnectVNC(); #endif } void Emulator_Control_Window::VM_State_Changed( Virtual_Machine *vm, VM::VM_State state ) { switch( state ) { case VM::VMS_Pause: this->setWindowTitle( vm->Get_Machine_Name() + tr(" [Paused]") ); break; case VM::VMS_Saved: this->setWindowTitle( vm->Get_Machine_Name() + tr(" [Saved]") ); break; default: this->setWindowTitle( vm->Get_Machine_Name() ); } } void Emulator_Control_Window::Get_Removable_Devices_List() { connect( Cur_VM, SIGNAL(Ready_Removable_Devices_List()), this, SLOT(Create_Connect_Menu()) ); Cur_VM->Update_Removable_Devices_List(); } void Emulator_Control_Window::Create_Connect_Menu() { disconnect( Cur_VM, SIGNAL(Ready_Removable_Devices_List()), this, SLOT(Create_Connect_Menu()) ); // Get emulator answer QString list = Cur_VM->Get_Removable_Devices_List(); // Parse QStringList devices = list.split( '\n', QString::SkipEmptyParts ); ui.menuConnectNew->clear(); Removable_Devies_Map.clear(); for( int ix = 0; ix < devices.count()-1; ++ix ) { QStringList curDev = devices[ ix ].split( ' ', QString::SkipEmptyParts ); // Data in curDev look like this: // ide0-hd0: removable=0 io-status=ok file=/tmp/vl.0x5urG backing_file=/mnt/os/vm/winxp_empty.qcow2 ro=0 drv=qcow2 encrypted=0 // ide1-cd0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted] // floppy0: removable=1 locked=0 tray-open=0 [not inserted] // sd0: removable=1 locked=0 tray-open=0 [not inserted] // Data valid? if( curDev.count() < 5 ) continue; // It removable device? if( curDev[1] != "removable=1" ) continue; // Parse name QString devName = ""; if( curDev[0].contains("-cd") ) // CD-ROM { // Create human readable id for device QRegExp rx( "^([a-zA-Z]+)(\\d+)\\-([a-zA-Z]+)(\\d+)\\:$" ); if( ! rx.exactMatch(curDev[0]) ) { AQError( "void Emulator_Control_Window::Create_Connect_Menu()", "Unable to match regexp! Data: " + curDev[0] ); continue; } QStringList nameStrings = rx.capturedTexts(); if( nameStrings.count() != 5 ) { AQError( "void Emulator_Control_Window::Create_Connect_Menu()", "Section CD. nameStrings.count() != 5" ); } // Create menu item devName = QString( "CD-ROM %1 (On %2%3)" ).arg( nameStrings[4] ).arg( nameStrings[1].toUpper() ).arg( nameStrings[2] ); QMenu *tmpMenu = ui.menuConnectNew->addMenu( QIcon(":/cdrom.png"), devName ); connect( tmpMenu, SIGNAL(aboutToShow()), this, SLOT(Create_Device_Menu()) ); } else if( curDev[0].contains("floppy0") ) // FDA { devName = "Floppy A"; QMenu *tmpMenu = ui.menuConnectNew->addMenu( QIcon(":/fdd.png"), devName ); connect( tmpMenu, SIGNAL(aboutToShow()), this, SLOT(Create_Device_Menu()) ); } else if( curDev[0].contains("floppy1") ) // FDB { devName = "Floppy B"; QMenu *tmpMenu = ui.menuConnectNew->addMenu( QIcon(":/fdd.png"), devName ); connect( tmpMenu, SIGNAL(aboutToShow()), this, SLOT(Create_Device_Menu()) ); } else if( curDev[0].contains("sd") ) // SD Card { // Create human readable id for device QRegExp rx( "^([a-zA-Z]+)(\\d+):$" ); if( ! rx.exactMatch(curDev[0]) ) { AQError( "void Emulator_Control_Window::Create_Connect_Menu()", "Unable to match regexp! Data: " + curDev[0] ); continue; } QStringList nameStrings = rx.capturedTexts(); if( nameStrings.count() != 3 ) { AQError( "void Emulator_Control_Window::Create_Connect_Menu()", "Section SD. nameStrings.count() != 3" ); } // Add to menu devName = "SD Card " + nameStrings[ 2 ]; QMenu *tmpMenu = ui.menuConnectNew->addMenu( QIcon(":/hdd.png"), devName ); connect( tmpMenu, SIGNAL(aboutToShow()), this, SLOT(Create_Device_Menu()) ); } else { devName = "Unknown device"; } // Add device line to map Removable_Devies_Map[ devName ] = devices[ ix ]; } // If usb available for this VM add usb menu if( Cur_VM->Get_USB_Ports().count() > 0 ) { ui.menuConnectNew->addAction( QIcon(":/usb.png"), "USB" ); } } void Emulator_Control_Window::Create_Device_Menu() { // Get sender menu object QMenu *tmpMenu = qobject_cast( sender() ); if( ! tmpMenu ) { AQError( "void Emulator_Control_Window::Create_Device_Menu()", "Menu item is NULL" ); return; } // Clear old menu tmpMenu->clear(); // Get map value for parse QString value = Removable_Devies_Map[ tmpMenu->title() ]; if( value.isEmpty() ) { AQError( "void Emulator_Control_Window::Create_Device_Menu()", "Removable device value is empty" ); return; } // Parse line QString internalDevName = QString(value).replace( QRegExp("\\:.*"), "" ); // Get device name // Get device source path QString deviceSourcePath = ""; int jumpSize = 5; // 5 is size of 'file=' int fileIndex = value.indexOf( "backing_file=" ); if( fileIndex > 0 ) jumpSize = 13; // 13 is size of 'backing_file=' else fileIndex = value.indexOf( "file=" ); if( fileIndex > 0 ) { fileIndex += jumpSize; // Get path if( fileIndex < value.count() ) { for( int ix = fileIndex; ix < value.count(); ++ix ) { if( value[ix] == ' ' && value[ix-1] != '\\' ) // End of file name? { deviceSourcePath = value.mid( fileIndex, ix - fileIndex ); // Save file path break; } } } } if( internalDevName.contains("-cd") ) { // Add current CDROM image (If exists) if( ! deviceSourcePath.isEmpty() ) { QFileInfo tmpInfo( deviceSourcePath ); QAction *conCdromAct = tmpMenu->addAction( tr("Current \"") + tmpInfo.fileName() + "\"", this, SLOT(Connect_Device()) ); conCdromAct->setData( internalDevName + "\n" + deviceSourcePath ); conCdromAct->setCheckable( true ); conCdromAct->setChecked( true ); tmpMenu->addSeparator(); } // Add host devices QStringList cdList = System_Info::Get_Host_CDROM_List(); for( int ix = 0; ix < cdList.count(); ++ix ) { if( cdList[ix] != deviceSourcePath ) { QAction *conCdromAct = tmpMenu->addAction( tr("Connect \"") + cdList[ix] + "\"", this, SLOT(Connect_Device()) ); conCdromAct->setData( internalDevName + "\n" + cdList[ix] ); } } if( ! cdList.isEmpty() ) tmpMenu->addSeparator(); // Add recent images/devices list cdList = Get_CD_Recent_Images_List(); for( int ix = 0; ix < cdList.count(); ++ix ) { if( cdList[ix] != deviceSourcePath ) { QFileInfo tmpInfo( cdList[ix] ); QAction *conCdromAct = tmpMenu->addAction( tr("Connect \"") + tmpInfo.fileName() + "\"", this, SLOT(Connect_Device()) ); conCdromAct->setData( internalDevName + "\n" + cdList[ix] ); } } if( ! cdList.isEmpty() ) tmpMenu->addSeparator(); // Add 'Browse' menu item QAction *browseAct = tmpMenu->addAction( QIcon(":/open-file.png"), "Browse...", this, SLOT(Open_Device_File()) ); browseAct->setData( internalDevName ); // Add 'Eject' menu item QAction *ejectAct = tmpMenu->addAction( QIcon(":/eject.png"), "Eject", this, SLOT(Eject_Device()) ); ejectAct->setData( internalDevName ); } else if( internalDevName.contains("floppy") ) { // Add current Floppy image (If exists) if( ! deviceSourcePath.isEmpty() ) { QFileInfo tmpInfo( deviceSourcePath ); QAction *conFddAct = tmpMenu->addAction( tr("Current \"") + tmpInfo.fileName() + "\"", this, SLOT(Connect_Device()) ); conFddAct->setData( internalDevName + "\n" + deviceSourcePath ); conFddAct->setCheckable( true ); conFddAct->setChecked( true ); tmpMenu->addSeparator(); } // Add host devices QStringList fddList = System_Info::Get_Host_FDD_List(); for( int ix = 0; ix < fddList.count(); ++ix ) { if( fddList[ix] != deviceSourcePath ) { QAction *conFddAct = tmpMenu->addAction( tr("Connect \"") + fddList[ix] + "\"", this, SLOT(Connect_Device()) ); conFddAct->setData( internalDevName + "\n" + fddList[ix] ); } } if( ! fddList.isEmpty() ) tmpMenu->addSeparator(); // Add recent images/devices list fddList = Get_FDD_Recent_Images_List(); for( int ix = 0; ix < fddList.count(); ++ix ) { if( fddList[ix] != deviceSourcePath ) { QFileInfo tmpInfo( fddList[ix] ); QAction *conFddAct = tmpMenu->addAction( tr("Connect \"") + tmpInfo.fileName() + "\"", this, SLOT(Connect_Device()) ); conFddAct->setData( internalDevName + "\n" + fddList[ix] ); } } if( ! fddList.isEmpty() ) tmpMenu->addSeparator(); // Add 'Browse' menu item QAction *browseAct = tmpMenu->addAction( QIcon(":/open-file.png"), "Browse...", this, SLOT(Open_Device_File()) ); browseAct->setData( internalDevName ); // Add 'Eject' menu item QAction *ejectAct = tmpMenu->addAction( QIcon(":/eject.png"), "Eject", this, SLOT(Eject_Device()) ); ejectAct->setData( internalDevName ); } else if( internalDevName.contains("sd") ) { // Add current Floppy image (If exists) if( ! deviceSourcePath.isEmpty() ) { QFileInfo tmpInfo( deviceSourcePath ); QAction *conSdAct = tmpMenu->addAction( tr("Current \"") + tmpInfo.fileName() + "\"", this, SLOT(Connect_Device()) ); conSdAct->setData( internalDevName + "\n" + deviceSourcePath ); conSdAct->setCheckable( true ); conSdAct->setChecked( true ); tmpMenu->addSeparator(); } // Add 'Browse' menu item QAction *browseAct = tmpMenu->addAction( QIcon(":/open-file.png"), "Browse...", this, SLOT(Open_Device_File()) ); browseAct->setData( internalDevName ); // Add 'Eject' menu item QAction *ejectAct = tmpMenu->addAction( QIcon(":/eject.png"), "Eject", this, SLOT(Eject_Device()) ); ejectAct->setData( internalDevName ); } else { AQError( "void Emulator_Control_Window::Create_Device_Menu()", "Unknown device type! Data: " + value ); } } void Emulator_Control_Window::Connect_Device() { QAction *act = qobject_cast( sender() ); if( act ) { QStringList nameAndPath = act->data().toString().split( '\n', QString::SkipEmptyParts ); if( nameAndPath.count() < 2 ) { AQError( "void Emulator_Control_Window::Connect_Device()", "Cannot split data to name and path" ); return; } // Change device source //emit Ready_Read_Command( QString("change %1 \"%2\"").arg(nameAndPath[0]).arg(nameAndPath[1]) ); Set_Device( nameAndPath[0], nameAndPath[1] ); // FIXME Save changet device source path } } void Emulator_Control_Window::Open_Device_File() { QAction *act = qobject_cast( sender() ); if( ! act ) return; // Get device name QString devName = act->data().toString(); QString lastDir = ""; QString fileFilter = ""; bool cd = false, fd = false; // Determine device type if( devName.contains("-cd") ) { lastDir = Cur_VM->Get_CD_ROM().Get_File_Name(); fileFilter = tr( "All Files (*);;Images Files (*.iso *.img)" ); cd = true; fd = false; } else if( devName.contains("floppy") ) { lastDir = Cur_VM->Get_CD_ROM().Get_File_Name(); fileFilter = tr( "All Files (*);;Images Files (*.img *.ima)" ); cd = false; fd = true; } else { cd = false; fd = false; } QString fileName = QFileDialog::getOpenFileName( this, tr("Open Device or Image File"), Get_Last_Dir_Path(lastDir), fileFilter ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); //on_actionFD1_Eject_triggered(); Set_Device( devName, fileName ); // Add to Recent Menu if( cd ) { Add_To_Recent_CD_Files( fileName ); Update_Recent_CD_ROM_Images_List(); } else if( fd ) { Add_To_Recent_FDD_Files( fileName ); Update_Recent_Floppy_Images_List(); } } } void Emulator_Control_Window::Eject_Device() { QAction *act = qobject_cast( sender() ); if( act ) { // Eject emit Ready_Read_Command( QString("eject %1").arg(act->data().toString()) ); // FIXME Save changet device source path } } /* //FIXME void Emulator_Control_Window::on_actionUpdate_list_triggered() { Get_Removable_Devices_List(); }*/ void Emulator_Control_Window::closeEvent( QCloseEvent *event ) { #ifdef VNC_DISPLAY if( this->isVisible() == false || Show_Close_Warning == false ) { if( Settings.value("Use_VNC_Display", "yes").toString() == "yes" && ui.actionFullscreen_Mode->isChecked() ) { Machine_View->Set_Scaling( ui.actionDisplay_Scaling->isChecked() ); Machine_View->Set_Fullscreen( false ); } Mon_Win->hide(); event->accept(); return; } if( Use_VNC() ) { int ret = QMessageBox::question( this, tr("Power Off This VM?"), tr("Selected VM is running now. Shutdown anyway?"), QMessageBox::Yes | QMessageBox::Save | QMessageBox::Close | QMessageBox::Cancel, QMessageBox::Cancel ); if( ret == QMessageBox::Yes ) { Cur_VM->Stop(); Mon_Win->hide(); event->accept(); return; } else if( ret == QMessageBox::Save ) { on_actionSave_VM_triggered(); Mon_Win->hide(); event->accept(); return; } else if( ret == QMessageBox::Cancel ) { event->ignore(); return; } // For Section QMessageBox::Close Next Code } #endif Mon_Win->hide(); event->accept(); } void Emulator_Control_Window::Set_Current_VM( Virtual_Machine *vm ) { if( vm == NULL ) return; Cur_VM = vm; // VM stop connect( Cur_VM, SIGNAL(QEMU_End()), this, SLOT(QEMU_Quit()) ); // VM state changet connect( Cur_VM, SIGNAL(State_Changed(Virtual_Machine*,VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*,VM::VM_State)) ); #ifdef VNC_DISPLAY if( Use_VNC() ) { this->setWindowTitle( Cur_VM->Get_Machine_Name() ); connect( Cur_VM, SIGNAL(Loading_Complete()), this, SLOT(Connect_VNC()) ); } #else this->setWindowTitle( Cur_VM->Get_Machine_Name() + tr(" (Emulator Control)") ); #endif // USB for( int ix = 0; ix < Cur_VM->Get_USB_Ports().count(); ++ix ) { QAction *new_act = new QAction( Cur_VM->Get_USB_Ports()[ix].Get_Product_Name(), ui.menuDisconnect ); new_act->setData( Cur_VM->Get_USB_Ports()[ix].Get_ID_Line() ); connect( new_act, SIGNAL(triggered()), this, SLOT(Delete_USB_From_VM()) ); ui.menuDisconnect->addAction( new_act ); } setWindowIcon(QIcon(vm->Get_Icon_Path())); } void Emulator_Control_Window::Init() { First_Start = false; Show_Close_Warning = true; // Create Recent Menu Items int max = Settings.value( "CD_ROM_Existing_Images/Max", "5" ).toString().toInt(); for( int ix = 0; ix < max; ++ix ) { QAction *tmp_act = new QAction( this ); Recent_Files_CD_Items << tmp_act; Recent_Files_CD_Items[ ix ]->setText( "" ); Recent_Files_CD_Items[ ix ]->setData( "" ); Recent_Files_CD_Items[ ix ]->setVisible( false ); connect( Recent_Files_CD_Items[ix], SIGNAL(triggered()), this, SLOT(Open_Recent_CD_ROM_Image()) ); } Update_Recent_CD_ROM_Images_List(); // Floppy max = Settings.value( "Floppy_Existing_Images/Max", "5" ).toString().toInt(); for( int ix = 0; ix < max; ++ix ) { QAction *tmp_act = new QAction( this ); Recent_Files_FD0_Items << tmp_act; Recent_Files_FD0_Items[ ix ]->setText( "" ); Recent_Files_FD0_Items[ ix ]->setData( "" ); Recent_Files_FD0_Items[ ix ]->setVisible( false ); connect( Recent_Files_FD0_Items[ix], SIGNAL(triggered()), this, SLOT(Open_Recent_Floppy0_Image()) ); } for( int ix = 0; ix < max; ++ix ) { QAction *tmp_act = new QAction( this ); Recent_Files_FD1_Items << tmp_act; Recent_Files_FD1_Items[ ix ]->setText( "" ); Recent_Files_FD1_Items[ ix ]->setData( "" ); Recent_Files_FD1_Items[ ix ]->setVisible( false ); connect( Recent_Files_FD1_Items[ix], SIGNAL(triggered()), this, SLOT(Open_Recent_Floppy1_Image()) ); } Update_Recent_Floppy_Images_List(); // Use VNC Embedded Display #ifdef VNC_DISPLAY if( ! Use_VNC() ) { ui.actionDisplay_Scaling->setEnabled( false ); ui.actionFullscreen_Mode->setEnabled( false ); ui.actionReinit_VNC->setEnabled( false ); } else { setMaximumSize( 4096, 2048 ); // Add VNC Display Widget if( ! Machine_View ) delete Machine_View; Machine_View = new MachineView( this , Cur_VM ); QVBoxLayout *vnc_layout = new QVBoxLayout( centralWidget() ); Machine_View->setLayout( vnc_layout ); setCentralWidget( Machine_View ); Machine_View->show(); connect( Machine_View, SIGNAL(Full_Size(int,int)), this, SLOT(Apply_Full_Size(int,int)) ); if ( Cur_VM->Use_VNC() ) Machine_View->Set_VNC_URL( "localhost", Cur_VM->Get_VNC_Display_Number() + 5900 ); else Machine_View->Set_VNC_URL( "localhost", Cur_VM->Get_Embedded_Display_Port() + (Settings.value("First_VNC_Port", "5910").toString().toInt()) ); } #else ui.actionDisplay_Scaling->setEnabled( false ); ui.actionFullscreen_Mode->setEnabled( false ); ui.actionReinit_VNC->setEnabled( false ); #endif } void Emulator_Control_Window::Set_Show_Close_Warning( bool on ) { Show_Close_Warning = on; } void Emulator_Control_Window::Use_Minimal_Size( bool use ) { this->setMaximumSize( 4096, use ? 1 : 4096 ); } void Emulator_Control_Window::on_actionSave_Screenshot_triggered() { if( Settings.value("Use_Screenshots_Folder", "no").toString() == "yes" ) { if( ! Settings.value("Screenshot_Folder_Path", "").toString().isEmpty() ) { // create unique file name QString unic_name = QUuid::createUuid().toString(); unic_name = unic_name.mid( 25, 12 ); // save screenshot Cur_VM->Take_Screenshot( Settings.value("Screenshot_Folder_Path", "").toString() + unic_name + "." + Settings.value( "Screenshot_Save_Format", "PNG" ).toString() ); } } else { AQGraphic_Warning( "Warning!", "Shared Screenshots Folder Not Enabled!\nPlease Enter Name for New Screenshot." ); on_actionSave_Screenshot_As_triggered(); } } void Emulator_Control_Window::on_actionSave_Screenshot_As_triggered() { static QString fileName = QDir::homePath(); // For save value fileName = QFileDialog::getSaveFileName( this, tr("Save Screenshot As..."), fileName, tr("All Files (*)") ); if( ! fileName.isEmpty() ) Cur_VM->Take_Screenshot( QDir::toNativeSeparators(fileName) ); } void Emulator_Control_Window::on_actionSave_VM_triggered() { Cur_VM->Save_VM_State(); } void Emulator_Control_Window::on_actionManage_Snapshots_triggered() { Snapshots_Window *snapshot_win = new Snapshots_Window( this ); snapshot_win->Set_VM( Cur_VM ); snapshot_win->exec(); delete snapshot_win; } void Emulator_Control_Window::on_actionCommit_triggered() { emit Ready_Read_Command( "commit all" ); } void Emulator_Control_Window::on_actionPause_VM_triggered() { Cur_VM->Pause(); } void Emulator_Control_Window::on_actionPower_Off_triggered() { if( QMessageBox::question(this, tr("Are you sure?"), tr("Are you sure to shutdown VM \"%1\"?").arg(Cur_VM->Get_Machine_Name()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No ) { return; } Cur_VM->Stop(); } void Emulator_Control_Window::on_actionReset_VM_triggered() { if( QMessageBox::question(this, tr("Are you sure?"), tr("Are you sure to reboot VM \"%1\"?").arg(Cur_VM->Get_Machine_Name()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No ) { return; } Cur_VM->Reset(); } void Emulator_Control_Window::on_actionQEMU_Monitor_triggered() { connect( Mon_Win, SIGNAL(Command_Sent(QString)), Cur_VM, SLOT(Execute_Emu_Ctl_Command(QString)) ); connect( Cur_VM, SIGNAL(Clean_Console(QString)), Mon_Win, SLOT(Add_QEMU_Out(QString)) ); Mon_Win->show(); } void Emulator_Control_Window::on_actionQuit_triggered() { Show_Close_Warning = false; this->close(); } void Emulator_Control_Window::on_actionFD0_dev_fd0_triggered() { if( ! FD0_Available() ) return; on_actionFD0_Eject_triggered(); Set_Device( "fda", "/dev/fd0" ); } void Emulator_Control_Window::on_actionFD0_dev_null_triggered() { if( ! FD0_Available() ) return; on_actionFD0_Eject_triggered(); Set_Device( "fda", "/dev/null" ); } void Emulator_Control_Window::on_actionFD0_Other_triggered() { if( ! FD0_Available() ) return; QString fileName = QFileDialog::getOpenFileName( this, tr("Open Device or Image File"), Get_Last_Dir_Path(Cur_VM->Get_FD0().Get_File_Name()), tr("All Files (*);;Images Files (*.img *.ima)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); on_actionFD0_Eject_triggered(); Set_Device( "fda", fileName ); // Add to Recent Menu Add_To_Recent_FDD_Files( fileName ); Update_Recent_Floppy_Images_List(); } } void Emulator_Control_Window::on_actionFD0_Eject_triggered() { if( ! FD0_Available() ) return; emit Ready_Read_Command( "eject -f floppy0" ); } void Emulator_Control_Window::Open_Recent_Floppy0_Image() { QAction *tmp_act = qobject_cast( sender() ); if( tmp_act ) { on_actionFD0_Eject_triggered(); Set_Device( "fda", tmp_act->data().toString() ); } } void Emulator_Control_Window::on_actionFD1_dev_fd0_triggered() { if( ! FD1_Available() ) return; on_actionFD1_Eject_triggered(); Set_Device( "fdb", "/dev/fd0" ); } void Emulator_Control_Window::on_actionFD1_dev_null_triggered() { if( ! FD1_Available() ) return; on_actionFD1_Eject_triggered(); Set_Device( "fdb", "/dev/null" ); } void Emulator_Control_Window::on_actionFD1_Other_triggered() { if( ! FD1_Available() ) return; QString fileName = QFileDialog::getOpenFileName( this, tr("Open Device or Image File"), Get_Last_Dir_Path(Cur_VM->Get_FD1().Get_File_Name()), tr("All Files (*);;Images Files (*.img *.ima)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); on_actionFD1_Eject_triggered(); Set_Device( "fdb", fileName ); // Add to Recent Menu Add_To_Recent_FDD_Files( fileName ); Update_Recent_Floppy_Images_List(); } } void Emulator_Control_Window::on_actionFD1_Eject_triggered() { if( ! FD1_Available() ) return; emit Ready_Read_Command( "eject -f floppy1" ); } void Emulator_Control_Window::Open_Recent_Floppy1_Image() { QAction *tmp_act = qobject_cast( sender() ); if( tmp_act ) { on_actionFD1_Eject_triggered(); Set_Device( "fdb", tmp_act->data().toString() ); } } void Emulator_Control_Window::on_actionCDROM_dev_cdrom_triggered() { if( ! CD_ROM_Available() ) return; on_actionCDROM_Eject_triggered(); Set_Device( "cdrom", "/dev/cdrom" ); } void Emulator_Control_Window::on_actionCDROM_dev_null_triggered() { if( ! CD_ROM_Available() ) return; on_actionCDROM_Eject_triggered(); Set_Device( "cdrom", "/dev/null" ); } void Emulator_Control_Window::on_actionCDROM_Other_triggered() { if( ! CD_ROM_Available() ) return; QString fileName = QFileDialog::getOpenFileName( this, tr("Open Device or Image File"), Get_Last_Dir_Path(Cur_VM->Get_CD_ROM().Get_File_Name()), tr("All Files (*);;Images Files (*.iso)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); on_actionCDROM_Eject_triggered(); Set_Device( "cdrom", fileName ); // Add to Recent Menu Add_To_Recent_CD_Files( fileName ); Update_Recent_CD_ROM_Images_List(); } } void Emulator_Control_Window::on_actionCDROM_Eject_triggered() { if( ! CD_ROM_Available() ) return; emit Ready_Read_Command( "eject -f ide1-cd0" ); } void Emulator_Control_Window::Open_Recent_CD_ROM_Image() { QAction *tmp_act = qobject_cast( sender() ); if( tmp_act ) { if( ! CD_ROM_Available() ) return; on_actionCDROM_Eject_triggered(); Set_Device( "cdrom", tmp_act->data().toString() ); } } void Emulator_Control_Window::Delete_USB_From_VM() { QAction *usb_item = qobject_cast( sender() ); if( usb_item ) { QList ac_list = ui.menuDisconnect->actions(); for( int ix = 0; ix < ac_list.count(); ++ix ) { if( usb_item->data().toString() == ac_list[ix]->data().toString() ) { // Delete from Running VM QString bus_addr; // FIXME = Cur_VM->Get_USB_Bus_Address( usb_item->data().toString() ); if( bus_addr.isEmpty() ) return; emit Ready_Read_Command( "usb_del " + bus_addr ); // Delete item ui.menuDisconnect->removeAction( usb_item ); return; } } // Cannot Find AQGraphic_Error( "void Emulator_Control_Window::Delete_USB_From_VM()", tr("Error!"), tr("Cannot Find USB Device!"), false ); } else { AQError( "void Emulator_Control_Window::Delete_USB_From_VM()", "Cannot convert to QAction!" ); } } void Emulator_Control_Window::Add_USB_To_VM() { QAction *usb_item = qobject_cast( sender() ); if( usb_item ) { QList ac_list = ui.menuDisconnect->actions(); for( int ix = 0; ix < ac_list.count(); ++ix ) { // Unique value if( usb_item->data().toString() == ac_list[ix]->data().toString() ) { AQWarning( "void Emulator_Control_Window::Add_USB_To_VM()", "This is not unique value: " + usb_item->data().toString() ); return; } } // Create Item for Disconnect Menu QAction *dis_act = new QAction( usb_item->text(), ui.menuDisconnect ); dis_act->setData( usb_item->data() ); connect( dis_act, SIGNAL(triggered()), this, SLOT(Delete_USB_From_VM()) ); ui.menuDisconnect->addAction( dis_act ); // Add To Running VM emit Ready_Read_Command( "usb_add host:" + usb_item->data().toString() ); } else { AQError( "void Emulator_Control_Window::Add_USB_To_VM()", "Cannot convert to QAction!" ); } } void Emulator_Control_Window::on_actionUSB_Update_Device_List_triggered() { // Get New USB Host List QList tmp_list = System_Info::Get_All_Host_USB(); if( tmp_list.isEmpty() ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Get USB Information From System!") ); return; } QList used_list = System_Info::Get_Used_USB_List(); // Delete all used USB devices for( int ax = 0; ax < tmp_list.count(); ax++ ) { for( int bx = 0; bx < used_list.count(); bx++ ) { if( tmp_list[ax] == used_list[bx] ) { tmp_list.removeAt( ax ); ax--; break; } } } QList ac_list = ui.menuUSB_Connect->actions(); // Delete Previous Menu (is avirable) if( ac_list.count() > 1 ) { ui.menuUSB_Connect->clear(); ui.menuUSB_Connect->addAction( ui.actionUSB_Update_Device_List ); ui.menuUSB_Connect->addSeparator(); } // Add items for( int ix = 0; ix < tmp_list.count(); ++ix ) { QAction *new_act = new QAction( tmp_list[ix].Get_Product_Name(), ui.menuUSB_Connect ); new_act->setData( tmp_list[ix].Get_ID_Line() ); connect( new_act, SIGNAL(triggered()), this, SLOT(Add_USB_To_VM()) ); ui.menuUSB_Connect->addAction( new_act ); } } void Emulator_Control_Window::on_actionBy_Bus_Address_triggered() { bool ok = false; QString bus_addr = QInputDialog::getText( this, tr("Disconnect USB"), tr("Enter You Bus.Address VM USB Value"), QLineEdit::Normal, "", &ok ); if( ok && ! bus_addr.isEmpty() ) { emit Ready_Read_Command( "usb_del " + bus_addr ); } } void Emulator_Control_Window::on_actionUSB_Disconnect_All_Devices_triggered() { QList ac_list = ui.menuDisconnect->actions(); for( int dx = 0; dx < ac_list.count(); ++dx ) { if( ac_list[dx]->data().isNull() == false && ac_list[dx]->data().isValid() == true ) { QString bus_addr; // FIXME = Cur_VM->Get_USB_Bus_Address( ac_list[dx]->data().toString() ); if( bus_addr.isEmpty() ) return; emit Ready_Read_Command( "usb_del " + bus_addr ); } } ui.menuDisconnect->clear(); ui.menuDisconnect->addAction( ui.actionUSB_Disconnect_All_Devices ); ui.menuDisconnect->addAction( ui.actionBy_Bus_Address ); ui.menuDisconnect->addSeparator(); } void Emulator_Control_Window::on_actionCtrl_Alt_Delete_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-delete" ); } void Emulator_Control_Window::on_actionOther_Keys_triggered() { bool ok = false; QString keys = QInputDialog::getText( this, tr("Send Keys"), tr("Enter your key combinations such as ctrl-alt-del or alt-f2"), QLineEdit::Normal, "", &ok ); if( ok && ! keys.isEmpty() ) emit Ready_Read_Command( "sendkey " + keys ); } /* shift shift_r alt alt_r altgr altgr_r ctrl ctrl_r menu esc 1 2 3 4 5 6 7 8 9 0 minus equal backspace tab q w e r t y u i o p ret a s d f g h j k l z x c v b n m comma dot slash asterisk spc caps_lock f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 num_lock scroll_lock kp_divide kp_multiply kp_subtract kp_add kp_enter kp_decimal sysrq kp_0 kp_1 kp_2 kp_3 kp_4 kp_5 kp_6 kp_7 kp_8 kp_9 < f11 f12 print home pgup pgdn end left up down right insert delete*/ QString convert_char(QString s) { if ( s.length() != 1 ) return s; if ( s == "/" ) return "slash"; if ( s == ":" ) return "shift-semicolon"; if ( s == ";" ) return "semicolon"; if ( s == "=" ) return "equal"; if ( s == "-" ) return "minus"; if ( s == "+" ) return "kp_add"; if ( s == "\t" ) return "tab"; if ( s == "." ) return "dot"; if ( s == "*" ) return "asterisk"; if ( s == "," ) return "comma"; if ( s == "\\" ) return "backslash"; if ( s == " " ) return "spc"; if ( s == "!" ) return "shift-1"; if ( s == "@" ) return "shift-2"; if ( s == "#" ) return "shift-3"; if ( s == "$" ) return "shift-4"; if ( s == "%" ) return "shift-5"; if ( s == "^" ) return "shift-6"; if ( s == "&" ) return "shift-7"; if ( s == "(" ) return "shift-9"; if ( s == ")" ) return "shift-0"; if ( s == "_" ) return "shift-minus"; if ( s == "<" ) return "shift-comma"; if ( s == ">" ) return "shift-dot"; if ( s == ">" ) return "shift-dot"; if ( s == "\n" ) return "kp_enter"; if ( s.at(0).isLetter() && s.at(0).isUpper() ) return "shift-"+s.toLower(); if ( s == "[" ) return "ctrl-shift-u-5-b"; if ( s == "]" ) return "ctrl-shift-u-5-b"; if ( s == "{" ) return "ctrl-shift-u-7-b"; if ( s == "}" ) return "ctrl-shift-u-7-d"; if ( s == "'" ) return "apostrophe"; if ( s == "\"" ) return "shift-apostrophe"; return s; } void Emulator_Control_Window::on_actionClipboard_triggered() { QClipboard *clipboard = QApplication::clipboard(); QString text = clipboard->text(); if( ! text.isEmpty() ) { for (int i = 0; i < text.length(); i++) { emit Ready_Read_Command( QString("sendkey ") + convert_char(text.at(i)) ); } } } void Emulator_Control_Window::on_actionGrab_Mouse_triggered() { //FIXME: NOT IMPLEMENTED //DIDN'T MAKE THE CUT FOR 0.9.1 //Machine_View->captureAllMouseEvents(); } void Emulator_Control_Window::on_actionCtrl_Alt_Backspace_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-backspace" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F1_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f1" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F2_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f2" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F3_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f3" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F4_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f4" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F5_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f5" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F6_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f6" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F7_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f7" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F8_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f8" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F9_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f9" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F10_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f10" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F11_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f11" ); } void Emulator_Control_Window::on_actionCtrl_Alt_F12_triggered() { emit Ready_Read_Command( "sendkey ctrl-alt-f12" ); } #ifdef VNC_DISPLAY void Emulator_Control_Window::on_actionDisplay_Scaling_triggered() { Machine_View->Set_Scaling( ui.actionDisplay_Scaling->isChecked() ); } void Emulator_Control_Window::on_actionFullscreen_Mode_triggered() { if( ! Fullscreen_Menu_Added ) { Machine_View->addAction( ui.actionFullscreen_Mode ); Fullscreen_Menu_Added = true; } if ( ui.actionFullscreen_Mode->isChecked() ) { if( Settings.value("Show_Fullscreen_Warning", "yes").toString() == "yes" ) { int ret = QMessageBox::question( this, tr("Fullscreen mode"), tr("To return from fullscreen to windowed mode press Ctrl-Alt-F\nShow this message again?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if( ret == QMessageBox::No ) Settings.setValue( "Show_Fullscreen_Warning", "no" ); } } setMaximumSize( 4096, 2048 ); Machine_View->Set_Scaling( ui.actionFullscreen_Mode->isChecked() ); Machine_View->Set_Fullscreen( ui.actionFullscreen_Mode->isChecked() ); } void Emulator_Control_Window::on_actionReinit_VNC_triggered() { Machine_View->initView(); } void Emulator_Control_Window::Connect_VNC() { QTest::qWait( 500 ); // This for init QEMU VNC server Machine_View->initView(); } bool Emulator_Control_Window::Use_VNC() { if( Settings.value("Use_VNC_Display", "no").toString() == "yes" && Cur_VM->Get_VNC_Socket_Mode() == false && Cur_VM->Get_Video_Card() != "none" ) //TODO: Should also work seemlessly if VNC is set to use a socket { return true; } else { return false; } } #endif void Emulator_Control_Window::on_actionAbout_Emulator_Control_triggered() { QMessageBox::information( this, tr("About Emulator Control..."), tr("Emulator Control is a Tool for Managing a Virtual Machine at Runtime.") ); } bool Emulator_Control_Window::FD0_Available() { return true; // FIXME if( Cur_VM->Get_FD0().Get_Enabled() == false ) { QMessageBox::information( this, tr("Warning!"), tr("In This VM Floppy 1 Not Found!") ); return false; } else { return true; } } bool Emulator_Control_Window::FD1_Available() { return true; // FIXME if( Cur_VM->Get_FD1().Get_Enabled() == false ) { QMessageBox::information( this, tr("Warning!"), tr("In This VM Floppy 2 Not Found!") ); return false; } else { return true; } } bool Emulator_Control_Window::CD_ROM_Available() { return true; // FIXME if( Cur_VM->Get_HDC().Get_Enabled() == true || Cur_VM->Get_CD_ROM().Get_Enabled() == false ) { QMessageBox::information( this, tr("Warning!"), tr("In This VM CD-ROM Not Found!") ); return false; } else { return true; } } void Emulator_Control_Window::Update_Recent_CD_ROM_Images_List() { // Clear Menu for( int dx = 0; dx < Recent_Files_CD_Items.count(); ++dx ) { Recent_Files_CD_Items[ dx ]->setText( "" ); Recent_Files_CD_Items[ dx ]->setData( "" ); Recent_Files_CD_Items[ dx ]->setVisible( false ); } // Add New int max = Settings.value( "CD_ROM_Existing_Images/Max", "5" ).toString().toInt(); while( max > Recent_Files_CD_Items.count() ) { QAction *tmp_act = new QAction( this ); Recent_Files_CD_Items << tmp_act; Recent_Files_CD_Items[ Recent_Files_CD_Items.count() -1 ]->setText( "" ); Recent_Files_CD_Items[ Recent_Files_CD_Items.count() -1 ]->setData( "" ); Recent_Files_CD_Items[ Recent_Files_CD_Items.count() -1 ]->setVisible( false ); connect( Recent_Files_CD_Items[Recent_Files_CD_Items.count() -1], SIGNAL(triggered()), this, SLOT(Open_Recent_CD_ROM_Image()) ); } for( int ix = 0; ix < max; ++ix ) { if( ix < Get_CD_Recent_Images_List().count() && Get_CD_Recent_Images_List()[ix].isEmpty() == false ) { QFileInfo info = QFileInfo( Get_CD_Recent_Images_List()[ix] ); Recent_Files_CD_Items[ ix ]->setText( info.fileName() ); Recent_Files_CD_Items[ ix ]->setData( Get_CD_Recent_Images_List()[ix] ); Recent_Files_CD_Items[ ix ]->setVisible( true ); ui.menuCDROM_Recent_Files->addAction( Recent_Files_CD_Items[ix] ); } } } void Emulator_Control_Window::Update_Recent_Floppy_Images_List() { // Clear Menu for( int dx = 0; dx < Recent_Files_FD0_Items.count(); ++dx ) { Recent_Files_FD0_Items[ dx ]->setText( "" ); Recent_Files_FD0_Items[ dx ]->setData( "" ); Recent_Files_FD0_Items[ dx ]->setVisible( false ); Recent_Files_FD1_Items[ dx ]->setText( "" ); Recent_Files_FD1_Items[ dx ]->setData( "" ); Recent_Files_FD1_Items[ dx ]->setVisible( false ); } // Add New int max = Settings.value( "CD_ROM_Existing_Images/Max", "5" ).toString().toInt(); while( max > Recent_Files_FD0_Items.count() ) { QAction *tmp_act = new QAction( this ); Recent_Files_FD0_Items << tmp_act; Recent_Files_FD0_Items[ Recent_Files_FD0_Items.count() -1 ]->setText( "" ); Recent_Files_FD0_Items[ Recent_Files_FD0_Items.count() -1 ]->setData( "" ); Recent_Files_FD0_Items[ Recent_Files_FD0_Items.count() -1 ]->setVisible( false ); connect( Recent_Files_FD0_Items[Recent_Files_FD0_Items.count() -1], SIGNAL(triggered()), this, SLOT(Open_Recent_Floppy0_Image()) ); } while( max > Recent_Files_FD1_Items.count() ) { QAction *tmp_act = new QAction( this ); Recent_Files_FD1_Items << tmp_act; Recent_Files_FD1_Items[ Recent_Files_FD1_Items.count() -1 ]->setText( "" ); Recent_Files_FD1_Items[ Recent_Files_FD1_Items.count() -1 ]->setData( "" ); Recent_Files_FD1_Items[ Recent_Files_FD1_Items.count() -1 ]->setVisible( false ); connect( Recent_Files_FD1_Items[Recent_Files_FD1_Items.count() -1], SIGNAL(triggered()), this, SLOT(Open_Recent_Floppy1_Image()) ); } QStringList fd_list = Get_FDD_Recent_Images_List(); for( int ix = 0; ix < max; ++ix ) { if( ix < fd_list.count() && fd_list[ix].isEmpty() == false ) { QFileInfo info = QFileInfo( fd_list[ix] ); Recent_Files_FD0_Items[ ix ]->setText( info.fileName() ); Recent_Files_FD0_Items[ ix ]->setData( fd_list[ix] ); Recent_Files_FD0_Items[ ix ]->setVisible( true ); ui.menuFD0_Recent_Files->addAction( Recent_Files_FD0_Items[ix] ); } } for( int ix = 0; ix < max; ++ix ) { if( ix < fd_list.count() && fd_list[ix].isEmpty() == false ) { QFileInfo info = QFileInfo( fd_list[ix] ); Recent_Files_FD1_Items[ ix ]->setText( info.fileName() ); Recent_Files_FD1_Items[ ix ]->setData( fd_list[ix] ); Recent_Files_FD1_Items[ ix ]->setVisible( true ); ui.menuFD1_Recent_Files->addAction( Recent_Files_FD1_Items[ix] ); } } } void Emulator_Control_Window::Set_Device( const QString &dev_name, const QString &path ) { /*if( Cur_VM->Get_Emulator().Get_Version() != VM::QEMU_0_9_0 )*/ QString new_dev_name; if( dev_name == "fda" ) new_dev_name = "floppy0"; else if( dev_name == "fdb" ) new_dev_name = "floppy1"; else if( dev_name == "cdrom" ) new_dev_name = "ide1-cd0"; else new_dev_name = dev_name; emit Ready_Read_Command( "change " + new_dev_name + " \"" + path + "\"" ); // Save new path if( dev_name == "fda" ) Cur_VM->Set_FD0( VM_Storage_Device(true, path) ); else if( dev_name == "fdb" ) Cur_VM->Set_FD1( VM_Storage_Device(true, path) ); else if( dev_name == "cdrom" ) Cur_VM->Set_CD_ROM( VM_Storage_Device(true, path) ); else { // Find device if( dev_name.contains("-cd") ) // CD-ROM? { if( dev_name == "ide1-cd0" ) // Default CD-ROM drive { Cur_VM->Set_CD_ROM( VM_Storage_Device( true, path, Cur_VM->Get_CD_ROM().Get_Nativ_Mode(), Cur_VM->Get_CD_ROM().Get_Nativ_Device()) ); } else { // Find CD-ROM in other storage devices QList devList = Cur_VM->Get_Storage_Devices_List(); int cdromCount = 0; int deviceIndex = -1; for( int ix = 0; ix < devList.count(); ++ix ) { if( devList[ix].Get_Media() == VM::DM_CD_ROM ) { ++cdromCount; deviceIndex = ix; } } // Simple way finded device? if( cdromCount == 1 && deviceIndex != -1 ) { devList[ deviceIndex ].Set_File_Path( path ); Cur_VM->Set_Storage_Device( deviceIndex, devList[deviceIndex] ); } else { // Strong way... FIXME } } } else if( dev_name.contains("floppy") ) // Floppy? { if( dev_name == "floppy0" ) { Cur_VM->Set_FD0( VM_Storage_Device( true, path, Cur_VM->Get_FD0().Get_Nativ_Mode(), Cur_VM->Get_FD0().Get_Nativ_Device()) ); } else if( dev_name == "floppy1" ) { Cur_VM->Set_FD1( VM_Storage_Device( true, path, Cur_VM->Get_FD1().Get_Nativ_Mode(), Cur_VM->Get_FD1().Get_Nativ_Device()) ); } else { // Find floppy in storage devices QList devList = Cur_VM->Get_Storage_Devices_List(); int floppyCount = 0; int deviceIndex = -1; for( int ix = 0; ix < devList.count(); ++ix ) { if( devList[ix].Get_Interface() == VM::DI_Floppy ) { ++floppyCount; deviceIndex = ix; } } // Simple way finded device? if( floppyCount == 1 && deviceIndex != -1 ) { devList[ deviceIndex ].Set_File_Path( path ); Cur_VM->Set_Storage_Device( deviceIndex, devList[deviceIndex] ); } else { // Strong way... FIXME } } } else { } } } aqemu-0.9.2/src/Emulator_Control_Window.h000066400000000000000000000113701272330227200204130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef EMULATOR_CONTROL_WINDOW_H #define EMULATOR_CONTROL_WINDOW_H #include #include #include "VM.h" #include "ui_Emulator_Control_Window.h" #include "Monitor_Window.h" #ifdef VNC_DISPLAY #include "Embedded_Display/Machine_View.h" #endif class Virtual_Machine; class Emulator_Control_Window: public QMainWindow { Q_OBJECT public: Emulator_Control_Window( QWidget *parent = 0 ); void Set_Current_VM( Virtual_Machine *vm ); void Init(); void Set_Show_Close_Warning( bool on ); void Use_Minimal_Size( bool use ); Monitor_Window *Mon_Win; bool First_Start; signals: void Ready_Read_Command( QString com ); private slots: void Apply_Full_Size( int w, int h ); void QEMU_Quit(); void VM_State_Changed( Virtual_Machine *vm, VM::VM_State state ); void Get_Removable_Devices_List(); void Create_Connect_Menu(); void Create_Device_Menu(); void Connect_Device(); void Open_Device_File(); void Eject_Device(); //void on_actionUpdate_list_triggered(); //FIXME void on_actionSave_Screenshot_triggered(); void on_actionSave_Screenshot_As_triggered(); void on_actionSave_VM_triggered(); void on_actionManage_Snapshots_triggered(); void on_actionCommit_triggered(); void on_actionPause_VM_triggered(); void on_actionPower_Off_triggered(); void on_actionReset_VM_triggered(); void on_actionQEMU_Monitor_triggered(); void on_actionQuit_triggered(); void on_actionFD0_dev_fd0_triggered(); void on_actionFD0_dev_null_triggered(); void on_actionFD0_Other_triggered(); void on_actionFD0_Eject_triggered(); void Open_Recent_Floppy0_Image(); void on_actionFD1_dev_fd0_triggered(); void on_actionFD1_dev_null_triggered(); void on_actionFD1_Other_triggered(); void on_actionFD1_Eject_triggered(); void Open_Recent_Floppy1_Image(); void on_actionCDROM_dev_cdrom_triggered(); void on_actionCDROM_dev_null_triggered(); void on_actionCDROM_Other_triggered(); void on_actionCDROM_Eject_triggered(); void Open_Recent_CD_ROM_Image(); void Delete_USB_From_VM(); void Add_USB_To_VM(); void on_actionUSB_Update_Device_List_triggered(); void on_actionBy_Bus_Address_triggered(); void on_actionUSB_Disconnect_All_Devices_triggered(); void on_actionCtrl_Alt_Delete_triggered(); void on_actionOther_Keys_triggered(); void on_actionCtrl_Alt_Backspace_triggered(); void on_actionCtrl_Alt_F1_triggered(); void on_actionCtrl_Alt_F2_triggered(); void on_actionCtrl_Alt_F3_triggered(); void on_actionCtrl_Alt_F4_triggered(); void on_actionCtrl_Alt_F5_triggered(); void on_actionCtrl_Alt_F6_triggered(); void on_actionCtrl_Alt_F7_triggered(); void on_actionCtrl_Alt_F8_triggered(); void on_actionCtrl_Alt_F9_triggered(); void on_actionCtrl_Alt_F10_triggered(); void on_actionCtrl_Alt_F11_triggered(); void on_actionCtrl_Alt_F12_triggered(); void on_actionClipboard_triggered(); void on_actionGrab_Mouse_triggered(); #ifdef VNC_DISPLAY void on_actionDisplay_Scaling_triggered(); void on_actionFullscreen_Mode_triggered(); void on_actionReinit_VNC_triggered(); void Connect_VNC(); bool Use_VNC(); #endif void on_actionAbout_Emulator_Control_triggered(); protected: void closeEvent( QCloseEvent *event ); private: Ui::Emulator_Control_Window ui; bool Show_Close_Warning; bool Fullscreen_Menu_Added; Virtual_Machine *Cur_VM; QSettings Settings; QList Recent_Files_CD_Items; QList Recent_Files_FD0_Items; QList Recent_Files_FD1_Items; QMap Removable_Devies_Map; #ifdef VNC_DISPLAY MachineView *Machine_View; #endif void Update_Recent_CD_ROM_Images_List(); void Update_Recent_Floppy_Images_List(); bool CD_ROM_Available(); bool FD0_Available(); bool FD1_Available(); void Set_Device( const QString &dev_name, const QString &path ); }; #endif aqemu-0.9.2/src/Emulator_Control_Window.ui000066400000000000000000000470231272330227200206050ustar00rootroot00000000000000 Andrey Rijov Emulator_Control_Window 0 0 416 48 Emulator Control :/go.png:/go.png false 0 0 0 0 416 32 &Help &VM Send &Keys Ctrl-Alt-&F# :/key.png:/key.png &Connect Floppy &B :/fdd.png:/fdd.png &Recent Files Floppy &A :/fdd.png:/fdd.png &Recent Files &USB :/usb.png:/usb.png &Connect :/connect.png:/connect.png &Disconnect :/disconnect.png:/disconnect.png &CD-ROM :/cdrom.png:/cdrom.png &Recent Files View Co&nnect :/save.png:/save.png Save Screens&hot :/save.png:/save.png &Save VM :/open-file.png:/open-file.png &Load VM Ctrl+O :/pause.png:/pause.png &Pause VM :/exit.png:/exit.png &Quit :/save-as.png:/save-as.png Save VM S&tate... :/open-file.png:/open-file.png Load VM St&ate... :/restart.png:/restart.png &Reset VM :/stop.png:/stop.png Power &Off :/save-all.png:/save-all.png &Commit :/key.png:/key.png Ctrl-Alt-&Delete &1 &2 &3 &4 &5 &6 &7 &8 &9 1&0 11 12 :/fdd.png:/fdd.png /&dev/fd0 /dev/&null :/open-file.png:/open-file.png &Other... :/eject.png:/eject.png &Eject &Update Device List :/about.png:/about.png &About Emulator Control... :/fdd.png:/fdd.png /&dev/fd0 :/open-file.png:/open-file.png &Other... :/eject.png:/eject.png &Eject /dev/&null :/cdrom.png:/cdrom.png /&dev/cdrom :/open-file.png:/open-file.png &Other... :/eject.png:/eject.png &Eject :/save-as.png:/save-as.png Sa&ve Screenshot As... /dev/&null &All Devices :/key.png:/key.png &Other Keys... :/terminal.png:/terminal.png QEMU &Monitor :/key.png:/key.png &Ctrl-Alt-Backspace null (/dev/null) stdio (Standard In Out) Other... /dev/ttyS0 Other... null (/dev/null) &By Bus.Address :/clock.png:/clock.png Ma&nage Snapshots d true :/scale.png:/scale.png &Display Scaling true :/fullscreen.png:/fullscreen.png &Fullscreen Mode Ctrl+Alt+F true Show Status Bar :/bug.png:/bug.png &Reinit VNC a a :/key.png:/key.png C&lipboard :/input-mouse.png:/input-mouse.png &Grab Mouse aqemu-0.9.2/src/Emulator_Options_Window.cpp000066400000000000000000000256711272330227200207720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Utils.h" #include "System_Info.h" #include "Emulator_Options_Window.h" Emulator_Options_Window::Emulator_Options_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); ui.Table_Systems->resizeColumnsToContents(); ui.Table_Systems->resizeRowsToContents(); QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Table_Systems ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Table_Systems->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Table_Systems ); hv->setSectionResizeMode( QHeaderView::Stretch ); ui.Table_Systems->setHorizontalHeader( hv ); Update_Info = false; #ifdef Q_OS_WIN32 ui.RB_KVM->setEnabled( false ); #endif } void Emulator_Options_Window::on_Button_Find_clicked() { if( ui.Edit_Path_to_Dir->text().isEmpty() ) { AQGraphic_Warning( tr("Error!"), tr("Path is Empty!") ); return; } QDir dir = QDir( ui.Edit_Path_to_Dir->text() ); if( ! dir.exists() ) { AQGraphic_Warning( tr("Warning"), tr("Path doesn't exist!") ); return; } // Set Type and Bin files QMap list; list = System_Info::Find_QEMU_Binary_Files( ui.Edit_Path_to_Dir->text() ); // Clear old bin files ui.Table_Systems->clearContents(); while( ui.Table_Systems->rowCount() > 0 ) ui.Table_Systems->removeRow( 0 ); // Add bin files to Table_Systems QMap::const_iterator iter = list.constBegin(); while( iter != list.constEnd() ) { ui.Table_Systems->insertRow( ui.Table_Systems->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( iter.key() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 0, newItem ); newItem = new QTableWidgetItem( QDir::toNativeSeparators(iter.value()) ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 1, newItem ); ++iter; // next value } // Update emulator info Update_Info = true; Update_Emulator(); Update_Info = false; } void Emulator_Options_Window::on_TB_Browse_clicked() { QString dir = QFileDialog::getExistingDirectory( this, tr("Select Directory"), Get_Last_Dir_Path(ui.Edit_Path_to_Dir->text()), QFileDialog::ShowDirsOnly ); if( ! dir.isEmpty() ) ui.Edit_Path_to_Dir->setText( QDir::toNativeSeparators(dir) ); } void Emulator_Options_Window::done(int r) { if ( r == QDialog::Accepted ) { // Find all Emulators Names if( ui.Edit_Name->text().isEmpty() ) { AQGraphic_Warning( tr("Error!"), tr("Enulator Name is Empty!") ); return; } if( ! Name_Valid(ui.Edit_Name->text()) ) { AQGraphic_Warning( tr("Error!"), tr("This emulator name is already used!") ); return; } // Name Current_Emulator.Set_Name( ui.Edit_Name->text() ); // Path Current_Emulator.Set_Path( ui.Edit_Path_to_Dir->text() ); // Save Binary List QMap bin_files; for( int ix = 0; ix < ui.Table_Systems->rowCount(); ix++ ) { bin_files[ ui.Table_Systems->item(ix, 0)->text() ] = ui.Table_Systems->item(ix, 1)->text(); } Current_Emulator.Set_Binary_Files( bin_files ); // Check version if( ui.RB_Check_Version->isChecked() ) Current_Emulator.Set_Check_Version( true ); else Current_Emulator.Set_Check_Version( false ); // Check available options if( ui.RB_Check_Options->isChecked() ) Current_Emulator.Set_Check_Available_Options( true ); else Current_Emulator.Set_Check_Available_Options( false ); // Force version if( ui.RB_Force_Version->isChecked() ) Current_Emulator.Set_Force_Version( true ); else Current_Emulator.Set_Force_Version( false ); // Version Current_Emulator.Set_Version( String_To_Emulator_Version(ui.CB_Version->currentText()) ); // Update emulator? Update_Emulator(); } QDialog::done(r); } Emulator Emulator_Options_Window::Get_Emulator() const { return Current_Emulator; } void Emulator_Options_Window::Set_Emulator( const Emulator &emul ) { Current_Emulator = emul; // Name ui.Edit_Name->setText( Current_Emulator.Get_Name() ); // Path ui.Edit_Path_to_Dir->setText( Current_Emulator.Get_Path() ); // Version if( Current_Emulator.Get_Check_Version() ) ui.RB_Check_Version->setChecked( true ); // Check version else if( Current_Emulator.Get_Check_Available_Options() ) ui.RB_Check_Options->setChecked( true ); // Check available options else if( Current_Emulator.Get_Force_Version() ) ui.RB_Force_Version->setChecked( true ); // Force version else ui.RB_Save_Options->setChecked( true ); // Use saved emulator available options // Force Version switch( Current_Emulator.Get_Version() ) { case VM::QEMU_2_0: ui.CB_Version->setCurrentIndex( 1 ); break; default: AQWarning( "void Emulator_Options_Window::Set_Emulator( Emulator emul )", "Version NOT Valid! Use Default" ); ui.CB_Version->setCurrentIndex( 0 ); break; } // Emulator Binary Files QMap bin_files = Current_Emulator.Get_Binary_Files(); // Clear ui.Table_Systems->clearContents(); while( ui.Table_Systems->rowCount() > 0 ) ui.Table_Systems->removeRow( 0 ); // Add new for( QMap::const_iterator iter = bin_files.constBegin(); iter != bin_files.constEnd(); iter++ ) { ui.Table_Systems->insertRow( ui.Table_Systems->rowCount() ); QTableWidgetItem *newItem; /*if( ui.RB_QEMU->isChecked() ) { newItem = new QTableWidgetItem( iter.key() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 0, newItem ); } else { newItem = new QTableWidgetItem( iter.key() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 0, newItem ); }*/ newItem = new QTableWidgetItem( iter.value() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 1, newItem ); } Update_Info = false; // Update emulator info } void Emulator_Options_Window::Set_All_Emulators_Names( const QStringList &allNames ) { All_Emulators_Names = allNames; } void Emulator_Options_Window::on_Edit_Name_textChanged() { if( Name_Valid(ui.Edit_Name->text()) ) ui.Label_Name_Valid->setPixmap( QPixmap(":/ok.png") ); else ui.Label_Name_Valid->setPixmap( QPixmap(":/remove.png") ); } void Emulator_Options_Window::on_Edit_Path_to_Dir_textChanged() { if( QFile::exists(ui.Edit_Path_to_Dir->text()) ) ui.Button_Find->setEnabled( true ); else ui.Button_Find->setEnabled( false ); Update_Info = true; // Update emulator info } void Emulator_Options_Window::on_Table_Systems_itemDoubleClicked( QTableWidgetItem *item ) { QString binName = QFileDialog::getOpenFileName( this, tr("Select QEMU Binary File"), Get_Last_Dir_Path(ui.Edit_Path_to_Dir->text()), tr("All Files (*)") ); if( ! binName.isEmpty() ) { if( ui.Table_Systems->currentRow() < 0 ) return; ui.Table_Systems->item( ui.Table_Systems->currentRow(), 1 )->setText( QDir::toNativeSeparators(binName) ); Update_Info = true; // Update emulator info } } void Emulator_Options_Window::on_RB_QEMU_toggled( bool checked ) { // Clear ui.Table_Systems->clearContents(); while( ui.Table_Systems->rowCount() > 0 ) ui.Table_Systems->removeRow( 0 ); // Add new items QMap bin_files = System_Info::Find_QEMU_Binary_Files( "" ); for( QMap::const_iterator iter = bin_files.constBegin(); iter != bin_files.constEnd(); iter++ ) { ui.Table_Systems->insertRow( ui.Table_Systems->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( iter.key() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 0, newItem ); } Update_Info = true; // Update emulator info } void Emulator_Options_Window::on_RB_KVM_toggled( bool checked ) { /*// Clear ui.Table_Systems->clearContents(); while( ui.Table_Systems->rowCount() > 0 ) ui.Table_Systems->removeRow( 0 ); // Add new items QMap bin_files = System_Info::Find_KVM_Binary_Files( "" ); for( QMap::const_iterator iter = bin_files.constBegin(); iter != bin_files.constEnd(); iter++ ) { ui.Table_Systems->insertRow( ui.Table_Systems->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( iter.key() ); ui.Table_Systems->setItem( ui.Table_Systems->rowCount()-1, 0, newItem ); } Update_Info = true; // Update emulator info*/ //tobgle //FIXME?! } bool Emulator_Options_Window::Name_Valid( const QString &name ) { if( name.isEmpty() ) return false; for( int fx = 0; fx < All_Emulators_Names.count(); fx++ ) { if( All_Emulators_Names[fx] == name && Current_Emulator.Get_Name() != name ) return false; } return true; } void Emulator_Options_Window::Update_Emulator() { if( Update_Info ) { if( ui.RB_Save_Options->isChecked() || // Update emulator bin files info? ui.RB_Check_Options->isChecked() ) { QMap devList; for( int ix = 0; ix < ui.Table_Systems->rowCount(); ix++ ) { if( ! QFile::exists(ui.Table_Systems->item(ix, 1)->text()) ) continue; bool ok = false; Available_Devices tmpDev = System_Info::Get_Emulator_Info( ui.Table_Systems->item(ix, 1)->text(), &ok, Current_Emulator.Get_Version(), ui.Table_Systems->item(ix, 0)->text() ); if( ok ) devList[ ui.Table_Systems->item(ix, 0)->text() ] = tmpDev; else AQGraphic_Warning( tr("Error!"), tr("Cannot get emulator info! For file: %1").arg(ui.Table_Systems->item(ix, 1)->text()) ); } Current_Emulator.Set_Devices( devList ); } else if( ui.RB_Check_Version->isChecked() ) // Update version { VM::Emulator_Version emul_version = VM::Obsolete; for( int ix = 0; ix < ui.Table_Systems->rowCount(); ix++ ) { if( QFile::exists(ui.Table_Systems->item(ix, 1)->text()) ) emul_version = System_Info::Get_Emulator_Version( ui.Table_Systems->item(ix, 1)->text() ); else continue; if( emul_version != VM::Obsolete ) break; } if( emul_version == VM::Obsolete ) AQGraphic_Warning( tr("Error!"), tr("Cannot get version for emulator!") ); else Current_Emulator.Set_Version( emul_version ); } } } aqemu-0.9.2/src/Emulator_Options_Window.h000066400000000000000000000036701272330227200204320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef EMULATOR_OPTIONS_WINDOW_H #define EMULATOR_OPTIONS_WINDOW_H #include #include "VM_Devices.h" #include "ui_Emulator_Options_Window.h" class Emulator_Options_Window: public QDialog { Q_OBJECT public: Emulator_Options_Window( QWidget *parent = 0 ); Emulator Get_Emulator() const; void Set_Emulator( const Emulator &emul ); void Set_All_Emulators_Names( const QStringList &allNames ); private slots: void done(int); void on_Edit_Name_textChanged(); void on_Edit_Path_to_Dir_textChanged(); void on_Button_Find_clicked(); void on_TB_Browse_clicked(); void on_Table_Systems_itemDoubleClicked( QTableWidgetItem *item ); void on_RB_QEMU_toggled( bool checked ); void on_RB_KVM_toggled( bool checked ); bool Name_Valid( const QString &name ); void Update_Emulator(); private: Ui::Emulator_Options_Window ui; QStringList All_Emulators_Names; QSettings Settings; Emulator Current_Emulator; bool Update_Info; // Update emulator information before exit }; #endif aqemu-0.9.2/src/Emulator_Options_Window.ui000066400000000000000000000343331272330227200206200ustar00rootroot00000000000000 Andrey Rijov Emulator_Options_Window 0 0 821 641 Emulator Settings :/exec.png:/exec.png Name (Emulator identifier) 10 0 0 24 24 24 24 24 24 :/ok.png true Qt::Vertical QSizePolicy::Fixed 150 10 0 0 Find emulator Qt::Horizontal 0 0 Path to Emutators Binary Directory: 10 ... :/open-folder.png:/open-folder.png false 0 0 &Find Emulators :/find.png:/find.png Qt::Vertical QSizePolicy::Fixed 150 10 0 0 Emulators Executables Files Qt::Horizontal 10 QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel QEMU System Binary File Name Qt::Vertical QSizePolicy::Fixed 150 10 0 0 0 0 0 0 Emulator Version Qt::Horizontal 10 &Use saved available emulator options (Recomended to choose it again after emulator updating) true A&lways check available emulator options while starting AQEMU (Slow) Alwa&ys check emulator version while starting AQEMU false 0 0 Se&t version and available options manually Qt::Horizontal QSizePolicy::Fixed 5 17 false 0 0 -1 256 Qt::Horizontal Qt::Horizontal 298 25 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
Edit_Name Edit_Path_to_Dir TB_Browse Button_Find Table_Systems RB_Save_Options RB_Check_Options RB_Check_Version RB_Force_Version CB_Version RB_Force_Version toggled(bool) CB_Version setEnabled(bool) 109 387 313 378 buttonBox rejected() Emulator_Options_Window reject() 611 612 410 320 buttonBox accepted() Emulator_Options_Window accept() 611 612 410 320
aqemu-0.9.2/src/Error_Log_Window.cpp000066400000000000000000000062221272330227200173500ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "Utils.h" #include "Error_Log_Window.h" Error_Log_Window::Error_Log_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); last_error_is_deprecated_option = false; Errors_Count = 0; if( Settings.value("No_Show_Error_Log_Forever", "no") == "yes" ) ui.RB_No_Show_Forever->setChecked( true ); else if ( Settings.value("Error_Log_User_Mode","yes") == "yes" ) ui.RB_User_Normal_Mode->setChecked( true ); else if( ! Get_Show_Error_Window() ) ui.RB_Show_AQEMU_Started->setChecked( true ); } void Error_Log_Window::Add_to_Log( const QString& err_str ) { if( err_str.indexOf(QRegExp("\\w+"), 0) == -1 ) return; Errors_Count++; ui.Edit_Log->append( " " + tr("Error #") + QString::number(Errors_Count) + "
" + err_str + "
" ); last_error_is_deprecated_option = err_str.contains("option is deprecated"); //deprecated options shouldn't block an actual error from being shown if ( err_str.contains("invalid") || err_str.contains("could not") ) { last_error_is_deprecated_option = false; } } bool Error_Log_Window::No_Show_Before_AQEMU_Restart() const { if( ui.RB_Show_AQEMU_Started->isChecked() ) Set_Show_Error_Window( false ); else Set_Show_Error_Window( true ); return ! Get_Show_Error_Window(); } bool Error_Log_Window::No_Show_Before_VM_Restart() const { if( ui.RB_Show_VM_Started->isChecked() ) return true; else return false; } bool Error_Log_Window::No_Show_Deprecated_Options_Error() const { if( ui.RB_Normal_Mode->isChecked() ) { //the "Normal_Mode" which should really be called "Developer Mode" //is the only mode in which we want to see deprecated options errors return false; } return last_error_is_deprecated_option; } void Error_Log_Window::done(int r) { if ( r == QDialog::Accepted ) { if( ui.RB_No_Show_Forever->isChecked() ) Settings.setValue( "No_Show_Error_Log_Forever", "yes" ); else Settings.setValue( "No_Show_Error_Log_Forever", "no" ); if( ui.RB_User_Normal_Mode->isChecked() ) Settings.setValue( "Error_Log_User_Mode", "yes" ); else Settings.setValue( "Error_Log_User_Mode", "no" ); No_Show_Before_AQEMU_Restart(); } QDialog::done(r); } aqemu-0.9.2/src/Error_Log_Window.h000066400000000000000000000030371272330227200170160ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef ERROR_LOG_WINDOW_H #define ERROR_LOG_WINDOW_H #include #include "ui_Error_Log_Window.h" class Error_Log_Window: public QDialog { Q_OBJECT public: Error_Log_Window( QWidget *parent = 0 ); void Add_to_Log( const QString& err_str ); bool No_Show_Before_AQEMU_Restart() const; bool No_Show_Before_VM_Restart() const; bool No_Show_Deprecated_Options_Error() const; private slots: void done(int); private: Ui::Error_Log_Window ui; int Errors_Count; QSettings Settings; bool last_error_is_deprecated_option; }; #endif aqemu-0.9.2/src/Error_Log_Window.ui000066400000000000000000000125231272330227200172040ustar00rootroot00000000000000 Andrey Rijov Error_Log_Window 0 0 542 438 QEMU Error Log :/bug.png:/bug.png true When To Show This Log 10 Everytime an error occurs or an option is &deprecated. true Everytime an error occurs. (Defau&lt) false Do &not show until the next VM is started. false Do not show &until the next time AQEMU is started. Never. &To view manually select "VM->Show QEMU Error Log Window" in the menu. &Clear List :/error.png:/error.png Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
Edit_Log RB_Show_VM_Started RB_Show_AQEMU_Started RB_No_Show_Forever Button_Clear_Log Button_Clear_Log clicked() Edit_Log clear() 53 291 228 103 buttonBox accepted() Error_Log_Window accept() 349 383 270 205 buttonBox rejected() Error_Log_Window reject() 349 383 270 205
aqemu-0.9.2/src/First_Start_Wizard.cpp000066400000000000000000000455661272330227200177310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include "First_Start_Wizard.h" #include "Utils.h" #include "System_Info.h" #include "Advanced_Settings_Window.h" #include "Edit_Emulator_Version_Window.h" #include "Emulator_Options_Window.h" First_Start_Wizard::First_Start_Wizard( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); Emulators_Find_Done = false; Next_Move = true; retranslateUi(); Load_Settings(); ui.All_Pages->setCurrentIndex(1); } bool First_Start_Wizard::Find_Emulators() { on_Button_Find_Emulators_clicked(); //Update_Emulators_List(); // FIXME return Save_Settings(); } void First_Start_Wizard::on_Button_Cancel_clicked() { if( QMessageBox::information(this, tr("Warning!"), tr("Are you sure? You can configure these options later in Settings windows."), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes ) { reject(); } } void First_Start_Wizard::on_Button_Back_clicked() { Next_Move = false; if( ui.All_Pages->currentWidget() == ui.Find_Emulators_Page || ui.All_Pages->currentWidget() == ui.Add_Emulator_Page ) ui.All_Pages->setCurrentWidget( ui.General_Settings_Page ); else ui.All_Pages->setCurrentIndex( ui.All_Pages->currentIndex() -1 ); ui.Button_Next->setEnabled( true ); } void First_Start_Wizard::on_Button_Next_clicked() { if( ui.All_Pages->currentWidget() == ui.Welcome_Page ) { retranslateUi(); } else if( ui.All_Pages->currentWidget() == ui.General_Settings_Page ) { #ifdef Q_OS_WIN32 ui.All_Pages->setCurrentWidget( ui.Add_Emulator_Page ); #else ui.All_Pages->setCurrentWidget( ui.Find_Emulators_Page ); #endif return; } else if( ui.All_Pages->currentIndex() == ui.All_Pages->count()-1 ) { if( Save_Settings() ) { Advanced_Settings_Window *asw = new Advanced_Settings_Window(); asw->done(QDialog::Accepted); delete asw; accept(); } } Next_Move = true; ui.All_Pages->setCurrentIndex( ui.All_Pages->currentIndex() +1 ); if ( ui.All_Pages->currentIndex() == 3 ) //FIXME: skipping this page but it could maybe be removed ui.All_Pages->setCurrentIndex( ui.All_Pages->currentIndex() + 1 ); if( ui.All_Pages->currentWidget() == ui.Find_Emulators_Page ) { if( ! Emulators_Find_Done ) ui.Button_Next->setEnabled( false ); } } void First_Start_Wizard::on_Edit_VM_Dir_textChanged() { ui.Button_Next->setEnabled( ! ui.Edit_VM_Dir->text().isEmpty() ); } void First_Start_Wizard::on_TB_Browse_VM_Dir_clicked() { QString folder = QFileDialog::getExistingDirectory( this, tr("Set Folder for you VM's"), Settings.value("VM_Directory", "~").toString() ); if( ! folder.isEmpty() ) { if( ! (folder.endsWith("/") || folder.endsWith("\\")) ) folder += "/"; ui.Edit_VM_Dir->setText( QDir::toNativeSeparators(folder) ); } } void First_Start_Wizard::on_Button_Find_Emulators_clicked() { Emulators_Find_Done = true; ui.Button_Next->setEnabled( true ); // Clear old emulators list and remove emulators files ui.Edit_Enulators_List->clear(); // Remove old files Remove_All_Emulators_Files(); // Find emulators files // Get environment values QStringList sys_env = QProcess::systemEnvironment(); if( sys_env.count() <= 0 ) { AQError( "void First_Start_Wizard::on_Button_Find_clicked()", "Cannot Get System Environment Information!" ); return; } else { // Find PATH QStringList paths; for( int ix = 0; ix < sys_env.count(); ix++ ) { if( sys_env[ix].startsWith("PATH=") ) { QString tmp = sys_env[ ix ].remove( "PATH=" ); paths = tmp.split( ":", QString::SkipEmptyParts ); break; } } // Delete /usr/bin/X11/ from PATH's list for( int ix = 0; ix < paths.count(); ix++ ) { if( paths[ix].contains("/usr/bin/X11") ) paths.removeAt( ix ); } // Remove duplicates paths.removeDuplicates(); // Add / to line end for( int ix = 0; ix < paths.count(); ++ix ) { paths[ ix ] = QDir::toNativeSeparators( (paths[ix].endsWith("/") || paths[ix].endsWith("\\")) ? paths[ix] : paths[ix] + "/" ); } if( paths.count() <= 0 ) { AQError( "void First_Start_Wizard::on_Button_Find_clicked()", "Cannot Find PATH in System Environment Information!" ); return; } else { // Find QEMU-IMG bool qemuIMG_Found = false; for( int ix = 0; ix < paths.count(); ++ix ) { if( QFile::exists(paths[ix] + "qemu-img") ) { Settings.setValue( "QEMU-IMG_Path", paths[ix] + "qemu-img" ); qemuIMG_Found = true; break; } else if( QFile::exists(paths[ix] + "kvm-img") ) { Settings.setValue( "QEMU-IMG_Path", paths[ix] + "kvm-img" ); qemuIMG_Found = true; break; } else if( QFile::exists(paths[ix] + "qemu-img-kvm") ) { Settings.setValue( "QEMU-IMG_Path", paths[ix] + "qemu-img-kvm" ); qemuIMG_Found = true; break; } else if( QFile::exists(paths[ix] + "qemu-kvm-img") ) { Settings.setValue( "QEMU-IMG_Path", paths[ix] + "qemu-kvm-img" ); qemuIMG_Found = true; break; } } if( qemuIMG_Found ) AQDebug( "void First_Start_Wizard::on_Button_Find_Emulators_clicked()", "qemu-img find on: " + Settings.value("QEMU-IMG_Path","").toString() ); else AQError( "void First_Start_Wizard::on_Button_Find_Emulators_clicked()", "Cannot find qemu-img!" ); // Find QEMU QList qemuEmulatorsList; for( int qx = 0; qx < paths.count(); ++qx ) { QMap qemu_list = System_Info::Find_QEMU_Binary_Files( paths[qx] ); // Found emulators files in this dir? bool qemuBinFilesFound = false; for( QMap::const_iterator it = qemu_list.constBegin(); it != qemu_list.constEnd(); ++it ) { if( ! it.value().isEmpty() ) { qemuBinFilesFound = true; break; } } if( ! qemuBinFilesFound ) { AQDebug( "void First_Start_Wizard::on_Button_Find_clicked()", "In " + paths[qx] + " QEMU Not Found" ); continue; } // Bin files found. Work... AQDebug( "void First_Start_Wizard::on_Button_Find_clicked()", "QEMU Found. Path: " + paths[qx] ); // Check Version VM::Emulator_Version qemu_version = VM::Obsolete; QMap::const_iterator iter = qemu_list.constBegin(); while( iter != qemu_list.constEnd() ) { if( QFile::exists(iter.value()) ) qemu_version = System_Info::Get_Emulator_Version( iter.value() ); if( qemu_version != VM::Obsolete ) break; iter++; } if( qemu_version == VM::Obsolete ) { AQError( "void First_Start_Wizard::on_Button_Find_clicked()", "Cannot Get QEMU Version! Using Default: 2.0" ); qemu_version = VM::QEMU_2_0; } // Get emulator info int allEmulBinCount = qemu_list.count(); QProgressDialog progressWin( tr("Search..."), tr("Cancel"), 0, allEmulBinCount, this ); progressWin.setWindowModality( Qt::WindowModal ); QMap devList; iter = qemu_list.constBegin(); for( int emulBinIndex = 0; iter != qemu_list.constEnd(); ++emulBinIndex ) { progressWin.setValue( emulBinIndex ); if( ! iter.value().isEmpty() ) { bool ok = false; Available_Devices tmpDev = System_Info::Get_Emulator_Info( iter.value(), &ok, qemu_version, iter.key() ); if( ok ) devList[ iter.key() ] = tmpDev; else AQGraphic_Warning( "void First_Start_Wizard::on_Button_Find_clicked()", tr("Error!"), tr("Cannot get emulator info! For file: %1").arg(iter.value()) ); } ++iter; if( progressWin.wasCanceled() ) break; } progressWin.setValue( allEmulBinCount ); // Create new emulator Emulator emul; // Emulator name QString emulName = Emulator_Version_To_String( qemu_version ); int emulDublicateNameCount = 1; for( int ix = 0; ix < qemuEmulatorsList.count(); ++ix ) { if( emulName == qemuEmulatorsList[ix].Get_Name() ) { ++emulDublicateNameCount; emulName = QString("%1 #%2").arg( Emulator_Version_To_String(qemu_version) ) .arg( emulDublicateNameCount ); ix = 0; } } emul.Set_Name( emulName ); emul.Set_Version( qemu_version ); emul.Set_Path( paths[qx] ); emul.Set_Devices( devList ); emul.Set_Binary_Files( qemu_list ); emul.Set_Check_Version( false ); emul.Set_Check_Available_Options( false ); emul.Set_Force_Version( false ); qemuEmulatorsList << emul; // Add Text ui.Edit_Enulators_List->appendPlainText( tr("QEMU Found in \"%1\", version: %2"). arg(paths[qx]). arg(Emulator_Version_To_String(qemu_version)) ); } // Set default emulators if( qemuEmulatorsList.count() > 0 ) { // Enable Edit Emulator Version Manualy Button ui.Button_Edit->setEnabled( true ); // Find and set QEMU default emulator if( qemuEmulatorsList.count() > 1 ) { VM::Emulator_Version maxVer = VM::Obsolete; int maxVerIndex = 0; for( int ix = 0; ix < qemuEmulatorsList.count(); ++ix ) { if( qemuEmulatorsList[ix].Get_Version() > maxVer ) { maxVer = qemuEmulatorsList[ix].Get_Version(); maxVerIndex = ix; } } qemuEmulatorsList[ maxVerIndex ].Set_Default( true ); // Save emulators for( int ix = 0; ix < qemuEmulatorsList.count(); ++ix ) qemuEmulatorsList[ ix ].Save(); } else if( qemuEmulatorsList.count() > 0 ) { qemuEmulatorsList[ 0 ].Set_Default( true ); qemuEmulatorsList[ 0 ].Save(); } } } } } void First_Start_Wizard::on_Button_Skip_Find_clicked() { ui.Button_Next->setEnabled( true ); } void First_Start_Wizard::on_Button_Edit_clicked() { Edit_Emulator_Version_Window *edit_win = new Edit_Emulator_Version_Window(); if( edit_win->exec() == QDialog::Accepted ) { // Update Emulators Info Text ui.Edit_Enulators_List->setPlainText( tr("Emulator Version Modified By User") ); } delete edit_win; } #ifdef Q_OS_WIN32 void First_Start_Wizard::on_TB_Add_Emulator_Browse_clicked() { QString emulatorDirPath = QFileDialog::getExistingDirectory( this, tr("Select QEMU emulator directory"), Get_Last_Dir_Path(ui.Edit_Add_Emulator_Path->text()) ); if( ! emulatorDirPath.isEmpty() ) ui.Edit_Add_Emulator_Path->setText( QDir::toNativeSeparators(emulatorDirPath) ); } void First_Start_Wizard::on_Button_Add_Emulator_Find_clicked() { } void First_Start_Wizard::on_Button_Add_Emulator_Manual_Mode_clicked() { Emulator_Options_Window *emulatorOptionsWin = new Emulator_Options_Window( this ); Emul.Set_Name( ui.CB_Add_Emulator_Version->currentText() ); Emul.Set_Path( ui.Edit_Add_Emulator_Path->text() ); Emul.Set_Version( String_To_Emulator_Version(ui.CB_Add_Emulator_Version->currentText()) ); Emul.Set_Force_Version( true ); emulatorOptionsWin->Set_Emulator( Emul ); if( emulatorOptionsWin->exec() == QDialog::Accepted ) { Emul = emulatorOptionsWin->Get_Emulator(); ui.Edit_Add_Emulator_Path->setText( Emul.Get_Path() ); ui.CB_Add_Emulator_Version->setEditText( Emulator_Version_To_String(Emul.Get_Version()) ); } delete emulatorOptionsWin; } #endif void First_Start_Wizard::on_All_Pages_currentChanged( int index ) { // Back, Next Buttons State if( index == 0 ) ui.Button_Back->setEnabled( false ); else if( index == ui.All_Pages->count()-1 ) ui.Button_Next->setText( tr("&Finish") ); else { ui.Button_Back->setEnabled( true ); ui.Button_Next->setText( tr("&Next") ); } // Set Header Text ui.Label_Caption->setText( Header_Captions[ui.All_Pages->currentIndex()] ); // Pages Actions if( ui.All_Pages->currentWidget() == ui.General_Settings_Page && Next_Move ) retranslateUi(); } void First_Start_Wizard::Load_Settings() { // Find All Language Files (*.qm) QDir data_dir( Settings.value("AQEMU_Data_Folder", "/usr/share/aqemu/").toString() ); QFileInfoList lang_files = data_dir.entryInfoList( QStringList("*.qm"), QDir::Files, QDir::Name ); if( lang_files.count() > 0 ) { // Add Languages to List for( int dd = 0; dd < lang_files.count(); ++dd ) { ui.CB_Language->addItem( lang_files[dd].completeBaseName() ); if( lang_files[dd].completeBaseName() == Settings.value( "Language", "en" ).toString() ) ui.CB_Language->setCurrentIndex( dd + 1 ); // First Item 'English' } } // Virtual Machines Folder #ifdef Q_OS_WIN32 ui.Edit_Add_Emulator_Path->setText( QDir::toNativeSeparators(QDir::currentPath() + "/QEMU/") ); ui.Edit_VM_Dir->setText( QDir::toNativeSeparators(Settings.value("VM_Directory", QDir::homePath() + "/AQEMU_VM/").toString()) ); #else ui.Edit_VM_Dir->setText( QDir::toNativeSeparators(Settings.value("VM_Directory", QDir::homePath() + "/.aqemu/").toString()) ); #endif } bool First_Start_Wizard::Save_Settings() { // Virtual Machines Folder QDir dir; ui.Edit_VM_Dir->setText( QDir::toNativeSeparators(ui.Edit_VM_Dir->text()) ); if( ! (ui.Edit_VM_Dir->text().endsWith("/") || ui.Edit_VM_Dir->text().endsWith("\\")) ) ui.Edit_VM_Dir->setText( ui.Edit_VM_Dir->text() + QDir::toNativeSeparators("/") ); if( dir.exists(ui.Edit_VM_Dir->text()) ) { if( ! dir.exists(ui.Edit_VM_Dir->text() + QDir::toNativeSeparators("/os_templates/")) ) dir.mkdir( ui.Edit_VM_Dir->text() + QDir::toNativeSeparators("/os_templates/") ); } else if( ! (dir.mkdir(ui.Edit_VM_Dir->text()) && dir.mkdir(ui.Edit_VM_Dir->text() + QDir::toNativeSeparators("/os_templates/"))) ) { AQGraphic_Warning( tr("Error!"), tr("Cannot Create New Folder!") ); return false; } Settings.setValue( "VM_Directory", ui.Edit_VM_Dir->text() ); // Interface Language if( ui.CB_Language->currentIndex() == 0 ) Settings.setValue( "Language", "en" ); else Settings.setValue( "Language", ui.CB_Language->itemText(ui.CB_Language->currentIndex()) ); // Off First Start Settings.setValue( "First_Start", "no" ); #ifdef Q_OS_WIN32 // Check emulator if( Emul.Get_Name().isEmpty() ) { Emul.Set_Name( ui.CB_Add_Emulator_Version->currentText() ); Emul.Set_Path( ui.Edit_Add_Emulator_Path->text() ); Emul.Set_Version( String_To_Emulator_Version(ui.CB_Add_Emulator_Version->currentText()) ); Emul.Set_Force_Version( true ); bool foundEmulBinary = false; bool searchAgain = true; while( true ) { QList emulBinPaths = Emul.Get_Binary_Files().values(); for( int ix = 0; ix < emulBinPaths.count(); ++ix ) { if( QFile::exists(emulBinPaths[ix]) ) { foundEmulBinary = true; break; } } if( ! foundEmulBinary ) { if( ! searchAgain ) break; searchAgain = false; Emul.Set_Binary_Files( System_Info::Find_QEMU_Binary_Files(ui.Edit_Add_Emulator_Path->text()) ); } else break; } if( ! foundEmulBinary ) { AQGraphic_Warning( tr("Error"), tr("Emulator binary files not exists! Please click Back and set it manual.") ); return false; } // qemu-img if( ! QFile::exists(Settings.value("QEMU-IMG_Path", "").toString()) ) { QString qemuImgPath = (ui.Edit_Add_Emulator_Path->text().endsWith("/") || ui.Edit_Add_Emulator_Path->text().endsWith("\\")) ? ui.Edit_Add_Emulator_Path->text() + "qemu-img.exe" : ui.Edit_Add_Emulator_Path->text() + QDir::toNativeSeparators("/qemu-img.exe"); if( QFile::exists(qemuImgPath) ) Settings.setValue( "QEMU-IMG_Path", QDir::toNativeSeparators(qemuImgPath) ); else AQGraphic_Warning( tr("Warning!"), tr("Cannot find qemu-img.exe! You most set it path in: File->Advanced Settings->Advanced->qemu-img path") ); } } Remove_All_Emulators_Files(); Emul.Save(); #endif return true; } void First_Start_Wizard::retranslateUi() { // Load Language QTranslator appTranslator; if( ui.CB_Language->currentIndex() != 0 ) { if( appTranslator.load(Settings.value("AQEMU_Data_Folder", "").toString() + ui.CB_Language->itemText(ui.CB_Language->currentIndex()) + ".qm") ) { QCoreApplication::installTranslator( &appTranslator ); AQDebug( "void First_Start_Wizard::retranslateUi()", "Translation File\"" + Settings.value("AQEMU_Data_Folder", "").toString() + ui.CB_Language->itemText(ui.CB_Language->currentIndex()) + ".qm" + "\" Loaded" ); } else AQError( "void First_Start_Wizard::retranslateUi()", "Cannot Load Translations!" ); } Header_Captions.clear(); Header_Captions << tr( "Welcome" ); Header_Captions << tr( "VM Folder" ); Header_Captions << tr( "Find QEMU" ); Header_Captions << tr( "Setup Emulator" ); Header_Captions << tr( "Finished" ); ui.Label_Caption->setText( Header_Captions[0] ); ui.Button_Back->setText( tr("&Back") ); ui.Button_Next->setText( tr("&Next") ); ui.Button_Cancel->setText( tr("&Cancel") ); ui.Label_Welcome_Text->setText( tr("Welcome to the AQEMU settings wizard!\nThis wizard will help you to choose options AQEMU needs to work correctly. Click on \"Next\" to go to next page or the \"Back\" button to go to the previous page.") ); ui.Label_Select_Language->setText( tr("Here you can choose the interface language") ); ui.Label_VM_Dir->setText( tr("Please set the folder for virtual machine configurations:") ); ui.Label_Find_Emulators->setText( tr("To work correctly AQEMU must find QEMU. To search automatically click on \"Search\". If the search can't find QEMU, you can reconfigure AQEMU later. You can do it in the \"File->Settings\" dialog.") ); ui.Button_Find_Emulators->setText( tr("&Search") ); ui.Button_Skip_Find->setText( tr("S&kip Search") ); ui.Button_Edit->setText( tr("Set &Versions Manualy") ); ui.Label_Add_Emulator_Help->setText( "Help text (not written...)" ); ui.Label_Add_Emulator_Path->setText( "Path to the emulator directory" ); ui.Label_Add_Emulator_Version->setText( "Emulator version" ); ui.Button_Add_Emulator_Find->setText( "Start &searching" ); ui.Button_Add_Emulator_Manual_Mode->setText( "Show all settings..." ); ui.Label_Finish_Text->setText( tr("Congratulations! You can now configure and use virtual machines. Click on \"Finish\" to save these settings.") ); } aqemu-0.9.2/src/First_Start_Wizard.h000066400000000000000000000037151272330227200173640ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef FIRST_START_WIZARD_H #define FIRST_START_WIZARD_H #include #include "VM_Devices.h" #include "ui_First_Start_Wizard.h" class First_Start_Wizard: public QDialog { Q_OBJECT public: First_Start_Wizard( QWidget *parent = 0 ); bool Find_Emulators(); private slots: void on_Button_Cancel_clicked(); void on_Button_Back_clicked(); void on_Button_Next_clicked(); void on_Edit_VM_Dir_textChanged(); void on_TB_Browse_VM_Dir_clicked(); void on_Button_Find_Emulators_clicked(); void on_Button_Skip_Find_clicked(); void on_Button_Edit_clicked(); #ifdef Q_OS_WIN32 void on_TB_Add_Emulator_Browse_clicked(); void on_Button_Add_Emulator_Find_clicked(); void on_Button_Add_Emulator_Manual_Mode_clicked(); #endif void on_All_Pages_currentChanged( int index ); void Load_Settings(); bool Save_Settings(); void retranslateUi(); private: Ui::First_Start_Wizard ui; bool Next_Move; bool Emulators_Find_Done; QStringList Header_Captions; QSettings Settings; Emulator Emul; }; #endif aqemu-0.9.2/src/First_Start_Wizard.ui000066400000000000000000000355471272330227200175620ustar00rootroot00000000000000 First_Start_Wizard 0 0 671 400 First Start Wizard :/wizard.png:/wizard.png 12 QFrame::StyledPanel QFrame::Plain 0 true Qt::Vertical 20 100 English Qt::Vertical 20 101 0 0 true Qt::Horizontal 10 4 :/open-folder.png:/open-folder.png Qt::Vertical 20 40 true Qt::ScrollBarAlwaysOn Qt::ScrollBarAlwaysOff true :/system-search.png:/system-search.png :/go.png:/go.png false :/edit.png:/edit.png Qt::Horizontal 306 20 Qt::Vertical QSizePolicy::Fixed 40 20 10 4 :/open-folder.png:/open-folder.png Qt::Vertical QSizePolicy::Fixed 40 10 :/system-search.png:/system-search.png :/edit.png:/edit.png Qt::Horizontal 40 20 Qt::Vertical 20 17 true Qt::Horizontal 40 20 false :/previous.png:/previous.png :/next.png:/next.png Qt::Horizontal QSizePolicy::Fixed 20 20 :/cancel.png:/cancel.png aqemu-0.9.2/src/Folder_Sharing_Widget.cpp000066400000000000000000000215071272330227200203230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include "Folder_Sharing_Widget.h" #include "Add_New_Device_Window.h" #include "Utils.h" #include "Create_HDD_Image_Window.h" #include "System_Info.h" #include "Device_Manager_Widget.h" Folder_Sharing_Widget::Folder_Sharing_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); Enabled = true; //pw = new Properties_Window( this ); Context_Menu = new QMenu( ui.Folders_List ); ui.Folders_List->setSpacing( 3 ); ui.Folders_List->setFlow( QListView::TopToBottom ); ui.Folders_List->setViewMode( QListView::ListMode ); connect(this,SIGNAL(Folder_Changed()),this,SLOT(Update_Icons())); } void Folder_Sharing_Widget::on_actionAdd_Samba_Folder_triggered() { QString message = tr(R"(To set up a shared SAMBA folder these settings need to be made: <> A SAMBA server (smbd) must be installed on the host <> Network support must be enabled <> The network must be set to 'user mode stack'/'user' mode <> Set the shared folder in Network -> TFTP/SAMBA <> Access the folder in the guest at: \\10.0.2.4\qemu (Windows) mount -t cifs //10.0.2.4/qemu /mnt/path/ (Linux) )"); QMessageBox::information( this, tr("How To Setup a Shared SAMBA Folder"), message ); } void Folder_Sharing_Widget::syncLayout(Device_Manager_Widget* dm) { int w = dm->ui.add_layout_widget->sizeHint().width(); ui.add_layout_widget->setMinimumWidth(w); ui.add_layout_widget->setMaximumWidth(w); w = dm->ui.manage_layout_widget->sizeHint().width(); ui.manage_layout_widget->setMinimumWidth(w); ui.manage_layout_widget->setMaximumWidth(w); w = dm->ui.view_layout_widget->sizeHint().width(); ui.view_layout_widget->setMinimumWidth(w); ui.view_layout_widget->setMaximumWidth(w); } Folder_Sharing_Widget::~Folder_Sharing_Widget() { //if( pw != NULL ) delete pw; if( Context_Menu != NULL ) delete Context_Menu; } void Folder_Sharing_Widget::Set_VM( const Virtual_Machine &vm ) { ui.Folders_List->clear(); ui.Label_Connected_To->setText( "" ); ui.TB_Add_Folder->setEnabled( true ); Shared_Folders.clear(); for( int ix = 0; ix < vm.Get_Shared_Folders_List().count(); ++ix ) { Shared_Folders << vm.Get_Shared_Folders_List()[ix]; } Update_Icons(); Update_Enabled_Actions(); } void Folder_Sharing_Widget::Set_Enabled( bool on ) { Enabled = on; ui.Label_Add_Folders->setEnabled( on ); ui.TB_Add_Folder->setEnabled( on ); ui.TB_Add_Samba_Folder->setEnabled( on ); ui.Label_Manage_Folders->setEnabled( on ); //ui.TB_Edit_Folder->setEnabled( on ); ui.TB_Remove_Folder->setEnabled( on ); ui.Label_View_Mode->setEnabled( on ); ui.TB_Icon_Mode->setEnabled( on ); ui.TB_List_Mode->setEnabled( on ); //ui.Label_Folders_List->setEnabled( on ); ui.Label_Information->setEnabled( on ); ui.Label_Connected_To->setEnabled( true ); } void Folder_Sharing_Widget::Update_Enabled_Actions() { // Adds ui.actionAdd_Folder->setEnabled( true ); ui.TB_Add_Folder->setEnabled( true ); // Update Information if( ui.Folders_List->currentItem() != NULL ) { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Folders_List->currentItem()->data(512).toString() == "folder" + QString::number(fx) ) { found = true; ui.Label_Connected_To->setText( "# "+tr("The 9p filesystem module must be available on the guest")+"\nmkdir /tmp/shared"+QString::number(fx)+"; mount -t 9p -o trans=virtio shared"+QString::number(fx)+" /tmp/shared"+QString::number(fx)+" \\\n -o version=9p2000.L,posixacl,cache=mmap" ); //ui.TB_Edit_Folder->setEnabled( true ); ui.actionProperties->setEnabled( true ); ui.TB_Remove_Folder->setEnabled( true ); ui.actionRemove->setEnabled( true ); } } if( ! found ) { //ui.TB_Edit_Folder->setEnabled( false ); ui.actionProperties->setEnabled( false); ui.TB_Remove_Folder->setEnabled( false ); ui.actionRemove->setEnabled( false ); } } else { //ui.TB_Edit_Folder->setEnabled( false ); ui.actionProperties->setEnabled( false); ui.TB_Remove_Folder->setEnabled( false ); ui.actionRemove->setEnabled( false ); } // Disable widgets if( ! Enabled ) { ui.actionAdd_Folder->setEnabled( false ); ui.TB_Add_Folder->setEnabled( false ); ui.TB_Remove_Folder->setEnabled( false ); ui.actionRemove->setEnabled( false ); } } void Folder_Sharing_Widget::Update_List_Mode() { if( ui.Folders_List->viewMode() == QListView::IconMode ) { ui.Folders_List->setSpacing( 10 ); ui.Folders_List->setFlow( QListView::LeftToRight ); ui.Folders_List->setViewMode( QListView::IconMode ); } else { ui.Folders_List->setSpacing( 3 ); ui.Folders_List->setFlow( QListView::TopToBottom ); ui.Folders_List->setViewMode( QListView::ListMode ); } } void Folder_Sharing_Widget::on_Folders_List_customContextMenuRequested( const QPoint &pos ) { QListWidgetItem *it = ui.Folders_List->itemAt( pos ); /* //TODO if( it != NULL ) { { bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Folders_List->currentItem()->data(512).toString() == "folder" + QString::number(fx) ) { found = true; Context_Menu = new QMenu( ui.Folders_List ); //Context_Menu->addAction( ui.actionProperties ); Context_Menu->addAction( ui.actionRemove ); Context_Menu->exec( ui.Folders_List->mapToGlobal(pos) ); } } if( ! found ) { AQError( "void Folder_Sharing_Widget::on_Folders_List_customContextMenuRequested( const QPoint &pos )", "Incorrect folder!" ); } } } else { Context_Menu = new QMenu( ui.Folders_List ); Context_Menu->addAction( ui.actionAdd_Folder ); Context_Menu->addSeparator(); Context_Menu->addAction( ui.actionIcon_Mode ); Context_Menu->addAction( ui.actionList_Mode ); Context_Menu->exec( ui.Folders_List->mapToGlobal(pos) ); } */ } void Folder_Sharing_Widget::on_Folders_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ) { Update_Enabled_Actions(); } void Folder_Sharing_Widget::on_Folders_List_itemDoubleClicked( QListWidgetItem *item ) { on_actionProperties_triggered(); } void Folder_Sharing_Widget::on_actionAdd_Folder_triggered() { QString path = QFileDialog::getExistingDirectory(this, "Select to folder to be shared"); if ( ! path.isEmpty() ) { Shared_Folders << VM_Shared_Folder(true,path); emit Folder_Changed(); } } void Folder_Sharing_Widget::on_actionProperties_triggered() { /* stub */ } void Folder_Sharing_Widget::on_actionRemove_triggered() { int mes_ret = QMessageBox::question( this, tr("Remove?"), tr("Remove Folder?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::No ) return; bool found = false; for( int fx = 0; fx < 32; ++fx ) { if( ui.Folders_List->currentItem()->data(512).toString() == "folder" + QString::number(fx) ) { found = true; Shared_Folders.removeAt( fx ); } } if( ! found ) { AQError( "void Folder_Sharing_Widget::on_actionRemove_triggered()", "Incorrect folder!" ); return; } emit Folder_Changed(); } void Folder_Sharing_Widget::on_actionIcon_Mode_triggered() { ui.Folders_List->setSpacing( 10 ); ui.Folders_List->setFlow( QListView::LeftToRight ); ui.Folders_List->setViewMode( QListView::IconMode ); } void Folder_Sharing_Widget::on_actionList_Mode_triggered() { ui.Folders_List->setSpacing( 3 ); ui.Folders_List->setFlow( QListView::TopToBottom ); ui.Folders_List->setViewMode( QListView::ListMode ); } void Folder_Sharing_Widget::Update_Icons() { ui.Folders_List->clear(); for( int ix = 0; ix < Shared_Folders.count(); ++ix ) { QListWidgetItem *hdit = new QListWidgetItem( QIcon(":/open-folder.png"), Shared_Folders[ix].Get_Folder(), ui.Folders_List ); hdit->setData( 512, "folder" + QString::number(ix) ); ui.Folders_List->addItem( hdit ); } } aqemu-0.9.2/src/Folder_Sharing_Widget.h000066400000000000000000000043301272330227200177630ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef FOLDER_SHARING_WIDGET_H #define FOLDER_SHARING_WIDGET_H #include "VM.h" //#include "Properties_Window.h" #include "ui_Folder_Sharing_Widget.h" class Device_Manager_Widget; class Folder_Sharing_Widget: public QWidget { Q_OBJECT public: Folder_Sharing_Widget( QWidget *parent = 0 ); ~Folder_Sharing_Widget(); void Set_VM( const Virtual_Machine &vm ); void Set_Enabled( bool on ); QList Shared_Folders; void syncLayout(Device_Manager_Widget*); public slots: void Update_Enabled_Actions(); void Update_List_Mode(); signals: void Folder_Changed(); private slots: // For Context Menu void on_Folders_List_customContextMenuRequested( const QPoint &pos ); void on_Folders_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ); void on_Folders_List_itemDoubleClicked( QListWidgetItem *item ); void on_actionAdd_Samba_Folder_triggered(); void on_actionAdd_Folder_triggered(); void on_actionProperties_triggered(); void on_actionRemove_triggered(); void on_actionIcon_Mode_triggered(); void on_actionList_Mode_triggered(); void Update_Icons(); private: bool Enabled; //Properties_Window *pw; Ui::Folder_Sharing_Widget ui; QMenu *Context_Menu; }; #endif aqemu-0.9.2/src/Folder_Sharing_Widget.ui000066400000000000000000000407351272330227200201620ustar00rootroot00000000000000 Andrey Rijov Folder_Sharing_Widget 0 0 719 432 Folder Sharing Widget 9 9 9 9 6 Qt::Horizontal 20 20 Qt::Vertical Qt::Vertical Qt::Horizontal 6 0 0 0 0 Qt::CustomContextMenu Qt::ScrollBarAlwaysOn 32 32 Qt::ElideMiddle QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel QListView::Static QListView::LeftToRight 10 QListView::IconMode 0 0 true How to mount on the guest: Monospace 9 Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse 6 1 1 1 1 Add Folder 6 0 0 0 0 true Add to shared folders list :/open-folder.png:/open-folder.png 32 32 Share folder using samba (for Windows guests) ... :/samba.png:/samba.png 32 32 Qt::Horizontal 40 20 6 1 1 1 1 Remove Folder 6 0 0 0 0 Remove from shared folders list :/remove.png:/remove.png 32 32 Qt::Horizontal 40 20 1 1 1 1 6 View Mode 6 0 0 0 0 Icon Mode :/view_icon.png:/view_icon.png 32 32 List Mode :/view_detailed.png:/view_detailed.png 32 32 :/images/open-folder.png:/images/open-folder.png Add Folder :/images/edit.png:/images/edit.png Properties Properties Properties :/images/button_cancel.png:/images/button_cancel.png Remove From List :/images/view_detailed.png:/images/view_detailed.png List Mode :/images/view_icon.png:/images/view_icon.png Icon Mode :/images/reload.png:/images/reload.png Quick Format :/images/add.png:/images/add.png Add Samba Folder Add Folder Add Samba Folder TB_Remove_Folder TB_Icon_Mode TB_List_Mode Folders_List TB_Add_Folder clicked() actionAdd_Folder trigger() 34 55 -1 -1 TB_Remove_Folder clicked() actionRemove trigger() 233 55 -1 -1 TB_List_Mode clicked() actionList_Mode trigger() 487 55 -1 -1 TB_Icon_Mode clicked() actionIcon_Mode trigger() 433 55 -1 -1 TB_Add_Samba_Folder clicked() actionAdd_Samba_Folder trigger() 70 59 -1 -1 aqemu-0.9.2/src/HDD_Image_Info.cpp000066400000000000000000000114331272330227200166030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include "Utils.h" #include "HDD_Image_Info.h" HDD_Image_Info::HDD_Image_Info( QObject *parent ) : QObject( parent ) { QEMU_IMG_Proc = new QProcess( this ); } VM::Disk_Info HDD_Image_Info::Get_Disk_Info() const { return Info; } void HDD_Image_Info::Update_Disk_Info( const QString &path ) { Info.Image_File_Name = path; if( Info.Image_File_Name.isEmpty() ) { Clear_Info(); return; } if( QFile::exists(Info.Image_File_Name) == false ) { AQWarning( "void QEMU_IMG_Thread::run()", "Image \"" + Info.Image_File_Name + "\" does not exist!" ); Clear_Info(); return; } else { QStringList args; args << "info" << Info.Image_File_Name; QEMU_IMG_Proc = new QProcess( this ); QSettings settings; QEMU_IMG_Proc->start( settings.value("QEMU-IMG_Path", "qemu-img").toString(), args ); connect( QEMU_IMG_Proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(Parse_Info(int, QProcess::ExitStatus)), Qt::DirectConnection ); connect( QEMU_IMG_Proc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(Clear_Info()), Qt::DirectConnection ); } } void HDD_Image_Info::Clear_Info() { AQDebug( "void HDD_Image_Info::Clear_Info()", "HDD Info Not Read!" ); VM_HDD tmp_hdd; Info.Disk_Format = ""; Info.Virtual_Size = tmp_hdd.String_to_Device_Size( "0 G" ); Info.Disk_Size = tmp_hdd.String_to_Device_Size( "0 G" ); Info.Cluster_Size = 0; emit Completed( false ); } void HDD_Image_Info::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus ) { QByteArray info_str_ba = QEMU_IMG_Proc->readAll(); QString info_str = QString( info_str_ba ); // Create QString if( info_str.isEmpty() ) { AQDebug( "void HDD_Image_Info::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", "Data is empty." ); return; } QRegExp RegInfo = QRegExp( ".*image:[\\s]+([^\n\r]+).*file format:[\\s]+([\\w\\d]+).*virtual size:[\\s]+([\\d]+[.]*[\\d]*[KMG]+).*disk size:[\\s]+([\\d]+[.]*[\\d]*[KMG]+).*cluster_size:[\\s]+([\\d]+).*" ); bool cluster = true; if( ! RegInfo.exactMatch(info_str) ) { AQWarning( "void QEMU_IMG_Thread::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", "QRegExp With Cluster Size Not Matched!" ); RegInfo = QRegExp( QString(".*image:[\\s]+([^\n\r]+).*")+ QString("file format:[\\s]+([\\w\\d]+).*")+ QString("virtual size:[\\s]+([\\d]+[.]*[\\d]*[KMG]+).*")+ QString("disk size:[\\s]+([\\d]+[.]*[\\d]*[KMG]*).*") ); if( ! RegInfo.exactMatch(info_str) ) { AQError( "void QEMU_IMG_Thread::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", "QRegExp Without Cluster Size Not Matched! Image: " + Info.Image_File_Name + "\nData: " + info_str ); Clear_Info(); return; } else { cluster = false; } } QStringList info_lines = RegInfo.capturedTexts(); if( cluster && info_lines.count() != 6 ) { AQError( "void QEMU_IMG_Thread::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", "info_str.count() != 6" ); Clear_Info(); return; } else if( ! cluster && info_lines.count() != 5 ) { AQError( "void QEMU_IMG_Thread::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", "info_str.count() != 5" ); Clear_Info(); return; } if( info_lines[1] != Info.Image_File_Name ) { AQWarning( "void QEMU_IMG_Thread::Parse_Info( int exitCode, QProcess::ExitStatus exitStatus )", QString("info_lines[1] != Image_File_Name\nDetails:\n[[%1]]\n[[%2]]").arg(info_lines[1]).arg(Info.Image_File_Name) ); } Info.Disk_Format = info_lines[ 2 ]; VM_HDD tmp_hdd; Info.Virtual_Size = tmp_hdd.String_to_Device_Size( info_lines[3] ); Info.Disk_Size = tmp_hdd.String_to_Device_Size( info_lines[4] ); if( cluster ) Info.Cluster_Size = info_lines[ 5 ].toInt(); else Info.Cluster_Size = 0; emit Completed( true ); } aqemu-0.9.2/src/HDD_Image_Info.h000066400000000000000000000026741272330227200162570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef HDD_IMAGE_INFO_H #define HDD_IMAGE_INFO_H #include #include "VM_Devices.h" class HDD_Image_Info : public QObject { Q_OBJECT public: HDD_Image_Info( QObject *parent = 0 ); VM::Disk_Info Get_Disk_Info() const; public slots: void Update_Disk_Info( const QString &path ); private slots: void Parse_Info( int exitCode, QProcess::ExitStatus exitStatus ); void Clear_Info(); signals: void Completed( bool ok ); private: VM::Disk_Info Info; QProcess* QEMU_IMG_Proc; }; #endif aqemu-0.9.2/src/IP_Edit.cpp000066400000000000000000000133211272330227200154020ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ //adapted code from http://stackoverflow.com/a/29160735 by AGo #include #include #include #include #include #include #include #include "IP_Edit.h" CustomLineEdit::CustomLineEdit(const QString & contents, QWidget *parent) : QLineEdit(contents, parent), selectOnMouseRelease(false) { QIntValidator *valid = new QIntValidator(0, 255, this); setValidator(valid); } void CustomLineEdit::jumpIn() { setFocus(); selectOnMouseRelease = false; selectAll(); } void CustomLineEdit::focusInEvent(QFocusEvent *event) { QLineEdit::focusInEvent(event); selectOnMouseRelease = true; } void CustomLineEdit::keyPressEvent(QKeyEvent * event) { int key = event->key(); int cursorPos = cursorPosition(); // Jump forward by Space if (key == Qt::Key_Space) { emit jumpForward(); event->accept(); return; } // Jump Backward only from 0 cursor position if (cursorPos == 0) { if ((key == Qt::Key_Left) || (key == Qt::Key_Backspace)) { emit jumpBackward(); event->accept(); return; } } // Jump forward from last postion by right arrow if (cursorPos == text().count()) { if (key == Qt::Key_Right) { emit jumpForward(); event->accept(); return; } } // After key is placed cursor has new position QLineEdit::keyPressEvent(event); int freshCurPos = cursorPosition(); if ((freshCurPos == 3) && (key != Qt::Key_Right)) emit jumpForward(); } void CustomLineEdit::mouseReleaseEvent(QMouseEvent *event) { if(!selectOnMouseRelease) return; selectOnMouseRelease = false; selectAll(); QLineEdit::mouseReleaseEvent(event); } void makeCommonStyle(QWidget* line) { line->setContentsMargins(0, 0, 0, 0); auto lineedit = dynamic_cast(line); if (lineedit) lineedit->setAlignment(Qt::AlignCenter); //line->setStyleSheet("QLineEdit { border: 0px none; }"); //line->setFrame(false); line->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); } QWidget* makeIpSplitter() { QLabel *splitter = new QLabel("."); makeCommonStyle(splitter); splitter->setAlignment(Qt::AlignCenter); splitter->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); splitter->setMaximumWidth(10); //splitter->setReadOnly(true); splitter->setFocusPolicy(Qt::NoFocus); return splitter; } IP_Edit::IP_Edit(QWidget *parent) : QFrame(parent) { setContentsMargins(0, 0, 0, 0); setStyleSheet("QFrame { border: 0px; }"); QList lines; QList::iterator linesIterator; p1 = new CustomLineEdit; p2 = new CustomLineEdit; p3 = new CustomLineEdit; p4 = new CustomLineEdit; QFontMetrics metrics(QApplication::font()); int width = metrics.width("888") + 24; p1->setMaximumWidth(width); p2->setMaximumWidth(width); p3->setMaximumWidth(width); p4->setMaximumWidth(width); lines.append(p1); lines.append(p2); lines.append(p3); lines.append(p4); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->setSpacing(0); mainLayout->setContentsMargins(0,0,0,0); setLayout(mainLayout); for (linesIterator = lines.begin(); linesIterator != lines.end(); ++linesIterator) { makeCommonStyle(*linesIterator); mainLayout->addWidget(*linesIterator); if (*linesIterator != lines.last()) { connect(*linesIterator, &CustomLineEdit::jumpForward, *(linesIterator+1), &CustomLineEdit::jumpIn); mainLayout->addWidget(makeIpSplitter()); } if (*linesIterator != lines.first()) { connect(*linesIterator, &CustomLineEdit::jumpBackward, *(linesIterator-1), &CustomLineEdit::jumpIn); } } mainLayout->addItem(new QSpacerItem(1, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed)); connect(p1,SIGNAL(textChanged(const QString &)),this,SIGNAL(textChanged(const QString &))); connect(p2,SIGNAL(textChanged(const QString &)),this,SIGNAL(textChanged(const QString &))); connect(p3,SIGNAL(textChanged(const QString &)),this,SIGNAL(textChanged(const QString &))); connect(p4,SIGNAL(textChanged(const QString &)),this,SIGNAL(textChanged(const QString &))); } IP_Edit::~IP_Edit() { delete p1; delete p2; delete p3; delete p4; } void IP_Edit::setText(const QString& s) { auto list = s.split("."); if ( list.count() > 3 ) { p1->setText(list[0]); p2->setText(list[1]); p3->setText(list[2]); p4->setText(list[3]); } } QString IP_Edit::text() { return p1->text()+"."+p2->text()+"."+p3->text()+"."+p4->text(); } aqemu-0.9.2/src/IP_Edit.h000066400000000000000000000036761272330227200150630ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ //adapted code from http://stackoverflow.com/a/29160735 by AGo #ifndef IP_EDIT_H #define IP_EDIT_H #include #include class CustomLineEdit : public QLineEdit { Q_OBJECT public: explicit CustomLineEdit(const QString & contents = "", QWidget *parent = 0); virtual ~CustomLineEdit() {} signals: void jumpForward(); void jumpBackward(); public slots: void jumpIn(); protected: virtual void focusInEvent(QFocusEvent *event); virtual void keyPressEvent(QKeyEvent * event); virtual void mouseReleaseEvent(QMouseEvent *event); private: bool selectOnMouseRelease; }; class IP_Edit : public QFrame { Q_OBJECT public: explicit IP_Edit(QWidget *parent = 0); ~IP_Edit(); void setText(const QString&); QString text(); signals: void textChanged(const QString &); private: CustomLineEdit* p1; CustomLineEdit* p2; CustomLineEdit* p3; CustomLineEdit* p4; }; #endif aqemu-0.9.2/src/KVM_Options.ui000066400000000000000000000103671272330227200161370ustar00rootroot00000000000000 KVM_Options 0 0 291 87 KVM Options 10 4 KVM Shadow Memory false 1 2048 false 0 0 Mb Qt::Horizontal 221 22 Qt::Vertical 20 103 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
buttonBox accepted() KVM_Options accept() 248 254 157 274 buttonBox rejected() KVM_Options reject() 316 260 286 274 CH_KVM_Shadow_Memory toggled(bool) SB_KVM_Shadow_Memory_Size setEnabled(bool) 107 140 234 140 CH_KVM_Shadow_Memory toggled(bool) Label_KVM_Shadow_Memory_Mb setEnabled(bool) 107 140 283 140
aqemu-0.9.2/src/Main_Window.cpp000066400000000000000000005162611272330227200163530ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "Main_Window.h" #include "Delete_VM_Files_Window.h" #include "Device_Manager_Widget.h" #include "Folder_Sharing_Widget.h" #include "Select_Icon_Window.h" #include "About_Window.h" #include "Create_HDD_Image_Window.h" #include "Convert_HDD_Image_Window.h" #include "VM_Wizard_Window.h" #include "Ports_Tab_Widget.h" #include "Create_Template_Window.h" #include "Snapshots_Window.h" #include "VNC_Password_Window.h" #include "Copy_VM_Window.h" #include "Advanced_Settings_Window.h" #include "First_Start_Wizard.h" #include "Emulator_Control_Window.h" #include "Boot_Device_Window.h" #include "SMP_Settings_Window.h" #include "Settings_Widget.h" #include "Utils.h" // This is static emulator devices data QMap System_Info::Emulator_QEMU_2_0; QList System_Info::All_Host_USB; QList System_Info::Used_Host_USB; Main_Window::Main_Window( QWidget *parent ) : QMainWindow( parent ) { Advanced_Options = new QDialog; Accelerator_Options = new QDialog; Architecture_Options = new QDialog; ui.setupUi( this ); ui_ao.setupUi( Advanced_Options ); connect(ui_ao.CH_Start_Date,SIGNAL(toggled(bool)),this,SLOT(adv_on_CH_Start_Date_toggled(bool))); ui_kvm.setupUi( Accelerator_Options ); ui_arch.setupUi( Architecture_Options ); ui.Tabs->setCurrentIndex(0); ui.Use_Linux_Boot_Widget->setEnabled(false); QRegExp rx( "^[\\d]{1,2}|1[\\d]{,2}|2[0-4]{,2}|25[0-5]$" ); QValidator *validator = new QRegExpValidator( rx, this ); ui.CB_CPU_Count->setValidator( validator ); // This for Tab Info Backgroud Color Update_Info_Text( 1 ); Nativ_Device_Window = new Add_New_Device_Window(); // Network Settigns New_Network_Settings_Widget = new Network_Widget(); Old_Network_Settings_Widget = new Old_Network_Widget(); // SPICE SPICE_Widget = new SPICE_Settings_Widget(this); ui.TabWidget_Display->insertTab( 1, SPICE_Widget, QIcon(":/pepper.png"), tr("SPICE Remote") ); Display_Settings_Widget = new Settings_Widget( ui.TabWidget_Display, QBoxLayout::LeftToRight, true ); Display_Settings_Widget->setIconSize(QSize(32,32)); Display_Settings_Widget->addToGroup("Main"); // Update Emulators Information System_Info::Update_VM_Computers_List(); All_Emulators_List = Get_Emulators_List(); GUI_User_Mode = true; Apply_Emulator( 0 ); // Create Icon_Menu Icon_Menu = new QMenu( ui.Machines_List ); Icon_Menu->addAction( ui.actionPower_On ); Icon_Menu->addAction( ui.actionSave ); Icon_Menu->addAction( ui.actionPause ); Icon_Menu->addAction( ui.actionPower_Off ); Icon_Menu->addAction( ui.actionReset ); Icon_Menu->addSeparator(); Icon_Menu->addAction( ui.actionDelete_VM ); Icon_Menu->addAction( ui.actionDelete_VM_And_Files ); Icon_Menu->addAction( ui.actionSave_As_Template ); Icon_Menu->addAction( ui.actionCopy ); Icon_Menu->addSeparator(); Icon_Menu->addAction( ui.actionManage_Snapshots ); Icon_Menu->addAction( ui.actionShow_Emulator_Control ); Icon_Menu->addAction( ui.actionShow_QEMU_Arguments ); Icon_Menu->addAction( ui.actionCreate_Shell_Script ); Icon_Menu->addAction( ui.actionShow_QEMU_Error_Log_Window ); Icon_Menu->addAction( ui.actionChange_Icon ); // Create VM List Menu VM_List_Menu = new QMenu( ui.Machines_List ); VM_List_Menu->addAction( ui.actionAdd_New_VM ); VM_List_Menu->addAction( ui.actionLoad_VM_From_File ); VM_List_Menu->addAction( ui.actionCreate_HDD_Image ); Ports_Tab = new Ports_Tab_Widget(); ui.TabWidget_Media->insertTab( 0, Ports_Tab, QIcon(":/usb.png"), tr("Computer Ports") ); Dev_Manager = new Device_Manager_Widget(); Folder_Sharing = new Folder_Sharing_Widget(); ui.TabWidget_Media->insertTab( 0, Folder_Sharing, QIcon(":/open-folder.png"), tr("Folder Sharing") ); ui.TabWidget_Media->insertTab( 0, Dev_Manager, QIcon(":/hdd.png"), tr("Device Manager") ); ui.TabWidget_Media->setCurrentWidget(Dev_Manager); Media_Settings_Widget = new Settings_Widget( ui.TabWidget_Media, QBoxLayout::LeftToRight, true ); Media_Settings_Widget->setIconSize(QSize(32,32)); Media_Settings_Widget->addToGroup("Main"); //// code to sync sizes of widgets in Device Manager, Folder Sharing and Ports Tab Widget Folder_Sharing->syncLayout(Dev_Manager); Ports_Tab->syncLayout(Dev_Manager); //// Network_Settings_Widget = new Settings_Widget( ui.Network_Cards_Tabs, QBoxLayout::LeftToRight, true ); Network_Settings_Widget->setIconSize(QSize(32,32)); Network_Settings_Widget->addToGroup("Main"); // This For Network Redirections Table QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Redirections_List ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Redirections_List->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Redirections_List ); hv->setSectionResizeMode( QHeaderView::Stretch ); ui.Redirections_List->setHorizontalHeader( hv ); hv = new QHeaderView( Qt::Vertical, ui.Redirections_List ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Redirections_List->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Redirections_List ); hv->setSectionResizeMode( QHeaderView::Stretch ); ui.Redirections_List->setHorizontalHeader( hv ); // Get max RAM size on_TB_Update_Available_RAM_Size_clicked(); // Singals for watch VM Changes Connect_Signals(); // Loading AQEMU Settings if( ! Load_Settings() ) { // no Settings AQWarning( "Main_Window::Main_Window( QWidget *parent )", "Cannot Load Settings!" ); } else { if( ! Load_Virtual_Machines() ) // Loading XML VM files { // no vm's AQWarning( "Main_Window::Main_Window( QWidget *parent )", "No VM Loaded!" ); // FIXME if( VM_List.count() <= 0 ) { ui.actionPower_On->setEnabled( false ); ui.actionSave->setEnabled( false ); ui.actionPause->setEnabled( false ); ui.actionPower_Off->setEnabled( false ); ui.actionReset->setEnabled( false ); Set_Widgets_State( false ); Update_Info_Text( 1 ); } } else { // ok, vm's loaded. show it... AQDebug( "Main_Window::Main_Window( QWidget *parent )", "All OK Loading Complete!" ); } } Settings_Widget::syncGroupIconSizes("Main"); } Main_Window::~Main_Window() { delete Advanced_Options; delete Accelerator_Options; delete Architecture_Options; delete Nativ_Device_Window; delete New_Network_Settings_Widget; delete Old_Network_Settings_Widget; delete SPICE_Widget; delete Display_Settings_Widget; delete Icon_Menu; delete VM_List_Menu; delete Ports_Tab; delete Dev_Manager; delete Folder_Sharing; delete Media_Settings_Widget; } void Main_Window::closeEvent( QCloseEvent *event ) { if( ! Save_Settings() ) AQGraphic_Error( "void Main_Window::closeEvent( QCloseEvent *event )", tr("AQEMU"), tr("Could not save main window settings!"), false ); // Find running VM for( int vx = 0; vx < VM_List.count(); ++vx ) { if( VM_List[vx]->Get_State() == VM::VMS_Running || VM_List[vx]->Get_State() == VM::VMS_Pause ) { int mes_res = QMessageBox::question( this, tr("Close AQEMU?"), tr("One or more VMs are running!\nTerminate all running VMs and close AQEMU?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_res != QMessageBox::Yes ) { event->ignore(); return; } break; } } // Close All Emu_Ctl and QEMU_Error_Log Windows for( int ex = 0; ex < VM_List.count(); ++ex ) { VM_List[ ex ]->Hide_Emu_Ctl_Win(); VM_List[ ex ]->Hide_QEMU_Error_Log(); VM_List[ ex ]->Stop(); } if ( ! Save_Or_Discard() ) event->ignore(); else event->accept(); } Virtual_Machine *Main_Window::Get_VM_By_UID( const QString &uid ) { for( int ix = 0; ix < VM_List.count(); ix++ ) { if( VM_List[ix]->Get_UID() == uid ) return VM_List[ ix ]; } // VM Not Found! AQWarning( "Virtual_Machine *Main_Window::Get_VM_By_UID( const QString &uid, bool &ok )", "UID Not Found!" ); return NULL; } Virtual_Machine *Main_Window::Get_Current_VM() { if( ui.Machines_List->currentRow() < 0 ) return NULL; return Get_VM_By_UID( ui.Machines_List->currentItem()->data(256).toString() ); } void Main_Window::Connect_Signals() { // General Tab connect( ui.Edit_Machine_Name, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.CB_Computer_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui_arch.CB_CPU_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_CPU_Count, SIGNAL(editTextChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui_arch.CB_Machine_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_Boot_Priority, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_Boot_Priority, SIGNAL(currentIndexChanged(int)), this, SLOT(CB_Boot_Priority_currentIndexChanged(int)) ); connect( ui.CB_Video_Card, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_Keyboard_Layout, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.Memory_Size, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_RAM_Size, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CH_Remove_RAM_Size_Limitation, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_sb16, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_es1370, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Adlib, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_AC97, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_GUS, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_PCSPK, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_HDA, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_cs4231a, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Fullscreen, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Local_Time, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Snapshot, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_ACPI, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_No_Reboot, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_No_Shutdown, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); // Network Tab connect( ui.CH_Use_Network, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.RB_Network_Mode_Old, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.RB_Network_Mode_New, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( New_Network_Settings_Widget, SIGNAL(Changed()), this, SLOT(VM_Changed()) ); connect( Old_Network_Settings_Widget, SIGNAL(Changed()), this, SLOT(VM_Changed()) ); // Ports connect( Ports_Tab, SIGNAL(Settings_Changed()), this, SLOT(VM_Changed()) ); // Additional Network Settings connect( ui.CH_Redirections, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.Redirections_List, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(VM_Changed()) ); connect( ui.RB_TCP, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.RB_UDP, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.SB_Redir_Port, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.Edit_Guest_IP, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.SB_Guest_Port, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.RB_TCP, SIGNAL(toggled(bool)), this, SLOT(Update_Current_Redirection_Item()) ); connect( ui.RB_UDP, SIGNAL(toggled(bool)), this, SLOT(Update_Current_Redirection_Item()) ); connect( ui.SB_Redir_Port, SIGNAL(valueChanged(int)), this, SLOT(Update_Current_Redirection_Item()) ); connect( ui.Edit_Guest_IP, SIGNAL(textChanged(const QString &)), this, SLOT(Update_Current_Redirection_Item()) ); connect( ui.SB_Guest_Port, SIGNAL(valueChanged(int)), this, SLOT(Update_Current_Redirection_Item()) ); connect( ui.Edit_TFTP_Prefix, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.Edit_SMB_Folder, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); // Advanced Tab connect( ui.CH_No_Frame, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Alt_Grab, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_No_Quit, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Portrait, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Curses, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Show_Cursor, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_Start_CPU, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_FDD_Boot, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_Win2K_Hack, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_RTC_TD_Hack, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_Start_Date, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.DTE_Start_Date, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(VM_Changed()) ); connect( ui.CH_Init_Graphic_Mode, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.SB_InitGM_Width, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.SB_InitGM_Height, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.CB_InitGM_Depth, SIGNAL(currentIndexChanged(int)), this, SLOT(VM_Changed()) ); // Advanced Options connect( ui_ao.Edit_Additional_Args, SIGNAL(textChanged()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_Only_User_Args, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_ao.CH_Use_User_Binary, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); // Hardware Virtualization Tab /*connect( ui_kvm.CH_No_KVM_IRQChip, SIGNAL(clicked()), this, SLOT(VM_Changed()) );*/ //FIXME: use new non-kvm option /*connect( ui_kvm.CH_No_KVM_Pit, SIGNAL(clicked()), this, SLOT(VM_Changed()) );*/ //possibly remove connect( ui_kvm.CH_KVM_Shadow_Memory, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui_kvm.SB_KVM_Shadow_Memory_Size, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); // SPICE connect( SPICE_Widget, SIGNAL(State_Changed()), this, SLOT(VM_Changed()) ); // VNC Tab connect( ui.CH_Activate_VNC, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.RB_VNC_Display_Number, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.SB_VNC_Display, SIGNAL(valueChanged(int)), this, SLOT(VM_Changed()) ); connect( ui.RB_VNC_Unix_Socket, SIGNAL(toggled(bool)), this, SLOT(VM_Changed()) ); connect( ui.CH_VNC_Password, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_Use_VNC_TLS, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.CH_x509_Folder, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_x509_Folder, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.CH_x509verify_Folder, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_x509verify_Folder, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); // Optional Images connect( ui.CH_ROM_File, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_ROM_File, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.CH_MTDBlock, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_MTDBlock_File, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.CH_SD_Image, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_SD_Image_File, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.CH_PFlash, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_PFlash_File, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); // Boot Linux Kernel connect( ui.CH_Use_Linux_Boot, SIGNAL(clicked()), this, SLOT(VM_Changed()) ); connect( ui.Edit_Linux_bzImage_Path, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.Edit_Linux_Initrd_Path, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( ui.Edit_Linux_Command_Line, SIGNAL(textChanged(const QString &)), this, SLOT(VM_Changed()) ); connect( Folder_Sharing, SIGNAL(Folder_Changed()), this, SLOT(VM_Changed()) ); connect( Dev_Manager, SIGNAL(Device_Changed()), this, SLOT(VM_Changed()) ); connect( ui.SB_VNC_Display, SIGNAL(valueChanged(int)), this, SLOT(SB_VNC_Display_changed(int))); connect( ui.SB_VNC_Display_Port, SIGNAL(valueChanged(int)), this, SLOT(SB_VNC_Display_Port_changed(int))); } void Main_Window::SB_VNC_Display_changed(int num) { ui.SB_VNC_Display_Port->setValue(5900+num); } void Main_Window::SB_VNC_Display_Port_changed(int port) { ui.SB_VNC_Display->setValue(port-5900); } const QMap Main_Window::Get_Devices_Info( bool *ok ) const { // Get current emulator Emulator curEmul; QMap retList; curEmul = Get_Default_Emulator(); if( curEmul.Get_Name().isEmpty() ) { AQError( "QList &Main_Window::Get_Devices_Info( bool *ok )", "Emulator empty!" ); *ok = false; return retList; } *ok = true; return curEmul.Get_Devices(); } Available_Devices Main_Window::Get_Current_Machine_Devices( bool *ok ) const { // Get all devices bool devOk = false; QMap allDevList = Get_Devices_Info( &devOk ); if( ! devOk ) { AQError( "Available_Devices Main_Window::Get_Current_Machine_Devices( bool *ok ) const", "Cannot get devices!" ); *ok = false; return Available_Devices(); } // Find current device for( QMap::const_iterator ix = allDevList.constBegin(); ix != allDevList.constEnd(); ++ix ) { if( ui.CB_Computer_Type->currentText() == ix.value().System.Caption ) { *ok = true; return ix.value(); } } for( QMap::const_iterator ix = allDevList.constBegin(); ix != allDevList.constEnd(); ++ix ) { if( ui.CB_Computer_Type->currentText() == ix.value().System.Caption ) { *ok = true; return ix.value(); } } // Not found AQError( "Available_Devices Main_Window::Get_Current_Machine_Devices( bool *ok ) const", "Cannot get current machine device!" ); *ok = false; return Available_Devices(); } bool Main_Window::Create_VM_From_Ui( Virtual_Machine *tmp_vm, Virtual_Machine *old_vm, bool show_user_errors ) { std::unique_ptr dugw; if ( show_user_errors == false ) dugw.reset(new Disable_User_Graphic_Warning()); if( old_vm == NULL ) { if ( show_user_errors ) AQError( "bool Main_Window::Create_VM_From_Ui( Virtual_Machine *tmp_vm, Virtual_Machine *old_vm )", "old_vm == NULL" ); return false; } // Save file name tmp_vm->Set_VM_XML_File_Path( old_vm->Get_VM_XML_File_Path() ); // UID tmp_vm->Set_UID( old_vm->Get_UID() ); // Machine Name if( ui.Edit_Machine_Name->text().isEmpty() ) { if ( show_user_errors ) AQGraphic_Warning( tr("Error!"), tr("VM Name is Empty!") ); return false; } else { tmp_vm->Set_Machine_Name( ui.Edit_Machine_Name->text() ); } // Icon Path for( int ix = 0; ix < ui.Machines_List->count(); ix++ ) { if( ui.Machines_List->item(ix)->data(256).toString() == old_vm->Get_UID() ) { if( ui.Machines_List->item(ix)->data(128).toString() == QDir::toNativeSeparators(Settings.value("VM_Directory", "~").toString() + Get_FS_Compatible_VM_Name(ui.Edit_Machine_Name->text())) ) { tmp_vm->Set_Icon_Path( old_vm->Get_Icon_Path() ); tmp_vm->Set_Screenshot_Path( ui.Machines_List->item(ix)->data(128).toString() ); } else { tmp_vm->Set_Icon_Path( ui.Machines_List->item(ix)->data(128).toString() ); } } } // Get devices bool curMachineOk = false; Available_Devices curComp = Get_Current_Machine_Devices( &curMachineOk ); if( ! curMachineOk ) { return false; } // Machine Accelerator tmp_vm->Set_Machine_Accelerator( VM::String_To_Accel( ui.CB_Machine_Accelerator->currentText() ) ); // Computer Type tmp_vm->Set_Computer_Type( curComp.System.QEMU_Name ); // Machine Type tmp_vm->Set_Machine_Type( curComp.Machine_List[ui_arch.CB_Machine_Type->currentIndex()].QEMU_Name ); // CPU Type tmp_vm->Set_CPU_Type( curComp.CPU_List[ui_arch.CB_CPU_Type->currentIndex()].QEMU_Name ); // Create Emulator Info Emulator tmp_emul = Get_Default_Emulator(); tmp_emul.Set_Name( "" ); tmp_vm->Set_Emulator( tmp_emul ); // Video if ( ui.CB_Video_Card->currentIndex() != -1 ) { tmp_vm->Set_Video_Card( curComp.Video_Card_List[ui.CB_Video_Card->currentIndex()].QEMU_Name ); } // CPU Count if( ! Validate_CPU_Count(ui.CB_CPU_Count->currentText()) ) { return false; } tmp_vm->Set_SMP_CPU_Count( ui.CB_CPU_Count->currentText().toInt() ); tmp_vm->Set_SMP( SMP_Settings.Get_Values() ); // Keyboard Layout if( ui.CB_Keyboard_Layout->currentIndex() == 0 ) // Default tmp_vm->Set_Keyboard_Layout( "Default" ); else tmp_vm->Set_Keyboard_Layout( ui.CB_Keyboard_Layout->currentText() ); // Boot Priority tmp_vm->Set_Boot_Order_List( Boot_Order_List ); tmp_vm->Set_Show_Boot_Menu( Show_Boot_Menu ); // Audio VM::Sound_Cards snd_card; snd_card.Audio_sb16 = ui.CH_sb16->isChecked(); snd_card.Audio_es1370 = ui.CH_es1370->isChecked(); snd_card.Audio_Adlib = ui.CH_Adlib->isChecked(); snd_card.Audio_PC_Speaker = ui.CH_PCSPK->isChecked(); snd_card.Audio_GUS = ui.CH_GUS->isChecked(); snd_card.Audio_AC97 = ui.CH_AC97->isChecked(); snd_card.Audio_HDA = ui.CH_HDA->isChecked(); snd_card.Audio_cs4231a = ui.CH_cs4231a->isChecked(); tmp_vm->Set_Audio_Cards( snd_card ); // Memory tmp_vm->Set_Memory_Size( ui.Memory_Size->value() ); // Check free ram tmp_vm->Set_Remove_RAM_Size_Limitation( ui.CH_Remove_RAM_Size_Limitation->isChecked() ); // Options tmp_vm->Use_Fullscreen_Mode( ui.CH_Fullscreen->isChecked() ); tmp_vm->Use_Win2K_Hack( ui_ao.CH_Win2K_Hack->isChecked() ); tmp_vm->Use_Local_Time( ui.CH_Local_Time->isChecked() ); tmp_vm->Use_Check_FDD_Boot_Sector( ui_ao.CH_FDD_Boot->isChecked() ); tmp_vm->Use_ACPI( ui_ao.CH_ACPI->isChecked() ); tmp_vm->Use_Snapshot_Mode( ui.CH_Snapshot->isChecked() ); tmp_vm->Use_Start_CPU( ui_ao.CH_Start_CPU->isChecked() ); tmp_vm->Use_No_Reboot( ui_ao.CH_No_Reboot->isChecked() ); tmp_vm->Use_No_Shutdown( ui_ao.CH_No_Shutdown->isChecked() ); tmp_vm->Set_FD0( Dev_Manager->Floppy1 ); tmp_vm->Set_FD1( Dev_Manager->Floppy2 ); tmp_vm->Set_CD_ROM( Dev_Manager->CD_ROM ); tmp_vm->Set_HDA( Dev_Manager->HDA ); tmp_vm->Set_HDB( Dev_Manager->HDB ); tmp_vm->Set_HDC( Dev_Manager->HDC ); tmp_vm->Set_HDD( Dev_Manager->HDD ); tmp_vm->Set_Storage_Devices_List( Dev_Manager->Storage_Devices ); // Shared Folders tmp_vm->Set_Shared_Folders_List( Folder_Sharing->Shared_Folders ); // Network Tab tmp_vm->Set_Use_Network( ui.CH_Use_Network->isChecked() ); // Use Nativ Network tmp_vm->Use_Nativ_Network( ui.RB_Network_Mode_New->isChecked() ); // Redirections List if( ui.CH_Redirections->isChecked() && ui.Redirections_List->rowCount() < 1 ) { if ( show_user_errors ) AQGraphic_Warning( tr("Error!"), tr("Redirection List is Empty! Please Disable Redirections!") ); return false; } // Redirections tmp_vm->Set_Use_Redirections( ui.CH_Redirections->isChecked() ); // Redirections List for( int rx = 0; rx < ui.Redirections_List->rowCount(); rx++ ) { VM_Redirection tmp_redir; auto item = ui.Redirections_List->item(rx, 0); if ( item == nullptr ) continue; if( ui.Redirections_List->item(rx, 0)->text() == "TCP" ) tmp_redir.Set_Protocol( "TCP" ); else tmp_redir.Set_Protocol( "UDP" ); if ( ui.Redirections_List->item(rx, 1) == nullptr || ui.Redirections_List->item(rx, 2) == nullptr || ui.Redirections_List->item(rx, 3) == nullptr ) continue; tmp_redir.Set_Host_Port( ui.Redirections_List->item(rx, 1)->text().toInt() ); tmp_redir.Set_Guest_IP( ui.Redirections_List->item(rx, 2)->text() ); tmp_redir.Set_Guest_Port( ui.Redirections_List->item(rx, 3)->text().toInt() ); tmp_vm->Add_Network_Redirection( tmp_redir ); } // TFTP tmp_vm->Set_TFTP_Prefix( ui.Edit_TFTP_Prefix->text() ); // SMB Dir tmp_vm->Set_SMB_Directory( ui.Edit_SMB_Folder->text() ); // Network Cards QList tmp_net_cards; if( Old_Network_Settings_Widget->Get_Network_Cards(tmp_net_cards) ) { tmp_vm->Set_Network_Cards( tmp_net_cards ); } else { return false; } // Nativ QList tmp_net_cards_nativ; if( New_Network_Settings_Widget->Get_Network_Cards(tmp_net_cards_nativ) ) { tmp_vm->Set_Network_Cards_Nativ( tmp_net_cards_nativ ); } else { return false; } // Port page tmp_vm->Set_Serial_Ports( Ports_Tab->Get_Serial_Ports() ); tmp_vm->Set_Parallel_Ports( Ports_Tab->Get_Parallel_Ports() ); tmp_vm->Set_USB_Ports( Ports_Tab->Get_USB_Ports() ); // Other Page tmp_vm->Set_Use_Linux_Boot( ui.CH_Use_Linux_Boot->isChecked() ); tmp_vm->Set_bzImage_Path( ui.Edit_Linux_bzImage_Path->text() ); tmp_vm->Set_Initrd_Path( ui.Edit_Linux_Initrd_Path->text() ); tmp_vm->Set_Kernel_ComLine( ui.Edit_Linux_Command_Line->text() ); // Optional Images // ROM File tmp_vm->Set_Use_ROM_File( ui.CH_ROM_File->isChecked() ); tmp_vm->Set_ROM_File( ui.Edit_ROM_File->text() ); // On-Board Flash Image tmp_vm->Use_MTDBlock_File( ui.CH_MTDBlock->isChecked() ); tmp_vm->Set_MTDBlock_File( ui.Edit_MTDBlock_File->text() ); // SecureDigital Card Image tmp_vm->Use_SecureDigital_File( ui.CH_SD_Image->isChecked() ); tmp_vm->Set_SecureDigital_File( ui.Edit_SD_Image_File->text() ); // Parallel Flash Image tmp_vm->Use_PFlash_File( ui.CH_PFlash->isChecked() ); tmp_vm->Set_PFlash_File( ui.Edit_PFlash_File->text() ); // Additional QEMU Arguments tmp_vm->Set_Additional_Args( ui_ao.Edit_Additional_Args->toPlainText() ); // Only_User_Args tmp_vm->Set_Only_User_Args( ui_ao.CH_Only_User_Args->isChecked() ); // Use_User_Emulator_Binary tmp_vm->Set_Use_User_Emulator_Binary( ui_ao.CH_Use_User_Binary->isChecked() ); /*// Disable KVM kernel mode PIC/IOAPIC/LAPIC tmp_vm->Use_KVM_IRQChip( ui_kvm.CH_No_KVM_IRQChip->isChecked() ); // Disable KVM kernel mode PIT tmp_vm->Use_No_KVM_Pit( ui_kvm.CH_No_KVM_Pit->isChecked() ); // KVM_No_Pit_Reinjection tmp_vm->Use_KVM_No_Pit_Reinjection( ui_kvm.CH_KVM_No_Pit_Reinjection->isChecked() ); // KVM_Nesting tmp_vm->Use_KVM_Nesting( ui_kvm.CH_KVM_Nesting->isChecked() );*/ //FIXME: deprecated stuff //are there replacements? // KVM Shadow Memory tmp_vm->Use_KVM_Shadow_Memory( ui_kvm.CH_KVM_Shadow_Memory->isChecked() ); tmp_vm->Set_KVM_Shadow_Memory_Size( ui_kvm.SB_KVM_Shadow_Memory_Size->value() ); // Initial Graphical Mode VM_Init_Graphic_Mode tmp_mode; tmp_mode.Set_Enabled( ui.CH_Init_Graphic_Mode->isChecked() ); tmp_mode.Set_Width( ui.SB_InitGM_Width->value() ); tmp_mode.Set_Height( ui.SB_InitGM_Height->value() ); switch( ui.CB_InitGM_Depth->currentIndex() ) { case 0: tmp_mode.Set_Depth( 8 ); break; case 1: tmp_mode.Set_Depth( 16 ); break; case 2: tmp_mode.Set_Depth( 24 ); break; case 3: tmp_mode.Set_Depth( 32 ); break; default: if ( show_user_errors ) AQError( "bool Main_Window::Create_VM_From_Ui( Virtual_Machine *tmp_vm, QListWidgetItem *item )", "Initial Graphical Mode: Default Section!" ); tmp_mode.Set_Depth( 24 ); break; } tmp_vm->Set_Init_Graphic_Mode( tmp_mode ); // Show QEMU Window Without a Frame and Window Decorations tmp_vm->Use_No_Frame( ui.CH_No_Frame->isChecked() ); // Use Ctrl-Alt-Shift to Grab Mouse (Instead of Ctrl-Alt) tmp_vm->Use_Alt_Grab( ui.CH_Alt_Grab->isChecked() ); // Disable SDL Window Close Capability tmp_vm->Use_No_Quit( ui.CH_No_Quit->isChecked() ); // Rotate Graphical Output 90 Deg Left (Only PXA LCD) tmp_vm->Use_Portrait( ui.CH_Portrait->isChecked() ); // Show_Cursor tmp_vm->Use_Show_Cursor( ui.CH_Show_Cursor->isChecked() ); // Curses tmp_vm->Use_Curses( ui.CH_Curses->isChecked() ); // RTC_TD_Hack tmp_vm->Use_RTC_TD_Hack( ui_ao.CH_RTC_TD_Hack->isChecked() ); // Start Date tmp_vm->Use_Start_Date( ui_ao.CH_Start_Date->isChecked() ); tmp_vm->Set_Start_Date( ui_ao.DTE_Start_Date->dateTime() ); // SPICE bool spiceSettingsOK = false; tmp_vm->Set_SPICE( SPICE_Widget->Get_Settings( spiceSettingsOK ) ); if( ! spiceSettingsOK ) { return false; } // VNC tmp_vm->Use_VNC( ui.CH_Activate_VNC->isChecked() ); // Use Unix Socket Mode for VNC tmp_vm->Set_VNC_Socket_Mode( ui.RB_VNC_Unix_Socket->isChecked() ); // UNIX Domain Socket Path tmp_vm->Set_VNC_Unix_Socket_Path( ui.Edit_VNC_Unix_Socket->text() ); // VNC Display Number tmp_vm->Set_VNC_Display_Number( ui.SB_VNC_Display->value() ); // Use Password for VNC tmp_vm->Use_VNC_Password( ui.CH_VNC_Password->isChecked() ); // Use TLS tmp_vm->Use_VNC_TLS( ui.CH_Use_VNC_TLS->isChecked() ); // Use x509 tmp_vm->Use_VNC_x509( ui.CH_x509_Folder->isChecked() ); // x509 Folder tmp_vm->Set_VNC_x509_Folder_Path( ui.Edit_x509_Folder->text() ); // Use x509verify tmp_vm->Use_VNC_x509verify( ui.CH_x509verify_Folder->isChecked() ); // x509 Folder tmp_vm->Set_VNC_x509verify_Folder_Path( ui.Edit_x509verify_Folder->text() ); return true; } bool Main_Window::Load_Settings() { // Main Window Size resize( Settings.value("General_Window_Width", "885").toInt(), Settings.value("General_Window_Height", "544").toInt() ); // Main Window Position move( Settings.value("General_Window_Position", QPoint(300, 300)).toPoint() ); // Splitter ui.splitter->restoreState( Settings.value("General_Splitter", QByteArray("\0\0\0\xff\0\0\0\0\0\0\0\x2\0\0\0\xbc\0\0\x2$\0\0\0\0\x4\x1\0\0\0\x1")).toByteArray() ); // VM Icons Size ui.Machines_List->setIconSize( QSize( Settings.value("VM_Icons_Size", "48").toInt(), Settings.value("VM_Icons_Size", "48").toInt()) ); // Load CD Exists Images List VM_Folder = QDir::toNativeSeparators( Settings.value("VM_Directory", "~").toString() ); Load_Recent_Images_List(); if( Settings.status() == QSettings::NoError ) { // if( ui.Machines_List->count() > 0 ) Update_VM_Ui(); return true; } else { AQError( "bool Main_Window::Load_Settings()", "Settings.status() != QSettings::NoError" ); return false; } } bool Main_Window::Save_Settings() { // Current VM Index Settings.setValue( "Current_VM_Index", ui.Machines_List->currentRow() ); // Save Windows Size Settings.setValue( "General_Window_Width", QString::number(this->width()) ); Settings.setValue( "General_Window_Height", QString::number(this->height()) ); // Save Main Window Position Settings.setValue( "General_Window_Position", pos() ); // Splitter Settings.setValue( "General_Splitter", ui.splitter->saveState() ); // Save Settings.sync(); if( Settings.status() == QSettings::NoError ) return true; else return false; } bool Main_Window::Load_Virtual_Machines() { QDir vm_dir( QDir::toNativeSeparators(Settings.value("VM_Directory", "~").toString()) ); QFileInfoList fil = vm_dir.entryInfoList( QStringList("*.aqemu"), QDir::Files, QDir::Name ); if( fil.count() <= 0 ) return false; int real_index = 0; for( int ix = 0; ix < fil.count(); ix++ ) { // Check Permissions if( ! fil[ix].isWritable() ) { AQGraphic_Error( "bool Main_Window::Load_Virtual_Machines()", tr("Error!"), tr("VM File \"") + fil[ix].filePath() + tr("\" is Read Only!\nCheck Permissions!"), true ); } Virtual_Machine *new_vm = new Virtual_Machine(); if( ! new_vm->Load_VM(fil[ix].filePath()) ) { --real_index; } else { new_vm->Set_UID( QUuid::createUuid().toString() ); // Create UID QObject::connect( new_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); QListWidgetItem *item = new QListWidgetItem( new_vm->Get_Machine_Name(), ui.Machines_List ); item->setData( 256, new_vm->Get_UID() ); // Load OS Logo or OS Screenshot Icon if( new_vm->Get_State() == VM::VMS_Saved && Settings.value("Use_Screenshot_for_OS_Logo", "yes").toString() == "yes" ) { // Screenshot File Not Found? Use OS Icon. if( QFile::exists(new_vm->Get_Screenshot_Path()) ) item->setIcon( QIcon(new_vm->Get_Screenshot_Path()) ); else item->setIcon( QIcon(new_vm->Get_Icon_Path()) ); } else { item->setIcon( QIcon(new_vm->Get_Icon_Path()) ); } // Append new VM VM_List << new_vm; } ++real_index; } // Set last used vm int cur_row = Settings.value( "Current_VM_Index", 0 ).toInt(); if( cur_row >= 0 ) { if( cur_row < ui.Machines_List->count() ) { ui.Machines_List->setCurrentRow( cur_row ); } else { AQWarning( "bool Main_Window::Load_Virtual_Machines()", "cur_row > ui.Machines_List->count()" ); ui.Machines_List->setCurrentRow( 0 ); } } else { AQWarning( "bool Main_Window::Load_Virtual_Machines()", "cur_row < 0" ); ui.Machines_List->setCurrentRow( 0 ); } Update_VM_Ui(); return true; } bool Main_Window::Save_Virtual_Machines() { return true; } void Main_Window::Update_VM_Ui(bool update_info_tab) { Update_VM_Port_Number(); if( ui.Machines_List->currentRow() < 0 ) { AQWarning( "void Main_Window::Update_VM_Ui()", "VM Index Out of Range" ); /* AQGraphic_Error( "void Main_Window::Update_VM_Ui()", tr("Critical Error!"), tr("VM Index Out of Range! Close AQEMU?"), true );*/ return; } Virtual_Machine *tmp_vm = Get_Current_VM(); if( tmp_vm == NULL ) { AQError( "void Main_Window::Update_VM_Ui()", "Cannot Find VM!" ); return; } // Machine Name ui.Edit_Machine_Name->setText( tmp_vm->Get_Machine_Name() ); Show_State_Current( tmp_vm ); Show_State_VM( tmp_vm); if( tmp_vm->Get_State() == VM::VMS_In_Error ) { AQError( "void Main_Window::Update_VM_Ui()", "VM in VM::VMS_In_Error state!" ); return; } int found = false; for( int ix = 0; ix < ui.CB_Machine_Accelerator->count(); ix++ ) { if( ui.CB_Machine_Accelerator->itemText(ix).toLower() == VM::Accel_To_String(tmp_vm->Get_Machine_Accelerator()).toLower() ) { ui.CB_Machine_Accelerator->setCurrentIndex( ix ); found = true; break; } } if ( ! found ) { ui.CB_Machine_Accelerator->setCurrentIndex( 0 ); } /*if( ui.CB_Machine_Accelerator->count() <= 0 ) { AQError( "void Main_Window::Update_VM_Ui()", "ui.CB_Machine_Accelerator->count() <= 0" ); return; }*/ // Get current VM devices Available_Devices curComp = tmp_vm->Get_Emulator().Get_Devices()[ tmp_vm->Get_Computer_Type() ]; if( curComp.System.QEMU_Name.isEmpty() ) { AQError( "void Main_Window::Update_VM_Ui()", "cur_comp not valid!" ); return; } // Computer Type int compTypeIndex = ui.CB_Computer_Type->findText( curComp.System.Caption ); if( compTypeIndex != -1 ) ui.CB_Computer_Type->setCurrentIndex( compTypeIndex ); else { AQError( "void Main_Window::Update_VM_Ui()", "Cannot find computer type index!" ); return; } // Machine Type QString tmp_str = tmp_vm->Get_Machine_Type(); for( int mx = 0; mx < curComp.Machine_List.count(); ++mx ) { if( tmp_str == curComp.Machine_List[mx].QEMU_Name ) { ui_arch.CB_Machine_Type->setCurrentIndex( mx ); break; } } // CPU Type tmp_str = tmp_vm->Get_CPU_Type(); for( int cx = 0; cx < curComp.CPU_List.count(); ++cx ) { if( tmp_str == curComp.CPU_List[cx].QEMU_Name ) { ui_arch.CB_CPU_Type->setCurrentIndex( cx ); break; } } // Video Card tmp_str = tmp_vm->Get_Video_Card(); for( int vx = 0; vx < curComp.Video_Card_List.count(); ++vx ) { if( tmp_str == curComp.Video_Card_List[vx].QEMU_Name ) { ui.CB_Video_Card->setCurrentIndex( vx ); break; } } // Count CPU's ui.CB_CPU_Count->setEditText( QString::number(tmp_vm->Get_SMP_CPU_Count()) ); SMP_Settings.Set_Values( tmp_vm->Get_SMP(), curComp.PSO_SMP_Count, curComp.PSO_SMP_Cores, curComp.PSO_SMP_Threads, curComp.PSO_SMP_Sockets, curComp.PSO_SMP_MaxCPUs ); // Keyboard Layout int lang_index = ui.CB_Keyboard_Layout->findText( tmp_vm->Get_Keyboard_Layout() ); if( lang_index >= 0 && lang_index < ui.CB_Keyboard_Layout->count() ) { ui.CB_Keyboard_Layout->setCurrentIndex( lang_index ); } else { ui.CB_Keyboard_Layout->setCurrentIndex( 0 ); // default lang } // Boot Set_Boot_Order( tmp_vm->Get_Boot_Order_List() ); Boot_Order_List = tmp_vm->Get_Boot_Order_List(); Show_Boot_Menu = tmp_vm->Get_Show_Boot_Menu(); // Audio Cards if( tmp_vm->Get_Audio_Cards().Audio_sb16 ) ui.CH_sb16->setChecked( true ); else ui.CH_sb16->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_es1370 ) ui.CH_es1370->setChecked( true ); else ui.CH_es1370->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_Adlib ) ui.CH_Adlib->setChecked( true ); else ui.CH_Adlib->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_PC_Speaker ) ui.CH_PCSPK->setChecked( true ); else ui.CH_PCSPK->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_GUS ) ui.CH_GUS->setChecked( true ); else ui.CH_GUS->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_AC97 ) ui.CH_AC97->setChecked( true ); else ui.CH_AC97->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_HDA ) ui.CH_HDA->setChecked( true ); else ui.CH_HDA->setChecked( false ); if( tmp_vm->Get_Audio_Cards().Audio_cs4231a ) ui.CH_cs4231a->setChecked( true ); else ui.CH_cs4231a->setChecked( false ); // RAM if( tmp_vm->Get_Memory_Size() < 1 ) { AQGraphic_Warning( tr("Error!"), tr("Memory size < 1! Using default value: 256 MB") ); ui.Memory_Size->setValue( 256 ); } else if( tmp_vm->Get_Memory_Size() >= ui.Memory_Size->maximum() ) { AQGraphic_Warning( tr("Error!"), tr("Memory size > all free memory on this system!") ); ui.Memory_Size->setValue( ui.Memory_Size->maximum() ); } else ui.Memory_Size->setValue( tmp_vm->Get_Memory_Size() ); ui.CH_Remove_RAM_Size_Limitation->setChecked( tmp_vm->Get_Remove_RAM_Size_Limitation() ); on_CH_Remove_RAM_Size_Limitation_stateChanged( ui.CH_Remove_RAM_Size_Limitation->checkState() ); // General Tab. Options ui.CH_Fullscreen->setChecked( tmp_vm->Use_Fullscreen_Mode() ); ui_ao.CH_ACPI->setChecked( tmp_vm->Use_ACPI() ); ui.CH_Snapshot->setChecked( tmp_vm->Use_Snapshot_Mode() ); ui_ao.CH_FDD_Boot->setChecked( tmp_vm->Use_Check_FDD_Boot_Sector() ); ui.CH_Local_Time->setChecked( tmp_vm->Use_Local_Time() ); ui_ao.CH_Win2K_Hack->setChecked( tmp_vm->Use_Win2K_Hack() ); Dev_Manager->Set_VM( *tmp_vm ); // FIXME Use pointer // Shared Folders Folder_Sharing->Set_VM( *tmp_vm ); // FIXME Use pointer // Network tab. Redirections // Remove all rows... while( ui.Redirections_List->rowCount() > 0 ) ui.Redirections_List->removeRow( 0 ); // Add values for( int rx = 0; rx < tmp_vm->Get_Network_Redirections_Count(); rx++ ) { ui.Redirections_List->insertRow( ui.Redirections_List->rowCount() ); // protocol QTableWidgetItem *newItem = new QTableWidgetItem( tmp_vm->Get_Network_Redirection(rx).Get_Protocol() ); ui.Redirections_List->setItem( ui.Redirections_List->rowCount()-1, 0, newItem ); // host port newItem = new QTableWidgetItem( QString::number(tmp_vm->Get_Network_Redirection(rx).Get_Host_Port()) ); ui.Redirections_List->setItem( ui.Redirections_List->rowCount()-1, 1, newItem ); // ip newItem = new QTableWidgetItem( tmp_vm->Get_Network_Redirection(rx).Get_Guest_IP() ); ui.Redirections_List->setItem( ui.Redirections_List->rowCount()-1, 2, newItem ); // guest port newItem = new QTableWidgetItem( QString::number(tmp_vm->Get_Network_Redirection(rx).Get_Guest_Port()) ); ui.Redirections_List->setItem( ui.Redirections_List->rowCount()-1, 3, newItem ); // set focus to new row ui.Redirections_List->setCurrentCell( ui.Redirections_List->rowCount()-1 , 0 ); } Old_Network_Settings_Widget->Set_Network_Card_Models( curComp.Network_Card_List ); Old_Network_Settings_Widget->Set_Network_Cards( tmp_vm->Get_Network_Cards() ); New_Network_Settings_Widget->Set_Network_Card_Models( curComp.Network_Card_List ); New_Network_Settings_Widget->Set_Network_Cards( tmp_vm->Get_Network_Cards_Nativ() ); // Use Nativ Network Cards ui.RB_Network_Mode_New->setChecked( tmp_vm->Use_Nativ_Network() ); ui.RB_Network_Mode_Old->setChecked( ! tmp_vm->Use_Nativ_Network() ); on_RB_Network_Mode_New_toggled( ui.RB_Network_Mode_New->isChecked() ); ui.Edit_TFTP_Prefix->setText( tmp_vm->Get_TFTP_Prefix() ); ui.Edit_SMB_Folder->setText( tmp_vm->Get_SMB_Directory() ); ui.CH_Redirections->setChecked( ! tmp_vm->Get_Use_Redirections() ); ui.CH_Redirections->setChecked( tmp_vm->Get_Use_Redirections() ); ui.CH_Use_Network->setChecked( ! tmp_vm->Get_Use_Network() ); ui.CH_Use_Network->setChecked( tmp_vm->Get_Use_Network() ); // Ports Tab Ports_Tab->Clear_Old_Ports(); Ports_Tab->Set_Serial_Ports( tmp_vm->Get_Serial_Ports() ); Ports_Tab->Set_Parallel_Ports( tmp_vm->Get_Parallel_Ports() ); Ports_Tab->Set_USB_Ports( tmp_vm->Get_USB_Ports() ); // Additional Options ui_ao.CH_RTC_TD_Hack->setChecked( tmp_vm->Use_RTC_TD_Hack() ); ui_ao.CH_No_Shutdown->setChecked( tmp_vm->Use_No_Shutdown() ); ui_ao.CH_No_Reboot->setChecked( tmp_vm->Use_No_Reboot() ); ui_ao.CH_Start_CPU->setChecked( tmp_vm->Use_Start_CPU() ); // Start Date ui_ao.CH_Start_Date->setChecked( tmp_vm->Use_Start_Date() ); ui_ao.DTE_Start_Date->setDateTime( tmp_vm->Get_Start_Date() ); // Additional Arguments ui_ao.Edit_Additional_Args->setPlainText( tmp_vm->Get_Additional_Args() ); // Only_User_Args ui_ao.CH_Only_User_Args->setChecked( tmp_vm->Get_Only_User_Args() ); // Use_User_Emulator_Binary ui_ao.CH_Use_User_Binary->setChecked( tmp_vm->Get_Use_User_Emulator_Binary() ); // QEMU Window Option // Show QEMU Window Without a Frame and Window Decorations ui.CH_No_Frame->setChecked( tmp_vm->Use_No_Frame() ); // Use Ctrl-Alt-Shift to Grab Mouse (Instead of Ctrl-Alt) ui.CH_Alt_Grab->setChecked( tmp_vm->Use_Alt_Grab() ); // Disable SDL Window Close Capability ui.CH_No_Quit->setChecked( tmp_vm->Use_No_Quit() ); // Rotate Graphical Output 90 Deg Left (Only PXA LCD) ui.CH_Portrait->setChecked( tmp_vm->Use_Portrait() ); // Curses ui.CH_Curses->setChecked( tmp_vm->Use_Curses() ); // Show_Cursor ui.CH_Show_Cursor->setChecked( tmp_vm->Use_Show_Cursor() ); // Initial Graphical Mode ui.CH_Init_Graphic_Mode->setChecked( tmp_vm->Get_Init_Graphic_Mode().Get_Enabled() ); ui.SB_InitGM_Width->setValue( tmp_vm->Get_Init_Graphic_Mode().Get_Width() ); ui.SB_InitGM_Height->setValue( tmp_vm->Get_Init_Graphic_Mode().Get_Height() ); switch( tmp_vm->Get_Init_Graphic_Mode().Get_Depth() ) { case 8: ui.CB_InitGM_Depth->setCurrentIndex( 0 ); break; case 16: ui.CB_InitGM_Depth->setCurrentIndex( 1 ); break; case 24: ui.CB_InitGM_Depth->setCurrentIndex( 2 ); break; case 32: ui.CB_InitGM_Depth->setCurrentIndex( 3 ); break; default: AQError( "void Main_Window::Update_VM_Ui()", "Initial Graphical Mode: Default Section!" ); ui.CB_InitGM_Depth->setCurrentIndex( 2 ); break; } // Other tab ui.CH_Use_Linux_Boot->setChecked( tmp_vm->Get_Use_Linux_Boot() ); ui.Edit_Linux_bzImage_Path->setText( tmp_vm->Get_bzImage_Path() ); ui.Edit_Linux_Initrd_Path->setText( tmp_vm->Get_Initrd_Path() ); ui.Edit_Linux_Command_Line->setText( tmp_vm->Get_Kernel_ComLine() ); // ROM File ui.CH_ROM_File->setChecked( tmp_vm->Get_Use_ROM_File() ); ui.Edit_ROM_File->setText( tmp_vm->Get_ROM_File() ); // On-Board Flash Image ui.CH_MTDBlock->setChecked( tmp_vm->Use_MTDBlock_File() ); ui.Edit_MTDBlock_File->setText( tmp_vm->Get_MTDBlock_File() ); // SecureDigital Card Image ui.CH_SD_Image->setChecked( tmp_vm->Use_SecureDigital_File() ); ui.Edit_SD_Image_File->setText( tmp_vm->Get_SecureDigital_File() ); // Parallel Flash Image ui.CH_PFlash->setChecked( tmp_vm->Use_PFlash_File() ); ui.Edit_PFlash_File->setText( tmp_vm->Get_PFlash_File() ); /*// Disable KVM kernel mode PIC/IOAPIC/LAPIC ui_kvm.CH_No_KVM_IRQChip->setChecked( tmp_vm->Use_KVM_IRQChip() ); // Disable KVM kernel mode PIT ui_kvm.CH_No_KVM_Pit->setChecked( tmp_vm->Use_No_KVM_Pit() ); // KVM_No_Pit_Reinjection ui_kvm.CH_KVM_No_Pit_Reinjection->setChecked( tmp_vm->Use_KVM_No_Pit_Reinjection() ); // KVM_Nesting ui_kvm.CH_KVM_Nesting->setChecked( tmp_vm->Use_KVM_Nesting() );*/ //FIXME: deprecated //alternatives? // KVM Shadow Memory ui_kvm.CH_KVM_Shadow_Memory->setChecked( tmp_vm->Use_KVM_Shadow_Memory() ); ui_kvm.SB_KVM_Shadow_Memory_Size->setValue( tmp_vm->Get_KVM_Shadow_Memory_Size() ); // SPICE SPICE_Widget->Set_Settings( tmp_vm->Get_SPICE() ); // VNC ui.CH_Activate_VNC->setChecked( tmp_vm->Use_VNC() ); // Use Unix Socket Mode for VNC ui.RB_VNC_Unix_Socket->setChecked( tmp_vm->Get_VNC_Socket_Mode() ); // UNIX Domain Socket Path ui.Edit_VNC_Unix_Socket->setText( tmp_vm->Get_VNC_Unix_Socket_Path() ); // VNC Display Number ui.SB_VNC_Display->setValue( tmp_vm->Get_VNC_Display_Number() ); // Use Password for VNC ui.CH_VNC_Password->setChecked( tmp_vm->Use_VNC_Password() ); // Use TLS ui.CH_Use_VNC_TLS->setChecked( tmp_vm->Use_VNC_TLS() ); // Use x509 ui.CH_x509_Folder->setChecked( tmp_vm->Use_VNC_x509() ); // x509 Folder ui.Edit_x509_Folder->setText( tmp_vm->Get_VNC_x509_Folder_Path() ); // Use x509verify ui.CH_x509verify_Folder->setChecked( tmp_vm->Use_VNC_x509verify() ); // x509 Folder ui.Edit_x509verify_Folder->setText( tmp_vm->Get_VNC_x509verify_Folder_Path() ); if ( update_info_tab ) { Update_Info_Text(); } Update_Disabled_Controls(); // FIXME /* TODO: POST 0.9.1 QString info_text = tr("Machine:") + " " + tmp_vm->Get_Machine_Name(); info_text += " " + tr("State:") + " " + tmp_vm->Get_State_Text(); ui.Label_Machine_Info->setText(info_text); */ // For VM Changes Signals ui.Button_Apply->setEnabled( false ); ui.Button_Cancel->setEnabled( false ); } void Main_Window::Update_VM_Port_Number() { for( int ix = 0; ix < VM_List.count(); ++ix ) { VM_List[ ix ]->Set_Embedded_Display_Port( ix ); } } void Main_Window::Update_Info_Text( int info_mode ) { #define INFO_TEXT_INDENT 25 Virtual_Machine *tmp_vm = Get_Current_VM(); if( tmp_vm == NULL && info_mode == 0 ) { AQError( "void Main_Window::Update_Info_Text( int info_mode )", "Cannot Find VM!" ); return; } ui.VM_Information_Text->clear(); if( info_mode != 0 ) { // This is for the Tab Info background color QPalette qpal; ui.VM_Information_Text->setHtml( "" "" "

" ); QTextCursor cursor = ui.VM_Information_Text->textCursor(); QTextCharFormat format = QTextCharFormat(); QTextCharFormat bold_format = format; bold_format.setFontWeight( QFont::Bold ); bold_format.setForeground( qpal.color(QPalette::Link) ); QTextTableFormat table_format; table_format.setAlignment( Qt::AlignLeft ); table_format.setCellPadding( 0 ); table_format.setCellSpacing( 0 ); QVector constraints; constraints << QTextLength( QTextLength::FixedLength, INFO_TEXT_INDENT ) << QTextLength( QTextLength::FixedLength, 220 ); table_format.setColumnWidthConstraints(constraints); if( info_mode == 1 ) cursor.insertText( tr("You must create a new virtual machine"), bold_format ); else if( info_mode == 2 ) cursor.insertText( tr("This VM uses the emulator \"%1\" that is not installed.\n" "The VM cannot work!").arg( (tmp_vm->Get_Machine_Accelerator() == VM::TCG) ? "TCG" : "KVM" ), bold_format ); cursor.insertBlock(); return; } // This is for the Tab Info background color QPalette qpal; ui.VM_Information_Text->setHtml( "" "" "

" ); QTextCursor cursor = ui.VM_Information_Text->textCursor(); QTextCharFormat format = QTextCharFormat(); QTextFrame *topFrame = cursor.currentFrame(); // Use Scrennshot in Save Mode if( Settings.value("Info/Show_Screenshot_in_Save_Mode", "no").toString() == "yes" ) { // Find Full Size Screenshot QString img_path = QDir::toNativeSeparators( Settings.value("VM_Directory", "~").toString() + Get_FS_Compatible_VM_Name(tmp_vm->Get_Machine_Name()) + "_screenshot" ); if( ! QFile::exists(img_path) ) { AQDebug( "void Main_Window::Update_Info_Text( int info_mode )", "Screenshot Path is Empty!" ); } else { cursor.insertHtml( "width() -50) + "\" src=\"" + img_path + "\">" ); return; } } QTextCharFormat bold_format = format; bold_format.setFontWeight( QFont::Bold ); bold_format.setForeground( qpal.color(QPalette::Link) ); QTextTableFormat table_format; table_format.setAlignment( Qt::AlignLeft ); table_format.setCellPadding( 0 ); table_format.setCellSpacing( 0 ); QVector constraints; constraints << QTextLength( QTextLength::FixedLength, INFO_TEXT_INDENT ) << QTextLength( QTextLength::FixedLength, 220 ) << QTextLength( QTextLength::VariableLength, 250 ); table_format.setColumnWidthConstraints(constraints); // Vairables QTextTable *table; QTextFrame *frame; QTextFrameFormat frame_format; QTextTableCell cell; QTextCursor cell_cursor; // Machine State if( Settings.value("Info/Machine_Details", "yes").toString() == "yes" ) { cursor.insertText( tr("Machine"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame_format = frame->frameFormat(); frame_format.setBorder( 0 ); frame->setFrameFormat( frame_format ); if( Settings.value("Info/Machine_Name", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Name:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.Edit_Machine_Name->text(), format ); table->insertRows( table->rows(), 1 ); } cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("State:"), format ); QString state_text = tmp_vm->Get_State_Text(); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( state_text, format ); table->insertRows( table->rows(), 1 ); } else { // this code is mainly here to prevent a segfault // it's a temporary hack, since all of the code in this method // should really be refactored/rewritten. table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame_format = frame->frameFormat(); frame_format.setBorder( 0 ); frame->setFrameFormat( frame_format ); } // General Tab if( Settings.value("Info/Machine_Accelerator", "yes").toString() == "yes" || Settings.value("Info/Emulator_Version", "no").toString() == "yes" || Settings.value("Info/Computer_Type", "yes").toString() == "yes" || Settings.value("Info/Machine_Type", "no").toString() == "yes" || Settings.value("Info/Boot_Priority", "yes").toString() == "yes" || Settings.value("Info/CPU_Type", "no").toString() == "yes" || Settings.value("Info/Number_of_CPU", "yes").toString() == "yes" || Settings.value("Info/Video_Card", "yes").toString() == "yes" || Settings.value("Info/Keyboard_Layout", "no").toString() == "yes" || Settings.value("Info/Memory_Size", "yes").toString() == "yes" || Settings.value("Info/Use_Sound", "yes").toString() == "yes" || Settings.value("Info/Fullscreen", "yes").toString() == "yes" || Settings.value("Info/Snapshot", "yes").toString() == "yes" || Settings.value("Info/Localtime", "yes").toString() == "yes" ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("General"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); if( Settings.value("Info/Machine_Accelerator", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Accelerator:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_Machine_Accelerator->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Computer_Type", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Architecture:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_Computer_Type->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Machine_Type", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Machine Type:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_arch.CB_Machine_Type->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Boot_Priority", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Boot Priority:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_Boot_Priority->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/CPU_Type", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("CPU Type:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_arch.CB_CPU_Type->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Number_of_CPU", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Number of CPU:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_CPU_Count->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Video_Card", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Video Card:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_Video_Card->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Keyboard_Layout", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Keyboard Layout:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CB_Keyboard_Layout->currentText(), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Memory_Size", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Memory Size:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( QString::number(ui.Memory_Size->value()), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Use_Sound", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Sound:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if( ui.CH_sb16->isChecked() || ui.CH_es1370->isChecked() || ui.CH_Adlib->isChecked() || ui.CH_AC97->isChecked() || ui.CH_GUS->isChecked() || ui.CH_PCSPK->isChecked() || ui.CH_HDA->isChecked() || ui.CH_cs4231a->isChecked() ) { cell_cursor.insertText( tr("Yes"), format ); } else { cell_cursor.insertText( tr("No"), format ); } table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Fullscreen", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Fullscreen Mode:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Fullscreen->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Snapshot", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Snapshot Mode:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Snapshot->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Localtime", "yes").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Local Time:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Local_Time->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } } // FDD/CD/HDD if( (Settings.value("Info/Show_FDD", "yes").toString() == "yes" && (tmp_vm->Get_FD0().Get_Enabled() || tmp_vm->Get_FD1().Get_Enabled() || tmp_vm->Get_Storage_Devices_List().count() > 0)) || (Settings.value("Info/Show_CD", "yes").toString() == "yes" && (tmp_vm->Get_CD_ROM().Get_Enabled() || tmp_vm->Get_Storage_Devices_List().count() > 0)) || (Settings.value("Info/Show_HDD", "yes").toString() == "yes" && (tmp_vm->Get_HDA().Get_Enabled() || tmp_vm->Get_HDB().Get_Enabled() || tmp_vm->Get_HDC().Get_Enabled() || tmp_vm->Get_HDD().Get_Enabled() || tmp_vm->Get_Storage_Devices_List().count() > 0)) ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("Devices"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); if( true /*Settings.value("Use_Device_Manager", "no").toString() == "yes"*/ ) { QFileInfo fi; if( Settings.value("Info/Show_FDD", "yes").toString() == "yes" ) { if( tmp_vm->Get_FD0().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Floppy 1:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_FD0().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } if( tmp_vm->Get_FD1().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Floppy 2:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_FD1().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } } if( Settings.value("Info/Show_CD", "yes").toString() == "yes" ) { if( tmp_vm->Get_CD_ROM().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("CD/DVD-ROM:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_CD_ROM().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } } if( Settings.value("Info/Show_HDD", "yes").toString() == "yes" ) { if( tmp_vm->Get_HDA().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Primary Master (HDA):"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_HDA().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } if( tmp_vm->Get_HDB().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Primary Slave (HDB):"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_HDB().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } if( tmp_vm->Get_HDC().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Secondary Master (HDC):"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_HDC().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } if( tmp_vm->Get_HDD().Get_Enabled() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Secondary Slave (HDD):"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); fi = QFileInfo( tmp_vm->Get_HDD().Get_File_Name() ); cell_cursor.insertText( fi.fileName(), format ); table->insertRows( table->rows(), 1 ); } } } } // Network if( Settings.value("Info/Network_Cards", "yes").toString() == "yes" && ((tmp_vm->Use_Nativ_Network() == false && tmp_vm->Get_Network_Cards_Count() > 0) || (tmp_vm->Use_Nativ_Network() == true && tmp_vm->Get_Network_Cards_Nativ().count() > 0)) ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("Network"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); if( ui.CH_Use_Network->isChecked() == false ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Network:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No"), format ); table->insertRows( table->rows(), 1 ); } else { if( tmp_vm->Use_Nativ_Network() == false ) { for( int nx = 0; nx < tmp_vm->Get_Network_Cards_Count(); ++nx ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Card: ") + QString::number(nx+1), format ); QString con_mode = ""; switch( tmp_vm->Get_Network_Card(nx).Get_Net_Mode() ) { case VM::Net_Mode_Usermode: con_mode = tr("User mode network stack"); break; case VM::Net_Mode_Tuntap: con_mode = tr("TUN/TAP Interface"); break; case VM::Net_Mode_Tuntapfd: con_mode = tr("TUN/TAP Interface"); break; case VM::Net_Mode_Tcplisten: con_mode = tr("TCP Socket"); break; case VM::Net_Mode_Tcpfd: con_mode = tr("TCP Socket"); break; case VM::Net_Mode_Tcpconnect: con_mode = tr("VLAN"); break; case VM::Net_Mode_Multicast: con_mode = tr("UDP multicast socket"); break; case VM::Net_Mode_Multicastfd: con_mode = tr("UDP multicast socket"); break; default: con_mode = tr("No Connection"); break; } cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( con_mode, format ); table->insertRows( table->rows(), 1 ); } } else { QList nativ_Cards = tmp_vm->Get_Network_Cards_Nativ(); for( int ix = 0; ix < nativ_Cards.count(); ix++ ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Item %1").arg(ix+1), format ); QString con_mode = ""; switch( nativ_Cards[ix].Get_Network_Type() ) { case VM::Net_Mode_Nativ_NIC: con_mode = tr( "NIC" ); break; case VM::Net_Mode_Nativ_User: con_mode = tr( "User" ); break; case VM::Net_Mode_Nativ_Chanel: con_mode = tr( "Channel" ); break; case VM::Net_Mode_Nativ_TAP: con_mode = tr( "TAP" ); break; case VM::Net_Mode_Nativ_Socket: con_mode = tr( "Socket" ); break; case VM::Net_Mode_Nativ_MulticastSocket: con_mode = tr( "Multicast Socket" ); break; case VM::Net_Mode_Nativ_VDE: con_mode = tr( "VDE" ); break; case VM::Net_Mode_Nativ_Dump: con_mode = tr( "Dump" ); break; default: con_mode = tr( "Unknown Type Item" ); break; } cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( con_mode, format ); table->insertRows( table->rows(), 1 ); } } } } // Network Redirections if( Settings.value("Info/Redirections", "no").toString() == "yes" ) { if( tmp_vm->Get_Use_Redirections() || tmp_vm->Get_Network_Redirections_Count() < 1 ) { for( int rx = 0; rx < tmp_vm->Get_Network_Redirections_Count(); ++rx ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Redirection ") + QString::number(rx+1) + ":", format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tmp_vm->Get_Network_Redirection(rx).Get_Protocol() + " " + QString::number(tmp_vm->Get_Network_Redirection(rx).Get_Host_Port()) + ":" + tmp_vm->Get_Network_Redirection(rx).Get_Guest_IP() + ":" + QString::number(tmp_vm->Get_Network_Redirection(rx).Get_Guest_Port()), format ); table->insertRows( table->rows(), 1 ); } } else { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Redirections:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No"), format ); table->insertRows( table->rows(), 1 ); } } // Ports Tab if( (Settings.value("Info/Serial_Port", "yes").toString() == "yes" && tmp_vm->Get_Serial_Ports().count() > 0) || (Settings.value("Info/Parallel_Port", "yes").toString() == "yes" && tmp_vm->Get_Parallel_Ports().count() > 0) || (Settings.value("Info/USB_Port", "yes").toString() == "yes" && tmp_vm->Get_USB_Ports().count() > 0) ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("Ports"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); if( Settings.value("Info/Serial_Port", "yes").toString() == "yes" ) { for( int ix = 0; ix < tmp_vm->Get_Serial_Ports().count(); ix++ ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Serial Port %1:").arg(ix), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); switch( tmp_vm->Get_Serial_Ports()[ix].Get_Port_Redirection() ) { case VM::PR_Default: cell_cursor.insertText( tr("Default"), format ); break; case VM::PR_vc: cell_cursor.insertText( tr("vc"), format ); break; case VM::PR_pty: cell_cursor.insertText( tr("pty"), format ); break; case VM::PR_none: cell_cursor.insertText( tr("none"), format ); break; case VM::PR_null: cell_cursor.insertText( tr("null"), format ); break; case VM::PR_dev: cell_cursor.insertText( tr("dev"), format ); break; case VM::PR_host_port: cell_cursor.insertText( tr("host_port"), format ); break; case VM::PR_file: cell_cursor.insertText( tr("file"), format ); break; case VM::PR_stdio: cell_cursor.insertText( tr("stdio"), format ); break; case VM::PR_pipe: cell_cursor.insertText( tr("pipe"), format ); break; case VM::PR_udp: cell_cursor.insertText( tr("udp"), format ); break; case VM::PR_tcp: cell_cursor.insertText( tr("tcp"), format ); break; case VM::PR_telnet: cell_cursor.insertText( tr("telnet"), format ); break; case VM::PR_unix: cell_cursor.insertText( tr("unix"), format ); break; default: cell_cursor.insertText( tr("Default"), format ); break; } table->insertRows( table->rows(), 1 ); } } if( Settings.value("Info/Parallel_Port", "yes").toString() == "yes" ) { for( int ix = 0; ix < tmp_vm->Get_Parallel_Ports().count(); ix++ ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Parallel Port %1:").arg(ix), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); switch( tmp_vm->Get_Parallel_Ports()[ix].Get_Port_Redirection() ) { case VM::PR_Default: cell_cursor.insertText( tr("Default"), format ); break; case VM::PR_vc: cell_cursor.insertText( tr("vc"), format ); break; case VM::PR_pty: cell_cursor.insertText( tr("pty"), format ); break; case VM::PR_none: cell_cursor.insertText( tr("none"), format ); break; case VM::PR_null: cell_cursor.insertText( tr("null"), format ); break; case VM::PR_dev: cell_cursor.insertText( tr("dev"), format ); break; case VM::PR_host_port: cell_cursor.insertText( tr("host_port"), format ); break; case VM::PR_file: cell_cursor.insertText( tr("file"), format ); break; case VM::PR_stdio: cell_cursor.insertText( tr("stdio"), format ); break; case VM::PR_pipe: cell_cursor.insertText( tr("pipe"), format ); break; case VM::PR_udp: cell_cursor.insertText( tr("udp"), format ); break; case VM::PR_tcp: cell_cursor.insertText( tr("tcp"), format ); break; case VM::PR_telnet: cell_cursor.insertText( tr("telnet"), format ); break; case VM::PR_unix: cell_cursor.insertText( tr("unix"), format ); break; default: cell_cursor.insertText( tr("Default"), format ); break; } table->insertRows( table->rows(), 1 ); } } if( Settings.value("Info/USB_Port", "yes").toString() == "yes" ) { for( int ix = 0; ix < tmp_vm->Get_USB_Ports().count(); ix++ ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("USB Port %1:").arg(ix), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tmp_vm->Get_USB_Ports()[ix].Get_Manufacturer_Name() + " " + tmp_vm->Get_USB_Ports()[ix].Get_Product_Name(), format ); table->insertRows( table->rows(), 1 ); } } } // Other Tab if( Settings.value("Info/Linux_Boot", "no").toString() == "yes" || Settings.value("Info/ROM_File", "no").toString() == "yes" || Settings.value("Info/MTDBlock", "no").toString() == "yes" || Settings.value("Info/SD_Image", "no").toString() == "yes" || Settings.value("Info/PFlash", "no").toString() == "yes" || Settings.value("Info/VNC", "no").toString() == "yes" || Settings.value("Info/SPICE", "no").toString() == "yes" || Settings.value("Info/Acceleration", "no").toString() == "yes" ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("Other"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); // Acceleration if( Settings.value("Info/Acceleration", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Acceleration:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); //FIXME //or remove? cell_cursor.insertText( tr("Use If Possible"), format ); table->insertRows( table->rows(), 1 ); } // VNC if( Settings.value("Info/VNC", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("VNC Port:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if ( tmp_vm->Use_VNC() ) cell_cursor.insertText( QString::number( ui.SB_VNC_Display->value() + 5900 ) , format ); else cell_cursor.insertText( QString::number( Settings.value("First_VNC_Port", "5910").toInt() + tmp_vm->Get_Embedded_Display_Port() ) , format ); table->insertRows( table->rows(), 1 ); } // SPICE if( Settings.value("Info/SPICE", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("SPICE Port:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( QString::number(tmp_vm->Get_SPICE().Get_Port()) , format ); table->insertRows( table->rows(), 1 ); } // Linux Boot if( Settings.value("Info/Linux_Boot", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Use Linux Boot:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Use_Linux_Boot->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); if( ui.CH_Use_Linux_Boot->isChecked() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Kernel bzImage:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); QFileInfo lb_tmp = QFileInfo( ui.Edit_Linux_bzImage_Path->text() ); cell_cursor.insertText( lb_tmp.fileName(), format ); table->insertRows( table->rows(), 1 ); cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Initrd File:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); lb_tmp = QFileInfo( ui.Edit_Linux_Initrd_Path->text() ); cell_cursor.insertText( lb_tmp.fileName(), format ); table->insertRows( table->rows(), 1 ); cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Kernel ComLine:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.Edit_Linux_Command_Line->text(), format ); table->insertRows( table->rows(), 1 ); } } QFileInfo im_info; // ROM File if( Settings.value("Info/ROM_File", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("ROM File:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if( ui.CH_ROM_File->isChecked() ) { im_info = QFileInfo( ui.Edit_ROM_File->text() ); cell_cursor.insertText( im_info.fileName(), format ); } else { cell_cursor.insertText( tr("No"), format ); } table->insertRows( table->rows(), 1 ); } // On-Board Flash Image if( Settings.value("Info/MTDBlock", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("On-Board Flash Image:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if( ui.CH_MTDBlock->isChecked() ) { im_info = QFileInfo( ui.Edit_MTDBlock_File->text() ); cell_cursor.insertText( im_info.fileName(), format ); } else { cell_cursor.insertText( tr("No"), format ); } table->insertRows( table->rows(), 1 ); } // SD Card Image if( Settings.value("Info/SD_Image", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("SD Card Image:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if( ui.CH_SD_Image->isChecked() ) { im_info = QFileInfo( ui.Edit_SD_Image_File->text() ); cell_cursor.insertText( im_info.fileName(), format ); } else { cell_cursor.insertText( tr("No"), format ); } table->insertRows( table->rows(), 1 ); } // Parallel Flash Image if( Settings.value("Info/PFlash", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Parallel Flash Image:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); if( ui.CH_PFlash->isChecked() ) { im_info = QFileInfo( ui.Edit_PFlash_File->text() ); cell_cursor.insertText( im_info.fileName(), format ); } else { cell_cursor.insertText( tr("No"), format ); } table->insertRows( table->rows(), 1 ); } } // Advanced Tab if( Settings.value("Info/RTC_TD_Hack", "no").toString() == "yes" || Settings.value("Info/Win2K_Hack", "no").toString() == "yes" || Settings.value("Info/No_Shutdown", "no").toString() == "yes" || Settings.value("Info/No_Reboot", "no").toString() == "yes" || Settings.value("Info/Start_CPU", "no").toString() == "yes" || Settings.value("Info/Check_Boot_on_FDD", "no").toString() == "yes" || Settings.value("Info/ACPI", "no").toString() == "yes" || (Settings.value("Info/Start_Date", "no").toString() == "yes" && ui_ao.CH_Start_Date->isChecked()) || Settings.value("Info/No_Frame", "no").toString() == "yes" || Settings.value("Info/Alt_Grab", "no").toString() == "yes" || Settings.value("Info/No_Quit", "no").toString() == "yes" || Settings.value("Info/Portrait", "no").toString() == "yes" || Settings.value("Info/Curses", "no").toString() == "yes" || Settings.value("Info/Show_Cursor", "no").toString() == "yes" || (Settings.value("Info/Init_Graphical_Mode", "no").toString() == "yes" && ui.CH_Init_Graphic_Mode->isChecked()) ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("Advanced"), bold_format ); cursor.insertBlock(); table = cursor.insertTable( 1, 3, table_format ); frame = cursor.currentFrame(); frame->setFrameFormat( frame_format ); if( Settings.value("Info/RTC_TD_Hack", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("RTC TD Hack:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_RTC_TD_Hack->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Win2K_Hack", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Windows 2000 Hack:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_Win2K_Hack->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/No_Shutdown", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No Shutdown:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_No_Shutdown->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/No_Reboot", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No Reboot:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_No_Reboot->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Start_CPU", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Start CPU at Startup:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_Start_CPU->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Check_Boot_on_FDD", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Check Boot Sector on FDD:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_FDD_Boot->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/ACPI", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Enable ACPI:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.CH_ACPI->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Start_Date", "no").toString() == "yes" && ui_ao.CH_Start_Date->isChecked() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Start Date:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui_ao.DTE_Start_Date->text(), format ); table->insertRows( table->rows(), 1 ); } // Advanced -> QEMU Window Options if( Settings.value("Info/No_Frame", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No Frame:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_No_Frame->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Alt_Grab", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Alt Grab:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Alt_Grab->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/No_Quit", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("No Quit:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_No_Quit->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Portrait", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Portrait Mode:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Portrait->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Curses", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Curses:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Curses->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Show_Cursor", "no").toString() == "yes" ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Show Cursor:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( ui.CH_Show_Cursor->isChecked() ? tr("Yes") : tr("No"), format ); table->insertRows( table->rows(), 1 ); } if( Settings.value("Info/Init_Graphical_Mode", "no").toString() == "yes" && ui.CH_Init_Graphic_Mode->isChecked() ) { cell = table->cellAt( table->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( tr("Initial Graphical Mode:"), format ); cell = table->cellAt( table->rows()-1, 2 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( QString("%1x%2x%3").arg(ui.SB_InitGM_Width->text()) .arg(ui.SB_InitGM_Height->text()) .arg(ui.CB_InitGM_Depth->currentText()) , format ); table->insertRows( table->rows(), 1 ); } } // Show_QEMU_Arguments if( Settings.value("Info/Show_QEMU_Args", "no").toString() == "yes" ) { cursor.setPosition( topFrame->lastPosition() ); cursor.insertText( tr("QEMU Arguments"), bold_format ); cursor.insertBlock(); QTextTableFormat table_format2; table_format2.setAlignment( Qt::AlignLeft ); table_format2.setCellPadding( 0 ); table_format2.setCellSpacing( 0 ); QVector constraints2; constraints2 << QTextLength( QTextLength::FixedLength, INFO_TEXT_INDENT ) << QTextLength( QTextLength::VariableLength, 500 ) << QTextLength( QTextLength::FixedLength, 10 ); table_format2.setColumnWidthConstraints( constraints2 ); QTextTable *table2 = cursor.insertTable( 1, 3, table_format2 ); frame = cursor.currentFrame(); QTextFrameFormat frame_format2 = frame->frameFormat(); frame_format2.setBorder( 0 ); frame->setFrameFormat( frame_format2 ); cell = table2->cellAt( table2->rows()-1, 1 ); cell_cursor = cell.firstCursorPosition(); cell_cursor.insertText( Get_QEMU_Args().replace(" -"," \\\n -"), format ); } // Move the cursor to the top ui.VM_Information_Text->moveCursor(QTextCursor::Start); ui.VM_Information_Text->ensureCursorVisible(); } void Main_Window::Update_Disabled_Controls() { // Get devices bool curMachineOk = false; Available_Devices curComp = Get_Current_Machine_Devices( &curMachineOk ); if( ! curMachineOk ) return; // Apply emulator // CPU disconnect( ui.CB_CPU_Count, SIGNAL(editTextChanged(const QString &)), this, SLOT(Validate_CPU_Count(const QString&)) ); ui.CB_CPU_Count->clear(); if( curComp.PSO_SMP_Count == 1 ) { ui.CB_CPU_Count->addItem( QString::number(1) ); ui.CB_CPU_Count->setEnabled( false ); ui.TB_Show_SMP_Settings_Window->setEnabled( false ); } else { for( int cx = 1; (cx -1) <= curComp.PSO_SMP_Count; cx *= 2 ) { if( cx == 256 ) ui.CB_CPU_Count->addItem( QString::number(255) ); else ui.CB_CPU_Count->addItem( QString::number(cx) ); } ui.CB_CPU_Count->setEnabled( true ); ui.TB_Show_SMP_Settings_Window->setEnabled( true ); } connect( ui.CB_CPU_Count, SIGNAL(editTextChanged(const QString &)), this, SLOT(Validate_CPU_Count(const QString&)) ); /* SMP_Settings if( PSO_SMP_Count ) // FIXME else if( curComp.PSO_SMP_Cores ) else if( curComp.PSO_SMP_Threads ) else if( curComp.PSO_SMP_Sockets ) else if( curComp.PSO_SMP_MaxCPUs ) else */ // Drive /*if( curComp.PSO_Drive ) else if( curComp.PSO_Drive_File ) else if( curComp.PSO_Drive_If ) else if( curComp.PSO_Drive_Bus_Unit ) else if( curComp.PSO_Drive_Index ) else if( curComp.PSO_Drive_Media ) else if( curComp.PSO_Drive_Cyls_Heads_Secs_Trans ) else if( curComp.PSO_Drive_Snapshot ) else if( curComp.PSO_Drive_Cache ) else if( curComp.PSO_Drive_AIO ) else if( curComp.PSO_Drive_Format ) else if( curComp.PSO_Drive_Serial ) else if( curComp.PSO_Drive_ADDR ) else if( curComp.PSO_Drive_Boot ) else */ // Options if( curComp.PSO_Boot_Order ) ui.TB_Show_Boot_Settings_Window->setEnabled( true ); else ui.TB_Show_Boot_Settings_Window->setEnabled( false ); if( curComp.PSO_Initial_Graphic_Mode ) ui.CH_Init_Graphic_Mode->setEnabled( true ); else ui.CH_Init_Graphic_Mode->setEnabled( false ); if( curComp.PSO_No_FB_Boot_Check ) ui_ao.CH_FDD_Boot->setEnabled( true ); else ui_ao.CH_FDD_Boot->setEnabled( false ); if( curComp.PSO_Win2K_Hack ) ui_ao.CH_Win2K_Hack->setEnabled( true ); else ui_ao.CH_Win2K_Hack->setEnabled( false ); if( curComp.PSO_No_ACPI ) ui_ao.CH_ACPI->setEnabled( true ); else ui_ao.CH_ACPI->setEnabled( false ); if( curComp.PSO_RTC_TD_Hack ) ui_ao.CH_RTC_TD_Hack->setEnabled( true ); else ui_ao.CH_RTC_TD_Hack->setEnabled( false ); if( curComp.PSO_MTDBlock ) ui.CH_MTDBlock->setEnabled( true ); else ui.CH_MTDBlock->setEnabled( false ); if( curComp.PSO_SD ) ui.CH_SD_Image->setEnabled( true ); else ui.CH_SD_Image->setEnabled( false ); if( curComp.PSO_PFlash ) ui.CH_PFlash->setEnabled( true ); else ui.CH_PFlash->setEnabled( false ); //if( curComp.PSO_Name ) //else if( curComp.PSO_Curses ) ui.CH_Curses->setEnabled( true ); else ui.CH_Curses->setEnabled( false ); if( curComp.PSO_No_Frame ) ui.CH_No_Frame->setEnabled( true ); else ui.CH_No_Frame->setEnabled( false ); if( curComp.PSO_Alt_Grab ) ui.CH_Alt_Grab->setEnabled( true ); else ui.CH_Alt_Grab->setEnabled( false ); if( curComp.PSO_No_Quit ) ui.CH_No_Quit->setEnabled( true ); else ui.CH_No_Quit->setEnabled( false ); //if( curComp.PSO_SDL ) //else if( curComp.PSO_Portrait ) ui.CH_Portrait->setEnabled( true ); else ui.CH_Portrait->setEnabled( false ); if( curComp.PSO_No_Shutdown ) ui_ao.CH_No_Shutdown->setEnabled( true ); else ui_ao.CH_No_Shutdown->setEnabled( false ); if( curComp.PSO_Startdate ) { ui_ao.CH_Start_Date->setEnabled( true ); ui_ao.DTE_Start_Date->setEnabled( true ); } else { ui_ao.CH_Start_Date->setEnabled( false ); ui_ao.DTE_Start_Date->setEnabled( false ); } if( curComp.PSO_Show_Cursor ) ui.CH_Show_Cursor->setEnabled( true ); else ui.CH_Show_Cursor->setEnabled( false ); //if( curComp.PSO_Bootp ) //else New_Network_Settings_Widget->Set_Devices( curComp ); // Nativ mode network if( ui.RB_Network_Mode_New->isChecked() ) { // FIXME } //if( curComp.PSO_No_KVM ) ui.CH_No_KVM->setEnabled( true ); //else ui.CH_No_KVM->setEnabled( false ); /*if( curComp.PSO_No_KVM_IRQChip ) ui_kvm.CH_No_KVM_IRQChip->setEnabled( true ); //FIXME: deprecated //alternatives? else ui_kvm.CH_No_KVM_IRQChip->setEnabled( false ); if( curComp.PSO_No_KVM_Pit ) ui_kvm.CH_No_KVM_Pit->setEnabled( true ); else ui_kvm.CH_No_KVM_Pit->setEnabled( false ); if( curComp.PSO_No_KVM_Pit_Reinjection ) ui_kvm.CH_KVM_No_Pit_Reinjection->setEnabled( true ); else ui_kvm.CH_KVM_No_Pit_Reinjection->setEnabled( false ); if( curComp.PSO_Enable_Nesting ) ui_kvm.CH_KVM_Nesting->setEnabled( true ); else ui_kvm.CH_KVM_Nesting->setEnabled( false );*/ if( curComp.PSO_KVM_Shadow_Memory ) { ui_kvm.CH_KVM_Shadow_Memory->setEnabled( true ); ui_kvm.SB_KVM_Shadow_Memory_Size->setEnabled( true ); ui_kvm.Label_KVM_Shadow_Memory_Mb->setEnabled( true ); } else { ui_kvm.CH_KVM_Shadow_Memory->setEnabled( false ); ui_kvm.SB_KVM_Shadow_Memory_Size->setEnabled( false ); ui_kvm.Label_KVM_Shadow_Memory_Mb->setEnabled( false ); } // SPICE SPICE_Widget->setEnabled( curComp.PSO_SPICE ); SPICE_Widget->Set_PSO_GXL( curComp.PSO_QXL ); // Obsolete QEMU options if( curComp.PSO_TFTP ) { ui.Label_TFTP->setEnabled( true ); ui.Edit_TFTP_Prefix->setEnabled( true ); ui.TB_Browse_TFTP->setEnabled( true ); } else { ui.Label_TFTP->setEnabled( false ); ui.Edit_TFTP_Prefix->setEnabled( false ); ui.TB_Browse_TFTP->setEnabled( false ); } if( curComp.PSO_SMB ) { ui.Label_SMB_Folder->setEnabled( true ); ui.TB_Browse_SMB->setEnabled( true ); ui.Edit_SMB_Folder->setEnabled( true ); } else { ui.Label_SMB_Folder->setEnabled( false ); ui.TB_Browse_SMB->setEnabled( false ); ui.Edit_SMB_Folder->setEnabled( false ); } //if( curComp.PSO_Std_VGA ) //else } void Main_Window::Update_Recent_CD_ROM_Images_List() { // CD-ROM QStringList cd_list = System_Info::Get_Host_CDROM_List(); cd_list += Get_CD_Recent_Images_List(); } void Main_Window::Update_Recent_Floppy_Images_List() { // Floppy QStringList fd_list = System_Info::Get_Host_FDD_List(); fd_list += Get_FDD_Recent_Images_List(); } QString Main_Window::Get_Storage_Device_Info_String( const QString &path ) { if( path.isEmpty() ) return tr( "Type: none Size: 0" ); if( ! QFile::exists(path) ) { AQWarning( "QString Main_Window::Get_Storage_Device_Info_String( const QString &path )", "File \"" + path + "\" not exists!" ); return tr( "Type: none Size: 0" ); } QFileInfo file = QFileInfo( path ); qint64 size_in_bytes = file.size(); if( It_Host_Device(path) ) return tr( "Type: Host Device" ); if( file.isFile() == false && file.isSymLink() == false ) return tr( "Type: none Size: 0" ); if( size_in_bytes <= 0 ) return tr( "Type: Image Size: 0" ); QString suf = ""; float size = 0; if( (size_in_bytes / 1024.0) < 1 ) { suf = tr( "Byte" ); size = (float) size_in_bytes; } else if( (size_in_bytes / 1024.0 / 1024.0) < 1 ) { suf = tr( "Kb" ); size = (float) size_in_bytes / 1024.0; } else if( (size_in_bytes / 1024.0 / 1024.0 / 1024.0) < 1 ) { suf = tr( "Mb" ); size = (float) size_in_bytes / 1024.0 / 1024.0; } else { suf = tr( "Gb" ); size = (float) size_in_bytes / 1024.0/ 1024.0 / 1024.0; } return tr("Type: Image Size: ") + QString::number(size, 'f', 2) + suf; } void Main_Window::VM_State_Changed( Virtual_Machine *vm, VM::VM_State s ) { if( vm == NULL ) { AQError( "void Main_Window::VM_State_Changed( Virtual_Machine *vm, VM::VM_State s )", "Error: vm == NULL" ); return; } Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::VM_State_Changed( Virtual_Machine *vm, VM::VM_State s )", "Cannot Get Current VM" ); return; } // This is current VM? if( *vm == *cur_vm ) { Update_Info_Text(); Show_State_Current( cur_vm ); } Show_State_VM( vm ); vm->Save_VM(); // Save New State } void Main_Window::Change_The_Icon(Virtual_Machine* vm, QString _icon) { //find QListWidgetItem in ui.Machines_List matching the vm QString name = vm->Get_Machine_Name(); int i = 0; QListWidgetItem* vm_item = nullptr; for ( QListWidgetItem* item = ui.Machines_List->item(0); item != 0; item = ui.Machines_List->item(0+i)) { if ( item->text() == name ) vm_item = item; i++; } if ( vm_item == nullptr ) { AQDebug("void Main_Window::Change_The_Icon(Virtual_Machine* vm, QString _icon)", "Matching icon not found"); return; } if ( _icon.contains("stop") ) { vm_item->setIcon(QIcon(vm->Get_Icon_Path())); return; } int s = Settings.value("VM_Icons_Size", "48").toInt(); QIcon icon = QIcon(vm->Get_Icon_Path()); auto pix = new QPixmap(icon.pixmap(QSize(s,s))); auto painter = new QPainter(pix); QPixmap pix2(QIcon(_icon).pixmap(QSize(s,s))); QRect rect(s/2,s/2,s/2,s/2); painter->drawPixmap(rect,pix2); QIcon icon2(*pix); vm_item->setIcon(icon2); delete painter; delete pix; } void Main_Window::setStateActionsEnabled(bool enabled) { ui.actionPower_On->setEnabled( enabled ); ui.actionSave->setEnabled( enabled ); ui.actionPause->setEnabled( enabled ); ui.actionPower_Off->setEnabled( enabled ); ui.actionReset->setEnabled( enabled ); } void Main_Window::Show_State_Current( Virtual_Machine *vm) { if( vm == NULL ) { AQError( "void Main_Window::Show_State( Virtual_Machine *vm, VM::VM_State s )", "vm == NULL" ); return; } if( vm->Get_State() == VM::VMS_Saved && Settings.value("Use_Screenshot_for_OS_Logo", "yes").toString() == "yes" ) { ui.Machines_List->currentItem()->setIcon( QIcon(vm->Get_Screenshot_Path()) ); ui.Machines_List->currentItem()->setData( 128, vm->Get_Screenshot_Path() ); } else { ui.Machines_List->currentItem()->setIcon( QIcon(vm->Get_Icon_Path()) ); ui.Machines_List->currentItem()->setData( 128, vm->Get_Icon_Path() ); } switch( vm->Get_State() ) { case VM::VMS_Running: setStateActionsEnabled( true ); ui.actionPower_On->setEnabled( false ); ui.actionPause->setChecked( false ); Set_Widgets_State( false ); break; case VM::VMS_Power_Off: setStateActionsEnabled( false ); ui.actionPower_On->setEnabled( true ); ui.actionPause->setChecked( false ); Set_Widgets_State( true ); break; case VM::VMS_Pause: setStateActionsEnabled( true ); ui.actionPower_On->setEnabled( false ); ui.actionPause->setChecked( true ); Set_Widgets_State( false ); break; case VM::VMS_Saved: ui.actionPower_On->setEnabled( true ); ui.actionSave->setEnabled( false ); ui.actionPause->setEnabled( false ); ui.actionPause->setChecked( false ); ui.actionPower_Off->setEnabled( true ); ui.actionReset->setEnabled( true ); Set_Widgets_State( false ); break; case VM::VMS_In_Error: setStateActionsEnabled( false ); ui.actionPause->setChecked( false ); Set_Widgets_State( false ); Update_Info_Text( 2 ); break; default: break; } ui.Button_Apply->setEnabled( false ); ui.Button_Cancel->setEnabled( false ); Update_Emulator_Control( vm ); } void Main_Window::Show_State_VM( Virtual_Machine *vm ) { if( vm == NULL ) { AQError( "void Main_Window::Show_State_VM( Virtual_Machine *vm )", "vm == NULL" ); return; } switch( vm->Get_State() ) { case VM::VMS_Running: Change_The_Icon(vm, ":/play.png"); break; case VM::VMS_Power_Off: Change_The_Icon(vm, ":/stop.png"); break; case VM::VMS_Pause: Change_The_Icon(vm, ":/pause.png"); break; case VM::VMS_Saved: Change_The_Icon(vm, ":/save.png"); break; case VM::VMS_In_Error: Change_The_Icon(vm, ":/error.png"); break; default: break; } Update_Emulator_Control( vm ); } void Main_Window::Set_Widgets_State( bool enabled ) { QList list; // Tabs ui.Tab_General->setEnabled( enabled ); //ui.Tab_HDD->setEnabled( enabled ); //ui.Tab_Removable_Disks->setEnabled( enabled ); // Media Dev_Manager->Set_Enabled( enabled ); Folder_Sharing->Set_Enabled( enabled ); Ports_Tab->setEnabled( enabled ); ui.Tab_Optional_Images->setEnabled( enabled ); ui.Tab_Boot_Linux->setEnabled( enabled ); // Tab network ui.Widget_Use_Network->setEnabled( enabled ); Old_Network_Settings_Widget->Set_Enabled( enabled ); New_Network_Settings_Widget->Set_Enabled( enabled ); // Network redirections list.clear(); list << ui.Redirection_Widget << ui.Widget_Redirection_Buttons; Checkbox_Dependend_Set_Enabled( list, ui.CH_Redirections, enabled ); // Tab Display list.clear(); list << ui.VNC_General << ui.VNC_Security; Checkbox_Dependend_Set_Enabled( list, ui.CH_Activate_VNC, enabled ); SPICE_Widget->My_Set_Enabled( enabled ); ui.Tab_Emulator_Window_Options->setEnabled( enabled ); } void Main_Window::VM_Changed() { // check if there's really a change compared // to the current VM /(and saved VM file) auto old_vm = Get_Current_VM(); if ( old_vm != nullptr ) { auto tmp_vm = new Virtual_Machine(); Create_VM_From_Ui(tmp_vm,old_vm,false); bool test = ( *old_vm != *tmp_vm ); ui.Button_Apply->setEnabled( test ); ui.Button_Cancel->setEnabled( test ); delete tmp_vm; } } // FIXME This will be rewritten in the future. Deleting and creating new tabs/layouts is not done optimally void Main_Window::Update_Emulator_Control( Virtual_Machine *cur_vm ) { if( cur_vm == NULL ) { AQError( "void Main_Window::Update_Emulator_Control()", "cur_vm == NULL" ); return; } // VM Running? bool emulRun = (cur_vm->Get_State() == VM::VMS_Running || cur_vm->Get_State() == VM::VMS_Pause); if( Settings.value("Show_Emulator_Control_Window", "no").toString() == "yes" ) { if( Settings.value("Include_Emulator_Control", "no").toString() == "yes" ) { if( Settings.value("Use_VNC_Display", "no").toString() == "yes" ) { // Add Display tab if( emulRun ) { cur_vm->Emu_Ctl->Use_Minimal_Size( false ); ui.Tabs->insertTab( 0, cur_vm->Emu_Ctl, tr("Display") ); ui.Tabs->setCurrentIndex( 0 ); } else { // Check and delete Emulator Control tab if( ui.Tabs->tabText(0) == tr("Display") ) { ui.Tabs->removeTab( 0 ); ui.Tabs->setCurrentIndex( 0 ); } } } else // No VNC { // Hide all for( int vx = 0; vx < VM_List.count(); ++vx ) VM_List[vx]->Hide_Emu_Ctl_Win(); // Create new layout for tab Info delete ui.Tab_Info->layout(); QVBoxLayout *layout = new QVBoxLayout; cur_vm->Emu_Ctl->setMaximumSize( 4096, 30 ); if( emulRun ) { layout->addWidget( cur_vm->Emu_Ctl ); cur_vm->Show_Emu_Ctl_Win(); } layout->addWidget( ui.VM_Information_Text ); layout->setContentsMargins(0,0,0,0); ui.Tab_Info->setLayout( layout ); } } else // Don't include { if( emulRun ) cur_vm->Show_Emu_Ctl_Win(); else cur_vm->Hide_Emu_Ctl_Win(); } } else // No show emulator control { // Hide all for( int vx = 0; vx < VM_List.count(); ++vx ) VM_List[vx]->Hide_Emu_Ctl_Win(); } } void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ) { if( VM_List.count() < 1 ) { AQDebug( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )", "VM_List.count() < 1" ); return; } if( ui.Machines_List->row(previous) < 0 ) return; std::unique_ptr tmp_vm(new Virtual_Machine()); Virtual_Machine *old_vm = Get_VM_By_UID( previous->data(256).toString() ); if( old_vm == NULL ) { AQError( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous )", "old_vm == NULL" ); return; } if( Create_VM_From_Ui(tmp_vm.get(), old_vm) == false && old_vm->Get_State() != VM::VMS_In_Error ) { AQError( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )", "Cannot Create VM!" ); int mes_res = QMessageBox::question( this, tr("Warning!"), tr("Current VM was changed. Discard all changes?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_res == QMessageBox::No ) { ui.Machines_List->setCurrentItem( previous ); return; } else { // Discard changes if( ui.Machines_List->row(current) >= 0 && ui.Machines_List->row(current) < ui.Machines_List->count() ) { if( old_vm->Get_State() == VM::VMS_Saved ) { previous->setIcon( QIcon(old_vm->Get_Screenshot_Path()) ); previous->setData( 128, old_vm->Get_Screenshot_Path() ); } else { previous->setIcon( QIcon(old_vm->Get_Icon_Path()) ); previous->setData( 128, old_vm->Get_Icon_Path() ); } Update_VM_Ui(); } else { AQError( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )", "Index Invalid!" ); } } return; } // if previous machine settings were changed if( *old_vm != *tmp_vm.get() && old_vm->Get_State() != VM::VMS_In_Error && ui.Button_Apply->isEnabled() ) { int mes_res = QMessageBox::question( this, tr("Warning!"), tr("Current VM was changed. Save all changes?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if( mes_res == QMessageBox::Yes ) { disconnect( old_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); *old_vm = *tmp_vm.get(); connect( old_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); old_vm->Save_VM(); Update_VM_Ui(); return; } else { // Discard changes if( old_vm->Get_State() == VM::VMS_Saved ) { previous->setIcon( QIcon(old_vm->Get_Screenshot_Path()) ); previous->setData( 128, old_vm->Get_Screenshot_Path() ); } else { previous->setIcon( QIcon(old_vm->Get_Icon_Path()) ); previous->setData( 128, old_vm->Get_Icon_Path() ); } Update_VM_Ui(); } AQWarning( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )", "Changed VM Not Saved!" ); } else { if( ui.Machines_List->row(current) >= 0 && ui.Machines_List->row(current) < ui.Machines_List->count() ) { Update_VM_Ui(); } else { AQError( "void Main_Window::on_Machines_List_currentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )", "Index Invalid!" ); } } } void Main_Window::on_Machines_List_customContextMenuRequested( const QPoint &pos ) { QListWidgetItem *it = ui.Machines_List->itemAt( pos ); if( it != NULL ) Icon_Menu->exec( ui.Machines_List->mapToGlobal(pos) ); else VM_List_Menu->exec( ui.Machines_List->mapToGlobal(pos) ); } void Main_Window::on_Machines_List_itemDoubleClicked( QListWidgetItem *item ) { Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_Machines_List_itemDoubleClicked( QListWidgetItem *item )", "cur_vm == NULL" ); return; } if( cur_vm->Get_State() == VM::VMS_Saved ) { AQGraphic_Warning( tr("Warning"), tr("Cannot Change Icon When VM in Save State.") ); return; } on_actionChange_Icon_triggered(); } QString Main_Window::Get_QEMU_Args() { if( ui.Machines_List->currentRow() < 0 || ui.CB_Computer_Type->currentIndex() < 0 ) { AQWarning( "QString Main_Window::Get_QEMU_Args()", "Index < 0" ); return ""; } Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "QString Main_Window::Get_QEMU_Args()", "cur_vm == NULL" ); return ""; } QString line = ""; if( cur_vm->Get_Use_User_Emulator_Binary() && cur_vm->Get_Only_User_Args() ) { QStringList all_args = cur_vm->Build_QEMU_Args_For_Tab_Info(); line = all_args.takeAt( 0 ); for( int i = 0; i < all_args.count(); ++i ) line += " " + all_args[i]; } else { line = Get_Current_Binary_Name(); QStringList all_args = cur_vm->Build_QEMU_Args_For_Tab_Info(); for( int i = 0; i < all_args.count(); ++i ) line += " " + all_args[i]; } return line; } QString Main_Window::Get_Current_Binary_Name() { QString line = ""; Emulator cur_emul = Get_Default_Emulator(); QMap bin_list = cur_emul.Get_Binary_Files(); // Get devices bool curMachineOk = false; QString find_name = Get_Current_Machine_Devices( &curMachineOk ).System.QEMU_Name; if( ! curMachineOk ) return ""; for( QMap::const_iterator iter = bin_list.constBegin(); iter != bin_list.constEnd(); iter++ ) { if( iter.key() == find_name ) { line = iter.value(); break; } } return line; } bool Main_Window::Boot_Is_Correct( Virtual_Machine *tmp_vm ) { // Floppy A if( tmp_vm->Get_FD0().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_FD0().Get_File_Name()) ) { if( ! No_Device_Found("Floppy A", tmp_vm->Get_FD0().Get_File_Name(), VM::Boot_From_FDA) ) { return false; } else { VM_Storage_Device tmp_fd = tmp_vm->Get_FD0(); tmp_fd.Set_Enabled( false ); tmp_vm->Set_FD0( tmp_fd ); } } } // Floppy B if( tmp_vm->Get_FD1().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_FD1().Get_File_Name()) ) { if( ! No_Device_Found("Floppy B", tmp_vm->Get_FD1().Get_File_Name(), VM::Boot_From_FDA) ) { return false; } else { VM_Storage_Device tmp_fd = tmp_vm->Get_FD1(); tmp_fd.Set_Enabled( false ); tmp_vm->Set_FD1( tmp_fd ); } } } // CD-ROM if( tmp_vm->Get_CD_ROM().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_CD_ROM().Get_File_Name()) ) { if( ! No_Device_Found("CD-ROM", tmp_vm->Get_CD_ROM().Get_File_Name(), VM::Boot_From_CDROM) ) { return false; } else { VM_Storage_Device tmp_cd = tmp_vm->Get_CD_ROM(); tmp_cd.Set_Enabled( false ); tmp_vm->Set_CD_ROM( tmp_cd ); } } } // HDA if( tmp_vm->Get_HDA().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_HDA().Get_File_Name()) ) { if( ! No_Device_Found("HDA", tmp_vm->Get_HDA().Get_File_Name(), VM::Boot_From_HDD) ) { return false; } else { VM_HDD tmp_hd = tmp_vm->Get_HDA(); tmp_hd.Set_Enabled( false ); tmp_vm->Set_HDA( tmp_hd ); } } } // HDB if( tmp_vm->Get_HDB().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_HDB().Get_File_Name()) ) { if( ! No_Device_Found("HDB", tmp_vm->Get_HDB().Get_File_Name(), VM::Boot_From_HDD) ) { return false; } else { VM_HDD tmp_hd = tmp_vm->Get_HDB(); tmp_hd.Set_Enabled( false ); tmp_vm->Set_HDB( tmp_hd ); } } } // HDC if( tmp_vm->Get_HDC().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_HDC().Get_File_Name()) ) { if( ! No_Device_Found("HDC", tmp_vm->Get_HDC().Get_File_Name(), VM::Boot_From_HDD) ) { return false; } else { VM_HDD tmp_hd = tmp_vm->Get_HDC(); tmp_hd.Set_Enabled( false ); tmp_vm->Set_HDC( tmp_hd ); } } } // HDD if( tmp_vm->Get_HDD().Get_Enabled() ) { if( ! QFile::exists(tmp_vm->Get_HDD().Get_File_Name()) ) { if( ! No_Device_Found("HDD", tmp_vm->Get_HDD().Get_File_Name(), VM::Boot_From_HDD) ) { return false; } else { VM_HDD tmp_hd = tmp_vm->Get_HDD(); tmp_hd.Set_Enabled( false ); tmp_vm->Set_HDD( tmp_hd ); } } } if( ui.Machines_List->currentRow() >= 0 && ui.Machines_List->currentRow() < VM_List.count() ) { Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "bool Main_Window::Boot_Is_Correct( Virtual_Machine *tmp_vm )", "cur_vm == NULL" ); return false; } Dev_Manager->Set_VM( *cur_vm ); // FIXME Use pointer } // Linux Kernel Files if( tmp_vm->Get_Use_Linux_Boot() ) { if( ! QFile::exists(tmp_vm->Get_bzImage_Path()) ) { if( ! No_Device_Found(tr("bzImage"), tmp_vm->Get_bzImage_Path(), VM::Boot_None) ) { return false; } else { ui.CH_Use_Linux_Boot->setChecked( false ); tmp_vm->Set_Use_Linux_Boot( false ); } } if( ! QFile::exists(tmp_vm->Get_Initrd_Path()) ) { if( ! No_Device_Found(tr("Initrd"), tmp_vm->Get_Initrd_Path(), VM::Boot_None) ) { return false; } else { ui.CH_Use_Linux_Boot->setChecked( false ); tmp_vm->Set_Use_Linux_Boot( false ); } } } // ROM File if( tmp_vm->Get_Use_ROM_File() ) { if( ! QFile::exists(tmp_vm->Get_ROM_File()) ) { if( ! No_Device_Found(tr("ROM File"), tmp_vm->Get_ROM_File(), VM::Boot_None) ) { return false; } else { ui.CH_ROM_File->setChecked( false ); tmp_vm->Set_Use_ROM_File( false ); } } } // On-Board Flash Image if( tmp_vm->Use_MTDBlock_File() ) { if( ! QFile::exists(tmp_vm->Get_MTDBlock_File()) ) { if( ! No_Device_Found(tr("On-Board Flash"), tmp_vm->Get_MTDBlock_File(), VM::Boot_None) ) { return false; } else { ui.CH_MTDBlock->setChecked( false ); tmp_vm->Use_MTDBlock_File( false ); } } } // SecureDigital Card Image if( tmp_vm->Use_SecureDigital_File() ) { if( ! QFile::exists(tmp_vm->Get_SecureDigital_File()) ) { if( ! No_Device_Found(tr("SecureDigital Card"), tmp_vm->Get_SecureDigital_File(), VM::Boot_None) ) { return false; } else { ui.CH_SD_Image->setChecked( false ); tmp_vm->Use_SecureDigital_File( false ); } } } // Parallel Flash Image if( tmp_vm->Use_PFlash_File() ) { if( ! QFile::exists(tmp_vm->Get_PFlash_File()) ) { if( ! No_Device_Found(tr("Parallel Flash"), tmp_vm->Get_PFlash_File(), VM::Boot_None) ) { return false; } else { ui.CH_PFlash->setChecked( false ); tmp_vm->Use_PFlash_File( false ); } } } // VNC Sertificates if( tmp_vm->Use_VNC() && tmp_vm->Use_VNC_TLS() ) { if( tmp_vm->Use_VNC_x509() ) { if( ! QFile::exists(tmp_vm->Get_VNC_x509_Folder_Path()) ) { if( ! No_Device_Found(tr("VNC x509 Folder"), tmp_vm->Get_VNC_x509_Folder_Path(), VM::Boot_None) ) { return false; } else { ui.CH_Use_VNC_TLS->setChecked( false ); tmp_vm->Use_VNC_x509( false ); } } } if( tmp_vm->Use_VNC_x509verify() ) { if( ! QFile::exists(tmp_vm->Get_VNC_x509verify_Folder_Path()) ) { if( ! No_Device_Found(tr("VNC x509verify Folder"), tmp_vm->Get_VNC_x509verify_Folder_Path(), VM::Boot_None) ) { return false; } else { ui.CH_Use_VNC_TLS->setChecked( false ); tmp_vm->Use_VNC_x509verify( false ); } } } } // Boot is correct? QList bootOrderList = tmp_vm->Get_Boot_Order_List(); bool foundEnabledDevice = false; for( int bx = 0; bx < bootOrderList.count(); bx++ ) { if( bootOrderList[bx].Enabled ) { foundEnabledDevice = true; switch( bootOrderList[bx].Type ) { case VM::Boot_From_FDA: if( tmp_vm->Get_FD0().Get_Enabled() ) return true; break; case VM::Boot_From_FDB: if( tmp_vm->Get_FD1().Get_Enabled() ) return true; break; case VM::Boot_From_CDROM: if( tmp_vm->Get_CD_ROM().Get_Enabled() ) return true; break; case VM::Boot_From_HDD: if( tmp_vm->Get_HDA().Get_Enabled() ) return true; break; case VM::Boot_From_Network1: case VM::Boot_From_Network2: case VM::Boot_From_Network3: case VM::Boot_From_Network4: if( tmp_vm->Get_Use_Network() ) return true; break; default: break; } } } if( foundEnabledDevice ) { AQGraphic_Warning( tr("Error!"), tr("No boot device found!") ); return false; } else return true; // boot device type: None } bool Main_Window::No_Device_Found( const QString &name, const QString &path, VM::Boot_Device type ) { int retVal = QMessageBox::critical( this, tr("Error!"), tr("%1 Image \"%2\" doesn't Exist! Continue Without this Image?").arg(name).arg(path), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( retVal == QMessageBox::No ) return false; else { if( ui.Machines_List->currentRow() >= 0 && ui.Machines_List->currentRow() < VM_List.count() ) { Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "bool Main_Window::No_Device_Found( const QString &name, const QString &path, VM::Boot_Device type )", "cur_vm == NULL" ); return false; } cur_vm->Save_VM(); } return true; } } void Main_Window::on_actionChange_Icon_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionChange_Icon_triggered()", "cur_vm == NULL" ); return; } Select_Icon_Window icon_win( this ); icon_win.Set_Previous_Icon_Path( cur_vm->Get_Icon_Path() ); if( QDialog::Accepted == icon_win.exec() ) { if( ! icon_win.Get_New_Icon_Path().isEmpty() ) { ui.Machines_List->currentItem()->setIcon( QIcon(icon_win.Get_New_Icon_Path()) ); ui.Machines_List->currentItem()->setData( 128, icon_win.Get_New_Icon_Path() ); } Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionChange_Icon_triggered()", "cur_vm == NULL" ); return; } cur_vm->Set_Icon_Path( icon_win.Get_New_Icon_Path() ); cur_vm->Save_VM(); } } void Main_Window::on_actionAbout_AQEMU_triggered() { About_Window( this ).exec(); } void Main_Window::on_actionAbout_Qt_triggered() { QApplication::aboutQt(); } void Main_Window::on_actionDelete_VM_triggered() { if( VM_List.count() <= 0 ) return; if( ui.Machines_List->currentRow() < 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionDelete_VM_triggered()", "cur_vm == NULL" ); return; } int mes_ret = QMessageBox::question( this, tr("Delete?"), tr("Delete \"") + cur_vm->Get_Machine_Name() + tr("\" VM?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( mes_ret == QMessageBox::Yes ) { if( QFile::remove(cur_vm->Get_VM_XML_File_Path()) ) { QString uid = ui.Machines_List->currentItem()->data( 256 ).toString(); ui.Machines_List->takeItem( ui.Machines_List->currentRow() ); for( int ix = 0; ix < VM_List.count(); ix++ ) { if( uid == VM_List[ix]->Get_UID() ) { delete VM_List[ix]; VM_List.removeAt(ix); } } } else { AQGraphic_Error( "void Main_Window::on_actionDelete_Virtual_Machine_triggered()", tr("Error!"), tr("Cannot Delete VM XML File!"), false ); } } if( VM_List.count() <= 0 ) { ui.actionPower_On->setEnabled( false ); ui.actionSave->setEnabled( false ); ui.actionPause->setEnabled( false ); ui.actionPower_Off->setEnabled( false ); ui.actionReset->setEnabled( false ); ui.Button_Apply->setEnabled( false ); ui.Button_Cancel->setEnabled( false ); Set_Widgets_State( false ); Update_Info_Text( 1 ); } } void Main_Window::on_actionDelete_VM_And_Files_triggered() { if( VM_List.count() <= 0 ) return; if( ui.Machines_List->currentRow() < 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionDelete_VM_And_Files_triggered()", "cur_vm == NULL" ); return; } Delete_VM_Files_Window del_win( cur_vm ); if( del_win.exec() == QDialog::Accepted ) { // Delete VM QString uid = ui.Machines_List->currentItem()->data( 256 ).toString(); ui.Machines_List->takeItem( ui.Machines_List->currentRow() ); for( int ix = 0; ix < VM_List.count(); ix++ ) { if( uid == VM_List[ix]->Get_UID() ) VM_List.removeAt( ix ); } // No VMs More? if( VM_List.count() <= 0 ) { ui.actionPower_On->setEnabled( false ); ui.actionSave->setEnabled( false ); ui.actionPause->setEnabled( false ); ui.actionPower_Off->setEnabled( false ); ui.actionReset->setEnabled( false ); ui.Button_Apply->setEnabled( false ); ui.Button_Cancel->setEnabled( false ); Set_Widgets_State( false ); Update_Info_Text( 1 ); } } } void Main_Window::on_actionExit_triggered() { close(); } void Main_Window::on_actionShow_New_VM_Wizard_triggered() { VM_Wizard_Window Wizard_Win; Wizard_Win.Set_VM_List( &VM_List ); if( Wizard_Win.exec() == QDialog::Accepted ) { Virtual_Machine *vm = Wizard_Win.New_VM; vm->Set_UID( QUuid::createUuid().toString() ); // Create UID VM_List << vm; QObject::connect( vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); QListWidgetItem *item = new QListWidgetItem( vm->Get_Machine_Name(), ui.Machines_List ); item->setIcon( QIcon(vm->Get_Icon_Path()) ); item->setData( 256, vm->Get_UID() ); ui.Machines_List->setCurrentItem( item ); Update_VM_Ui(); on_Button_Apply_clicked(); } } void Main_Window::on_actionAdd_New_VM_triggered() { on_actionShow_New_VM_Wizard_triggered(); } void Main_Window::on_actionCreate_HDD_Image_triggered() { Create_HDD_Image_Window Create_HDD_Win( this ); Create_HDD_Win.exec(); } void Main_Window::on_actionConvert_HDD_Image_triggered() { Convert_HDD_Image_Window Convert_HDD_Win( this ); Convert_HDD_Win.exec(); } void Main_Window::on_actionShow_Advanced_Settings_Window_triggered() { Advanced_Settings_Window ad_set; if( ad_set.exec() == QDialog::Accepted ) { Save_Settings(); // Use Log if( Settings.value( "Log/Save_In_File", "yes" ).toString() == "yes" ) AQUse_Log( true ); else AQUse_Log( false ); // Log File Name AQLog_Path( Settings.value("Log/Log_Path", "").toString() ); // Log Filter AQUse_Debug_Output( Settings.value("Log/Print_In_STDOUT", "yes").toString() == "yes", Settings.value("Log/Save_Debug","no").toString() == "yes", Settings.value("Log/Save_Warning","yes").toString() == "yes", Settings.value("Log/Save_Error","yes").toString() == "yes" ); // Emulators Information Changed? QList tmpEmulatorsList = Get_Emulators_List(); if( tmpEmulatorsList != All_Emulators_List ) { Save_Or_Discard(true); // Update Emulators Information All_Emulators_List = Get_Emulators_List(); GUI_User_Mode = true; Apply_Emulator( 0 ); bool q = false, k = false; for( int ix = 0; ix < ui.CB_Machine_Accelerator->count(); ix++ ) { if( ui.CB_Machine_Accelerator->itemText(ix) == "TCG" ) q = true; else if( ui.CB_Machine_Accelerator->itemText(ix) == "KVM" ) k = true; } for( int ix = 0; ix < VM_List.count(); ix++ ) { QString type = (VM_List[ ix ]->Get_Machine_Accelerator() == VM::TCG ? "TCG" : "KVM"); if( type == "TCG" && q == false ) VM_List[ix]->Set_State( VM::VMS_In_Error ); else if( type == "KVM" && k == false ) VM_List[ix]->Set_State( VM::VMS_In_Error ); else { if( VM_List[ix]->Get_State() == VM::VMS_In_Error ) { if( (type == "TCG" && q == true) || (type == "KVM" && k == true) ) { VM_List[ ix ]->Update_Current_Emulator_Devices(); VM_List[ ix ]->Set_State( VM::VMS_Power_Off ); VM_List[ ix ]->Save_VM(); VM_List[ ix ]->Load_VM( VM_List[ix]->Get_VM_XML_File_Path() ); } } } } Load_Settings(); Update_VM_Ui(); } else { // Update text in tab Info Update_Info_Text(); } // Old/Merged Settings Window bool apply_enabled = ui.Button_Apply->isEnabled(); bool cancel_enabled = ui.Button_Cancel->isEnabled(); if( QDir::toNativeSeparators(Settings.value("VM_Directory", "~").toString()) != VM_Folder ) { Save_Or_Discard(true); // Apply Settings Load_Settings(); // Clear old vm's VM_List.clear(); ui.Machines_List->clear(); // Load new vm's Load_Virtual_Machines(); return; } else { // Apply Settings Load_Settings(); } // Update Icons for( int ix = 0; ix < VM_List.count(); ++ix ) { Virtual_Machine *tmp_vm = Get_VM_By_UID( ui.Machines_List->item(ix)->data(256).toString() ); if( tmp_vm == NULL ) { AQError( "void Main_Window::on_actionShow_Settings_Window_triggered()", "tmp_vm == NULL" ); continue; } if( tmp_vm->Get_State() == VM::VMS_Saved && Settings.value("Use_Screenshot_for_OS_Logo", "yes").toString() == "yes" ) { ui.Machines_List->item(ix)->setIcon( QIcon(tmp_vm->Get_Screenshot_Path()) ); ui.Machines_List->item(ix)->setData( 128, tmp_vm->Get_Screenshot_Path() ); } else { ui.Machines_List->item(ix)->setIcon( QIcon(tmp_vm->Get_Icon_Path()) ); ui.Machines_List->item(ix)->setData( 128, tmp_vm->Get_Icon_Path() ); } } // Adapted from old/merged Settings Window code, but this is/was a hack, // so the code above should at some time be rewritten to make the next // two lines obsolete ui.Button_Apply->setEnabled( apply_enabled ); ui.Button_Cancel->setEnabled( cancel_enabled ); } } void Main_Window::on_actionShow_First_Run_Wizard_triggered() { if ( ! Save_Or_Discard() ) return; First_Start_Wizard first_start_win( this ); if( first_start_win.exec() == QDialog::Accepted ) { // Update Emulator List if( Update_Emulators_List() ) { All_Emulators_List = Get_Emulators_List(); GUI_User_Mode = true; Apply_Emulator( 0 ); // Apply Settings Load_Settings(); // Clear old vm's VM_List.clear(); ui.Machines_List->clear(); // Load new vm's Load_Virtual_Machines(); } } } // return false on error or when the user cancels bool Main_Window::Save_Or_Discard(bool forced) { if( ui.Machines_List->count() == 0 ) return true; std::unique_ptr tmp_vm(new Virtual_Machine()); Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::Save_Or_Discard()", "cur_vm == NULL" ); return false; } if( Create_VM_From_Ui(tmp_vm.get(), cur_vm) == false ) { AQError( "void Main_Window::Save_Or_Discard()", "Cannot Create VM From Ui!" ); return false; } else { //something must have been changed if( *tmp_vm.get() != *cur_vm ) { QMessageBox msgBox; msgBox.setWindowTitle(tr("The VM was modified")); msgBox.setText(tr("The VM")+" "+cur_vm->Get_Machine_Name()+" "+("was modified.")); msgBox.setInformativeText(tr("Do you want to save your changes?")); if ( forced ) msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); else msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if ( forced ) msgBox.setDefaultButton(QMessageBox::Yes); else msgBox.setDefaultButton(QMessageBox::Cancel); int mes_res = msgBox.exec(); if( mes_res == QMessageBox::Yes ) { disconnect( cur_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); *cur_vm = *tmp_vm.get(); cur_vm->Save_VM(); Update_VM_Ui(); connect( cur_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); } else if ( mes_res == QMessageBox::No ) { // discard changes Update_VM_Ui(); } else //cancel { return false; } } } return true; } void Main_Window::on_actionPower_On_triggered() { if ( ! Save_Or_Discard() ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( ! Boot_Is_Correct(cur_vm) ) return; if( cur_vm->Start() ) { // VNC Password if( cur_vm->Use_VNC_Password() ) { VNC_Password_Window vnc_pas_win; if( vnc_pas_win.exec() == QDialog::Accepted ) cur_vm->Set_VNC_Password( vnc_pas_win.Get_Password() ); } } else { AQError( "void Main_Window::on_action_Power_On_triggered()", "Cannot Start VM!" ); } } void Main_Window::on_actionSave_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionSave_triggered()", "cur_vm == NULL" ); return; } if( cur_vm->Use_Snapshot_Mode() ) { AQGraphic_Warning( tr("Warning!"), tr("QEMU running in snapshot mode. VM can not be saved in this mode.") ); return; } if( Settings.value("Info/Show_Screenshot_in_Save_Mode", "no").toString() == "yes" ) { Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionSave_triggered()", "cur_vm == NULL" ); return; } QString img_path = QDir::toNativeSeparators( Settings.value("VM_Directory", "~" ).toString() + Get_FS_Compatible_VM_Name(cur_vm->Get_Machine_Name()) + "_screenshot" ); cur_vm->Take_Screenshot( img_path ); } cur_vm->Save_VM_State(); } void Main_Window::on_actionPower_Off_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionPower_Off_triggered()", "cur_vm == NULL" ); return; } if( QMessageBox::question(this, tr("Are you sure?"), tr("Shutdown VM \"%1\"?").arg(cur_vm->Get_Machine_Name()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No ) { return; } cur_vm->Stop(); } void Main_Window::on_actionPause_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionPause_triggered()", "cur_vm == NULL" ); return; } cur_vm->Pause(); } void Main_Window::on_actionReset_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionReset_triggered()", "cur_vm == NULL" ); return; } if( QMessageBox::question(this, tr("Are you sure?"), tr("Reboot VM \"%1\"?").arg(cur_vm->Get_Machine_Name()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No ) { return; } cur_vm->Reset(); } void Main_Window::on_actionLoad_VM_From_File_triggered() { QString load_path = QFileDialog::getOpenFileName( this, tr("Open AQEMU VM File"), QDir::homePath(), tr("AQEMU VM (*.aqemu)") ); if( ! QFile::exists(load_path) ) return; load_path = QDir::toNativeSeparators( load_path ); // ok file name valid QFileInfo vm_file( load_path ); QString new_file_path = QDir::toNativeSeparators( Settings.value("VM_Directory", "~").toString() + vm_file.fileName() ); if( QFile::exists(new_file_path) ) { AQGraphic_Warning( tr("Warning"), tr("VM With This Name Already Exists!") ); return; } QFile::copy( load_path, new_file_path ); Virtual_Machine *new_vm = new Virtual_Machine(); new_vm->Load_VM( QDir::toNativeSeparators(Settings.value("VM_Directory", "~").toString() + vm_file.fileName()) ); new_vm->Set_UID( QUuid::createUuid().toString() ); // Create UID VM_List << new_vm; connect( new_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); QListWidgetItem *item = new QListWidgetItem( new_vm->Get_Machine_Name(), ui.Machines_List ); item->setIcon( QIcon(new_vm->Get_Icon_Path()) ); item->setData( 256, new_vm->Get_UID() ); ui.Machines_List->setCurrentItem( item ); //ui.Machines_List->setCurrentRow( ui.Machines_List->count()-1 ); Update_VM_Ui(); } void Main_Window::on_actionCopy_triggered() { Copy_VM_Window copy_win; // Create Machine Name List for( int ix = 0; ix < VM_List.count(); ++ix ) { copy_win.Add_VM_Machine_Name( VM_List[ix]->Get_Machine_Name() ); } if( copy_win.exec() == QDialog::Accepted ) { // Copy VM Object Virtual_Machine *new_vm = Get_Current_VM(); if( new_vm == NULL ) { AQError( "void Main_Window::on_actionCopy_triggered()", "cur_vm == NULL" ); return; } new_vm->Set_Machine_Name( copy_win.Get_New_VM_Name() ); new_vm->Set_VM_XML_File_Path( Get_Complete_VM_File_Path(copy_win.Get_New_VM_Name()) ); // Copy Disk Images if( copy_win.Get_Copy_Disk_Images() ) { // Copy Floppy Images if( copy_win.Get_Copy_Floppy() ) { if( new_vm->Get_FD0().Get_Enabled() ) { new_vm->Set_FD0( VM_Storage_Device(true, Copy_VM_Floppy(new_vm->Get_Machine_Name(), "FD0", new_vm->Get_FD0())) ); } if( new_vm->Get_FD1().Get_Enabled() ) { new_vm->Set_FD1( VM_Storage_Device(true, Copy_VM_Floppy(new_vm->Get_Machine_Name(), "FD1", new_vm->Get_FD1())) ); } } // Copy Hard Drive Images if( copy_win.Get_Copy_Hard_Drive() ) { if( new_vm->Get_HDA().Get_Enabled() ) { new_vm->Set_HDA( VM_HDD( true, Copy_VM_Hard_Drive(new_vm->Get_Machine_Name(), "HDA", new_vm->Get_HDA()) ) ); } if( new_vm->Get_HDB().Get_Enabled() ) { new_vm->Set_HDB( VM_HDD( true, Copy_VM_Hard_Drive(new_vm->Get_Machine_Name(), "HDB", new_vm->Get_HDB()) ) ); } if( new_vm->Get_HDC().Get_Enabled() ) { new_vm->Set_HDC( VM_HDD( true, Copy_VM_Hard_Drive(new_vm->Get_Machine_Name(), "HDC", new_vm->Get_HDC()) ) ); } if( new_vm->Get_HDD().Get_Enabled() ) { new_vm->Set_HDD( VM_HDD( true, Copy_VM_Hard_Drive(new_vm->Get_Machine_Name(), "HDD", new_vm->Get_HDD()) ) ); } } } // Add New VM new_vm->Set_UID( QUuid::createUuid().toString() ); // Create UID VM_List << new_vm; connect( new_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); QListWidgetItem *item = new QListWidgetItem( new_vm->Get_Machine_Name(), ui.Machines_List ); item->setIcon( QIcon(new_vm->Get_Icon_Path()) ); item->setData( 256, new_vm->Get_UID() ); ui.Machines_List->setCurrentItem( item ); //ui.Machines_List->setCurrentRow( ui.Machines_List->count()-1 ); Update_VM_Ui(); on_Button_Apply_clicked(); } } void Main_Window::on_actionSave_As_Template_triggered() { Create_Template_Window templ_win; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionSave_As_Template_triggered()", "cur_vm == NULL" ); return; } if( VM_List.count() > 0 ) templ_win.Set_VM_Path( cur_vm->Get_VM_XML_File_Path() ); if( templ_win.exec() == QDialog::Accepted ) QMessageBox::information( this, tr("Information"), tr("New Template Created!") ); } void Main_Window::on_actionShow_Emulator_Control_triggered() { if( VM_List.count() < 0 || ui.Machines_List->currentRow() < 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionShow_Emulator_Control_triggered()", "cur_vm == NULL" ); return; } if( cur_vm->Get_State() == VM::VMS_Running || cur_vm->Get_State() == VM::VMS_Pause ) { // Emulator Control is Visible? if( (Settings.value("Use_VNC_Display", "no").toString() == "yes" && ui.Tabs->tabText(0) == tr("Display")) ) { AQGraphic_Warning( tr("Warning"), tr("Emulator Control Already Show") ); } else { cur_vm->Show_Emu_Ctl_Win(); } } else { AQGraphic_Warning( tr("Warning"), tr("This Feature Works Only With A Running VM!") ); } } void Main_Window::on_actionManage_Snapshots_triggered() { if( VM_List.count() < 0 || ui.Machines_List->currentRow() < 0 ) { return; } Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionManage_Snapshots_triggered()", "cur_vm == NULL" ); return; } Snapshots_Window snapshot_win( this ); snapshot_win.Set_VM( cur_vm ); snapshot_win.exec(); } void Main_Window::on_actionShow_QEMU_Arguments_triggered() { if( VM_List.count() > 0 ) QMessageBox::information( this, tr("QEMU Arguments:"), Get_QEMU_Args().replace(" -"," \\\n -") ); else QMessageBox::information( this, tr("QEMU Arguments:"), tr("No VM Found!") ); } void Main_Window::on_actionCreate_Shell_Script_triggered() { if( VM_List.count() <= 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionCreate_Shell_Script_triggered()", "cur_vm == NULL" ); return; } QString script_code = "#!/bin/sh\n# This script created by AQEMU\n" + Get_Current_Binary_Name(); QStringList all_args = cur_vm->Build_QEMU_Args_For_Script(); for( int ix = 0; ix < all_args.count(); ix++ ) script_code += " " + all_args[ ix ]; script_code = script_code.remove( "-monitor stdio" ); // Save Script QString selectedFilter = ""; QString fileName = QFileDialog::getSaveFileName( this, tr("Save VM to Script"), "VM_" + Get_FS_Compatible_VM_Name(cur_vm->Get_Machine_Name()), tr("Shell Script Files (*.sh);;All Files (*)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); // Save to File if( selectedFilter.indexOf("(*.sh)") >= 0 && fileName.endsWith(".sh") == false ) { fileName += ".sh"; } QFile scriptFile( fileName ); if( ! scriptFile.open(QIODevice::WriteOnly | QIODevice::Text) ) { AQGraphic_Error( "void Main_Window::on_actionCreate_Shell_Script_triggered()", tr("Error!"), tr("Cannot Open File!") ); return; } QTextStream out( &scriptFile ); out << script_code << " $*\n"; // Set File Permissions scriptFile.setPermissions( scriptFile.permissions() | QFile::ExeOwner | QFile::ExeUser ); } } void Main_Window::on_actionShow_QEMU_Error_Log_Window_triggered() { if( VM_List.count() < 0 || ui.Machines_List->currentRow() < 0 ) return; Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_actionShow_QEMU_Error_Log_Window_triggered()", "cur_vm == NULL" ); return; } cur_vm->Show_Error_Log_Window(); } void Main_Window::on_Memory_Size_valueChanged( int value ) { int cursorPos = ui.CB_RAM_Size->lineEdit()->cursorPosition(); if( value % 1024 == 0 ) ui.CB_RAM_Size->setEditText( QString("%1 GB").arg(value / 1024) ); else ui.CB_RAM_Size->setEditText( QString("%1 MB").arg(value) ); ui.CB_RAM_Size->lineEdit()->setCursorPosition( cursorPos ); } void Main_Window::on_CB_RAM_Size_editTextChanged( const QString &text ) { if( text.isEmpty() ) return; QRegExp rx( "\\s*([\\d]+)\\s*(MB|GB|M|G|)\\s*" ); // like: 512MB or 512 if( ! rx.exactMatch(text.toUpper()) ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to memory size!").arg(text) ); return; } QStringList ramStrings = rx.capturedTexts(); if( ramStrings.count() != 3 ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to memory size!").arg(text) ); return; } bool ok = false; int value = ramStrings[1].toInt( &ok, 10 ); if( ! ok ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to integer!").arg(ramStrings[1]) ); return; } if( ramStrings[2] == "MB" || ramStrings[2] == "M" || ramStrings[2] == "" ); // Size in megabytes else if( ramStrings[2] == "GB" || ramStrings[2] == "G" ) value *= 1024; else { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to size suffix! Valid suffixes are: MB, GB").arg(ramStrings[2]) ); return; } if( value <= 0 ) { AQGraphic_Warning( tr("Error"), tr("Memory size < 0! Valid size is 1 or more") ); return; } on_TB_Update_Available_RAM_Size_clicked(); if( (value > ui.Memory_Size->maximum()) && (ui.CH_Remove_RAM_Size_Limitation->isChecked() == false) ) { AQGraphic_Warning( tr("Error"), tr("Your memory size %1 MB > %2 MB - all free RAM on this system!\n" "To set this value, check \"Remove limitation on maximum amount of memory\".") .arg(value).arg(ui.Memory_Size->maximum()) ); on_Memory_Size_valueChanged( ui.Memory_Size->value() ); // Set valid size return; } // All OK. Set memory size ui.Memory_Size->setValue( value ); } void Main_Window::on_CH_Remove_RAM_Size_Limitation_stateChanged( int state ) { if( state == Qt::Checked ) { ui.Memory_Size->setMaximum( 32768 ); ui.Label_Available_Free_Memory->setText( "32 GB" ); Update_RAM_Size_ComboBox( 32768 ); } else { int allRAM = 0, freeRAM = 0; System_Info::Get_Free_Memory_Size( allRAM, freeRAM ); if( allRAM < ui.Memory_Size->value() ) AQGraphic_Warning( tr("Error"), tr("Current memory size more of all host memory!\nUse the maximum available size.") ); ui.Memory_Size->setMaximum( allRAM ); ui.Label_Available_Free_Memory->setText( QString("%1 MB").arg(allRAM) ); Update_RAM_Size_ComboBox( allRAM ); } } void Main_Window::on_TB_Update_Available_RAM_Size_clicked() { int allRAM = 0, freeRAM = 0; System_Info::Get_Free_Memory_Size( allRAM, freeRAM ); ui.TB_Update_Available_RAM_Size->setText( tr("Free memory: %1 MB").arg(freeRAM) ); if( ! ui.CH_Remove_RAM_Size_Limitation->isChecked() ) { ui.Memory_Size->setMaximum( allRAM ); Update_RAM_Size_ComboBox( allRAM ); } } void Main_Window::Update_RAM_Size_ComboBox( int freeRAM ) { static int oldRamSize = 0; if( freeRAM == oldRamSize ) return; else oldRamSize = freeRAM; QStringList ramSizes; ramSizes << "32 MB" << "64 MB" << "128 MB" << "256 MB" << "512 MB" << "1 GB" << "2 GB" << "3 GB" << "4 GB" << "8 GB" << "16 GB" << "32 GB"; int maxRamIndex = 0; if( freeRAM >= 32768 ) maxRamIndex = 12; else if( freeRAM >= 16384 ) maxRamIndex = 11; else if( freeRAM >= 8192 ) maxRamIndex = 10; else if( freeRAM >= 4096 ) maxRamIndex = 9; else if( freeRAM >= 3072 ) maxRamIndex = 8; else if( freeRAM >= 2048 ) maxRamIndex = 7; else if( freeRAM >= 1024 ) maxRamIndex = 6; else if( freeRAM >= 512 ) maxRamIndex = 5; else if( freeRAM >= 256 ) maxRamIndex = 4; else if( freeRAM >= 128 ) maxRamIndex = 3; else if( freeRAM >= 64 ) maxRamIndex = 2; else if( freeRAM >= 32 ) maxRamIndex = 1; else { AQGraphic_Warning( tr("Error"), tr("Free memory on this system is less than 32 MB!") ); return; } if( maxRamIndex > ramSizes.count() ) { AQError( "void Main_Window::Update_RAM_Size_ComboBox( int freeRAM )", "maxRamIndex > ramSizes.count()" ); return; } QString oldText = ui.CB_RAM_Size->currentText(); ui.CB_RAM_Size->clear(); for( int ix = 0; ix < maxRamIndex; ix++ ) ui.CB_RAM_Size->addItem( ramSizes[ix] ); ui.CB_RAM_Size->setEditText( oldText ); } QStringList Main_Window::Create_Info_HDD_String( const QString &disk_format, const VM::Device_Size &virtual_size, const VM::Device_Size &disk_size, int cluster_size ) { QString suf_v = Get_TR_Size_Suffix( virtual_size ); QString suf_d = Get_TR_Size_Suffix( disk_size ); QStringList ret; ret << tr("Image Format: ") + disk_format + "\n" + tr("Allocated Disk Space: ") + QString::number(disk_size.Size) + " " + suf_d; ret << tr("Virtual Size: ") + QString::number(virtual_size.Size) + " " + suf_v + "\n" + tr("Cluster Size: ") + QString::number(cluster_size); return ret; } void Main_Window::on_CB_Computer_Type_currentIndexChanged( int index ) { Computer_Type_Changed(); } void Main_Window::on_CB_Machine_Accelerator_currentIndexChanged( int index ) { Apply_Emulator( 1 ); } void Main_Window::Computer_Type_Changed() { bool devOk = false; Available_Devices curComp; int comp_index = 0; comp_index = ui.CB_Computer_Type->currentIndex(); if( comp_index < 0 ) { AQDebug("index below 00000","asdf"); return; } QStringList cl; ui_arch.CB_CPU_Type->blockSignals(true); ui_arch.CB_Machine_Type->blockSignals(true); ui.CB_Video_Card->blockSignals(true); // CPU ui_arch.CB_CPU_Type->clear(); cl = QStringList(); curComp = Get_Current_Machine_Devices( &devOk ); if( ! devOk ) return; for( int mx = 0; mx < curComp.CPU_List.count(); ++mx ) cl << curComp.CPU_List[mx].Caption; ui_arch.CB_CPU_Type->addItems( cl ); // Machine ui_arch.CB_Machine_Type->clear(); cl = QStringList(); for( int mx = 0; mx < curComp.Machine_List.count(); ++mx ) cl << curComp.Machine_List[mx].Caption; ui_arch.CB_Machine_Type->addItems( cl ); // Video ui.CB_Video_Card->clear(); cl = QStringList(); for( int vx = 0; vx < curComp.Video_Card_List.count(); ++vx ) cl << curComp.Video_Card_List[vx].Caption; ui.CB_Video_Card->addItems( cl ); // Use Nativ Network Cards FIXME set emulator PSO to net card widget if( ui.RB_Network_Mode_New->isChecked() ) New_Network_Settings_Widget->Set_Network_Card_Models( curComp.Network_Card_List ); else Old_Network_Settings_Widget->Set_Network_Card_Models( curComp.Network_Card_List ); // Audio ui.CH_sb16->setEnabled( curComp.Audio_Card_List.Audio_sb16 ); ui.CH_es1370->setEnabled( curComp.Audio_Card_List.Audio_es1370 ); ui.CH_Adlib->setEnabled( curComp.Audio_Card_List.Audio_Adlib ); ui.CH_AC97->setEnabled( curComp.Audio_Card_List.Audio_AC97 ); ui.CH_GUS->setEnabled( curComp.Audio_Card_List.Audio_GUS ); ui.CH_PCSPK->setEnabled( curComp.Audio_Card_List.Audio_PC_Speaker ); ui.CH_HDA->setEnabled( curComp.Audio_Card_List.Audio_HDA ); ui.CH_cs4231a->setEnabled( curComp.Audio_Card_List.Audio_cs4231a ); ui_arch.CB_CPU_Type->blockSignals(false); ui_arch.CB_Machine_Type->blockSignals(false); ui.CB_Video_Card->blockSignals(false); // Other Options Update_Disabled_Controls(); } void Main_Window::Update_Machine_Accelerators() { ui.CB_Machine_Accelerator->blockSignals(true); ui.CB_Machine_Accelerator->clear(); ui.CB_Machine_Accelerator->addItem( tr("TCG") ); ui.CB_Machine_Accelerator->addItem( tr("KVM") ); ui.CB_Machine_Accelerator->addItem( tr("XEN") ); ui.CB_Machine_Accelerator->blockSignals(false); } void Main_Window::Update_Accelerator_Options() { if (ui.CB_Machine_Accelerator->currentText() == "KVM" ) ui.TB_Show_Accelerator_Options_Window->setEnabled(true); else ui.TB_Show_Accelerator_Options_Window->setEnabled(false); } void Main_Window::Update_Computer_Types() { QMap current_devices; bool devOk = false; current_devices = Get_Devices_Info( &devOk ); if( ! devOk ) return; QString text = ui.CB_Computer_Type->currentText(); ui.CB_Computer_Type->blockSignals(true); ui.CB_Computer_Type->clear(); for( QMap::const_iterator i = current_devices.constBegin(); i != current_devices.constEnd(); i++ ) { ui.CB_Computer_Type->addItem( i->System.Caption ); } ui.CB_Computer_Type->setCurrentText(text); bool only_native = false; if (ui.CB_Machine_Accelerator->currentText() == "KVM" || ui.CB_Machine_Accelerator->currentText() == "XEN" ) { only_native = true; } auto model = qobject_cast(ui.CB_Computer_Type->model()); for ( int i = 0; i < model->rowCount(); i++) { auto item = model->item(i); if ( item->text() == "IBM PC 64Bit" ) //FIXME: shouldn't be hardcoded { if (only_native) ui.CB_Computer_Type->setCurrentText(item->text()); continue; } item->setFlags(only_native ? item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled) : (Qt::ItemIsSelectable|Qt::ItemIsEnabled)); // visually disable by greying out - works only if combobox has been // painted already and palette returns the wanted color item->setData(only_native ? ui.CB_Computer_Type->palette().color(QPalette::Disabled, QPalette::Text) : QVariant(), // clear item data in order to use default color Qt::TextColorRole); } ui.CB_Computer_Type->blockSignals(false); } void Main_Window::Apply_Emulator( int mode ) { // FIXME //static bool firstRun = true; static bool running = false; if( GUI_User_Mode == false ) return; //if( running == true && firstRun == false ) return; //firstRun = false; if( running == true ) return; running = true; switch( mode ) { case 0: // Machine Accelerators Update_Machine_Accelerators(); case 1: Update_Accelerator_Options(); case 2: // Computer Type Update_Computer_Types(); case 3: Computer_Type_Changed(); break; default: AQWarning( "void Main_Window::Apply_Emulator( int mode )", "Default Section!" ); break; } VM_Changed(); running = false; } void Main_Window::CB_Boot_Priority_currentIndexChanged( int index ) { // Clear old string if( ui.CB_Boot_Priority->count() >= 5 ) ui.CB_Boot_Priority->removeItem( 5 ); VM::Boot_Device bootDev; switch( ui.CB_Boot_Priority->currentIndex() ) { case 0: bootDev = VM::Boot_From_FDA; break; case 1: bootDev = VM::Boot_From_HDD; break; case 2: bootDev = VM::Boot_From_CDROM; break; case 3: bootDev = VM::Boot_From_Network1; break; case 4: bootDev = VM::Boot_None; break; default: AQWarning( "void Main_Window::on_CB_Boot_Priority_currentIndexChanged( int index )", "Use Default Boot Device: CD-ROM" ); bootDev = VM::Boot_From_CDROM; break; } for( int bx = 0; bx < Boot_Order_List.count(); bx++ ) { if( Boot_Order_List[bx].Type == bootDev ) Boot_Order_List[ bx ].Enabled = true; else Boot_Order_List[ bx ].Enabled = false; } VM_Changed(); } void Main_Window::Set_Boot_Order( const QList &list ) { disconnect( ui.CB_Boot_Priority, SIGNAL(currentIndexChanged(int)), this, SLOT(CB_Boot_Priority_currentIndexChanged(int)) ); QStringList bootStr; for( int ix = 0; ix < list.count(); ix++ ) { if( list[ix].Enabled ) { switch( list[ix].Type ) { case VM::Boot_From_FDA: bootStr << "FDA"; break; case VM::Boot_From_FDB: bootStr << "FDB"; break; case VM::Boot_From_CDROM: bootStr << "CDROM"; break; case VM::Boot_From_HDD: bootStr << "HDD"; break; case VM::Boot_From_Network1: bootStr << "Net1"; break; case VM::Boot_From_Network2: bootStr << "Net2"; break; case VM::Boot_From_Network3: bootStr << "Net3"; break; case VM::Boot_From_Network4: bootStr << "Net4"; break; default: AQWarning( "void Main_Window::Set_Boot_Order( QList &list )", "Incorrect boot device type!" ); break; } } } // Clear old string if( ui.CB_Boot_Priority->count() >= 5 ) ui.CB_Boot_Priority->removeItem( 5 ); // Select boot device if( bootStr.count() < 1 ) // None { ui.CB_Boot_Priority->setCurrentIndex( 4 ); } else if( bootStr.count() == 1 ) // One { if( bootStr[0] == "FDA" || bootStr[0] == "FDB" ) ui.CB_Boot_Priority->setCurrentIndex( 0 ); else if( bootStr[0] == "CDROM" ) ui.CB_Boot_Priority->setCurrentIndex( 2 ); else if( bootStr[0] == "HDD" ) ui.CB_Boot_Priority->setCurrentIndex( 1 ); else if( bootStr[0] == "Net1" || bootStr[0] == "Net2" || bootStr[0] == "Net3" || bootStr[0] == "Net4" ) ui.CB_Boot_Priority->setCurrentIndex( 3 ); else { AQError( "void Main_Window::Set_Boot_Order( QList &list )", "Incorrent boot device type \"" + bootStr[0] +"\"!" ); } } else // More (Boot order list) { QString itemText = ""; for( int ix = 0; ix < bootStr.count(); ix++ ) { itemText += bootStr[ ix ]; if( (ix + 1) < bootStr.count() ) itemText += "/"; } ui.CB_Boot_Priority->addItem( itemText ); ui.CB_Boot_Priority->setCurrentIndex( ui.CB_Boot_Priority->count() - 1 ); } connect( ui.CB_Boot_Priority, SIGNAL(currentIndexChanged(int)), this, SLOT(CB_Boot_Priority_currentIndexChanged(int)) ); } void Main_Window::on_TB_Show_Boot_Settings_Window_clicked() { Boot_Device_Window boot_win; boot_win.setData( Boot_Order_List ); boot_win.setUseBootMenu( Show_Boot_Menu ); if( boot_win.exec() == QDialog::Accepted ) { Boot_Order_List = boot_win.data(); Show_Boot_Menu = boot_win.useBootMenu(); // Apply data to UI Set_Boot_Order( Boot_Order_List ); } } void Main_Window::on_TB_Show_Accelerator_Options_Window_clicked() { Discard_Changes ( Accelerator_Options ); } void Main_Window::on_TB_Show_Architecture_Options_Window_clicked() { Discard_Changes ( Architecture_Options ); } void Main_Window::Discard_Changes(QDialog* dialog) { auto old_vm = Get_Current_VM(); Virtual_Machine old_vm_copy(*old_vm); Virtual_Machine tmp_vm; bool ok = Create_VM_From_Ui(&tmp_vm, old_vm, false); bool a = ui.Button_Apply->isEnabled(); bool c = ui.Button_Cancel->isEnabled(); if ( dialog->exec() == QDialog::Accepted ) return; if ( ok ) { *old_vm = tmp_vm; Update_VM_Ui(false); *old_vm = old_vm_copy; ui.Button_Apply->setEnabled( a ); ui.Button_Cancel->setEnabled( c ); } } void Main_Window::on_TB_Show_Advanced_Options_Window_clicked() { Discard_Changes ( Advanced_Options ); } void Main_Window::on_TB_Show_SMP_Settings_Window_clicked() { if( ! Validate_CPU_Count(ui.CB_CPU_Count->currentText()) ) return; // New SMP count? if( SMP_Settings.Get_Values().SMP_Count != ui.CB_CPU_Count->currentText().toInt() ) SMP_Settings.Set_SMP_Count( ui.CB_CPU_Count->currentText().toInt() ); if( SMP_Settings.exec() == QDialog::Accepted ) { if( SMP_Settings.Get_Values().SMP_Count != ui.CB_CPU_Count->currentText().toInt() ) { // Set new CPU count value disconnect( ui.CB_CPU_Count, SIGNAL(editTextChanged(const QString &)), this, SLOT(Validate_CPU_Count(const QString&)) ); ui.CB_CPU_Count->setEditText( QString::number(SMP_Settings.Get_Values().SMP_Count) ); connect( ui.CB_CPU_Count, SIGNAL(editTextChanged(const QString &)), this, SLOT(Validate_CPU_Count(const QString&)) ); } else { // Settings changed? if( SMP_Settings.Get_Values() != Get_Current_VM()->Get_SMP() ) VM_Changed(); } } } bool Main_Window::Validate_CPU_Count( const QString &text ) { if( text.isEmpty() ) return false; bool cpuOk = false; int cpuCountTmp = text.toInt( &cpuOk ); if( ! cpuOk ) { AQGraphic_Warning( tr("Error!"), tr("CPU count value is not valid digit!") ); return false; } cpuOk = false; Available_Devices tmpDev = Get_Current_Machine_Devices( &cpuOk ); if( ! cpuOk ) { AQError( "bool Main_Window::Validate_CPU_Count( const QString &text )", "Cannot get devices!" ); return false; } if( cpuCountTmp <= tmpDev.PSO_SMP_Count ) { // Reset old SMP options if( SMP_Settings.Get_Values().SMP_Count != ui.CB_CPU_Count->currentText().toInt() ) SMP_Settings.Set_SMP_Count( cpuCountTmp ); return true; } else { AQGraphic_Warning( tr("Warning"), tr("CPU count > max CPU count for this emulator!") ); return false; } } void Main_Window::on_CH_Local_Time_toggled( bool on ) { if( on ) ui_ao.CH_Start_Date->setChecked( false ); } void Main_Window::on_Tabs_currentChanged( int index ) { if( index == 2 ) Dev_Manager->Update_List_Mode(); } void Main_Window::on_Button_Apply_clicked() { std::unique_ptr tmp_vm(new Virtual_Machine()); Virtual_Machine *cur_vm = Get_Current_VM(); if( cur_vm == NULL ) { AQError( "void Main_Window::on_Button_Apply_clicked()", "cur_vm == NULL" ); return; } if( Create_VM_From_Ui(tmp_vm.get(), cur_vm) == false ) return; QString old_path = ""; if( cur_vm->Get_Machine_Name() != tmp_vm.get()->Get_Machine_Name() ) { old_path = cur_vm->Get_VM_XML_File_Path(); } // save all Settings disconnect( cur_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); *cur_vm = *tmp_vm.get(); connect( cur_vm, SIGNAL(State_Changed(Virtual_Machine*, VM::VM_State)), this, SLOT(VM_State_Changed(Virtual_Machine*, VM::VM_State)) ); // save to file if( ! old_path.isEmpty() ) { // Create new file name cur_vm->Set_VM_XML_File_Path( Get_Complete_VM_File_Path(cur_vm->Get_Machine_Name()) ); } if( cur_vm->Save_VM() == false ) { AQGraphic_Error( "void Main_Window::on_Button_Apply_clicked()", tr("Error!"), tr("Cannot Save This VM to File!") ); return; } else if( ! old_path.isEmpty() ) // OK New File Saved { if( ! QFile::remove( old_path ) ) { AQWarning( "void Main_Window::on_Button_Apply_clicked()", "Cannot Remove File: \"" + old_path + "\"" ); } } // Set VM Name ui.Machines_List->currentItem()->setText( cur_vm->Get_Machine_Name() ); Update_Info_Text(); // For VM Changes Signals ui.Button_Apply->setEnabled( false ); ui.Button_Cancel->setEnabled( false ); } void Main_Window::on_Button_Cancel_clicked() { // load Settings Update_VM_Ui(); } void Main_Window::on_CH_Use_Network_toggled( bool on ) { Old_Network_Settings_Widget->Set_Enabled( on ); New_Network_Settings_Widget->Set_Enabled( on ); ui.Redirection_Widget->setEnabled( on ); ui.Redirections_List->setEnabled( on ); ui.Widget_Redirection_Buttons->setEnabled( on ); ui.CH_Redirections->setEnabled( on ); } void Main_Window::on_RB_Network_Mode_New_toggled( bool on ) { while( ui.Stack_Network_Basic_And_Native->count() > 0 ) ui.Stack_Network_Basic_And_Native->removeWidget( ui.Stack_Network_Basic_And_Native->widget(0) ); if( on ) ui.Stack_Network_Basic_And_Native->insertWidget( 0, New_Network_Settings_Widget ); else ui.Stack_Network_Basic_And_Native->insertWidget( 0, Old_Network_Settings_Widget ); ui.Stack_Network_Basic_And_Native->setCurrentIndex( 0 ); } void Main_Window::on_Redirections_List_cellClicked ( int row, int column ) { if( ui.Redirections_List->item( row, 0 )->text() == "TCP" ) ui.RB_TCP->setChecked( true ); else ui.RB_UDP->setChecked( true ); ui.SB_Redir_Port->setValue( ui.Redirections_List->item( row, 1 )->text().toInt() ); ui.Edit_Guest_IP->setText( ui.Redirections_List->item( row, 2 )->text() ); ui.SB_Guest_Port->setValue( ui.Redirections_List->item( row, 3 )->text().toInt() ); } void Main_Window::on_Button_Add_Redirections_clicked() { ui.Redirections_List->insertRow( ui.Redirections_List->rowCount() ); ui.Redirections_List->setCurrentCell( ui.Redirections_List->rowCount()-1 , 0 ); Update_Current_Redirection_Item(); } void Main_Window::on_Button_Delete_Redirections_clicked() { if( ui.Redirections_List->currentRow() > -1 ) ui.Redirections_List->removeRow( ui.Redirections_List->currentRow() ); } void Main_Window::Update_Current_Redirection_Item() { // Port < 1024 #ifndef Q_OS_WIN32 if( ui.SB_Redir_Port->value() < 1024 && Settings.value("Ignore_Redirection_Port_Varning", "no").toString() == "no" ) { int ret = QMessageBox::question( this, tr("Warning!"), tr("To Create Socket With Port Number < 1024, in Unix You Need to Run AQEMU in root Mode!\n" "Press \"Ignore\" button for hide this message in future.\nAdd This Record?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Ignore, QMessageBox::Yes ); if( ret == QMessageBox::No ) return; else if( ret == QMessageBox::Ignore ) Settings.setValue( "Ignore_Redirection_Port_Varning", "yes" ); } #endif QTableWidgetItem *newItem; // protocol if( ui.RB_TCP->isChecked() ) newItem = new QTableWidgetItem( "TCP" ); else newItem = new QTableWidgetItem( "UDP" ); ui.Redirections_List->setItem( ui.Redirections_List->currentRow(), 0, newItem ); // port newItem = new QTableWidgetItem( QString::number(ui.SB_Redir_Port->value()) ); ui.Redirections_List->setItem( ui.Redirections_List->currentRow(), 1, newItem ); // ip newItem = new QTableWidgetItem( ui.Edit_Guest_IP->text() ); ui.Redirections_List->setItem( ui.Redirections_List->currentRow(), 2, newItem ); // guest port newItem = new QTableWidgetItem( QString::number(ui.SB_Guest_Port->value()) ); ui.Redirections_List->setItem( ui.Redirections_List->currentRow(), 3, newItem ); } void Main_Window::on_Button_Clear_Redirections_clicked() { while( ui.Redirections_List->currentRow() > -1 ) ui.Redirections_List->removeRow( ui.Redirections_List->currentRow() ); } void Main_Window::on_TB_Browse_SMB_clicked() { QString SMB_Dir = QFileDialog::getExistingDirectory( this, tr("Select SMB Directory"), Get_Last_Dir_Path(ui.Edit_SMB_Folder->text()), QFileDialog::ShowDirsOnly ); if( ! SMB_Dir.isEmpty() ) ui.Edit_SMB_Folder->setText( QDir::toNativeSeparators(SMB_Dir) ); } void Main_Window::on_TB_Browse_TFTP_clicked() { QString TFTP_Dir = QFileDialog::getExistingDirectory( this, tr("Select TFTP Directory"), Get_Last_Dir_Path(ui.Edit_TFTP_Prefix->text()), QFileDialog::ShowDirsOnly ); if( ! TFTP_Dir.isEmpty() ) ui.Edit_TFTP_Prefix->setText( QDir::toNativeSeparators(TFTP_Dir) ); } void Main_Window::adv_on_CH_Start_Date_toggled( bool on ) { if( on ) ui.CH_Local_Time->setChecked( false ); } void Main_Window::on_TB_VNC_Unix_Socket_Browse_clicked() { QString socketPath = QFileDialog::getOpenFileName( this, tr("UNIX Domain Socket Path"), Get_Last_Dir_Path(ui.Edit_Linux_bzImage_Path->text()), tr("All Files (*)") ); if( ! socketPath.isEmpty() ) ui.Edit_VNC_Unix_Socket->setText( QDir::toNativeSeparators(socketPath) ); } void Main_Window::on_TB_x509_Browse_clicked() { QString x509Dir = QFileDialog::getExistingDirectory( this, tr("Select x509 Certificate Folder"), Get_Last_Dir_Path(ui.Edit_x509verify_Folder->text()), QFileDialog::ShowDirsOnly ); if( ! x509Dir.isEmpty() ) ui.Edit_x509_Folder->setText( QDir::toNativeSeparators(x509Dir) ); } void Main_Window::on_TB_x509verify_Browse_clicked() { QString x509verifyDir = QFileDialog::getExistingDirectory( this, tr("Select x509 Verify Certificate Folder"), Get_Last_Dir_Path(ui.Edit_x509verify_Folder->text()), QFileDialog::ShowDirsOnly ); if( ! x509verifyDir.isEmpty() ) ui.Edit_x509verify_Folder->setText( QDir::toNativeSeparators(x509verifyDir) ); } void Main_Window::on_TB_Linux_bzImage_SetPath_clicked() { QString kernel = QFileDialog::getOpenFileName( this, tr("Select Kernel Image File"), Get_Last_Dir_Path(ui.Edit_Linux_bzImage_Path->text()), tr("All Files (*)") ); if( ! kernel.isEmpty() ) ui.Edit_Linux_bzImage_Path->setText( QDir::toNativeSeparators(kernel) ); } void Main_Window::on_TB_Linux_Initrd_SetPath_clicked() { QString initrd = QFileDialog::getOpenFileName( this, tr("Select InitRD File"), Get_Last_Dir_Path(ui.Edit_Linux_Initrd_Path->text()), tr("All Files (*)") ); if( ! initrd.isEmpty() ) ui.Edit_Linux_Initrd_Path->setText( QDir::toNativeSeparators(initrd) ); } void Main_Window::on_TB_ROM_File_Browse_clicked() { QString romFile = QFileDialog::getOpenFileName( this, tr("Select ROM File"), Get_Last_Dir_Path(ui.Edit_ROM_File->text()), tr("All Files (*)") ); if( ! romFile.isEmpty() ) ui.Edit_ROM_File->setText( QDir::toNativeSeparators(romFile) ); } void Main_Window::on_TB_MTDBlock_File_Browse_clicked() { QString mtd_file = QFileDialog::getOpenFileName( this, tr("Select On-Board Flash Image"), Get_Last_Dir_Path(ui.Edit_MTDBlock_File->text()), tr("All Files (*)") ); if( ! mtd_file.isEmpty() ) ui.Edit_MTDBlock_File->setText( QDir::toNativeSeparators(mtd_file) ); } void Main_Window::on_TB_SD_Image_File_Browse_clicked() { QString sd_file = QFileDialog::getOpenFileName( this, tr("Select SecureDigital Card Image"), Get_Last_Dir_Path(ui.Edit_SD_Image_File->text()), tr("All Files (*)") ); if( ! sd_file.isEmpty() ) ui.Edit_SD_Image_File->setText( QDir::toNativeSeparators(sd_file) ); } void Main_Window::on_TB_PFlash_File_Browse_clicked() { QString flash_file = QFileDialog::getOpenFileName( this, tr("Select Parallel Flash Image"), Get_Last_Dir_Path(ui.Edit_PFlash_File->text()), tr("All Files (*)") ); if( ! flash_file.isEmpty() ) ui.Edit_PFlash_File->setText( QDir::toNativeSeparators(flash_file) ); } QString Main_Window::Copy_VM_Hard_Drive( const QString &vm_name, const QString &hd_name, const VM_HDD &hd ) { if( vm_name.isEmpty() ) { AQError( "QString Main_Window::Copy_VM_Hard_Drive( const QString &vm_name, const QString &hd_name, const VM_HDD &hd )", "vm_name is Empty!" ); return ""; } else { QString new_name = QDir::toNativeSeparators( Settings.value("VM_Directory", "~").toString() + Get_FS_Compatible_VM_Name( vm_name ) + "_" + hd_name ); if( QFile::exists(new_name) ) { for( int ix = 0; ix < 1024; ++ix ) { if( ! QFile::exists(new_name + "_" + QString::number(ix)) ) new_name += "_" + QString::number( ix ); } } if( ! QFile::copy(hd.Get_File_Name(), new_name) ) { AQError( "QString Main_Window::Copy_VM_Hard_Drive( const QString &vm_name, const QString &hd_name, const VM_HDD &hd )", "Copy Error!" ); } return new_name; } } QString Main_Window::Copy_VM_Floppy( const QString &vm_name, const QString &fd_name, const VM_Storage_Device &fd ) { if( vm_name.isEmpty() ) { AQError( "QString Main_Window::Copy_VM_Floppy( const QString &vm_name, const QString &fd_name, const VM_Storage_Device &fd )", "vm_name is Empty!" ); return ""; } else { QString new_name = QDir::toNativeSeparators( Settings.value("VM_Directory", "~").toString() + Get_FS_Compatible_VM_Name(vm_name) + "_" + fd_name ); if( QFile::exists(new_name) ) { for( int ix = 0; ix < 1024; ++ix ) { if( ! QFile::exists(new_name + "_" + QString::number(ix)) ) new_name += "_" + QString::number( ix ); } } if( ! QFile::copy(fd.Get_File_Name(), new_name) ) { AQError( "QString Main_Window::Copy_VM_Floppy( const QString &vm_name, const QString &fd_name, const VM_Storage_Device &fd )", "Copy Error!" ); } return new_name; } } aqemu-0.9.2/src/Main_Window.h000066400000000000000000000210451272330227200160070ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef MAIN_WINDOW_H #define MAIN_WINDOW_H #include #include #include "VM.h" #include "Utils.h" #include "ui_Main_Window.h" #include "ui_Advanced_Options.h" #include "ui_KVM_Options.h" #include "ui_Architecture_Options.h" #include "System_Info.h" #include "HDD_Image_Info.h" #include "Network_Widget.h" #include "Old_Network_Widget.h" #include "SMP_Settings_Window.h" #include "Add_New_Device_Window.h" #include "SPICE_Settings_Widget.h" class Ports_Tab_Widget; class Device_Manager_Widget; class Folder_Sharing_Widget; class Network_Card_Widget; class Main_Window: public QMainWindow { Q_OBJECT public: Main_Window( QWidget *parent = 0 ); ~Main_Window(); private slots: void on_Machines_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ); void on_Machines_List_customContextMenuRequested( const QPoint &pos ); void on_Machines_List_itemDoubleClicked( QListWidgetItem *item ); void VM_State_Changed( Virtual_Machine *vm, VM::VM_State s ); void Show_State_VM( Virtual_Machine *vm ); void Show_State_Current( Virtual_Machine *vmvm ); void Set_Widgets_State( bool enabled ); void VM_Changed(); void Update_Emulator_Control( Virtual_Machine *cur_vm ); void SB_VNC_Display_changed(int); void SB_VNC_Display_Port_changed(int); // Actions void on_actionChange_Icon_triggered(); void on_actionAbout_AQEMU_triggered(); void on_actionAbout_Qt_triggered(); void on_actionDelete_VM_triggered(); void on_actionDelete_VM_And_Files_triggered(); void on_actionExit_triggered(); void on_actionShow_New_VM_Wizard_triggered(); void on_actionAdd_New_VM_triggered(); void on_actionCreate_HDD_Image_triggered(); void on_actionConvert_HDD_Image_triggered(); void on_actionShow_Advanced_Settings_Window_triggered(); void on_actionShow_First_Run_Wizard_triggered(); void on_actionPower_On_triggered(); void on_actionSave_triggered(); void on_actionPower_Off_triggered(); void on_actionPause_triggered(); void on_actionReset_triggered(); void on_actionLoad_VM_From_File_triggered(); void on_actionSave_As_Template_triggered(); void on_actionCopy_triggered(); void on_actionManage_Snapshots_triggered(); void on_actionShow_Emulator_Control_triggered(); void on_actionShow_QEMU_Arguments_triggered(); void on_actionCreate_Shell_Script_triggered(); void on_actionShow_QEMU_Error_Log_Window_triggered(); void on_Tabs_currentChanged( int index ); // Apply and Cancel Buttons void on_Button_Apply_clicked(); void on_Button_Cancel_clicked(); // General Tab void on_CB_Computer_Type_currentIndexChanged( int index ); void on_CB_Machine_Accelerator_currentIndexChanged( int index ); void CB_Boot_Priority_currentIndexChanged( int index ); void on_TB_Show_Boot_Settings_Window_clicked(); void Set_Boot_Order( const QList &list ); void on_TB_Show_Architecture_Options_Window_clicked(); void on_TB_Show_Accelerator_Options_Window_clicked(); void on_TB_Show_Advanced_Options_Window_clicked(); void on_TB_Show_SMP_Settings_Window_clicked(); bool Validate_CPU_Count( const QString &text ); void Apply_Emulator( int mode ); void on_CH_Local_Time_toggled( bool on ); // Memory void on_Memory_Size_valueChanged( int value ); void on_CB_RAM_Size_editTextChanged( const QString &text ); void on_CH_Remove_RAM_Size_Limitation_stateChanged( int state ); void on_TB_Update_Available_RAM_Size_clicked(); void Update_RAM_Size_ComboBox( int freeRAM ); QStringList Create_Info_HDD_String( const QString &disk_format, const VM::Device_Size &virtual_size, const VM::Device_Size &disk_size, int cluster_size ); // Network Tab void on_CH_Use_Network_toggled( bool on ); void on_RB_Network_Mode_New_toggled( bool on ); void on_Redirections_List_cellClicked( int row, int column ); void on_Button_Add_Redirections_clicked(); void on_Button_Delete_Redirections_clicked(); void Update_Current_Redirection_Item(); void on_Button_Clear_Redirections_clicked(); void on_TB_Browse_SMB_clicked(); void on_TB_Browse_TFTP_clicked(); // Advanced void adv_on_CH_Start_Date_toggled( bool on ); // Other Tab void on_TB_VNC_Unix_Socket_Browse_clicked(); void on_TB_x509_Browse_clicked(); void on_TB_x509verify_Browse_clicked(); void on_TB_Linux_bzImage_SetPath_clicked(); void on_TB_Linux_Initrd_SetPath_clicked(); void on_TB_ROM_File_Browse_clicked(); void on_TB_MTDBlock_File_Browse_clicked(); void on_TB_SD_Image_File_Browse_clicked(); void on_TB_PFlash_File_Browse_clicked(); protected: void closeEvent( QCloseEvent *event ); private: Virtual_Machine *Get_VM_By_UID( const QString &uid ); Virtual_Machine *Get_Current_VM(); void Connect_Signals(); const QMap Get_Devices_Info( bool *ok ) const; Available_Devices Get_Current_Machine_Devices( bool *ok ) const; bool Create_VM_From_Ui( Virtual_Machine *tmp_vm, Virtual_Machine *old_vm, bool show_user_errors = true ); bool Load_Settings(); bool Save_Settings(); bool Save_Or_Discard(bool forced = false); void Discard_Changes(QDialog*); void setStateActionsEnabled(bool enabled); void Change_The_Icon(Virtual_Machine*,QString); void Update_VM_Ui( bool update_info_tab = true ); void Update_VM_Port_Number(); void Update_Info_Text( int info_mode = 0 ); void Update_Disabled_Controls(); void Update_Recent_CD_ROM_Images_List(); void Update_Recent_Floppy_Images_List(); void Computer_Type_Changed(); void Update_Machine_Accelerators(); void Update_Accelerator_Options(); void Update_Computer_Types(); QString Get_Storage_Device_Info_String( const QString &path ); bool Load_Virtual_Machines(); bool Save_Virtual_Machines(); QString Get_QEMU_Args(); QString Get_Current_Binary_Name(); bool Boot_Is_Correct( Virtual_Machine *tmp_vm ); bool No_Device_Found( const QString &name, const QString &path, VM::Boot_Device type ); QString Copy_VM_Hard_Drive( const QString &vm_name, const QString &hd_name, const VM_HDD &hd ); QString Copy_VM_Floppy( const QString &vm_name, const QString &fd_name, const VM_Storage_Device &fd ); Ui::Main_Window ui; Ui::Advanced_Options ui_ao; Ui::KVM_Options ui_kvm; Ui::Architecture_Options ui_arch; QDialog* Advanced_Options; QDialog* Accelerator_Options; QDialog* Architecture_Options; Settings_Widget* Display_Settings_Widget; Settings_Widget* Media_Settings_Widget; Settings_Widget* Network_Settings_Widget; QMenu *Icon_Menu; // Context menu for vm icons QMenu *VM_List_Menu; // Context menu for vm list QSettings Settings; bool GUI_User_Mode; QString VM_Folder; QList VM_List; QList All_Emulators_List; // FIXME use call SMP_Settings_Window SMP_Settings; QList Boot_Order_List; bool Show_Boot_Menu; HDD_Image_Info* HDA_Info; HDD_Image_Info* HDB_Info; HDD_Image_Info* HDC_Info; HDD_Image_Info* HDD_Info; Add_New_Device_Window *Nativ_Device_Window; VM_Nativ_Storage_Device Nativ_FD0; VM_Nativ_Storage_Device Nativ_FD1; VM_Nativ_Storage_Device Nativ_CD_ROM; VM_Nativ_Storage_Device Nativ_HDA; VM_Nativ_Storage_Device Nativ_HDB; VM_Nativ_Storage_Device Nativ_HDC; VM_Nativ_Storage_Device Nativ_HDD; Ports_Tab_Widget *Ports_Tab; Device_Manager_Widget *Dev_Manager; Folder_Sharing_Widget* Folder_Sharing; Network_Widget *New_Network_Settings_Widget; Old_Network_Widget *Old_Network_Settings_Widget; SPICE_Settings_Widget* SPICE_Widget; }; #endif aqemu-0.9.2/src/Main_Window.ui000066400000000000000000004553241272330227200162100ustar00rootroot00000000000000 Andrey Rijov (Originally) & Tobias Gläßer (Maintainer) Main_Window 0 0 982 669 AQEMU :/aqemu.png:/aqemu.png 4 6 0 6 6 Qt::Horizontal 150 0 Qt::CustomContextMenu Qt::ScrollBarAsNeeded Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers false QAbstractItemView::NoDragDrop 48 48 QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel QListView::Static QListView::Adjust 0 false true true 1 0 0 0 0 0 1 0 QTabWidget::West QTabWidget::Rounded 4 :/help-about.png:/help-about.png Info 4 4 4 4 247 247 247 247 247 247 218 225 237 QFrame::NoFrame Qt::ScrollBarAlwaysOff true :/configure.png:/configure.png VM 0 <html><head/><body><p><span style=" font-size:medium; font-weight:600; color: palette(link);">Machine</span></p></body></html> 24 6 6 6 3 0 0 256 The Machine 0 0 -1 64 QComboBox::AdjustToMinimumContentsLength 0 0 true 16 QComboBox::AdjustToMinimumContentsLength 1 2 4 8 16 32 64 128 255 0 0 Architecture Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 CP&Us: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_CPU_Count false :/configure.png:/configure.png 0 0 QComboBox::AdjustToMinimumContentsLength ... :/configure.png:/configure.png 0 0 Accelerator: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Options :/configure.png:/configure.png 0 0 &Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Machine_Name 0 0 5 0 5 16777215 QLayout::SetDefaultConstraint 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 &Boot: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::LinksAccessibleByMouse CB_Boot_Priority 0 0 0 8 QComboBox::AdjustToMinimumContentsLength Floppy HDD CD-ROM Network None 0 0 &Graphics: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Video_Card 0 0 -1 8 QComboBox::AdjustToMinimumContentsLength 0 0 &Keyboard: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Keyboard_Layout 0 0 128 QComboBox::AdjustToMinimumContentsLength en-us (default) ar da de de-ch en-gb en-us es et fi fo fr fr-be fr-ca fr-ch hr hu is it ja lt lv mk nl nl-be no pl pt pt-br ru sl sv th tr false :/configure.png:/configure.png 0 0 Advanced :/configure.png:/configure.png Qt::Horizontal QSizePolicy::Minimum 40 20 Qt::Vertical 20 40 <html><head/><body><p><span style=" font-size:medium; font-weight:600; color:palette(link);">Memory</span></p></body></html> 24 6 6 6 3 Qt::Horizontal QSizePolicy::Fixed 5 40 0 0 100 0 true 3 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Qt::LeftToRight Remove limitation on maximum amount of memory Qt::Vertical 20 54 0 0 2 6144 4 32 128 Qt::Horizontal QSlider::TicksAbove 128 0 0 1 MB Qt::Horizontal 13 20 Updating free memory information Free memory: 768 MB :/update.png:/update.png Qt::ToolButtonTextBesideIcon true Qt::Horizontal 40 20 2048 MB Qt::Horizontal QSizePolicy::Minimum 40 20 Qt::Vertical 20 40 <html><head/><body><p><span style=" font-size:medium; font-weight:600; color:palette(link);">Audio</span></p></body></html> QLayout::SetDefaultConstraint 24 6 6 6 3 Sound &Blaster 16 false &ENSONIQ ES1370 &Yamaha YM3812 AC97 (Intel 82801AA) Gravis &Ultrasound GF1 PC Speaker Intel HDA false cs4231a Qt::Vertical 20 40 <html><head/><body><p><span style=" font-size:medium; font-weight:600; color:palette(link);">Options</span></p></body></html> 24 6 6 6 3 0 0 <html><head/><body><p>&quot;Write to temporary files instead of disk image files.</p><p>In this case, the raw disk image you use is not written back.</p><p>You can however force the write back by pressing C-a s.&quot; Source: man qemu</p></body></html> Snapshot &mode 0 0 Set real time clock to local time. Default=utc Use &local time 0 0 Start in full screen &Fullscreen mode widget GB_Options GB_Audio GB_Memory label label_2 label_3 label_4 verticalSpacer_11 verticalSpacer_5 verticalSpacer_9 :/drive-optical.png:/drive-optical.png Media QTabWidget::Rounded 1 :/default_linux.png:/default_linux.png Boot Kernel 0 0 <html><head/><body><p align="center">You can use a given Linux or Multiboot kernel<br>without installing it in the disk image.<br>It can be useful for easier testing of various kernels.</p><p align="center"><span style=" font-size:9pt;">Source: </span><a href="http://wiki.qemu.org/download/qemu-sdoc.html"><span style=" font-size:9pt; text-decoration: underline; color:#0000ff;">wiki.qemu.org/download/qemu-sdoc.html</span></a></p></body></html> true Qt::Horizontal Enable &Linux/Multiboot boot true true ... :/open-file.png:/open-file.png true /boot/initramfs-linux.img true &Kernel bzImage file: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Linux_bzImage_Path true /boot/vmlinuz-linux true &Initrd file: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Linux_Initrd_Path true A&ppend command line: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Linux_Command_Line true ... :/open-file.png:/open-file.png true Qt::Vertical 20 378 Qt::Vertical QSizePolicy::MinimumExpanding 20 40 :/media-flash.png:/media-flash.png Special Images Onboard flash image false ... :/open-file.png:/open-file.png SecureDigital card image false ... :/open-file.png:/open-file.png Parallel flash image false false ... :/open-file.png:/open-file.png false false ROM file (for etherboot) false false ... :/open-file.png:/open-file.png Qt::Vertical 20 20 :/preferences-desktop-display.png:/preferences-desktop-display.png Display 0 0 QTabWidget::North QTabWidget::Rounded 0 :/vnc.png:/vnc.png VNC Remote Qt::Vertical 20 40 true 0 0 0 0 true Security false 10 Use password (You must set a password when you are starting the VM) Use TLS false 10 0 0 0 x509 folder path 4 10 false false ... :/open-folder.png:/open-folder.png x509verify folder path 4 10 false false ... :/open-folder.png:/open-folder.png Enable VNC Qt::Horizontal true General false 0 0 For Connection Use Port 5900 + VNC Display Number Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 1024 1 UNI&X domain socket: VNC display n&umber: true 0 0 5900 10000 5900 0 0 Port: false ... :/open-file.png:/open-file.png false :/qemu-black-and-orange.png:/qemu-black-and-orange.png QEMU Window Show QEMU window without frame and window decorations Use Ctrl-Alt-Shift to grab the mouse (Default is Ctrl-Alt) Disable QEMU window closing capability Rotate graphical output 90 degrees left (Only PXA LCD) Curses (Use a curses/ncurses interface instead of SDL) Show cursor (It works only in QEMU SDL window) Initial graphical mode 10 false Width: false 640 1600 800 Qt::Horizontal QSizePolicy::Fixed 13 26 false Height: false 480 1200 600 Qt::Horizontal QSizePolicy::Fixed 13 26 false &Depth: CB_InitGM_Depth false 2 8 16 24 32 Qt::Horizontal 40 20 Qt::Vertical 78 279 :/preferences-system-network.png:/preferences-system-network.png Network 1 :/audio-card.png:/audio-card.png Network 0 0 0 0 Enable &network Qt::Horizontal 200 17 0 0 0 0 Network GUI type: Qt::Horizontal QSizePolicy::Fixed 13 20 &Basic true &Native false Qt::Horizontal 0 0 :/preferences-system-network-sharing.png:/preferences-system-network-sharing.png Redirections 8 8 0 0 0 0 0 0 6 0 0 0 0 0 0 Item Settings Qt::Horizontal 6 10 1 1 1 Protocol: T&CP true &UDP Qt::Horizontal 271 20 6 10 1 1 1 &Host port: SB_Redir_Port 1 65535 1024 To &guest IP: Edit_Guest_IP 0 0 000.000.000.000;_ 15 Guest por&t: SB_Guest_Port 1 65535 1024 Qt::Vertical QSizePolicy::Minimum 50 10 0 0 0 0 Qt::ScrollBarAlwaysOn Qt::ScrollBarAlwaysOff QAbstractScrollArea::AdjustIgnored QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel Protocol 9 Host Port 9 Guest IP 9 Guest Port 9 0 0 Enable &redirections 0 0 0 0 0 0 A&dd Item :/add.png:/add.png Qt::ToolButtonTextUnderIcon 0 0 D&elete Item :/remove.png:/remove.png Qt::ToolButtonTextUnderIcon 0 0 &Clear List :/error.png:/error.png Qt::ToolButtonTextUnderIcon Qt::Vertical QSizePolicy::Expanding 20 61 0 0 Qt::Horizontal :/connect.png:/connect.png TFTP/SAMBA 10 TFTP folder: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_TFTP_Prefix /path/to/tftp/folder Allow &SMB access to: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_SMB_Folder /path/to/shared/folder ... :/open-folder.png:/open-folder.png ... :/open-folder.png:/open-folder.png Qt::Vertical 118 513 <html><head/><body><p align="center">How to set up a shared SAMBA folder or TFTP:<br/></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For SAMBA: A samba server (smbd) must be installed on the host</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Network support must be enabled</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The network must be set to 'user mode stack'/'user' mode</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the shared folder in Network -&gt; TFTP/SAMBA</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Access the folder in the guest at \\10.0.2.4\qemu</li></ul></body></html> 6 0 0 0 0 9 Qt::AlignCenter false 0 0 &Apply :/ok.png:/ok.png false 0 0 &Discard Changes :/cancel.png:/cancel.png 0 0 982 32 &VM &Add VM :/add.png:/add.png &Help Fi&le Manage Virtual Machines Qt::Vertical 24 24 LeftToolBarArea false Virtual Machine Control Qt::Vertical 24 24 LeftToolBarArea false :/help.png:/help.png &About AQEMU About AQEMU About AQEMU F1 :/about.png:/about.png About &Qt :/remove.png:/remove.png &Delete VM :/exit.png:/exit.png &Exit Ctrl+Q :/wizard.png:/wizard.png &Wizard... Ctrl+W :/add.png:/add.png &Add New VM Ctrl+N :/hdd.png:/hdd.png &Create HDD Image :/hdd.png:/hdd.png Con&vert HDD Image Convert HDD Image Convert HDD Image :/configure.png:/configure.png General &Settings AQEMU &Settings AQEMU &Settings :/play.png:/play.png &Start Ctrl+S :/stop.png:/stop.png St&op Ctrl+D true :/pause.png:/pause.png &Pause Ctrl+P :/update.png:/update.png &Reset Ctrl+R :/open-file.png:/open-file.png &Load VM From File :/save-as.png:/save-as.png Save As &Template :/terminal.png:/terminal.png Sho&w QEMU Arguments :/save.png:/save.png Sa&ve :/icon.png:/icon.png Change &Icon :/copy.png:/copy.png &Copy :/clock.png:/clock.png &Manage Snapshots :/go.png:/go.png Show &Emulator Control :/bug.png:/bug.png Show &QEMU Error Log Window :/configure.png:/configure.png C&onfigure :/wizard.png:/wizard.png &First Start Wizard :/exec.png:/exec.png Create She&ll Script :/remove.png:/remove.png Delete VM And &Files My_List_Widget QListWidget
Settings_Widget.h
Machines_List Tabs VM_Information_Text Button_Apply Button_Cancel Memory_Size CB_RAM_Size CH_sb16 CH_AC97 CH_HDA CH_es1370 CH_GUS CH_cs4231a CH_Adlib CH_PCSPK CH_Fullscreen CH_Local_Time CH_Snapshot CH_Use_Network Network_Cards_Tabs Redirections_List RB_TCP RB_UDP SB_Redir_Port Edit_Guest_IP SB_Guest_Port CH_No_Frame CH_Alt_Grab CH_No_Quit CH_Portrait CH_Activate_VNC RB_VNC_Display_Number SB_VNC_Display RB_VNC_Unix_Socket Edit_VNC_Unix_Socket TB_VNC_Unix_Socket_Browse CH_VNC_Password CH_Use_VNC_TLS CH_x509_Folder Edit_x509_Folder TB_x509_Browse CH_x509verify_Folder Edit_x509verify_Folder TB_x509verify_Browse CH_ROM_File CH_MTDBlock CH_SD_Image CH_PFlash CH_Use_Linux_Boot CH_Activate_VNC toggled(bool) VNC_Security setEnabled(bool) 598 172 581 433 CH_Activate_VNC toggled(bool) VNC_General setEnabled(bool) 598 172 595 222 CH_Init_Graphic_Mode toggled(bool) Initial_Graphical_Mode_Widget setEnabled(bool) 598 358 598 392 CH_Use_Linux_Boot toggled(bool) Use_Linux_Boot_Widget setEnabled(bool) 442 172 598 254 CH_x509_Folder toggled(bool) Edit_x509_Folder setEnabled(bool) 612 412 600 447 CH_x509verify_Folder toggled(bool) Edit_x509verify_Folder setEnabled(bool) 612 483 600 518 CH_x509_Folder toggled(bool) TB_x509_Browse setEnabled(bool) 612 412 882 447 CH_x509verify_Folder toggled(bool) TB_x509verify_Browse setEnabled(bool) 612 483 882 518 CH_Use_VNC_TLS toggled(bool) VNC_TLS_Panel setEnabled(bool) 607 381 607 467 CH_ROM_File toggled(bool) Edit_ROM_File setEnabled(bool) 387 176 681 176 CH_ROM_File toggled(bool) TB_ROM_File_Browse setEnabled(bool) 387 176 892 176 CH_SD_Image toggled(bool) Edit_SD_Image_File setEnabled(bool) 387 252 681 252 CH_SD_Image toggled(bool) TB_SD_Image_File_Browse setEnabled(bool) 387 252 892 252 CH_PFlash toggled(bool) Edit_PFlash_File setEnabled(bool) 387 290 681 290 CH_PFlash toggled(bool) TB_PFlash_File_Browse setEnabled(bool) 387 290 892 290 CH_MTDBlock toggled(bool) Edit_MTDBlock_File setEnabled(bool) 387 214 681 214 CH_MTDBlock toggled(bool) TB_MTDBlock_File_Browse setEnabled(bool) 387 214 892 214 CH_Redirections toggled(bool) Redirection_Widget setEnabled(bool) 344 212 598 527 CH_Use_Network toggled(bool) Widget_Network_Mode setEnabled(bool) 335 129 745 129 CH_Redirections toggled(bool) Widget_Redirection_Buttons setEnabled(bool) 344 212 847 352 CH_Redirections toggled(bool) Redirections_List setEnabled(bool) 344 212 535 352 RB_VNC_Display_Number toggled(bool) SB_VNC_Display setEnabled(bool) 398 240 675 240 RB_VNC_Unix_Socket toggled(bool) Edit_VNC_Unix_Socket setEnabled(bool) 398 277 675 277 RB_VNC_Unix_Socket toggled(bool) TB_VNC_Unix_Socket_Browse setEnabled(bool) 398 277 883 277
aqemu-0.9.2/src/Monitor_Window.cpp000066400000000000000000000042671272330227200171140ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Monitor_Window.h" Monitor_Window::Monitor_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); ui.Edit_Monitor_Out->setFont( Get_Font() ); } void Monitor_Window::Add_QEMU_Out( const QString &new_text ) { ui.Edit_Monitor_Out->moveCursor( QTextCursor::End ); ui.Edit_Monitor_Out->insertPlainText( new_text ); } void Monitor_Window::on_Button_Run_clicked() { ui.Edit_Monitor_Out->append( "" + ui.CB_Com_Line->currentText() + "\n" ); emit Command_Sent( ui.CB_Com_Line->currentText() ); ui.CB_Com_Line->clearEditText(); } void Monitor_Window::on_Button_Font_clicked() { bool ok = false; QFont font = QFontDialog::getFont( &ok, Get_Font(), this ); if( ok ) { ui.Edit_Monitor_Out->setFont( font ); QSettings settings; settings.setValue( "Emulator_Monitor_Font", font.toString() ); } } QFont Monitor_Window::Get_Font() { QSettings settings; QFont font = QFont( "DejaVu Sans Mono", 10 ); QString fontDescription = settings.value( "Emulator_Monitor_Font", "" ).toString(); if( ! fontDescription.isEmpty() ) font.fromString( fontDescription ); return font; } void Monitor_Window::closeEvent( QCloseEvent *event ) { emit Closing_Win(); event->accept(); } aqemu-0.9.2/src/Monitor_Window.h000066400000000000000000000027061272330227200165550ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef MONITOR_WINDOW_H #define MONITOR_WINDOW_H #include "ui_Monitor_Window.h" class Monitor_Window: public QDialog { Q_OBJECT public: Monitor_Window( QWidget *parent = 0 ); public slots: void Add_QEMU_Out( const QString &new_text ); signals: void Command_Sent( const QString &com ); void Closing_Win(); private slots: void on_Button_Run_clicked(); void on_Button_Font_clicked(); QFont Get_Font(); protected: void closeEvent( QCloseEvent *event ); private: Ui::Monitor_Window ui; }; #endif aqemu-0.9.2/src/Monitor_Window.ui000066400000000000000000000205341272330227200167420ustar00rootroot00000000000000 Andrey Rijov Monitor_Window 0 0 588 374 QEMU Monitor :/terminal.png:/terminal.png 6 255 255 255 0 0 0 255 255 255 0 0 0 113 115 119 0 0 0 DejaVu Sans Mono false true 0 0 Com&mand: CB_Com_Line 0 0 true -1 512 info version info network info block info registers info cpus info history info irq info pic info pci info tlb info mem info jit info kqemu info usb info usbhost info profile info capture info snapshots info mice info vnc 0 0 &Run :/go.png:/go.png 0 0 &Clear :/error.png:/error.png 0 0 Change font Font :/font.png:/font.png CB_Com_Line Button_Run Button_Clear Edit_Monitor_Out Button_Clear clicked() Edit_Monitor_Out clear() 489 251 426 162 aqemu-0.9.2/src/Network_Widget.cpp000066400000000000000000001600771272330227200170740ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Utils.h" #include "Network_Widget.h" Network_Widget::Network_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); on_CB_Network_Type_currentIndexChanged( 0 ); Connect_Slots(); ui.Scroll_Area->setStyleSheet(R"( QWidget#Scroll_Area { background: transparent; } QWidget#scrollAreaWidgetContents { background: transparent; } )"); } bool Network_Widget::Get_Network_Cards( QList &cards ) { if( ui.Items_List->count() < 1 ) { AQDebug( "bool Network_Widget::Get_Network_Card( QList &cards ) const", "No Items" ); cards.clear(); return true; } if( ! Net_Card_is_Valid() ) return false; if( ui.Items_List->currentRow() >= 0 && Network_Cards.count() > 0 ) { Network_Cards[ ui.Items_List->currentRow() ] = Get_Net_Card_From_Ui(); } cards = Network_Cards; return true; } void Network_Widget::Set_Network_Cards( const QList &cards ) { ui.Items_List->clear(); Network_Cards = cards; if( Network_Cards.count() > 0 ) { nic = user = chanel = tap = socket = multi = vde = dump = 0; // Max net card count == 8 for( int nx = 0; nx < Network_Cards.count() && nx < 8; ++nx ) { QString item_name = ""; if( Network_Cards[nx].Get_Name().isEmpty() == false && Network_Cards[nx].Use_Name() == true ) { item_name = Network_Cards[nx].Get_Name(); } switch( Network_Cards[nx].Get_Network_Type() ) { case VM::Net_Mode_Nativ_NIC: new QListWidgetItem( "NIC " + ( item_name.isEmpty() ? QString::number(++nic) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_User: new QListWidgetItem( "User " + ( item_name.isEmpty() ? QString::number(++user) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_Chanel: new QListWidgetItem( "Channel " + QString::number(++chanel), ui.Items_List ); break; case VM::Net_Mode_Nativ_TAP: new QListWidgetItem( "TAP " + ( item_name.isEmpty() ? QString::number(++tap) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_Socket: new QListWidgetItem( "Socket " + ( item_name.isEmpty() ? QString::number(++socket) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_MulticastSocket: new QListWidgetItem( "Multicast Socket " + ( item_name.isEmpty() ? QString::number(++multi) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_VDE: new QListWidgetItem( "VDE " + ( item_name.isEmpty() ? QString::number(++vde) : "(" + Network_Cards[nx].Get_Name() + ")" ), ui.Items_List ); break; case VM::Net_Mode_Nativ_Dump: new QListWidgetItem( "Dump " + QString::number(++dump), ui.Items_List ); break; default: new QListWidgetItem( tr("Unknown Type Item"), ui.Items_List ); break; } } ui.Items_List->setCurrentRow( 0 ); // Max net card count == 8 if( Network_Cards.count() < 8 ) Enable_Buttons( true, true ); else Enable_Buttons( false, true ); } else { Enable_Buttons( true, false ); } } void Network_Widget::Set_Network_Card_Models( const QList &models ) { if( ui.CB_model->count() > 0 ) ui.CB_model->clear(); if( Card_Models_QEMU_Name.count() > 0 ) Card_Models_QEMU_Name.clear(); for( int ix = 0; ix < models.count(); ix++ ) { ui.CB_model->addItem( models[ix].Caption ); Card_Models_QEMU_Name << models[ix].QEMU_Name; } } void Network_Widget::Set_Devices( const Available_Devices &devices ) { // Set network cards models if( ui.CB_model->count() > 0 ) ui.CB_model->clear(); if( Card_Models_QEMU_Name.count() > 0 ) Card_Models_QEMU_Name.clear(); for( int ix = 0; ix < devices.Network_Card_List.count(); ix++ ) { ui.CB_model->addItem( devices.Network_Card_List[ix].Caption ); Card_Models_QEMU_Name << devices.Network_Card_List[ix].QEMU_Name; } // Set types ui.CB_Network_Type->clear(); ui.CB_Network_Type->addItem( "nic" ); ui.CB_Network_Type->addItem( "user" ); ui.CB_Network_Type->addItem( "channel" ); ui.CB_Network_Type->addItem( "tap" ); ui.CB_Network_Type->addItem( "socket" ); ui.CB_Network_Type->addItem( "multicast socket" ); if( devices.PSO_Net_type_vde ) ui.CB_Network_Type->addItem( "vde" ); if( devices.PSO_Net_type_dump ) ui.CB_Network_Type->addItem( "dump" ); // Set PSO PSO_Net_name = devices.PSO_Net_name; PSO_Net_addr = devices.PSO_Net_addr; PSO_Net_vectors = devices.PSO_Net_vectors; PSO_Net_net = devices.PSO_Net_net; PSO_Net_host = devices.PSO_Net_host; PSO_Net_restrict = devices.PSO_Net_restrict; PSO_Net_dhcpstart = devices.PSO_Net_dhcpstart; PSO_Net_dns = devices.PSO_Net_dns; PSO_Net_tftp = devices.PSO_Net_tftp; PSO_Net_bootfile = devices.PSO_Net_bootfile; PSO_Net_smb = devices.PSO_Net_smb; PSO_Net_hostfwd = devices.PSO_Net_hostfwd; PSO_Net_guestfwd = devices.PSO_Net_guestfwd; PSO_Net_ifname = devices.PSO_Net_ifname; PSO_Net_script = devices.PSO_Net_script; PSO_Net_downscript = devices.PSO_Net_downscript; PSO_Net_sndbuf = devices.PSO_Net_sndbuf; PSO_Net_vnet_hdr = devices.PSO_Net_vnet_hdr; PSO_Net_vhost = devices.PSO_Net_vhost; PSO_Net_vhostfd = devices.PSO_Net_vhostfd; PSO_Net_listen = devices.PSO_Net_listen; PSO_Net_connect = devices.PSO_Net_connect; PSO_Net_mcast = devices.PSO_Net_mcast; PSO_Net_sock = devices.PSO_Net_sock; PSO_Net_port = devices.PSO_Net_port; PSO_Net_group = devices.PSO_Net_group; PSO_Net_mode = devices.PSO_Net_mode; PSO_Net_file = devices.PSO_Net_file; PSO_Net_len = devices.PSO_Net_len; } void Network_Widget::Set_Enabled( bool on ) { //ui.Label_Items_List->setEnabled( on ); ui.Button_Add->setEnabled( on ); ui.Button_Delete->setEnabled( on ); ui.General_Widget->setEnabled( on ); } void Network_Widget::Connect_Slots() { connect( ui.CB_Network_Type, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CB_model, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_macaddr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_macaddr, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_vlan, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_vlan, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_name, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_name, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_hostname, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_hostname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.Edit_port_dev, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_fd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_fd, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_ifname, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_ifname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_script, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_script, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_downscript, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_downscript, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_listen, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_listen, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_connect, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_connect, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_mcast, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_mcast, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_sock, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_sock, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_port, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_port, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_group, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_group, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_mode, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_mode, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_file, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_file, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_len, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.CB_len, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_addr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_addr, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_vectors, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_vectors, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_net, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_net, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_host, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_host, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_restrict, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.CB_restrict, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_dhcpstart, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_dhcpstart, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_dns, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_dns, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_tftp, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_tftp, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_bootfile, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_bootfile, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_smb, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_smb, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_smbserver, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_smbserver, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_sndbuf, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_sndbuf, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_vnet_hdr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.CB_vnet_hdr, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_vhost, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.CB_vhost, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_vhostfd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.SB_vhostfd, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_hostfwd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_hostfwd, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.CH_guestfwd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_guestfwd, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); // Update Name connect( ui.CH_name, SIGNAL(clicked()), this, SLOT(Update_Card_Item()) ); connect( ui.Edit_name, SIGNAL(textChanged(const QString &)), this, SLOT(Update_Card_Item()) ); connect( ui.CB_Network_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(Update_Card_Item()) ); } void Network_Widget::Disconnect_Slots() { disconnect( ui.CB_Network_Type, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CB_model, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_macaddr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_macaddr, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_vlan, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_vlan, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_name, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_name, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_hostname, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_hostname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.Edit_port_dev, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_fd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_fd, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_ifname, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_ifname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_script, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_script, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_downscript, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_downscript, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_listen, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_listen, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_connect, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_connect, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_mcast, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_mcast, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_sock, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_sock, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_port, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_port, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_group, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_group, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_mode, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_mode, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_file, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_file, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_len, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.CB_len, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_addr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_addr, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_vectors, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_vectors, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_net, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_net, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_host, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_host, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_restrict, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.CB_restrict, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_dhcpstart, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_dhcpstart, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_dns, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_dns, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_tftp, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_tftp, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_bootfile, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_bootfile, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_smb, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_smb, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_smbserver, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_smbserver, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_sndbuf, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_sndbuf, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_vnet_hdr, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.CB_vnet_hdr, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_vhost, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.CB_vhost, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_vhostfd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.SB_vhostfd, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_hostfwd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_hostfwd, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.CH_guestfwd, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_guestfwd, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); // Update Name disconnect( ui.CH_name, SIGNAL(clicked()), this, SLOT(Update_Card_Item()) ); disconnect( ui.Edit_name, SIGNAL(textChanged(const QString &)), this, SLOT(Update_Card_Item()) ); disconnect( ui.CB_Network_Type, SIGNAL(currentIndexChanged(int)), this, SLOT(Update_Card_Item()) ); } void Network_Widget::on_Button_Add_clicked() { if( ui.Items_List->count() >= 8 ) QMessageBox::information( this, tr("Warning!"), tr("Maximum Network Cards Count is 8.") ); else { VM_Net_Card_Nativ tmp_card; Network_Cards.append( tmp_card ); new QListWidgetItem( tr("New Item"), ui.Items_List ); ui.Items_List->setCurrentRow( ui.Items_List->count()-1 ); if( ui.Items_List->count() >= 8 ) Enable_Buttons( false, true ); else Enable_Buttons( true, true ); Update_Card_Item(); emit Changed(); } } void Network_Widget::on_Button_Delete_clicked() { if( Network_Cards.count() < 1 || ui.Items_List->count() < 1 ) return; Network_Cards.removeAt( ui.Items_List->currentRow() ); ui.Items_List->takeItem( ui.Items_List->currentRow() ); if( Network_Cards.count() <= 0 ) Enable_Buttons( true, false ); else if( Network_Cards.count() < 8 ) Enable_Buttons( true, true ); emit Changed(); } void Network_Widget::on_Items_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ) { if( Network_Cards.count() < 1 ) return; int cur = ui.Items_List->row( current ); int prev = ui.Items_List->row( previous ); if( cur < 0 || cur >= Network_Cards.count() || prev >= Network_Cards.count() ) { if( Network_Cards.count() <= 0 ) Enable_Buttons( true, false ); return; } else if( prev < 0 ) { // This first change item. No previous. // Show Current Item Disconnect_Slots(); Set_Net_Card_To_Ui( Network_Cards[0] ); Connect_Slots(); return; } // Check Previous Item if( ! Net_Card_is_Valid() ) return; else Network_Cards[ prev ] = Get_Net_Card_From_Ui(); // Show Current Item Disconnect_Slots(); Set_Net_Card_To_Ui( Network_Cards[cur] ); Connect_Slots(); } void Network_Widget::on_TB_Help_clicked() { // -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] if( ui.CB_Network_Type->currentText() == "nic" ) QMessageBox::information( this, tr("nic"), tr("-net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] \nCreate a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an ne2k_pci by default on the PC target. Optionally, the MAC address can be changed to addr and a name can be assigned for use in monitor commands. If no \'-net\' option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are i82551, i82557b, i82559er, ne2k_pci, ne2k_isa, pcnet, rtl8139, e1000, smc91c111, lance and mcf_fec. Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target.") ); // -net user[,vlan=n][,hostname=name][,name=name] else if( ui.CB_Network_Type->currentText() == "user" ) QMessageBox::information( this, tr("user"), tr("-net user[,vlan=n][,hostname=name][,name=name] \nUse the user mode network stack which requires no administrator privilege to run. \'hostname=name\' can be used to specify the client hostname reported by the builtin DHCP server.") ); // -net channel,port:dev else if( ui.CB_Network_Type->currentText() == "channel" ) QMessageBox::information( this, tr("channel"), tr("-net channel,port:dev \nForward \'user\' TCP connection to port port to character device dev") ); // -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] else if( ui.CB_Network_Type->currentText() == "tap" ) QMessageBox::information( this, tr("tap"), tr("-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] \nConnect the host TAP network interface name to VLAN n, use the network script file to configure it and the network script dfile to deconfigure it. If name is not provided, the OS automatically provides one. \'fd\'=h can be used to specify the handle of an already opened host TAP interface. The default network configure script is \'/etc/qemu-ifup\' and the default network deconfigure script is \'/etc/qemu-ifdown\'. Use \'script=no\' or \'downscript=no\' to disable script execution.") ); // -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] else if( ui.CB_Network_Type->currentText() == "socket" ) QMessageBox::information( this, tr("socket"), tr("-net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] \nConnect the VLAN n to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If \'listen\' is specified, QEMU waits for incoming connections on port (host is optional). \'connect\' is used to connect to another QEMU instance using the \'listen\' option. \'fd\'=h specifies an already opened TCP socket.") ); // -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] else if( ui.CB_Network_Type->currentText() == "multicast socket" ) QMessageBox::information( this, tr("socket"), tr("-net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] \nCreate a VLAN n shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address maddr and port. \nNOTES: \n1. Several QEMU can be running on different hosts and share same bus (assuming correct multicast setup for these hosts). \n2. mcast support is compatible with User Mode Linux (argument \'ethN=mcast\'), see http://user-mode-linux.sf.net. \n3. Use \'fd=h\' to specify an already opened UDP multicast socket.") ); // -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] else if( ui.CB_Network_Type->currentText() == "vde" ) QMessageBox::information( this, tr("vde"), tr("-net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] \nConnect VLAN n to PORT n of a vde switch running on host and listening for incoming connections on socketpath. Use GROUP groupname and MODE octalmode to change default ownership and permissions for communication port. This option is available only if QEMU has been compiled with vde support enabled.") ); // -net dump[,vlan=n][,file=file][,len=len] else if( ui.CB_Network_Type->currentText() == "dump" ) QMessageBox::information( this, tr("dump"), tr("-net dump[,vlan=n][,file=f][,len=n] \ndump traffic on vlan \'n\' to file \'f\' (max n bytes per packet)") ); else { AQError( "void Network_Widget::on_TB_Help_clicked()", "Invalid connection type! Data: " + ui.CB_Network_Type->currentText() ); } } void Network_Widget::on_TB_Browse_script_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select script"), Get_Last_Dir_Path(ui.Edit_script->text()), tr("All Files (*);;Scripts (*.sh)") ); if( ! fileName.isEmpty() ) ui.Edit_script->setText( QDir::toNativeSeparators(fileName) ); } void Network_Widget::on_TB_Browse_downscript_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select script"), Get_Last_Dir_Path(ui.Edit_downscript->text()), tr("All Files (*);;Scripts (*.sh)") ); if( ! fileName.isEmpty() ) ui.Edit_downscript->setText( QDir::toNativeSeparators(fileName) ); } void Network_Widget::on_CB_Network_Type_currentIndexChanged( int index ) { // Hide All ui.CH_vlan->setVisible( false ); ui.SB_vlan->setVisible( false ); ui.CH_macaddr->setVisible( false ); ui.Edit_macaddr->setVisible( false ); ui.TB_Generate_New_MAC->setVisible( false ); ui.Label_model->setVisible( false ); ui.CB_model->setVisible( false ); ui.CH_name->setVisible( false ); ui.Edit_name->setVisible( false ); ui.CH_hostname->setVisible( false ); ui.Edit_hostname->setVisible( false ); ui.Label_port_dev->setVisible( false ); ui.Edit_port_dev->setVisible( false ); ui.CH_fd->setVisible( false ); ui.SB_fd->setVisible( false ); ui.CH_ifname->setVisible( false ); ui.Edit_ifname->setVisible( false ); ui.CH_script->setVisible( false ); ui.Edit_script->setVisible( false ); ui.TB_Browse_script->setVisible( false ); ui.CH_downscript->setVisible( false ); ui.Edit_downscript->setVisible( false ); ui.TB_Browse_downscript->setVisible( false ); ui.CH_listen->setVisible( false ); ui.Edit_listen->setVisible( false ); ui.CH_connect->setVisible( false ); ui.Edit_connect->setVisible( false ); ui.CH_mcast->setVisible( false ); ui.Edit_mcast->setVisible( false ); ui.CH_sock->setVisible( false ); ui.Edit_sock->setVisible( false ); ui.CH_port->setVisible( false ); ui.SB_port->setVisible( false ); ui.CH_group->setVisible( false ); ui.Edit_group->setVisible( false ); ui.CH_mode->setVisible( false ); ui.Edit_mode->setVisible( false ); ui.CH_file->setVisible( false ); ui.Edit_file->setVisible( false ); ui.CH_len->setVisible( false ); ui.CB_len->setVisible( false ); ui.CH_addr->setVisible( false ); ui.Edit_addr->setVisible( false ); ui.CH_vectors->setVisible( false ); ui.SB_vectors->setVisible( false ); ui.CH_net->setVisible( false ); ui.Edit_net->setVisible( false ); ui.CH_host->setVisible( false ); ui.Edit_host->setVisible( false ); ui.CH_restrict->setVisible( false ); ui.CB_restrict->setVisible( false ); ui.CH_dhcpstart->setVisible( false ); ui.Edit_dhcpstart->setVisible( false ); ui.CH_dns->setVisible( false ); ui.Edit_dns->setVisible( false ); ui.CH_tftp->setVisible( false ); ui.Edit_tftp->setVisible( false ); ui.CH_bootfile->setVisible( false ); ui.Edit_bootfile->setVisible( false ); ui.TB_Browse_bootfile->setVisible( false ); ui.CH_smb->setVisible( false ); ui.Edit_smb->setVisible( false ); ui.TB_Browse_smb->setVisible( false ); ui.CH_smbserver->setVisible( false ); ui.Edit_smbserver->setVisible( false ); ui.CH_hostfwd->setVisible( false ); ui.Edit_hostfwd->setVisible( false ); ui.CH_guestfwd->setVisible( false ); ui.Edit_guestfwd->setVisible( false ); ui.CH_sndbuf->setVisible( false ); ui.SB_sndbuf->setVisible( false ); ui.CH_vnet_hdr->setVisible( false ); ui.CB_vnet_hdr->setVisible( false ); ui.CH_vhost->setVisible( false ); ui.CB_vhost->setVisible( false ); ui.CH_vhostfd->setVisible( false ); ui.SB_vhostfd->setVisible( false ); // -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] if( ui.CB_Network_Type->currentText() == "nic" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_macaddr->setVisible( true ); ui.Edit_macaddr->setVisible( true ); ui.TB_Generate_New_MAC->setVisible( true ); ui.Label_model->setVisible( true ); ui.CB_model->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_addr->setVisible( true ); ui.Edit_addr->setVisible( true ); ui.CH_vectors->setVisible( true ); ui.SB_vectors->setVisible( true ); } // -net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n] // [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f] // [,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]] else if( ui.CB_Network_Type->currentText() == "user" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_hostname->setVisible( true ); ui.Edit_hostname->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_net->setVisible( true ); ui.Edit_net->setVisible( true ); ui.CH_host->setVisible( true ); ui.Edit_host->setVisible( true ); ui.CH_restrict->setVisible( true ); ui.CB_restrict->setVisible( true ); ui.CH_dhcpstart->setVisible( true ); ui.Edit_dhcpstart->setVisible( true ); ui.CH_dns->setVisible( true ); ui.Edit_dns->setVisible( true ); ui.CH_tftp->setVisible( true ); ui.Edit_tftp->setVisible( true ); ui.CH_bootfile->setVisible( true ); ui.Edit_bootfile->setVisible( true ); ui.TB_Browse_bootfile->setVisible( true ); ui.CH_hostfwd->setVisible( true ); ui.Edit_hostfwd->setVisible( true ); ui.CH_guestfwd->setVisible( true ); ui.Edit_guestfwd->setVisible( true ); ui.CH_smb->setVisible( true ); ui.Edit_smb->setVisible( true ); ui.TB_Browse_smb->setVisible( true ); ui.CH_smbserver->setVisible( true ); ui.Edit_smbserver->setVisible( true ); } // -net channel,port:dev else if( ui.CB_Network_Type->currentText() == "channel" ) { ui.Label_port_dev->setVisible( true ); ui.Edit_port_dev->setVisible( true ); } // -net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile] // [,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h] else if( ui.CB_Network_Type->currentText() == "tap" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_fd->setVisible( true ); ui.SB_fd->setVisible( true ); ui.CH_ifname->setVisible( true ); ui.Edit_ifname->setVisible( true ); ui.CH_script->setVisible( true ); ui.Edit_script->setVisible( true ); ui.TB_Browse_script->setVisible( true ); ui.CH_downscript->setVisible( true ); ui.Edit_downscript->setVisible( true ); ui.TB_Browse_downscript->setVisible( true ); ui.CH_sndbuf->setVisible( true ); ui.SB_sndbuf->setVisible( true ); ui.CH_vnet_hdr->setVisible( true ); ui.CB_vnet_hdr->setVisible( true ); ui.CH_vhost->setVisible( true ); ui.CB_vhost->setVisible( true ); ui.CH_vhostfd->setVisible( true ); ui.SB_vhostfd->setVisible( true ); } // -net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port] else if( ui.CB_Network_Type->currentText() == "socket" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_fd->setVisible( true ); ui.SB_fd->setVisible( true ); ui.CH_listen->setVisible( true ); ui.Edit_listen->setVisible( true ); ui.CH_connect->setVisible( true ); ui.Edit_connect->setVisible( true ); } // -net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port] else if( ui.CB_Network_Type->currentText() == "multicast socket" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_fd->setVisible( true ); ui.SB_fd->setVisible( true ); ui.CH_mcast->setVisible( true ); ui.Edit_mcast->setVisible( true ); } // -net vde[,vlan=n][,name=str][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] else if( ui.CB_Network_Type->currentText() == "vde" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_name->setVisible( true ); ui.Edit_name->setVisible( true ); ui.CH_sock->setVisible( true ); ui.Edit_sock->setVisible( true ); ui.CH_port->setVisible( true ); ui.SB_port->setVisible( true ); ui.CH_group->setVisible( true ); ui.Edit_group->setVisible( true ); ui.CH_mode->setVisible( true ); ui.Edit_mode->setVisible( true ); } // -net dump[,vlan=n][,file=file][,len=len] else if( ui.CB_Network_Type->currentText() == "dump" ) { ui.CH_vlan->setVisible( true ); ui.SB_vlan->setVisible( true ); ui.CH_file->setVisible( true ); ui.Edit_file->setVisible( true ); ui.CH_len->setVisible( true ); ui.CB_len->setVisible( true ); } else { if( ui.CB_Network_Type->count() > 0 ) AQError( "void Network_Widget::on_CB_Network_Type_currentIndexChanged( int index )", "Invalid connection type! Data: " + ui.CB_Network_Type->currentText() ); } // Set PSO if( ! PSO_Net_name ) { ui.CH_name->setVisible( false ); ui.Edit_name->setVisible( false ); } if( ! PSO_Net_addr ) { ui.CH_addr->setVisible( false ); ui.Edit_addr->setVisible( false ); } if( ! PSO_Net_vectors ) { ui.CH_vectors->setVisible( false ); ui.SB_vectors->setVisible( false ); } if( ! PSO_Net_net ) { ui.CH_net->setVisible( false ); ui.Edit_net->setVisible( false ); } if( ! PSO_Net_host ) { ui.CH_host->setVisible( false ); ui.Edit_host->setVisible( false ); } if( ! PSO_Net_restrict ) { ui.CH_restrict->setVisible( false ); ui.CB_restrict->setVisible( false ); } if( ! PSO_Net_dhcpstart ) { ui.CH_dhcpstart->setVisible( false ); ui.Edit_dhcpstart->setVisible( false ); } if( ! PSO_Net_dns ) { ui.CH_dns->setVisible( false ); ui.Edit_dns->setVisible( false ); } if( ! PSO_Net_tftp ) { ui.CH_tftp->setVisible( false ); ui.Edit_tftp->setVisible( false ); } if( ! PSO_Net_bootfile ) { ui.CH_bootfile->setVisible( false ); ui.Edit_bootfile->setVisible( false ); ui.TB_Browse_bootfile->setVisible( false ); } if( ! PSO_Net_hostfwd ) { ui.CH_hostfwd->setVisible( false ); ui.Edit_hostfwd->setVisible( false ); } if( ! PSO_Net_guestfwd ) { ui.CH_guestfwd->setVisible( false ); ui.Edit_guestfwd->setVisible( false ); } if( ! PSO_Net_smb ) { ui.CH_smb->setVisible( false ); ui.Edit_smb->setVisible( false ); ui.TB_Browse_smb->setVisible( false ); ui.CH_smbserver->setVisible( false ); ui.Edit_smbserver->setVisible( false ); } if( ! PSO_Net_ifname ) { ui.CH_ifname->setVisible( false ); ui.Edit_ifname->setVisible( false ); } if( ! PSO_Net_script ) { ui.CH_script->setVisible( false ); ui.Edit_script->setVisible( false ); ui.TB_Browse_script->setVisible( false ); } if( ! PSO_Net_downscript ) { ui.CH_downscript->setVisible( false ); ui.Edit_downscript->setVisible( false ); ui.TB_Browse_downscript->setVisible( false ); } if( ! PSO_Net_sndbuf ) { ui.CH_sndbuf->setVisible( false ); ui.SB_sndbuf->setVisible( false ); } if( ! PSO_Net_vnet_hdr ) { ui.CH_vnet_hdr->setVisible( false ); ui.CB_vnet_hdr->setVisible( false ); } if( ! PSO_Net_vhost ) { ui.CH_vhost->setVisible( false ); ui.CB_vhost->setVisible( false ); } if( ! PSO_Net_vhostfd ) { ui.CH_vhostfd->setVisible( false ); ui.SB_vhostfd->setVisible( false ); } if( ! PSO_Net_listen ) { ui.CH_listen->setVisible( false ); ui.Edit_listen->setVisible( false ); } if( ! PSO_Net_connect ) { ui.CH_connect->setVisible( false ); ui.Edit_connect->setVisible( false ); } if( ! PSO_Net_mcast ) { ui.CH_mcast->setVisible( false ); ui.Edit_mcast->setVisible( false ); } if( ! PSO_Net_sock ) { ui.CH_sock->setVisible( false ); ui.Edit_sock->setVisible( false ); } if( ! PSO_Net_port ) { ui.CH_port->setVisible( false ); ui.SB_port->setVisible( false ); } if( ! PSO_Net_group ) { ui.CH_group->setVisible( false ); ui.Edit_group->setVisible( false ); } if( ! PSO_Net_mode ) { ui.CH_mode->setVisible( false ); ui.Edit_mode->setVisible( false ); } if( ! PSO_Net_file ) { ui.CH_file->setVisible( false ); ui.Edit_file->setVisible( false ); } if( ! PSO_Net_len ) { ui.CH_len->setVisible( false ); ui.CB_len->setVisible( false ); } /* FIXME if( ! PSO_Net_hostfwd ) if( ! PSO_Net_guestfwd ) ui.CH_vlan->setVisible( false ); ui.SB_vlan->setVisible( false ); ui.CH_macaddr->setVisible( false ); ui.Edit_macaddr->setVisible( false ); ui.TB_Generate_New_MAC->setVisible( false ); ui.Label_model->setVisible( false ); ui.CB_model->setVisible( false ); ui.CH_hostname->setVisible( false ); ui.Edit_hostname->setVisible( false ); ui.Label_port_dev->setVisible( false ); ui.Edit_port_dev->setVisible( false ); ui.CH_fd->setVisible( false ); ui.SB_fd->setVisible( false );*/ } void Network_Widget::on_TB_Generate_New_MAC_clicked() { if( ! ui.Items_List->currentItem() ) return; ui.Edit_macaddr->setText( Network_Cards[ ui.Items_List->currentRow() ].Generate_MAC() ); } void Network_Widget::on_TB_Browse_bootfile_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Boot file"), Get_Last_Dir_Path(ui.Edit_bootfile->text()), tr("All Files (*)") ); if( ! fileName.isEmpty() ) ui.Edit_bootfile->setText( QDir::toNativeSeparators(fileName) ); } void Network_Widget::on_TB_Browse_smb_clicked() { QString dirName = QFileDialog::getExistingDirectory( this, tr("SMB directory"), Get_Last_Dir_Path(ui.Edit_bootfile->text()) ); if( ! dirName.isEmpty() ) ui.Edit_smb->setText( QDir::toNativeSeparators(dirName) ); } void Network_Widget::on_CH_smb_toggled( bool checked ) { ui.CH_smbserver->setEnabled( checked ); if( ui.CH_smbserver->isEnabled() && ui.CH_smbserver->isChecked() ) ui.Edit_smbserver->setEnabled( true ); else ui.Edit_smbserver->setEnabled( false ); } VM_Net_Card_Nativ Network_Widget::Get_Net_Card_From_Ui() const { VM_Net_Card_Nativ card; switch( ui.CB_Network_Type->currentIndex() ) { case 0: card.Set_Network_Type( VM::Net_Mode_Nativ_NIC ); break; case 1: card.Set_Network_Type( VM::Net_Mode_Nativ_User ); break; case 2: card.Set_Network_Type( VM::Net_Mode_Nativ_Chanel ); break; case 3: card.Set_Network_Type( VM::Net_Mode_Nativ_TAP ); break; case 4: card.Set_Network_Type( VM::Net_Mode_Nativ_Socket ); break; case 5: card.Set_Network_Type( VM::Net_Mode_Nativ_MulticastSocket ); break; case 6: card.Set_Network_Type( VM::Net_Mode_Nativ_VDE ); break; case 7: card.Set_Network_Type( VM::Net_Mode_Nativ_Dump ); break; default: AQError( "VM_Net_Card_Nativ Network_Widget::Get_Net_Card_From_Ui() const", "Cannot Read Network Type! Use Default: User Mode" ); card.Set_Network_Type( VM::Net_Mode_Nativ_User ); break; } if ( ui.CB_model->currentIndex() != -1 ) { if ( Card_Models_QEMU_Name.count() - 1 >= ui.CB_model->currentIndex() ) { // Model card.Set_Card_Model( Card_Models_QEMU_Name[ui.CB_model->currentIndex()] ); } } // MAC card.Use_MAC_Address( ui.CH_macaddr->isChecked() ); card.Set_MAC_Address( ui.Edit_macaddr->text() ); // VLAN card.Use_VLAN( ui.CH_vlan->isChecked() ); card.Set_VLAN( ui.SB_vlan->value() ); // name card.Use_Name( ui.CH_name->isChecked() ); card.Set_Name( ui.Edit_name->text() ); // Hostname card.Use_Hostname( ui.CH_hostname->isChecked() ); card.Set_Hostname( ui.Edit_hostname->text() ); // port:dev card.Set_PortDev( ui.Edit_port_dev->text() ); // FD card.Use_File_Descriptor( ui.CH_fd->isChecked() ); card.Set_File_Descriptor( ui.SB_fd->value() ); // ifname card.Use_Interface_Name( ui.CH_ifname->isChecked() ); card.Set_Interface_Name( ui.Edit_ifname->text() ); // script card.Use_TUN_TAP_Script( ui.CH_script->isChecked() ); card.Set_TUN_TAP_Script( ui.Edit_script->text() ); // down script card.Use_TUN_TAP_Down_Script( ui.CH_downscript->isChecked() ); card.Set_TUN_TAP_Down_Script( ui.Edit_downscript->text() ); // listen card.Use_Listen( ui.CH_listen->isChecked() ); card.Set_Listen( ui. Edit_listen->text() ); // connect card.Use_Connect( ui.CH_connect->isChecked() ); card.Set_Connect( ui.Edit_connect->text() ); // mcast card.Use_MCast( ui.CH_mcast->isChecked() ); card.Set_MCast( ui.Edit_mcast->text() ); // sock card.Use_Sock( ui.CH_sock->isChecked() ); card.Set_Sock( ui.Edit_sock->text() ); // port card.Use_Port( ui.CH_port->isChecked() ); card.Set_Port( ui.SB_port->value() ); // group card.Use_Group( ui.CH_group->isChecked() ); card.Set_Group( ui.Edit_group->text() ); // mode card.Use_Mode( ui.CH_mode->isChecked() ); card.Set_Mode( ui.Edit_mode->text() ); // file card.Use_File( ui.CH_file->isChecked() ); card.Set_File( ui.Edit_file->text() ); // len card.Use_Len( ui.CH_len->isChecked() ); switch( ui.CB_len->currentIndex() ) { case 0: card.Set_Len( 64 ); break; case 1: card.Set_Len( 128 ); break; case 2: card.Set_Len( 512 ); break; case 3: card.Set_Len( 1024 ); break; case 4: card.Set_Len( 5120 ); break; case 5: card.Set_Len( 10240 ); break; default: card.Set_Len( 64 ); break; } // Addr card.Use_Addr( ui.CH_addr->isChecked() ); card.Set_Addr( ui.Edit_addr->text() ); // Vectors card.Use_Vectors( ui.CH_vectors->isChecked() ); card.Set_Vectors( ui.SB_vectors->value() ); // Net card.Use_Net( ui.CH_net->isChecked() ); card.Set_Net( ui.Edit_net->text() ); // Host card.Use_Host( ui.CH_host->isChecked() ); card.Set_Host( ui.Edit_host->text() ); // Restrict card.Use_Restrict( ui.CH_restrict->isChecked() ); card.Set_Restrict( ui.CB_restrict->currentIndex() == 0 ); // DHCPstart card.Use_DHCPstart( ui.CH_dhcpstart->isChecked() ); card.Set_DHCPstart( ui.Edit_dhcpstart->text() ); // DNS card.Use_DNS( ui.CH_dns->isChecked() ); card.Set_DNS( ui.Edit_dns->text() ); // Tftp card.Use_Tftp( ui.CH_tftp->isChecked() ); card.Set_Tftp( ui.Edit_tftp->text() ); // Bootfile card.Use_Bootfile( ui.CH_bootfile->isChecked() ); card.Set_Bootfile( ui.Edit_bootfile->text() ); // HostFwd card.Use_HostFwd( ui.CH_hostfwd->isChecked() ); card.Set_HostFwd( ui.Edit_hostfwd->text() ); // GuestFwd card.Use_GuestFwd( ui.CH_guestfwd->isChecked() ); card.Set_GuestFwd( ui.Edit_guestfwd->text() ); // SMB card.Use_SMB( ui.CH_smb->isChecked() ); card.Set_SMB( ui.Edit_smb->text() ); // SMBserver card.Use_SMBserver( ui.CH_smbserver->isChecked() ); card.Set_SMBserver( ui.Edit_smbserver->text() ); // Sndbuf card.Use_Sndbuf( ui.CH_sndbuf->isChecked() ); card.Set_Sndbuf( ui.SB_sndbuf->value() ); // VNet_hdr card.Use_VNet_hdr( ui.CH_vnet_hdr->isChecked() ); card.Set_VNet_hdr( ui.CB_vnet_hdr->currentIndex() == 0 ); // VHost card.Use_VHost( ui.CH_vhost->isChecked() ); card.Set_VHost( ui.CB_vhost->currentIndex() == 0 ); // VHostFd card.Use_VHostFd( ui.CH_vhostfd->isChecked() ); card.Set_VHostFd( ui.SB_vhostfd->value() ); return card; } void Network_Widget::Set_Net_Card_To_Ui( const VM_Net_Card_Nativ &card ) { switch( card.Get_Network_Type() ) { case VM::Net_Mode_Nativ_NIC: ui.CB_Network_Type->setCurrentIndex( 0 ); break; case VM::Net_Mode_Nativ_User: ui.CB_Network_Type->setCurrentIndex( 1 ); break; case VM::Net_Mode_Nativ_Chanel: ui.CB_Network_Type->setCurrentIndex( 2 ); break; case VM::Net_Mode_Nativ_TAP: ui.CB_Network_Type->setCurrentIndex( 3 ); break; case VM::Net_Mode_Nativ_Socket: ui.CB_Network_Type->setCurrentIndex( 4 ); break; case VM::Net_Mode_Nativ_MulticastSocket: ui.CB_Network_Type->setCurrentIndex( 5 ); break; case VM::Net_Mode_Nativ_VDE: ui.CB_Network_Type->setCurrentIndex( 6 ); break; case VM::Net_Mode_Nativ_Dump: ui.CB_Network_Type->setCurrentIndex( 7 ); break; default: AQError( "void Network_Widget::Set_Net_Card_To_Ui( const VM_Net_Card_Nativ &card )", "Cannot Read Network Type! Use Default: User Mode" ); ui.CB_Network_Type->setCurrentIndex( 1 ); break; } // Model if( ui.CB_model->count() < 1 ) { AQError( "void Network_Widget::Set_Net_Card_To_Ui( const VM_Net_Card_Nativ &card )", "Cannot Read Network Model!" ); } else { ui.CB_model->setCurrentIndex( 0 ); for( int ix = 0; ix < Card_Models_QEMU_Name.count(); ix++ ) { if( card.Get_Card_Model() == Card_Models_QEMU_Name[ix] ) { ui.CB_model->setCurrentIndex( ix ); } } } // MAC ui.CH_macaddr->setChecked( card.Use_MAC_Address() ); ui.Edit_macaddr->setText( card.Get_MAC_Address() ); // VLAN ui.CH_vlan->setChecked( card.Use_VLAN() ); ui.SB_vlan->setValue( card.Get_VLAN() ); // name ui.CH_name->setChecked( card.Use_Name() ); ui.Edit_name->setText( card.Get_Name() ); // Hostname ui.CH_hostname->setChecked( card.Use_Hostname() ); ui.Edit_hostname->setText( card.Get_Hostname() ); // port:dev ui.Edit_port_dev->setText( card.Get_PortDev() ); // FD ui.CH_fd->setChecked( card.Use_File_Descriptor() ); ui.SB_fd->setValue( card.Get_File_Descriptor() ); // ifname ui.CH_ifname->setChecked( card.Use_Interface_Name() ); ui.Edit_ifname->setText( card.Get_Interface_Name() ); // script ui.CH_script->setChecked( card.Use_TUN_TAP_Script() ); ui.Edit_script->setText( card.Get_TUN_TAP_Script() ); // down script ui.CH_downscript->setChecked( card.Use_TUN_TAP_Down_Script() ); ui.Edit_downscript->setText( card.Get_TUN_TAP_Down_Script() ); // listen ui.CH_listen->setChecked( card.Use_Listen() ); ui.Edit_listen->setText( card.Get_Listen() ); // connect ui.CH_connect->setChecked( card.Use_Connect() ); ui.Edit_connect->setText( card.Get_Connect() ); // mcast ui.CH_mcast->setChecked( card.Use_MCast() ); ui.Edit_mcast->setText( card.Get_MCast() ); // sock ui.CH_sock->setChecked( card.Use_Sock() ); ui.Edit_sock->setText( card.Get_Sock() ); // port ui.CH_port->setChecked( card.Use_Port() ); ui.SB_port->setValue( card.Get_Port() ); // group ui.CH_group->setChecked( card.Use_Group() ); ui.Edit_group->setText( card.Get_Group() ); // mode ui.CH_mode->setChecked( card.Use_Mode() ); ui.Edit_mode->setText( card.Get_Mode() ); // file ui.CH_file->setChecked( card.Use_File() ); ui.Edit_file->setText( card.Get_File() ); // len ui.CH_len->setChecked( card.Use_Len() ); switch( card.Get_Len() ) { case 64: ui.CB_len->setCurrentIndex( 0 ); break; case 128: ui.CB_len->setCurrentIndex( 1 ); break; case 512: ui.CB_len->setCurrentIndex( 2 ); break; case 1024: ui.CB_len->setCurrentIndex( 3 ); break; case 5120: ui.CB_len->setCurrentIndex( 4 ); break; case 10240: ui.CB_len->setCurrentIndex( 5 ); break; default: ui.CB_len->setCurrentIndex( 0 ); break; } // Addr ui.CH_addr->setChecked( card.Use_Addr() ); ui.Edit_addr->setText( card.Get_Addr() ); // Vectors ui.CH_vectors->setChecked( card.Use_Vectors() ); ui.SB_vectors->setValue( card.Get_Vectors() ); // Net ui.CH_net->setChecked( card.Use_Net() ); ui.Edit_net->setText( card.Get_Net() ); // Host ui.CH_host->setChecked( card.Use_Host() ); ui.Edit_host->setText( card.Get_Host() ); // Restrict ui.CH_restrict->setChecked( card.Use_Restrict() ); ui.CB_restrict->setCurrentIndex( card.Get_Restrict() ? 0 : 1 ); // DHCPstart ui.CH_dhcpstart->setChecked( card.Use_DHCPstart() ); ui.Edit_dhcpstart->setText( card.Get_DHCPstart() ); // DNS ui.CH_dns->setChecked( card.Use_DNS() ); ui.Edit_dns->setText( card.Get_DNS() ); // Tftp ui.CH_tftp->setChecked( card.Use_Tftp() ); ui.Edit_tftp->setText( card.Get_Tftp() ); // Bootfile ui.CH_bootfile->setChecked( card.Use_Bootfile() ); ui.Edit_bootfile->setText( card.Get_Bootfile() ); // HostFwd ui.CH_hostfwd->setChecked( card.Use_HostFwd() ); ui.Edit_hostfwd->setText( card.Get_HostFwd() ); // GuestFwd ui.CH_guestfwd->setChecked( card.Use_GuestFwd() ); ui.Edit_guestfwd->setText( card.Get_GuestFwd() ); // SMB ui.CH_smb->setChecked( card.Use_SMB() ); ui.Edit_smb->setText( card.Get_SMB() ); // SMBserver ui.CH_smbserver->setChecked( card.Use_SMBserver() ); ui.Edit_smbserver->setText( card.Get_SMBserver() ); on_CH_smb_toggled( card.Use_SMB() ); // Sndbuf ui.CH_sndbuf->setChecked( card.Use_Sndbuf() ); ui.SB_sndbuf->setValue( card.Get_Sndbuf() ); // VNet_hdr ui.CH_vnet_hdr->setChecked( card.Use_VNet_hdr() ); ui.CB_vnet_hdr->setCurrentIndex( card.Get_VNet_hdr() ? 0 : 1 ); // VHost ui.CH_vhost->setChecked( card.Use_VHost() ); ui.CB_vhost->setCurrentIndex( card.Get_VHost() ? 0 : 1 ); // VHostFd ui.CH_vhostfd->setChecked( card.Use_VHostFd() ); ui.SB_vhostfd->setValue( card.Get_VHostFd() ); } bool Network_Widget::Net_Card_is_Valid() { bool u_macaddr, u_name, u_hostname, u_port_dev, u_ifname, u_script, u_downscript, u_listen, u_connect, u_mcast, u_sock, u_group, u_mode, u_file, u_len; u_macaddr = u_name = u_hostname = u_port_dev = u_ifname = u_script = u_downscript = u_listen = u_connect = u_mcast = u_sock = u_group = u_mode = u_file = u_len = false; switch( ui.CB_Network_Type->currentIndex() ) { // -net nic[,vlan=n][,macaddr=addr][,model=type][,name=name] case 0: u_macaddr = u_name = true; break; // -net user[,vlan=n][,hostname=name][,name=name] case 1: u_hostname = u_name = true; break; // -net channel,port:dev case 2: u_port_dev = true; break; // -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile] case 3: u_name = u_ifname = u_script = u_downscript = true; break; // -net socket[,vlan=n][,name=name][,fd=h][,listen=[host]:port][,connect=host:port] case 4: u_name = u_listen = u_connect = true; break; // -net socket[,vlan=n][,name=name][,fd=h][,mcast=maddr:port] case 5: u_name = u_mcast = true; break; // -net vde[,vlan=n][,name=name][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] case 6: u_name = u_sock = u_group = u_mode = true; break; // -net dump[,vlan=n][,file=file][,len=len] case 7: u_file = u_len = true; break; default: break; } if( u_macaddr && ui.CH_macaddr->isChecked() ) { QRegExp rx = QRegExp( "^[\\da-fA-F]{2}(\\:[\\da-fA-F]{2}){5}$" ); if( ! rx.exactMatch(ui.Edit_macaddr->text()) ) { AQGraphic_Warning( tr("Error!"), tr("Incorrect MAC address!") ); return false; } } if( u_name && ui.CH_name->isChecked() ) { QRegExp rx = QRegExp( "^[\\da-zA-Z_\\-]+$" ); if( ! rx.exactMatch(ui.Edit_name->text()) ) { AQGraphic_Warning( tr("Error!"), tr("Invalid name! Valid characters are:: a-z A-Z 0-9 _ -") ); return false; } } if( u_hostname && ui.CH_hostname->isChecked() ) { QRegExp rx = QRegExp( "^[\\da-zA-Z_\\-]+$" ); if( ! rx.exactMatch(ui.Edit_hostname->text()) ) { AQGraphic_Warning( tr("Error!"), tr("Invalid Hostname! Valid characters are:: a-z A-Z 0-9 _ -") ); return false; } } // FIXME if( u_port_dev ) { } if( u_ifname && ui.CH_ifname->isChecked() ) { } if( u_script && ui.CH_script->isChecked() ) { if( ! QFile::exists(ui.Edit_script->text()) ) { if( No_File_Found("script", ui.Edit_script->text()) ) { ui.CH_script->setChecked( false ); } else return false; } } if( u_downscript && ui.CH_downscript->isChecked() ) { if( ! QFile::exists(ui.Edit_downscript->text()) ) { if( No_File_Found("downscript", ui.Edit_downscript->text()) ) { ui.CH_downscript->setChecked( false ); } else return false; } } if( u_listen && ui.CH_listen->isChecked() ) { } if( u_connect && ui.CH_connect->isChecked() ) { } if( u_mcast && ui.CH_mcast->isChecked() ) { } if( u_sock && ui.CH_sock->isChecked() ) { } if( u_group && ui.CH_group->isChecked() ) { } if( u_mode && ui.CH_mode->isChecked() ) { } if( u_file && ui.CH_file->isChecked() ) { } return true; } bool Network_Widget::No_File_Found( const QString &name, const QString &path ) { int retVal = QMessageBox::critical( this, tr("Error!"), tr("%1 File \"%2\" doesn't Exist! Continue Without this File?").arg(name).arg(path), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( retVal == QMessageBox::No ) return false; else return true; } void Network_Widget::Update_Card_Item() { if( ! ui.Items_List->currentItem() ) return; QString item_name = ""; if( ui.Edit_name->text().isEmpty() == false && ui.CH_name->isChecked() == true ) { item_name = ui.Edit_name->text(); } QString n = "(" + ui.Edit_name->text() + ")"; switch( ui.CB_Network_Type->currentIndex() ) { case 0: ui.Items_List->currentItem()->setText( "NIC " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_NIC) : n) ); break; case 1: ui.Items_List->currentItem()->setText( "User " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_User) : n) ); break; case 2: ui.Items_List->currentItem()->setText( "Channel " + Get_Items_Count(VM::Net_Mode_Nativ_Chanel) ); break; case 3: ui.Items_List->currentItem()->setText( "TAP " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_TAP) : n) ); break; case 4: ui.Items_List->currentItem()->setText( "Socket " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_Socket) : n) ); break; case 5: ui.Items_List->currentItem()->setText( "Multicast Socket " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_MulticastSocket) : n) ); break; case 6: ui.Items_List->currentItem()->setText( "VDE " + (item_name.isEmpty() ? Get_Items_Count(VM::Net_Mode_Nativ_VDE) : n) ); break; case 7: ui.Items_List->currentItem()->setText( "Dump " + Get_Items_Count(VM::Net_Mode_Nativ_Dump) ); break; default: ui.Items_List->currentItem()->setText( tr("Unknown Type Item") ); break; } } QString Network_Widget::Get_Items_Count( VM::Network_Mode_Nativ type ) { int count = 0; for( int ix = 0; ui.Items_List->currentRow() >= ix; ix++ ) { if( Network_Cards[ix].Get_Network_Type() == type ) count++; } return QString::number( count ? count : 1 ); } void Network_Widget::Enable_Buttons( bool add, bool del ) { ui.Button_Add->setEnabled( add ); ui.Button_Delete->setEnabled( del ); ui.General_Widget->setEnabled( del ); if( ! del ) // Clear GUI { VM_Net_Card_Nativ tmp_card; Set_Net_Card_To_Ui( tmp_card ); } } aqemu-0.9.2/src/Network_Widget.h000066400000000000000000000062631272330227200165350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef NETWORK_WIDGET_H #define NETWORK_WIDGET_H #include "ui_Network_Widget.h" #include "VM_Devices.h" class Network_Widget: public QWidget { Q_OBJECT public: Network_Widget( QWidget *parent = 0 ); bool Get_Network_Cards( QList &cards ); void Set_Network_Cards( const QList &cards ); void Set_Network_Card_Models( const QList &models ); void Set_Devices( const Available_Devices &devices ); void Set_Enabled( bool on ); private slots: void Connect_Slots(); void Disconnect_Slots(); void on_Button_Add_clicked(); void on_Button_Delete_clicked(); void on_Items_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ); void on_TB_Help_clicked(); void on_TB_Browse_script_clicked(); void on_TB_Browse_downscript_clicked(); void on_CB_Network_Type_currentIndexChanged( int index ); void on_TB_Generate_New_MAC_clicked(); void on_TB_Browse_bootfile_clicked(); void on_TB_Browse_smb_clicked(); void on_CH_smb_toggled( bool checked ); void Update_Card_Item(); private: VM_Net_Card_Nativ Get_Net_Card_From_Ui() const; void Set_Net_Card_To_Ui( const VM_Net_Card_Nativ &card ); bool Net_Card_is_Valid(); bool No_File_Found( const QString &name, const QString &path ); QString Get_Items_Count( VM::Network_Mode_Nativ type ); void Enable_Buttons( bool add, bool del ); signals: void Changed(); private: Ui::Network_Widget ui; QList Network_Cards; QStringList Card_Models_QEMU_Name; int nic, user, chanel, tap, socket, multi, vde, dump; bool PSO_Net_name; bool PSO_Net_addr; bool PSO_Net_vectors; bool PSO_Net_net; bool PSO_Net_host; bool PSO_Net_restrict; bool PSO_Net_dhcpstart; bool PSO_Net_dns; bool PSO_Net_tftp; bool PSO_Net_bootfile; bool PSO_Net_smb; bool PSO_Net_hostfwd; bool PSO_Net_guestfwd; bool PSO_Net_ifname; bool PSO_Net_script; bool PSO_Net_downscript; bool PSO_Net_sndbuf; bool PSO_Net_vnet_hdr; bool PSO_Net_vhost; bool PSO_Net_vhostfd; bool PSO_Net_listen; bool PSO_Net_connect; bool PSO_Net_mcast; bool PSO_Net_sock; bool PSO_Net_port; bool PSO_Net_group; bool PSO_Net_mode; bool PSO_Net_file; bool PSO_Net_len; }; #endif aqemu-0.9.2/src/Network_Widget.ui000066400000000000000000001520051272330227200167170ustar00rootroot00000000000000 Network_Widget 0 0 379 1241 AQEMU Network Widget 0 0 QFrame::NoFrame QFrame::Plain 0 0 0 0 5 0 0 &Delete :/remove.png:/remove.png Qt::ToolButtonTextUnderIcon 0 0 16777215 135 QAbstractItemView::NoEditTriggers QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel 0 0 &Add :/add.png:/add.png Qt::ToolButtonTextUnderIcon Qt::Vertical 20 1 Qt::Horizontal QFrame::NoFrame Qt::ScrollBarAlwaysOff true 0 0 347 1579 0 0 0 true 0 0 0 0 0 0 Connection type 4 QLayout::SetMinimumSize 0 0 -1 ? :/help.png:/help.png 0 0 Model false 0 0 0 0 macaddr 4 QLayout::SetMinimumSize false 0 0 aa:bb:cc:dd:ee false Generate New MAC :/update.png:/update.png 0 0 vlan false 0 0 0 0 name false 0 0 0 0 hostname false 0 0 0 0 port:dev 0 0 0 0 fd false 0 0 0 0 ifname false 0 0 0 0 script 4 QLayout::SetMinimumSize false 0 0 false ... :/open-file.png:/open-file.png 0 0 downscript 4 QLayout::SetMinimumSize false 0 0 false ... :/open-file.png:/open-file.png 0 0 listen false 0 0 0 0 connect false 0 0 0 0 mcast false 0 0 0 0 sock false 0 0 0 0 port false 0 0 65000 0 0 group false 0 0 0 0 mode false 0 0 0 0 file false 0 0 0 0 len false 0 0 64Kb (default) 128Kb 512Kb 1Mb 5Mb 10Mb addr false vectors false 999999999 net false host false restrict false y n dhcpstart false dns false tftp false bootfile 4 false false :/open-file.png:/open-file.png smb 4 false false :/open-folder.png:/open-folder.png smbserver false sndbuf false 999999999 vnet_hdr false on off vhost false on off vhostfd false 999999999 hostfwd false guestfwd false Qt::Vertical 20 31 Items_List Button_Add TB_Generate_New_MAC CB_Network_Type TB_Help CH_vlan SB_vlan CH_name Edit_name CH_hostname Edit_hostname Edit_port_dev CH_fd SB_fd CH_ifname Edit_ifname CH_script Edit_script TB_Browse_script CH_downscript Edit_downscript TB_Browse_downscript CH_listen Edit_listen CH_connect Edit_connect CH_mcast Edit_mcast CH_sock Edit_sock CH_port SB_port CH_group Edit_group CH_mode Edit_mode CH_file Edit_file CH_len CB_len CH_macaddr CB_model Edit_macaddr CH_vlan toggled(bool) SB_vlan setEnabled(bool) 57 260 278 256 CH_macaddr toggled(bool) Edit_macaddr setEnabled(bool) 69 225 257 225 CH_name toggled(bool) Edit_name setEnabled(bool) 67 287 234 277 CH_hostname toggled(bool) Edit_hostname setEnabled(bool) 65 306 225 307 CH_fd toggled(bool) SB_fd setEnabled(bool) 42 366 244 366 CH_ifname toggled(bool) Edit_ifname setEnabled(bool) 69 395 241 396 CH_script toggled(bool) Edit_script setEnabled(bool) 67 425 308 426 CH_script toggled(bool) TB_Browse_script setEnabled(bool) 67 425 338 428 CH_downscript toggled(bool) Edit_downscript setEnabled(bool) 92 458 308 459 CH_downscript toggled(bool) TB_Browse_downscript setEnabled(bool) 28 458 338 461 CH_listen toggled(bool) Edit_listen setEnabled(bool) 66 488 339 489 CH_connect toggled(bool) Edit_connect setEnabled(bool) 83 515 339 516 CH_mcast toggled(bool) Edit_mcast setEnabled(bool) 63 542 339 543 CH_sock toggled(bool) Edit_sock setEnabled(bool) 61 569 335 570 CH_port toggled(bool) SB_port setEnabled(bool) 58 596 339 597 CH_group toggled(bool) Edit_group setEnabled(bool) 69 623 339 624 CH_mode toggled(bool) Edit_mode setEnabled(bool) 67 650 339 651 CH_file toggled(bool) Edit_file setEnabled(bool) 50 677 339 678 CH_len toggled(bool) CB_len setEnabled(bool) 51 706 339 708 CH_macaddr toggled(bool) TB_Generate_New_MAC setEnabled(bool) 42 230 338 233 CH_host toggled(bool) Edit_host setEnabled(bool) 57 815 283 816 CH_restrict toggled(bool) CB_restrict setEnabled(bool) 78 842 174 840 CH_addr toggled(bool) Edit_addr setEnabled(bool) 48 734 164 731 CH_vectors toggled(bool) SB_vectors setEnabled(bool) 46 757 198 757 CH_dhcpstart toggled(bool) Edit_dhcpstart setEnabled(bool) 77 870 201 872 CH_dns toggled(bool) Edit_dns setEnabled(bool) 46 896 158 896 CH_tftp toggled(bool) Edit_tftp setEnabled(bool) 40 919 214 919 CH_bootfile toggled(bool) Edit_bootfile setEnabled(bool) 39 949 196 949 CH_smb toggled(bool) Edit_smb setEnabled(bool) 80 979 308 990 CH_smbserver toggled(bool) Edit_smbserver setEnabled(bool) 85 1009 180 1003 CH_bootfile toggled(bool) TB_Browse_bootfile setEnabled(bool) 48 956 332 953 CH_net toggled(bool) Edit_net setEnabled(bool) 58 788 297 789 CH_sndbuf toggled(bool) SB_sndbuf setEnabled(bool) 53 1033 171 1032 CH_vnet_hdr toggled(bool) CB_vnet_hdr setEnabled(bool) 49 1065 185 1060 CH_vhost toggled(bool) CB_vhost setEnabled(bool) 64 1090 168 1086 CH_vhostfd toggled(bool) SB_vhostfd setEnabled(bool) 72 1120 174 1117 CH_smb toggled(bool) TB_Browse_smb setEnabled(bool) 77 983 331 981 CH_hostfwd toggled(bool) Edit_hostfwd setEnabled(bool) 68 1150 151 1150 CH_guestfwd toggled(bool) Edit_guestfwd setEnabled(bool) 77 1179 158 1172 aqemu-0.9.2/src/Old_Network_Widget.cpp000066400000000000000000000577111272330227200176720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include "Old_Network_Widget.h" #include "Utils.h" Old_Network_Widget::Old_Network_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); // Set Network Card Validators Check_Network_Card = true; // IP Address QRegExp rx( "^([1-9]|[1-9][\\d]|[1][\\d][\\d]|2[0-4][\\d]|25[0-5])(\\.([0-9]|[1-9][\\d]|[1][\\d][\\d]|2[0-4][\\d]|25[0-5])){3}$" ); QValidator *validator = new QRegExpValidator( rx, this ); //ui.Edit_IP_Address->setValidator( validator ); // MAC Address rx = QRegExp( "^[\\da-fA-F]{2}(\\:[\\da-fA-F]{2}){5}$" ); validator = new QRegExpValidator( rx, this ); ui.Edit_MAC_Address->setValidator( validator ); // Connecting Slots Connect_Slots(); on_CB_Connection_Mode_currentIndexChanged(-1); //to hide widgets } bool Old_Network_Widget::Get_Network_Cards( QList &cards ) { if( Network_Cards.count() < 1 ) { AQDebug( "bool Old_Network_Widget::Get_Network_Cards( QList &cards )", "No Items" ); cards.clear(); return true; } for( int nx = 0; nx < Network_Cards.count(); nx++ ) { if( ! Net_Card_is_Valid(nx) ) { AQGraphic_Warning( tr("Error"), tr("Network Card #% Not Valid!").arg(nx) ); return false; } } cards = Network_Cards; return true; } void Old_Network_Widget::Set_Network_Cards( const QList &cards ) { Check_Network_Card = false; ui.Network_Cards_List->clear(); Network_Cards = cards; if( Network_Cards.count() > 0 ) { for( int nx = 0; nx < Network_Cards.count(); ++nx ) { new QListWidgetItem( tr("Card ") + QString::number(nx+1), ui.Network_Cards_List ); } Check_Network_Card = true; ui.Widget_All_Options->setEnabled( true ); ui.Network_Cards_List->setCurrentRow( 0 ); } else { ui.Widget_All_Options->setEnabled( false ); } } void Old_Network_Widget::Set_Network_Card_Models( const QList &models ) { if( ui.CB_Network_Card_Model->count() > 0 ) ui.CB_Network_Card_Model->clear(); if( Card_Models_QEMU_Name.count() > 0 ) Card_Models_QEMU_Name.clear(); for( int ix = 0; ix < models.count(); ix++ ) { ui.CB_Network_Card_Model->addItem( models[ix].Caption ); Card_Models_QEMU_Name.append( models[ix].QEMU_Name ); } } void Old_Network_Widget::Set_Enabled( bool on ) { //ui.Label_Cards_List->setEnabled( on ); ui.Button_Add_Net_Card->setEnabled( on ); ui.Button_Delete_Net_Card->setEnabled( on ); ui.Widget_All_Options->setEnabled( on ); } void Old_Network_Widget::Connect_Slots() { connect( ui.CB_Connection_Mode, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CB_Network_Card_Model, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); connect( ui.Edit_Hostname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.Edit_IP_Address, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.Edit_MAC_Address, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.SB_File_Descriptor, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.SB_Port, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.SB_VLAN, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); connect( ui.CH_TUN_TAP_Script, SIGNAL(clicked()), this, SIGNAL(Changed()) ); connect( ui.Edit_TUN_TAP_Script, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); connect( ui.Edit_Interface_Name, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); } void Old_Network_Widget::Disconnect_Slots() { disconnect( ui.CB_Connection_Mode, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CB_Network_Card_Model, SIGNAL(currentIndexChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.Edit_Hostname, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.Edit_IP_Address, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.Edit_MAC_Address, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.SB_File_Descriptor, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.SB_Port, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.SB_VLAN, SIGNAL(valueChanged(int)), this, SIGNAL(Changed()) ); disconnect( ui.CH_TUN_TAP_Script, SIGNAL(clicked()), this, SIGNAL(Changed()) ); disconnect( ui.Edit_TUN_TAP_Script, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); disconnect( ui.Edit_Interface_Name, SIGNAL(textChanged(const QString &)), this, SIGNAL(Changed()) ); } void Old_Network_Widget::on_Network_Cards_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ) { if( Network_Cards.count() < 1 || Check_Network_Card == false ) return; int bx = ui.Network_Cards_List->row( current ); if( bx < 0 ) { AQError( "void Old_Network_Widget::on_Network_Cards_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous )", "Current Netcard Index Out of Range!" ); return; } else { Disconnect_Slots(); Set_Net_Card_To_Ui( Network_Cards[bx] ); Connect_Slots(); } } void Old_Network_Widget::on_Button_Add_Net_Card_clicked() { if( ui.Network_Cards_List->count() >= 8 ) QMessageBox::information( this, tr("Warning!"), tr("Maximum Network Cards Count is 8.") ); else { VM_Net_Card tmp_card; Network_Cards.append( tmp_card ); new QListWidgetItem( tr("Card ") + QString::number(ui.Network_Cards_List->count()+1), ui.Network_Cards_List ); ui.Network_Cards_List->setCurrentRow( ui.Network_Cards_List->count()-1 ); ui.Widget_All_Options->setEnabled( true ); ui.Button_Delete_Net_Card->setEnabled( true ); if( ui.Network_Cards_List->count() == 8 ) ui.Button_Add_Net_Card->setEnabled( false ); emit Changed(); } } void Old_Network_Widget::on_Button_Delete_Net_Card_clicked() { if( ui.Network_Cards_List->count() == 0 ) { QMessageBox::information( this, tr("Warning!"), tr("Network Cards List is Empty!") ); } else if( ui.Network_Cards_List->currentRow() < ui.Network_Cards_List->count() && ui.Network_Cards_List->currentRow() >= 0 ) { Network_Cards.removeAt( ui.Network_Cards_List->currentRow() ); Check_Network_Card = false; ui.Network_Cards_List->clear(); for( int nx = 0; nx < Network_Cards.count(); ++nx ) { new QListWidgetItem( tr("Card ") + QString::number(nx+1), ui.Network_Cards_List ); } ui.Button_Add_Net_Card->setEnabled( true ); if( ui.Network_Cards_List->count() == 0 ) { ui.Button_Delete_Net_Card->setEnabled( false ); ui.Widget_All_Options->setEnabled( false ); } else { ui.Network_Cards_List->setCurrentRow( ui.Network_Cards_List->count()-1 ); Set_Net_Card_To_Ui( Network_Cards[Network_Cards.count()-1] ); } Check_Network_Card = true; emit Changed(); } else QMessageBox::information( this, tr("Warning!"), tr("Cannot Delete Network Card!") ); } void Old_Network_Widget::on_CB_Network_Card_Model_currentIndexChanged( int index ) { if( index < 0 || Network_Cards.count() <= 0 || Card_Models_QEMU_Name.count() <= 0 || ui.Network_Cards_List->currentRow() < 0 || ui.CB_Network_Card_Model->count() <= 0 ) { return; } Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Card_Model( Card_Models_QEMU_Name[index] ); } void Old_Network_Widget::on_CB_Connection_Mode_currentIndexChanged( int index ) { bool set_net_mode = ( ! ( index < 0 || Network_Cards.count() <= 0 || Card_Models_QEMU_Name.count() <= 0 || ui.Network_Cards_List->currentRow() < 0 || ui.CB_Network_Card_Model->count() <= 0 ) ); switch( index ) { case 0: // user mode if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Usermode ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( true ); ui.Edit_Hostname->setEnabled( true ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; case 1: // open TUN/TAP if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Tuntap ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( true ); ui.Edit_TUN_TAP_Script->setEnabled( true ); ui.TB_Browse_TUN_Script->setEnabled( true ); ui.Label_If_Name->setEnabled( true ); ui.Edit_Interface_Name->setEnabled( true ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; case 2: // already open TUN/TAP if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Tuntapfd ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( true ); ui.Edit_Interface_Name->setEnabled( true ); ui.Label_File_Descriptor->setEnabled( true ); ui.SB_File_Descriptor->setEnabled( true ); break; case 3: // open listening TCP socket if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Tcplisten ); ui.Label_IP->setEnabled( true ); ui.Edit_IP_Address->setEnabled( true ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( true ); ui.SB_Port->setEnabled( true ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; case 4: // already open TCP socket if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Tcpfd ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( true ); ui.SB_File_Descriptor->setEnabled( true ); break; case 5: // connect to listening TCP socket if(set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Tcpconnect ); ui.Label_IP->setEnabled( true ); ui.Edit_IP_Address->setEnabled( true ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( true ); ui.SB_Port->setEnabled( true ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; case 6: // create shared VLAN via UDP multicast socket if(set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Multicast ); ui.Label_IP->setEnabled( true ); ui.Edit_IP_Address->setEnabled( true ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( true ); ui.SB_Port->setEnabled( true ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; case 7: // use already open UDP multicast socket if(set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_Multicastfd ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( true ); ui.Edit_MAC_Address->setEnabled( true ); ui.TB_Generate_New_MAC->setEnabled( true ); ui.Label_VLAN->setEnabled( true ); ui.SB_VLAN->setEnabled( true ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( true ); ui.SB_File_Descriptor->setEnabled( true ); break; default: // no connection if (set_net_mode) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Net_Mode( VM::Net_Mode_None ); ui.Label_IP->setEnabled( false ); ui.Edit_IP_Address->setEnabled( false ); ui.Label_Host_Name->setEnabled( false ); ui.Edit_Hostname->setEnabled( false ); ui.Label_Port->setEnabled( false ); ui.SB_Port->setEnabled( false ); ui.Label_MAC->setEnabled( false ); ui.Edit_MAC_Address->setEnabled( false ); ui.TB_Generate_New_MAC->setEnabled( false ); ui.Label_VLAN->setEnabled( false ); ui.SB_VLAN->setEnabled( false ); ui.CH_TUN_TAP_Script->setEnabled( false ); ui.Edit_TUN_TAP_Script->setEnabled( false ); ui.TB_Browse_TUN_Script->setEnabled( false ); ui.Label_If_Name->setEnabled( false ); ui.Edit_Interface_Name->setEnabled( false ); ui.Label_File_Descriptor->setEnabled( false ); ui.SB_File_Descriptor->setEnabled( false ); break; } hide_Show_Disabled_Enabled_Options(); } void Old_Network_Widget::hide_Show_Disabled_Enabled_Options() { auto list = ui.Widget_All_Options->findChildren(); for ( int i = 0; i < list.count(); i++ ) { if ( list.at(i)->isEnabled() ) list[i]->show(); else list[i]->hide(); } // prevent QComboboxes from popping up ui.CB_Network_Card_Model->hidePopup(); ui.CB_Connection_Mode->hidePopup(); } void Old_Network_Widget::on_Edit_Hostname_textChanged() { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Hostname( ui.Edit_Hostname->text() ); } void Old_Network_Widget::on_Edit_IP_Address_textChanged() { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_IP_Address( ui.Edit_IP_Address->text() ); } void Old_Network_Widget::on_Edit_MAC_Address_textChanged() { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_MAC_Address( ui.Edit_MAC_Address->text() ); } void Old_Network_Widget::on_SB_Port_valueChanged( int i ) { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Port( i ); } void Old_Network_Widget::on_SB_VLAN_valueChanged( int i ) { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_VLAN( i ); } void Old_Network_Widget::on_CH_TUN_TAP_Script_stateChanged( int state ) { if( state == Qt::Checked ) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Use_TUN_TAP_Script( true ); else if( state == Qt::Unchecked ) Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Use_TUN_TAP_Script( false ); } void Old_Network_Widget::on_Edit_TUN_TAP_Script_textChanged() { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_TUN_TAP_Script( ui.Edit_TUN_TAP_Script->text() ); } void Old_Network_Widget::on_Edit_Interface_Name_textChanged() { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_Interface_Name( ui.Edit_Interface_Name->text() ); } void Old_Network_Widget::on_SB_File_Descriptor_valueChanged( int i ) { Network_Cards[ ui.Network_Cards_List->currentRow() ].Set_File_Descriptor( i ); } void Old_Network_Widget::on_TB_Generate_New_MAC_clicked() { ui.Edit_MAC_Address->setText( Network_Cards[ ui.Network_Cards_List->currentRow() ].Generate_MAC() ); } void Old_Network_Widget::on_TB_Browse_TUN_Script_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Select script"), Get_Last_Dir_Path(ui.Edit_TUN_TAP_Script->text()), tr("All Files (*);;Scripts (*.sh)") ); if( ! fileName.isEmpty() ) ui.Edit_TUN_TAP_Script->setText( QDir::toNativeSeparators(fileName) ); } void Old_Network_Widget::Set_Net_Card_To_Ui( const VM_Net_Card &card ) { // Card Model for( int ix = 0; ix < Card_Models_QEMU_Name.count(); ix++ ) { if( card.Get_Card_Model() == Card_Models_QEMU_Name[ix] ) { ui.CB_Network_Card_Model->setCurrentIndex( ix ); } } // Connection Type switch( card.Get_Net_Mode() ) { case VM::Net_Mode_Usermode: ui.CB_Connection_Mode->setCurrentIndex( 0 ); break; case VM::Net_Mode_Tuntap: ui.CB_Connection_Mode->setCurrentIndex( 1 ); break; case VM::Net_Mode_Tuntapfd: ui.CB_Connection_Mode->setCurrentIndex( 2 ); break; case VM::Net_Mode_Tcplisten: ui.CB_Connection_Mode->setCurrentIndex( 3 ); break; case VM::Net_Mode_Tcpfd: ui.CB_Connection_Mode->setCurrentIndex( 4 ); break; case VM::Net_Mode_Tcpconnect: ui.CB_Connection_Mode->setCurrentIndex( 5 ); break; case VM::Net_Mode_Multicast: ui.CB_Connection_Mode->setCurrentIndex( 6 ); break; case VM::Net_Mode_Multicastfd: ui.CB_Connection_Mode->setCurrentIndex( 7 ); break; case VM::Net_Mode_None: ui.CB_Connection_Mode->setCurrentIndex( 8 ); break; default: AQError( "void Main_Window::Set_Net_Card_To_Ui( const VM_Net_Card &card )", "Default Section!" ); ui.CB_Connection_Mode->setCurrentIndex( 8 ); break; } ui.Edit_Hostname->setText( card.Get_Hostname() ); ui.Edit_IP_Address->setText( card.Get_IP_Address() ); ui.Edit_MAC_Address->setText( card.Get_MAC_Address() ); ui.SB_Port->setValue( card.Get_Port() ); ui.SB_VLAN->setValue( card.Get_VLAN() ); ui.CH_TUN_TAP_Script->setChecked( card.Get_Use_TUN_TAP_Script() ); ui.Edit_TUN_TAP_Script->setText( card.Get_TUN_TAP_Script() ); ui.Edit_Interface_Name->setText( card.Get_Interface_Name() ); ui.SB_File_Descriptor->setValue( card.Get_File_Descriptor() ); } bool Old_Network_Widget::Net_Card_is_Valid( int index ) { if( index < 0 || index >= Network_Cards.count() ) { AQError( "bool Main_Window::Net_Card_is_Valid( int index )", "Index Out Of Range!" ); return false; } // IP Address if( Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcplisten || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcpconnect || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Multicast ) { QRegExp rx_ip( "^([1-9]|[1-9][\\d]|[1][\\d][\\d]|2[0-4][\\d]|25[0-5])(\\.([0-9]|[1-9][\\d]|[1][\\d][\\d]|2[0-4][\\d]|25[0-5])){3}$" ); if( ! rx_ip.exactMatch(Network_Cards[index].Get_IP_Address()) ) { if( ! ( Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcplisten && Network_Cards[index].Get_IP_Address().isEmpty() )) { AQGraphic_Warning( tr("Error!"), tr("IP Address in Card ") + QString::number(index+1) + tr(" Invalid!") ); return false; } } } // MAC Address if( Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Usermode || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tuntap || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tuntapfd || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcplisten || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcpfd || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tcpconnect || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Multicast || Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Multicastfd ) { QRegExp rx_mac = QRegExp( "^[\\da-fA-F]{2}(\\:[\\da-fA-F]{2}){5}$" ); if( ! Network_Cards[index].Get_MAC_Address().isEmpty() && ! rx_mac.exactMatch(Network_Cards[index].Get_MAC_Address()) ) { AQGraphic_Warning( tr("Error!"), tr("MAC Address in Card ") + QString::number(index+1) + tr(" Invalid!") ); return false; } } // TUN/TAP Script if( Network_Cards[index].Get_Net_Mode() == VM::Net_Mode_Tuntap ) { if( Network_Cards[index].Get_Use_TUN_TAP_Script() == true && Network_Cards[index].Get_TUN_TAP_Script().isEmpty() == false && Network_Cards[index].Get_TUN_TAP_Script() != "no" && QFile::exists(Network_Cards[index].Get_TUN_TAP_Script()) == false ) { int retVal = QMessageBox::critical( this, tr("Error!"), tr("In Card ") + QString::number(index+1) + tr(" TUN/TAP Script File \"%1\" Not Exists!\nContinue Without It File?").arg(Network_Cards[index].Get_TUN_TAP_Script()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( retVal == QMessageBox::No ) return false; else { Network_Cards[index].Set_Use_TUN_TAP_Script( false ); if( index == ui.Network_Cards_List->currentRow() ) ui.CH_TUN_TAP_Script->setChecked( false ); } } } return true; } aqemu-0.9.2/src/Old_Network_Widget.h000066400000000000000000000051121272330227200173230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** Copyirght (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef OLD_NETWORK_WIDGET_H #define OLD_NETWORK_WIDGET_H #include "ui_Old_Network_Widget.h" #include "VM_Devices.h" class Old_Network_Widget: public QWidget { Q_OBJECT public: Old_Network_Widget( QWidget *parent = 0 ); bool Get_Network_Cards( QList &cards ); void Set_Network_Cards( const QList &cards ); void Set_Network_Card_Models( const QList &models ); void Set_Enabled( bool on ); private slots: void Connect_Slots(); void Disconnect_Slots(); void on_Network_Cards_List_currentItemChanged( QListWidgetItem *current, QListWidgetItem *previous ); void on_Button_Add_Net_Card_clicked(); void on_Button_Delete_Net_Card_clicked(); void on_CB_Network_Card_Model_currentIndexChanged( int index ); void on_CB_Connection_Mode_currentIndexChanged( int index ); void on_Edit_Hostname_textChanged(); void on_Edit_IP_Address_textChanged(); void on_Edit_MAC_Address_textChanged(); void on_SB_Port_valueChanged( int i ); void on_SB_VLAN_valueChanged( int i ); void on_CH_TUN_TAP_Script_stateChanged( int state ); void on_Edit_TUN_TAP_Script_textChanged(); void on_Edit_Interface_Name_textChanged(); void on_SB_File_Descriptor_valueChanged( int i ); void on_TB_Generate_New_MAC_clicked(); void on_TB_Browse_TUN_Script_clicked(); void Set_Net_Card_To_Ui( const VM_Net_Card &card ); bool Net_Card_is_Valid( int index ); signals: void Changed(); private: void hide_Show_Disabled_Enabled_Options(); Ui::Old_Network_Widget ui; QList Network_Cards; bool Check_Network_Card; QStringList Card_Models_QEMU_Name; }; #endif aqemu-0.9.2/src/Old_Network_Widget.ui000066400000000000000000000434161272330227200175220ustar00rootroot00000000000000 Old_Network_Widget 0 0 976 728 Old Network Widget 5 0 0 0 0 Add :/add.png:/add.png Qt::ToolButtonTextUnderIcon 0 0 &Delete :/remove.png:/remove.png Qt::ToolButtonTextUnderIcon Qt::Vertical 20 13 Qt::Horizontal 0 0 0 0 true 0 0 200 0 &IP address: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_IP_Address 0 0 Networ&k card model: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Network_Card_Model 18 0 ... :/open-file.png:/open-file.png 0 0 80 0 80 16777215 1 50000 80 0 80 16777215 If the value is 0 then it will not be used 0 99999999 0 80 0 80 16777215 Generate New MAC :/update.png:/update.png 0 0 V&LAN: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_VLAN 32 0 0 200 0 In&terface Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Interface_Name 0 0 8 32 Use the user mode network stack Open a TUN/TAP interface Use an already open TUN/TAP interface Open a listening TCP socket Use an already open TCP socket Connect to listening TCP socket Create shared VLAN via UDP multicast socket Use an already open UDP multicast socket No connection 0 0 &FD: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_File_Descriptor 0 0 0 0 &TUN/TAP Script: true Qt::Vertical 20 16 Qt::Horizontal QSizePolicy::Fixed 24 20 0 0 &MAC address: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_MAC_Address Qt::Vertical QSizePolicy::Fixed 20 8 0 0 &Connection mode: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Connection_Mode 0 0 VM hostname: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Edit_Hostname 0 0 Por&t: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_Port QFrame::StyledPanel QFrame::Raised IP_Edit QFrame
IP_Edit.h
1
Network_Cards_List Button_Add_Net_Card Edit_Hostname
aqemu-0.9.2/src/Ports_Tab_Widget.cpp000066400000000000000000000263711272330227200173360ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include "Utils.h" #include "System_Info.h" #include "Ports_Tab_Widget.h" #include "Add_Port_Window.h" #include "Add_USB_Port_Window.h" #include "Device_Manager_Widget.h" Ports_Tab_Widget::Ports_Tab_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); Index = 0; QHeaderView *hv = new QHeaderView( Qt::Vertical, ui.Ports_Table ); hv->setSectionResizeMode( QHeaderView::Fixed ); ui.Ports_Table->setVerticalHeader( hv ); hv = new QHeaderView( Qt::Horizontal, ui.Ports_Table ); hv->setStretchLastSection( true ); hv->setSectionResizeMode( QHeaderView::ResizeToContents ); ui.Ports_Table->setHorizontalHeader( hv ); } void Ports_Tab_Widget::syncLayout(Device_Manager_Widget* dm) { int w = dm->ui.add_layout_widget->sizeHint().width(); ui.add_layout_widget->setMinimumWidth(w); ui.add_layout_widget->setMaximumWidth(w); w = dm->ui.manage_layout_widget->sizeHint().width(); ui.manage_layout_widget->setMinimumWidth(w); ui.manage_layout_widget->setMaximumWidth(w); /* w = dm->ui.view_layout_widget->sizeHint().width(); ui.view_layout_widget->setMinimumWidth(w); ui.view_layout_widget->setMaximumWidth(w);*/ } QList Ports_Tab_Widget::Get_Serial_Ports() const { QList tmp_list; for( QMapIterator iter(Serial_Ports); iter.hasNext(); ) { iter.next(); tmp_list << iter.value(); } return tmp_list; } void Ports_Tab_Widget::Set_Serial_Ports( const QList &list ) { for( int ix = 0; ix < list.count(); ix++ ) { Index++; Serial_Ports[ Index ] = list[ ix ]; ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_Port_Info(Serial_Ports[Index]) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("COM (Serial Port)") ); newItem->setData( Qt::UserRole, "COM" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); } } QList Ports_Tab_Widget::Get_Parallel_Ports() const { QList tmp_list; for( QMapIterator iter(Parallel_Ports); iter.hasNext(); ) { iter.next(); tmp_list << iter.value(); } return tmp_list; } void Ports_Tab_Widget::Set_Parallel_Ports( const QList &list ) { for( int ix = 0; ix < list.count(); ix++ ) { Index++; Parallel_Ports[ Index ] = list[ ix ]; ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_Port_Info(Parallel_Ports[Index]) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("LPT (Parallel Port)") ); newItem->setData( Qt::UserRole, "LPT" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); } } QList Ports_Tab_Widget::Get_USB_Ports() const { QList tmp_list; for( QMapIterator iter(USB_Ports); iter.hasNext(); ) { iter.next(); tmp_list << iter.value(); } return tmp_list; } void Ports_Tab_Widget::Set_USB_Ports( const QList &list ) { for( int ix = 0; ix < list.count(); ix++ ) { Index++; USB_Ports[ Index ] = list[ ix ]; ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_USB_Port_Info(USB_Ports[Index]) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("USB Port") ); newItem->setData( Qt::UserRole, "USB" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); } } void Ports_Tab_Widget::Clear_Old_Ports() { ui.Ports_Table->clearContents(); for( int rx = 0; rx < ui.Ports_Table->rowCount(); ) ui.Ports_Table->removeRow( rx ); Index = 0; Serial_Ports.clear(); Parallel_Ports.clear(); USB_Ports.clear(); } QString Ports_Tab_Widget::Get_Port_Info( const VM_Port &port ) { return "(This function not complete)"; // FIXME } QString Ports_Tab_Widget::Get_USB_Port_Info( const VM_USB &port ) { if( port.Get_Use_Host_Device() == false ) { QString devName = ""; bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; port.Get_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); if( usb_k ) devName = tr("Keyboard"); else if( usb_m ) devName = tr("Mouse"); else if( usb_t ) devName = tr("Tablet"); else if( usb_wt ) devName = tr("Wacom Tablet"); else if( usb_b ) devName = tr("Braille"); else { AQError( "QString Ports_Tab_Widget::Get_USB_Port_Info( const VM_USB &port )", "No QEMU USB Device!" ); } return tr( "Virtual QEMU Device: %1" ).arg(devName); } else { if( port.Get_Bus().isEmpty() || port.Get_Addr().isEmpty() || port.Get_DevPath().isEmpty() ) { return tr("%1 %2 (Vendor ID: %3 Product ID: %4)").arg( port.Get_Manufacturer_Name() ) .arg( port.Get_Product_Name() ) .arg( port.Get_Vendor_ID() ) .arg( port.Get_Product_ID() ); } else { return tr("%1 %2 (Bus.Addr.Path: %3.%4.%5)").arg( port.Get_Manufacturer_Name() ) .arg( port.Get_Product_Name() ) .arg( port.Get_Bus() ) .arg( port.Get_Addr() ) .arg( port.Get_DevPath() ); } } } void Ports_Tab_Widget::on_TB_Add_Serial_Port_clicked() { if( Serial_Ports.count() >= 4 ) { AQGraphic_Warning( tr("Warning"), tr("You can add no more than 4 COM ports") ); } else { Add_Port_Window *add_port_win = new Add_Port_Window( this ); add_port_win->Set_Port( VM_Port() ); if( add_port_win->exec() == QDialog::Accepted ) { Index++; Serial_Ports[ Index ] = add_port_win->Get_Port(); ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_Port_Info(add_port_win->Get_Port()) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("COM (Serial Port)") ); newItem->setData( Qt::UserRole, "COM" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); emit Settings_Changed(); } delete add_port_win; } } void Ports_Tab_Widget::on_TB_Add_Parallel_Port_clicked() { if( Parallel_Ports.count() >= 3 ) { AQGraphic_Warning( tr("Warning"), tr("You can add no more than 3 LPT ports") ); } else { Add_Port_Window *add_port_win = new Add_Port_Window( this ); add_port_win->Set_Port( VM_Port() ); if( add_port_win->exec() == QDialog::Accepted ) { Index++; Parallel_Ports[ Index ] = add_port_win->Get_Port(); ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_Port_Info(add_port_win->Get_Port()) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("LPT (Parallel Port)") ); newItem->setData( Qt::UserRole, "LPT" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); emit Settings_Changed(); } delete add_port_win; } } void Ports_Tab_Widget::on_TB_Add_USB_Port_clicked() { Add_USB_Port_Window *add_usb_win = new Add_USB_Port_Window( this ); add_usb_win->Set_Port( VM_USB() ); if( add_usb_win->exec() == QDialog::Accepted ) { Index++; USB_Ports[ Index ] = add_usb_win->Get_Port(); ui.Ports_Table->insertRow( ui.Ports_Table->rowCount() ); QTableWidgetItem *newItem = new QTableWidgetItem( Get_USB_Port_Info(add_usb_win->Get_Port()) ); newItem->setData( Qt::UserRole, Index ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 1, newItem ); newItem = new QTableWidgetItem( tr("USB Port") ); newItem->setData( Qt::UserRole, "USB" ); ui.Ports_Table->setItem( ui.Ports_Table->rowCount()-1, 0, newItem ); emit Settings_Changed(); } delete add_usb_win; } void Ports_Tab_Widget::on_TB_Edit_Port_clicked() { if( ui.Ports_Table->currentRow() < 0 ) { AQGraphic_Warning( tr("Warning"), tr("Device not select!") ); return; } else { // Port Type QString type = ui.Ports_Table->item( ui.Ports_Table->currentRow(), 0 )->data( Qt::UserRole ).toString(); int ix = ui.Ports_Table->item( ui.Ports_Table->currentRow(), 1 )->data( Qt::UserRole ).toInt(); if( type == "COM" ) { Add_Port_Window *add_port_win = new Add_Port_Window( this ); add_port_win->Set_Port( Serial_Ports[ix] ); if( add_port_win->exec() == QDialog::Accepted ) { Serial_Ports[ ix ] = add_port_win->Get_Port(); emit Settings_Changed(); } delete add_port_win; } else if( type == "LPT" ) { Add_Port_Window *add_port_win = new Add_Port_Window( this ); add_port_win->Set_Port( Parallel_Ports[ix] ); if( add_port_win->exec() == QDialog::Accepted ) { Parallel_Ports[ ix ] = add_port_win->Get_Port(); emit Settings_Changed(); } delete add_port_win; } else if( type == "USB" ) { Add_USB_Port_Window *add_usb_win = new Add_USB_Port_Window( this ); add_usb_win->Set_Port( USB_Ports[ix] ); if( add_usb_win->exec() == QDialog::Accepted ) { USB_Ports[ ix ] = add_usb_win->Get_Port(); emit Settings_Changed(); } delete add_usb_win; } else { AQError( "void Ports_Tab_Widget::on_TB_Edit_Port_clicked()", "Invalid port type!" ); return; } } } void Ports_Tab_Widget::on_TB_Delete_Port_clicked() { if( ui.Ports_Table->currentRow() < 0 ) { AQGraphic_Warning( tr("Warning"), tr("Device doesn't selected!") ); return; } else { QString type = ui.Ports_Table->item( ui.Ports_Table->currentRow(), 0 )->data( Qt::UserRole ).toString(); int ix = ui.Ports_Table->item( ui.Ports_Table->currentRow(), 1 )->data( Qt::UserRole ).toInt(); if( type == "COM" ) Serial_Ports.remove( ix ); else if( type == "LPT" ) Parallel_Ports.remove( ix ); else if( type == "USB" ) USB_Ports.remove( ix ); else { AQError( "void Ports_Tab_Widget::on_TB_Delete_Port_clicked()", "Invalid port type!" ); return; } ui.Ports_Table->removeRow( ui.Ports_Table->currentRow() ); emit Settings_Changed(); } } void Ports_Tab_Widget::on_Ports_Table_itemDoubleClicked( QTableWidgetItem *item ) { on_TB_Edit_Port_clicked(); } aqemu-0.9.2/src/Ports_Tab_Widget.h000066400000000000000000000041731272330227200167770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef PORTS_TAB_WINGET_H #define PORTS_TAB_WINGET_H #include "VM_Devices.h" #include "ui_Ports_Tab_Widget.h" class Device_Manager_Widget; class Ports_Tab_Widget: public QWidget { Q_OBJECT public: Ports_Tab_Widget( QWidget *parent = 0 ); QList Get_Serial_Ports() const; void Set_Serial_Ports( const QList &list ); QList Get_Parallel_Ports() const; void Set_Parallel_Ports( const QList &list ); QList Get_USB_Ports() const; void Set_USB_Ports( const QList &list ); void Clear_Old_Ports(); void syncLayout(Device_Manager_Widget*); private: QString Get_Port_Info( const VM_Port &port ); QString Get_USB_Port_Info( const VM_USB &port ); private slots: void on_TB_Add_Serial_Port_clicked(); void on_TB_Add_Parallel_Port_clicked(); void on_TB_Add_USB_Port_clicked(); void on_TB_Edit_Port_clicked(); void on_TB_Delete_Port_clicked(); void on_Ports_Table_itemDoubleClicked( QTableWidgetItem *item ); signals: void Settings_Changed(); private: Ui::Ports_Tab_Widget ui; int Index; QMap Serial_Ports; QMap Parallel_Ports; QMap USB_Ports; }; #endif aqemu-0.9.2/src/Ports_Tab_Widget.ui000066400000000000000000000237661272330227200171760ustar00rootroot00000000000000 Andrey Rijov Ports_Tab_Widget 0 0 416 345 Ports 9 9 9 9 6 1 1 1 1 Manage Ports 6 0 0 0 0 Edit port properties :/edit.png:/edit.png 32 32 Qt::ToolButtonIconOnly false Remove port :/remove.png:/remove.png 32 32 Qt::ToolButtonIconOnly false Qt::Horizontal 40 20 Qt::Horizontal 323 20 Qt::Horizontal 6 1 1 1 1 Add Ports 6 0 0 0 0 Add serial port (COM) :/serial-port.png:/serial-port.png 32 32 Qt::ToolButtonIconOnly false Add parallel port (LPT) :/parallel-port.png:/parallel-port.png 32 32 Qt::ToolButtonIconOnly false Add USB port :/usb.png:/usb.png 32 32 Qt::ToolButtonIconOnly false Qt::Horizontal 40 20 Qt::Vertical 0 0 QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel false Port Type Details Ports_Table aqemu-0.9.2/src/Properties_Window.cpp000066400000000000000000000362271272330227200176220ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Properties_Window.h" #include "Create_HDD_Image_Window.h" #include "Utils.h" #include "System_Info.h" #include "Add_New_Device_Window.h" Properties_Window::Properties_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); HDD_Info = new HDD_Image_Info(); connect( ui.CB_FD_Devices, SIGNAL(editTextChanged(QString)), this, SLOT(on_Button_Update_Info_clicked()) ); connect( ui.CB_CDROM_Devices, SIGNAL(editTextChanged(QString)), this, SLOT(on_Button_Update_Info_clicked()) ); connect( ui.Edit_HDD_Image_Path, SIGNAL(textChanged(QString)), this, SLOT(on_Button_Update_Info_clicked()) ); } const VM_Storage_Device &Properties_Window::Get_Floppy() { PW_Storage.Set_Enabled( true ); return PW_Storage; } const VM_Storage_Device &Properties_Window::Get_CD_ROM() { PW_Storage.Set_Enabled( true ); return PW_Storage; } const VM_HDD &Properties_Window::Get_HDD() { PW_HDD.Set_Enabled( true ); return PW_HDD; } void Properties_Window::Set_Floppy( const VM_Storage_Device &fd, const QString &name ) { PW_Storage = fd; ui.Label_Name->setText( ui.Label_Name->text() + name ); ui.GB_Floppy->setVisible( true ); ui.GB_Floppy->setEnabled( true ); ui.GB_CDROM->setVisible( false ); ui.GB_CDROM->setEnabled( false ); ui.GB_HDD->setVisible( false ); ui.GB_HDD->setEnabled( false ); // Find Floppy's ui.CB_FD_Devices->clear(); QStringList fd_list = System_Info::Get_Host_FDD_List(); fd_list += Get_FDD_Recent_Images_List(); if( fd_list.count() < 1 ) { AQDebug( "void Properties_Window::Set_Floppy( const VM_Storage_Device &fd, const QString &name )", "Cannot Find Host Floppy Devices!" ); } else { for( int d = 0; d < fd_list.count(); ++d ) ui.CB_FD_Devices->addItem( fd_list[d] ); } ui.CB_FD_Devices->setEditText( fd.Get_File_Name() ); on_Button_Update_Info_clicked(); resize( width(), minimumSizeHint().height() ); } void Properties_Window::Set_CD_ROM( const VM_Storage_Device &cd, const QString &name ) { PW_Storage = cd; ui.Label_Name->setText( ui.Label_Name->text() + name ); ui.GB_Floppy->setVisible( false ); ui.GB_Floppy->setEnabled( false ); ui.GB_CDROM->setVisible( true ); ui.GB_CDROM->setEnabled( true ); ui.GB_HDD->setVisible( false ); ui.GB_HDD->setEnabled( false ); // Find CD_ROM's ui.CB_CDROM_Devices->clear(); QStringList cd_list = System_Info::Get_Host_CDROM_List(); cd_list += Get_CD_Recent_Images_List(); if( cd_list.count() < 1 ) { AQDebug( "void Properties_Window::Set_CD_ROM( const VM_CDROM &cd, const QString &name )", "Cannot Find Host CD-ROM Devices!" ); } else { for( int d = 0; d < cd_list.count(); ++d ) ui.CB_CDROM_Devices->addItem( cd_list[d] ); } ui.CB_CDROM_Devices->setEditText( cd.Get_File_Name() ); on_Button_Update_Info_clicked(); resize( width(), minimumSizeHint().height() ); } void Properties_Window::Set_HDD( const VM_HDD &hd, const QString &name ) { PW_HDD = hd; connect( HDD_Info, SIGNAL(Completed(bool)), this, SLOT(Update_HDD(bool)) ); ui.Label_Name->setText( ui.Label_Name->text() + name ); ui.Edit_HDD_Image_Path->setText( hd.Get_File_Name() ); ui.GB_Floppy->setVisible( false ); ui.GB_Floppy->setEnabled( false ); ui.GB_CDROM->setVisible( false ); ui.GB_CDROM->setEnabled( false ); ui.GB_HDD->setVisible( true ); ui.GB_HDD->setEnabled( true ); on_Button_Update_Info_clicked(); resize( width(), minimumSizeHint().height() ); } void Properties_Window::Set_Enabled( bool enabled ) { ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled( enabled ); } void Properties_Window::Set_Current_Machine_Devices( const Available_Devices *dev ) { Current_Machine_Devices = dev; } void Properties_Window::done(int r) { if ( r == QDialog::Accepted ) { if( ui.GB_Floppy->isEnabled() ) { if( ! QFile::exists(ui.CB_FD_Devices->lineEdit()->text()) ) { AQGraphic_Warning( tr("Warning"), tr("Image file doesn't exist!") ); return; } else { Add_To_Recent_FDD_Files( ui.CB_FD_Devices->lineEdit()->text() ); QDialog::done(r); return; } } else if( ui.GB_CDROM->isEnabled() ) { if( ! QFile::exists(ui.CB_CDROM_Devices->lineEdit()->text()) ) { AQGraphic_Warning( tr("Warning"), tr("Image file doesn't exist!") ); return; } else { Add_To_Recent_CD_Files( ui.CB_CDROM_Devices->lineEdit()->text() ); QDialog::done(r); return; } } else if( ui.GB_HDD->isEnabled() ) { if( ! QFile::exists(ui.Edit_HDD_Image_Path->text()) ) { AQGraphic_Warning( tr("Warning"), tr("Image file doesn't exist!") ); return; } else { QDialog::done(r); return; } } else { AQError( "void Properties_Window::done(int)", "Default Section!" ); return; } } QDialog::done(r); } void Properties_Window::on_Button_Update_Info_clicked() { if( ui.GB_Floppy->isEnabled() ) { VM_Storage_Device *fd = new VM_Storage_Device( true, ui.CB_FD_Devices->lineEdit()->text() ); if( ui.CB_FD_Devices->lineEdit()->text().isEmpty() ) { ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Kb") ); return; } if( ! QFile::exists(ui.CB_FD_Devices->lineEdit()->text()) ) { ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Kb") ); return; } QFileInfo fd_img = QFileInfo( fd->Get_File_Name() ); qint64 size_in_bytes = fd_img.size(); if( size_in_bytes <= 0 ) ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Kb") ); else ui.Label_Info->setText( tr("Image Size: ") + QString::number((int)size_in_bytes / 1024.0) + tr("Kb") ); delete fd; } else if( ui.GB_CDROM->isEnabled() ) { VM_Storage_Device *cd = new VM_Storage_Device( true, ui.CB_CDROM_Devices->lineEdit()->text() ); if( ui.CB_CDROM_Devices->lineEdit()->text().isEmpty() ) { ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Mb") ); return; } if( ! QFile::exists(ui.CB_CDROM_Devices->lineEdit()->text()) ) { ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Mb") ); return; } QFileInfo cd_img = QFileInfo( cd->Get_File_Name() ); qint64 size_in_bytes = cd_img.size(); if( size_in_bytes <= 0 ) ui.Label_Info->setText( tr("Image Size: ") + QString::number(0) + tr("Mb") ); else ui.Label_Info->setText( tr("Image Size: ") + QString::number((float)size_in_bytes / 1024.0 / 1024.0, 'f', 2) + tr("Mb") ); delete cd; } else if( ui.GB_HDD->isEnabled() ) { HDD_Info->Update_Disk_Info( ui.Edit_HDD_Image_Path->text() ); } else { AQError( "void Properties_Window::on_Button_Update_Info_clicked()", "No Enabled GB!" ); } } void Properties_Window::on_TB_FD_Image_Browse_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Open Floppy Image File"), Get_Last_Dir_Path(ui.CB_FD_Devices->lineEdit()->text()), tr("All Files (*);;Images Files (*.img *.ima)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); ui.CB_FD_Devices->lineEdit()->setText( fileName ); Add_To_Recent_FDD_Files( fileName ); // Add this path to ComboBox items? for( int ix = 0; ix < ui.CB_FD_Devices->count(); ++ix ) { if( ui.CB_FD_Devices->itemText(ix) == fileName ) return; } ui.CB_FD_Devices->addItem( fileName ); } } void Properties_Window::on_TB_CDROM_Image_Browse_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Open CD\\DVD-ROM Image File"), Get_Last_Dir_Path(ui.CB_CDROM_Devices->lineEdit()->text()), tr("All Files (*);;Images Files (*.iso)") ); if( ! fileName.isEmpty() ) { fileName = QDir::toNativeSeparators( fileName ); ui.CB_CDROM_Devices->lineEdit()->setText( fileName ); Add_To_Recent_CD_Files( fileName ); // Add this path to ComboBox items? for( int ix = 0; ix < ui.CB_CDROM_Devices->count(); ++ix ) { if( ui.CB_CDROM_Devices->itemText(ix) == fileName ) return; } ui.CB_CDROM_Devices->addItem( fileName ); } } void Properties_Window::on_TB_HDD_Image_Browse_clicked() { QString fileName = QFileDialog::getOpenFileName( this, tr("Open HDD Image File"), Get_Last_Dir_Path(ui.Edit_HDD_Image_Path->text()), tr("All Files (*);;Images Files (*.img *.qcow *.wmdk)") ); if( ! fileName.isEmpty() ) ui.Edit_HDD_Image_Path->setText( QDir::toNativeSeparators(fileName) ); } void Properties_Window::on_Button_HDD_New_clicked() { Create_HDD_Image_Window *Create_HDD_Win = new Create_HDD_Image_Window( this ); if( Create_HDD_Win->exec() == QDialog::Accepted ) { ui.Edit_HDD_Image_Path->setText( Create_HDD_Win->Get_Image_File_Name() ); on_Button_Update_Info_clicked(); } delete Create_HDD_Win; } void Properties_Window::on_Button_HDD_Format_clicked() { Create_HDD_Image_Window *Create_HDD_Win = new Create_HDD_Image_Window( this ); Create_HDD_Win->Set_Image_File_Name( ui.Edit_HDD_Image_Path->text() ); if( Create_HDD_Win->exec() == QDialog::Accepted ) on_Button_Update_Info_clicked(); delete Create_HDD_Win; } void Properties_Window::Update_HDD( bool ok ) { PW_HDD.Set_Disk_Info( HDD_Info->Get_Disk_Info() ); QString suf_v = Get_TR_Size_Suffix( PW_HDD.Get_Virtual_Size() ); QString suf_d = Get_TR_Size_Suffix( PW_HDD.Get_Disk_Size() ); ui.Label_Info->setText( tr("Format: ") + PW_HDD.Get_Image_Format() + tr(" Virtual Size: ") + QString::number(PW_HDD.Get_Virtual_Size().Size) + Get_TR_Size_Suffix(PW_HDD.Get_Virtual_Size()) + tr("\nOn Disk Size: ") + QString::number(PW_HDD.Get_Disk_Size().Size) + Get_TR_Size_Suffix(PW_HDD.Get_Disk_Size()) + tr(" Cluster Size: ") + QString::number(PW_HDD.Get_Cluster_Size()) ); } void Properties_Window::on_TB_FD_Advanced_Settings_clicked() { // Set device Add_New_Device_Window *win = new Add_New_Device_Window(); win->Set_Device( PW_Storage.Get_Nativ_Device() ); // Set emulator if( ! Current_Machine_Devices ) { AQError( "void Properties_Window::on_TB_FD_Advanced_Settings_clicked()", "Current_Machine_Devices == NULL" ); return; } win->Set_Emulator_Devices( *Current_Machine_Devices ); // Show dialog if( win->exec() == QDialog::Accepted ) { // Set new values PW_Storage.Set_Nativ_Device( win->Get_Device() ); if( PW_Storage.Get_Nativ_Device().Get_File_Path() != ui.CB_FD_Devices->currentText() ) ui.CB_FD_Devices->setEditText( PW_Storage.Get_Nativ_Device().Get_File_Path() ); // Nativ Mode - on, File - not used if( PW_Storage.Get_Nativ_Device().Get_Nativ_Mode() && PW_Storage.Get_Nativ_Device().Use_File_Path() == false ) ui.CB_FD_Devices->setEditText( "" ); } delete win; } void Properties_Window::on_CB_FD_Devices_editTextChanged( const QString &text ) { PW_Storage.Set_File_Name( text ); VM_Nativ_Storage_Device tmpDev = PW_Storage.Get_Nativ_Device(); // Update nativ device file path if( text.isEmpty() ) { tmpDev.Use_File_Path( false ); } else { tmpDev.Set_File_Path( text ); if( PW_Storage.Get_Nativ_Device().Get_Nativ_Mode() ) tmpDev.Use_File_Path( true ); } PW_Storage.Set_Nativ_Device( tmpDev ); // Update info on_Button_Update_Info_clicked(); } void Properties_Window::on_TB_CDROM_Advanced_Settings_clicked() { // Set device Add_New_Device_Window *win = new Add_New_Device_Window(); win->Set_Device( PW_Storage.Get_Nativ_Device() ); // Set emulator if( ! Current_Machine_Devices ) { AQError( "void Properties_Window::on_TB_CDROM_Advanced_Settings_clicked()", "Current_Machine_Devices == NULL" ); return; } win->Set_Emulator_Devices( *Current_Machine_Devices ); // Show dialog if( win->exec() == QDialog::Accepted ) { // Set new values PW_Storage.Set_Nativ_Device( win->Get_Device() ); if( PW_Storage.Get_Nativ_Device().Get_File_Path() != ui.CB_CDROM_Devices->currentText() ) ui.CB_CDROM_Devices->setEditText( PW_Storage.Get_Nativ_Device().Get_File_Path() ); // Nativ Mode - on, File - not used if( PW_Storage.Get_Nativ_Device().Get_Nativ_Mode() && PW_Storage.Get_Nativ_Device().Use_File_Path() == false ) ui.CB_CDROM_Devices->setEditText( "" ); } delete win; } void Properties_Window::on_CB_CDROM_Devices_editTextChanged( const QString &text ) { PW_Storage.Set_File_Name( text ); VM_Nativ_Storage_Device tmpDev = PW_Storage.Get_Nativ_Device(); // Update nativ device file path if( text.isEmpty() ) { tmpDev.Use_File_Path( false ); } else { tmpDev.Set_File_Path( text ); if( PW_Storage.Get_Nativ_Device().Get_Nativ_Mode() ) tmpDev.Use_File_Path( true ); } PW_Storage.Set_Nativ_Device( tmpDev ); // Update info on_Button_Update_Info_clicked(); } void Properties_Window::on_TB_HDD_Advanced_Settings_clicked() { // Set device Add_New_Device_Window *win = new Add_New_Device_Window(); win->Set_Device( PW_HDD.Get_Nativ_Device() ); // Set emulator if( ! Current_Machine_Devices ) { AQError( "void Properties_Window::on_TB_HDD_Advanced_Settings_clicked()", "Current_Machine_Devices == NULL" ); return; } win->Set_Emulator_Devices( *Current_Machine_Devices ); // Show dialog if( win->exec() == QDialog::Accepted ) { // Set new values PW_HDD.Set_Nativ_Device( win->Get_Device() ); if( PW_HDD.Get_Nativ_Device().Get_File_Path() != ui.Edit_HDD_Image_Path->text() ) ui.Edit_HDD_Image_Path->setText( PW_HDD.Get_Nativ_Device().Get_File_Path() ); // Nativ Mode - on, File - not used if( PW_HDD.Get_Nativ_Device().Get_Nativ_Mode() && PW_HDD.Get_Nativ_Device().Use_File_Path() == false ) ui.Edit_HDD_Image_Path->setText( "" ); } delete win; } void Properties_Window::on_Edit_HDD_Image_Path_textChanged() { PW_HDD.Set_File_Name( ui.Edit_HDD_Image_Path->text() ); VM_Nativ_Storage_Device tmpDev = PW_HDD.Get_Nativ_Device(); // Update nativ device file path if( ui.Edit_HDD_Image_Path->text().isEmpty() ) { tmpDev.Use_File_Path( false ); } else { tmpDev.Set_File_Path( ui.Edit_HDD_Image_Path->text() ); if( PW_HDD.Get_Nativ_Device().Get_Nativ_Mode() ) tmpDev.Use_File_Path( true ); } PW_HDD.Set_Nativ_Device( tmpDev ); // Update info //on_Button_Update_Info_clicked(); HDD_Info->Update_Disk_Info( ui.Edit_HDD_Image_Path->text() ); } aqemu-0.9.2/src/Properties_Window.h000066400000000000000000000046031272330227200172600ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef PROPERTIES_WINDOW_H #define PROPERTIES_WINDOW_H #include "VM_Devices.h" #include "ui_Properties_Window.h" #include "HDD_Image_Info.h" class Properties_Window: public QDialog { Q_OBJECT public: Properties_Window( QWidget *parent = 0 ); const VM_Storage_Device &Get_Floppy(); const VM_Storage_Device &Get_CD_ROM(); const VM_HDD&Get_HDD(); void Set_Floppy( const VM_Storage_Device &fd, const QString &name ); void Set_CD_ROM( const VM_Storage_Device &cd, const QString &name ); void Set_HDD( const VM_HDD &hd, const QString &name ); void Set_Enabled( bool enabled ); void Set_Current_Machine_Devices( const Available_Devices *dev ); private slots: void done(int); void on_Button_Update_Info_clicked(); void on_TB_FD_Image_Browse_clicked(); void on_TB_CDROM_Image_Browse_clicked(); void on_TB_HDD_Image_Browse_clicked(); void on_Button_HDD_New_clicked(); void on_Button_HDD_Format_clicked(); void Update_HDD( bool ok ); void on_TB_FD_Advanced_Settings_clicked(); void on_CB_FD_Devices_editTextChanged( const QString &text ); void on_TB_CDROM_Advanced_Settings_clicked(); void on_CB_CDROM_Devices_editTextChanged( const QString &text ); void on_TB_HDD_Advanced_Settings_clicked(); void on_Edit_HDD_Image_Path_textChanged(); private: Ui::Properties_Window ui; VM_Storage_Device PW_Storage; VM_HDD PW_HDD; HDD_Image_Info* HDD_Info; const Available_Devices *Current_Machine_Devices; }; #endif aqemu-0.9.2/src/Properties_Window.ui000066400000000000000000000265661272330227200174620ustar00rootroot00000000000000 Andrey Rijov Properties_Window Qt::WindowModal 0 0 535 560 Properties :/edit.png:/edit.png 0 0 Floppy true 0 0 Browse :/open-file.png:/open-file.png Qt::ToolButtonIconOnly Qt::Horizontal 114 20 Advanced :/configure.png:/configure.png 0 0 CD/DVD-ROM true Browse :/open-file.png:/open-file.png Qt::ToolButtonIconOnly Qt::Horizontal 114 20 Advanced :/configure.png:/configure.png 0 0 Hard Disk Path to Image: Browse ... :/open-file.png:/open-file.png &Create :/add.png:/add.png &Format :/eraser.png:/eraser.png 0 0 Advanced :/configure.png:/configure.png 0 0 Information 0 0 Device Name: 0 0 Up&date Info :/update.png:/update.png Qt::TextSelectableByMouse Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
CB_FD_Devices TB_FD_Advanced_Settings TB_FD_Image_Browse CB_CDROM_Devices TB_CDROM_Advanced_Settings TB_CDROM_Image_Browse Edit_HDD_Image_Path TB_HDD_Image_Browse Button_HDD_New Button_HDD_Format TB_HDD_Advanced_Settings Button_Update_Info buttonBox accepted() Properties_Window accept() 396 531 267 279 buttonBox rejected() Properties_Window reject() 396 531 267 279
aqemu-0.9.2/src/QDom.cpp000066400000000000000000000164521272330227200147750ustar00rootroot00000000000000/*************************************************************************** ** The MIT License (MIT) ** Copyright (c) 2016 Tobias Gläßer ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the "Software"), ** to deal in the Software without restriction, including without limitation ** the rights to use, copy, modify, merge, publish, distribute, sublicense, ** and/or sell copies of the Software, and to permit persons to whom the Software ** is furnished to do so, subject to the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** ****************************************************************************/ #include "QDom.h" using namespace TinyXML2QDomWrapper; //QDomText QDomText::QDomText() { text = 0; } /* QDomText::QDomText(const QDomText& t) { //text = new XMLText(*t.text); } */ QDomText::QDomText(XMLText* _text) { text = _text; } //QDomElement QDomElement::QDomElement() { element = 0; } QDomElement::QDomElement(XMLElement* _el) { element = _el; } void QDomElement::appendChild(const QDomText& t) { if ( element ) element->InsertEndChild(t.text); } void QDomElement::appendChild(const QDomElement& e) { if ( element ) element->InsertEndChild(e.element); } void QDomElement::setAttribute(const QString& s, const QString& s2) { if ( element ) element->SetAttribute(s.toLatin1().constData(),s2.toLatin1().constData()); } const QDomNode QDomElement::firstChild() const { if ( element ) return QDomNode(element->FirstChild()); else return QDomNode(); } const QDomElement QDomElement::firstChildElement() const { if ( element ) return QDomElement(element->FirstChildElement()); else return QDomElement(); } const QDomElement QDomElement::firstChildElement(const QString& s) const { if ( element ) return QDomElement(element->FirstChildElement(s.toLatin1())); else return QDomElement(); } QList QDomElement::childNodes() { if ( element ) { QList list; for (auto el = element->FirstChildElement(); el != nullptr; el = el->NextSiblingElement()) { list.append(el); } return list; } else return QList(); } bool QDomElement::hasAttribute(const QString& s) { if ( element ) { const char* c = element->Attribute(s.toLatin1()); if ( c == NULL ) return false; else return true; } else { return false; } } QString QDomElement::attribute(const QString& s) { if ( element ) return element->Attribute(s.toLatin1()); else return QString(""); } const QString QDomElement::text() const { if ( element ) return element->GetText(); else return QString(""); } bool QDomElement::isNull() { //TODO if ( element ) { if ( element->NoChildren() ) { if ( element->GetText() != NULL && strcmp(element->GetText(),"") != 0 ) return false; else if ( element->FirstAttribute() != NULL ) return false; else if ( tagName() != "" ) return false; return true; } else return false; } else return true; } QString QDomElement::tagName() { if ( element ) return element->Name(); else return QString(""); } //QDomNode QDomNode::QDomNode(XMLNode* _node) { node = _node; } QDomNode::QDomNode() { node = 0; } const QDomNode QDomNode::nextSibling() { if ( node ) return QDomNode(node->NextSibling()); else return QDomNode(); } bool QDomNode::isNull() { if ( node ) { if ( node->NoChildren() ) { auto test = node->ToElement(); if ( test != NULL ) { if ( test->GetText() != NULL && strcmp(test->GetText(),"") != 0 ) return false; else if ( test->FirstAttribute() != NULL ) return false; else if ( test->Name() != NULL ) return false; else return true; } auto test2 = node->ToText(); if ( test2 != NULL ) return false; return true; } else return false; } else return true; //TODO } const QDomElement QDomNode::toElement() const { if ( node ) return QDomElement(node->ToElement()); else return QDomElement(); } //QDomDocument QDomDocument::QDomDocument() { document = new XMLDocument(); } QDomDocument::QDomDocument(const QString&) { document = new XMLDocument(); //TODO } QDomDocument::~QDomDocument() { delete document; document = nullptr; } void QDomDocument::appendChild(const QDomText& t) { if ( document ) document->InsertEndChild(t.text); } void QDomDocument::appendChild(const QDomElement& e) { if ( document ) document->InsertEndChild(e.element); } void QDomDocument::appendChild(const QDomProcessingInstruction& p) { //TODO: stub } QDomElement QDomDocument::documentElement() { if ( document ) return QDomElement(document->RootElement()); else return QDomElement(); } QDomElement QDomDocument::createElement(const QString& s) { if ( document ) return QDomElement(document->NewElement(s.toLatin1())); else return QDomElement(); } QDomText QDomDocument::createTextNode(const QString& s) { if ( document ) return QDomText(document->NewText(s.toLatin1())); else return QDomText(); } void QDomDocument::save(QTextStream& stream,int) { if ( document ) { XMLPrinter printer; document->Print(&printer); stream << printer.CStr(); } } QDomProcessingInstruction QDomDocument::createProcessingInstruction(const QString&, const QString&) { return QDomProcessingInstruction(); } bool QDomDocument::setContent(QFile* file, bool b, QString* s, int* i, int* i2) { if ( document ) { XMLError err = document->LoadFile(file->fileName().toLatin1()); if ( err == XML_NO_ERROR ) { return true; } else { const char* err_str = document->GetErrorStr1(); if ( err_str != NULL ) s->fromLatin1(err_str); //can't really implement line/col of err, since TinyXML2 doesn't seem to support that if ( i ) *i = -1; if ( i2 ) *i2 = -1; return false; } } else { return false; } } aqemu-0.9.2/src/QDom.h000066400000000000000000000074501272330227200144400ustar00rootroot00000000000000/*************************************************************************** ** The MIT License (MIT) ** Copyright (c) 2016 Tobias Gläßer ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the "Software"), ** to deal in the Software without restriction, including without limitation ** the rights to use, copy, modify, merge, publish, distribute, sublicense, ** and/or sell copies of the Software, and to permit persons to whom the Software ** is furnished to do so, subject to the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ** ****************************************************************************/ #ifndef QDOM_H #define QDOM_H #include #include #include "tinyxml2.h" using namespace tinyxml2; #define TXML2QDOM TinyXML2QDomWrapper namespace TinyXML2QDomWrapper { class QDomNode; class QDomElement; class QDomProcessingInstruction; class QDomText { friend class QDomElement; friend class QDomDocument; public: QDomText(); QDomText(XMLText*); //QDomText(const QDomText&); private: XMLText* text; }; class QDomElement { friend class QDomDocument; public: QDomElement(); QDomElement(XMLElement* _el); void appendChild(const QDomText&); void appendChild(const QDomElement&); void setAttribute(const QString&, const QString&); const QDomNode firstChild() const; const QDomElement firstChildElement() const; const QDomElement firstChildElement(const QString&) const; QList childNodes(); bool hasAttribute(const QString&); QString attribute(const QString&); const QString text() const; bool isNull(); QString tagName(); private: XMLElement* element; }; class QDomNode { friend class QDomElement; friend class QDomDocument; public: QDomNode(XMLNode* _node); QDomNode(); const QDomNode nextSibling(); bool isNull(); const QDomElement toElement() const; private: QDomNode* next; XMLNode* node; }; class QDomDocument : public QDomNode { friend class QDomElement; public: QDomDocument(); ~QDomDocument(); void appendChild(const QDomText&); void appendChild(const QDomElement&); void appendChild(const QDomProcessingInstruction&); QDomDocument(const QString&); QDomElement documentElement(); QDomElement createElement(const QString&); QDomText createTextNode(const QString&); void save(QTextStream&,int); QDomProcessingInstruction createProcessingInstruction(const QString&, const QString&); bool setContent(QFile* file, bool b, QString* s, int* i, int* i2); private: XMLDocument* document; }; class QDomProcessingInstruction { public: private: }; } //namespace end #endif aqemu-0.9.2/src/SMP_Settings_Window.cpp000066400000000000000000000056441272330227200200040ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "SMP_Settings_Window.h" SMP_Settings_Window::SMP_Settings_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } VM::SMP_Options SMP_Settings_Window::Get_Values() const { VM::SMP_Options smp; smp.SMP_Count = ui.SB_SMP->value(); smp.SMP_Cores = ui.SB_Cores->value(); smp.SMP_Threads = ui.SB_Threads->value(); smp.SMP_Sockets = ui.SB_Sockets->value(); smp.SMP_MaxCPUs = ui.SB_MaxCPUs->value(); return smp; } void SMP_Settings_Window::Set_Values( const VM::SMP_Options &smp, unsigned short PSO_SMP_Count, bool PSO_SMP_Cores, bool PSO_SMP_Threads, bool PSO_SMP_Sockets, bool PSO_SMP_MaxCPUs ) { Backup_SMP = smp; ui.SB_SMP->setValue( smp.SMP_Count ); ui.SB_Cores->setValue( smp.SMP_Cores ); ui.SB_Threads->setValue( smp.SMP_Threads ); ui.SB_Sockets->setValue( smp.SMP_Sockets ); ui.SB_MaxCPUs->setValue( smp.SMP_MaxCPUs ); ui.SB_SMP->setMaximum( PSO_SMP_Count ); ui.SB_Cores->setEnabled( PSO_SMP_Cores ); ui.Label_Cores->setEnabled( PSO_SMP_Cores ); ui.SB_Threads->setEnabled( PSO_SMP_Threads ); ui.Lebel_Threads->setEnabled( PSO_SMP_Threads ); ui.SB_Sockets->setEnabled( PSO_SMP_Sockets ); ui.Label_Sockets->setEnabled( PSO_SMP_Sockets ); ui.SB_MaxCPUs->setEnabled( PSO_SMP_MaxCPUs ); ui.Label_MaxCPUs->setEnabled( PSO_SMP_MaxCPUs ); } void SMP_Settings_Window::Set_SMP_Count( int count ) { Backup_SMP.SMP_Count = count; ui.SB_SMP->setValue( count ); ui.SB_Cores->setValue( 0 ); ui.SB_Threads->setValue( 0 ); ui.SB_Sockets->setValue( 0 ); ui.SB_MaxCPUs->setValue( 0 ); } void SMP_Settings_Window::done(int r) { if ( QDialog::Accepted == r ) { // FIXME Calculate Max CPU Count QDialog::done(r); return; } else //cancel { ui.SB_SMP->setValue( Backup_SMP.SMP_Count ); ui.SB_Cores->setValue( Backup_SMP.SMP_Cores ); ui.SB_Threads->setValue( Backup_SMP.SMP_Threads ); ui.SB_Sockets->setValue( Backup_SMP.SMP_Sockets ); ui.SB_MaxCPUs->setValue( Backup_SMP.SMP_MaxCPUs ); QDialog::done(r); } } aqemu-0.9.2/src/SMP_Settings_Window.h000066400000000000000000000030111272330227200174330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SMP_SETTINGS_WINDOW_H #define SMP_SETTINGS_WINDOW_H #include "ui_SMP_Settings_Window.h" #include "VM_Devices.h" class SMP_Settings_Window: public QDialog { Q_OBJECT public: SMP_Settings_Window( QWidget *parent = 0 ); VM::SMP_Options Get_Values() const; void Set_Values( const VM::SMP_Options &smp, unsigned short PSO_SMP_Count, bool PSO_SMP_Cores, bool PSO_SMP_Threads, bool PSO_SMP_Sockets, bool PSO_SMP_MaxCPUs ); void Set_SMP_Count( int count ); private slots: void done(int); private: Ui::SMP_Settings_Window ui; VM::SMP_Options Backup_SMP; }; #endif aqemu-0.9.2/src/SMP_Settings_Window.ui000066400000000000000000000161671272330227200176410ustar00rootroot00000000000000 Andrey Rijov SMP_Settings_Window 0 0 437 257 SMP Settings :/exec.png:/exec.png 0 0 All of these values can be omitted. Missing values (zeroes) get computed automatically. Qt::Horizontal CP&U count: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_SMP 1 255 1 Soc&ket count: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_Sockets 255 0 Qt::Horizontal 1 55 Cores per socket: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_Cores 255 0 &Threads per core: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter SB_Threads 255 0 Maximum &number of hotpluggable CPUs: SB_MaxCPUs 255 0 Qt::Horizontal Qt::Horizontal 205 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
SB_SMP SB_Sockets SB_Cores SB_Threads SB_MaxCPUs buttonBox accepted() SMP_Settings_Window accept() 324 228 218 128 buttonBox rejected() SMP_Settings_Window reject() 324 228 218 128
aqemu-0.9.2/src/SPICE_Settings_Widget.cpp000066400000000000000000000303641272330227200201610ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include "SPICE_Settings_Widget.h" #include "QListWidgetItem" #include "Utils.h" SPICE_Settings_Widget::SPICE_Settings_Widget( QWidget *parent ) : QWidget( parent ) { ui.setupUi( this ); // Connect slots connect( ui.CH_Use_SPICE, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); //TODO: DEPRECATED OPTION / IF THERE'S NO ALTERNATIVE => REMOVE THE CODE //connect( ui.SB_QXL_Num, SIGNAL(valueChanged(int)), this, SIGNAL(State_Changed()) ); //TODO: DEPRECATED OPTION / IF THERE'S NO ALTERNATIVE => REMOVE THE CODE //connect( ui.CB_RAM_Size, SIGNAL(currentIndexChanged(int)), this, SIGNAL(State_Changed()) ); connect( ui.Edit_SPICE_Port, SIGNAL(valueChanged(int)), this, SIGNAL(State_Changed()) ); connect( ui.CH_SPICE_SPort, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.Edit_SPICE_SPort, SIGNAL(valueChanged(int)), this, SIGNAL(State_Changed()) ); connect( ui.CH_SPICE_Host, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.Edit_SPICE_Host, SIGNAL(textChanged(const QString &)), this, SIGNAL(State_Changed()) ); connect( ui.CH_Use_Image_Compression, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.CB_Image_Compression, SIGNAL(currentIndexChanged(int)), this, SIGNAL(State_Changed()) ); connect( ui.CH_Set_Renderer, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.TB_Up, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.TB_Down, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.CH_Use_Video_Compression, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.CH_Use_Playback_Compression, SIGNAL(clicked()), this, SIGNAL(State_Changed()) ); connect( ui.RB_No_Password, SIGNAL(toggled(bool)), this, SIGNAL(State_Changed()) ); connect( ui.Edit_Password, SIGNAL(textChanged(const QString &)), this, SIGNAL(State_Changed()) ); ui.scrollArea->setStyleSheet(R"( QWidget#scrollArea { background: transparent; } QWidget#scrollAreaWidgetContents { background: transparent; } )"); } void SPICE_Settings_Widget::My_Set_Enabled(bool enabled) { QList list; list << ui.Network_Widget << ui.Media_Widget << ui.Security_Widget; Checkbox_Dependend_Set_Enabled(list, ui.CH_Use_SPICE,enabled); } const VM_SPICE &SPICE_Settings_Widget::Get_Settings( bool &settingsValidated ) { spiceSettings = VM_SPICE(); spiceSettings.Use_SPICE( ui.CH_Use_SPICE->isChecked() ); if ( ! ui.CH_Use_SPICE->isChecked() ) { settingsValidated = true; return spiceSettings; } //TODO: DEPRECATED OPTION / IF THERE'S NO ALTERNATIVE => REMOVE THE CODE //spiceSettings.Set_GXL_Devices_Count( ui.SB_QXL_Num->value() ); bool ok = false; unsigned int val = 0; //TODO: DEPRECATED OPTION / IF THERE'S NO ALTERNATIVE => REMOVE THE CODE /*unsigned int val = ui.CB_RAM_Size->currentText().toUInt( &ok ); if( ok ) spiceSettings.Set_RAM_Size( val ); else { AQGraphic_Warning( tr("Error"), tr("SPICE RAM size incorrect!") ); settingsValidated = false; return spiceSettings; }*/ val = ui.Edit_SPICE_Port->value(); spiceSettings.Set_Port( val ); /*if( val > 0 ) spiceSettings.Set_Port( val ); //TODO: seperate validation and / get settings else { AQGraphic_Warning( tr("Error"), tr("SPICE port number incorrect!") ); settingsValidated = false; return spiceSettings; }*/ spiceSettings.Use_SPort( ui.CH_SPICE_SPort->isChecked() ); val = ui.Edit_SPICE_SPort->value(); spiceSettings.Set_SPort( val ); /*if( val > 0 ) spiceSettings.Set_SPort( val ); //TODO: seperate validation and / get settings else { AQGraphic_Warning( tr("Error"), tr("SPICE SPort number incorrect!") ); settingsValidated = false; return spiceSettings; }*/ spiceSettings.Use_Hostname( ui.CH_SPICE_Host->isChecked() ); spiceSettings.Set_Hostname( ui.Edit_SPICE_Host->text() ); spiceSettings.Use_Image_Compression( ui.CH_Use_Image_Compression->isChecked() ); if( ui.CB_Image_Compression->currentIndex() == 0 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_on ); else if( ui.CB_Image_Compression->currentIndex() == 1 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_auto_glz ); else if( ui.CB_Image_Compression->currentIndex() == 2 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_auto_lz ); else if( ui.CB_Image_Compression->currentIndex() == 3 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_quic ); else if( ui.CB_Image_Compression->currentIndex() == 4 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_glz ); else if( ui.CB_Image_Compression->currentIndex() == 5 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_lz ); else if( ui.CB_Image_Compression->currentIndex() == 6 ) spiceSettings.Set_Image_Compression( VM::SPICE_IC_Type_off ); else { AQGraphic_Warning( tr("Error"), tr("SPICE image compression type invalid!") ); settingsValidated = false; return spiceSettings; } spiceSettings.Use_Renderer( ui.CH_Set_Renderer->isChecked() ); QList tmpRendersList; for( int ix = 0; ix < ui.Renderer_Order_List->count(); ++ix ) { tmpRendersList << (VM::SPICE_Renderer)ui.Renderer_Order_List->item( ix )->data( Qt::UserRole ).toInt(); } spiceSettings.Set_Renderer_List( tmpRendersList ); spiceSettings.Use_Video_Stream_Compression( ui.CH_Use_Video_Compression->isChecked() ); spiceSettings.Use_Playback_Compression( ui.CH_Use_Playback_Compression->isChecked() ); spiceSettings.Use_Password( ! ui.RB_No_Password->isChecked() ); spiceSettings.Set_Password( ui.Edit_Password->text() ); settingsValidated = true; return spiceSettings; } void SPICE_Settings_Widget::Set_Settings( const VM_SPICE &settings ) { ui.CH_Use_SPICE->setChecked( settings.Use_SPICE() ); //TODO: DEPRECATED OPTION / IF THERE'S NO ALTERNATIVE => REMOVE THE CODE //ui.SB_QXL_Num->setValue( settings.Get_GXL_Devices_Count() ); //ui.CB_RAM_Size->setEditText( QString::number(settings.Get_RAM_Size()) ); ui.Edit_SPICE_Port->setValue ( settings.Get_Port() ); ui.CH_SPICE_SPort->setChecked( settings.Use_SPort() ); ui.Edit_SPICE_SPort->setValue( settings.Get_SPort() ); ui.CH_SPICE_Host->setChecked( settings.Use_Hostname() ); ui.Edit_SPICE_Host->setText( settings.Get_Hostname() ); ui.CH_Use_Image_Compression->setChecked( settings.Use_Image_Compression() ); switch( settings.Get_Image_Compression() ) { case VM::SPICE_IC_Type_on: ui.CB_Image_Compression->setCurrentIndex( 0 ); break; case VM::SPICE_IC_Type_auto_glz: ui.CB_Image_Compression->setCurrentIndex( 1 ); break; case VM::SPICE_IC_Type_auto_lz: ui.CB_Image_Compression->setCurrentIndex( 2 ); break; case VM::SPICE_IC_Type_quic: ui.CB_Image_Compression->setCurrentIndex( 3 ); break; case VM::SPICE_IC_Type_glz: ui.CB_Image_Compression->setCurrentIndex( 4 ); break; case VM::SPICE_IC_Type_lz: ui.CB_Image_Compression->setCurrentIndex( 5 ); break; case VM::SPICE_IC_Type_off: ui.CB_Image_Compression->setCurrentIndex( 6 ); break; default: ui.CB_Image_Compression->setCurrentIndex( 0 ); break; } ui.CH_Set_Renderer->setChecked( settings.Use_Renderer() ); Show_Renderer_List( settings.Get_Renderer_List() ); ui.CH_Use_Video_Compression->setChecked( settings.Use_Video_Stream_Compression() ); ui.CH_Use_Playback_Compression->setChecked( settings.Use_Playback_Compression() ); ui.RB_No_Password->setChecked( ! settings.Use_Password() ); ui.Edit_Password->setText( settings.Get_Password() ); } void SPICE_Settings_Widget::Set_PSO_GXL( bool use ) { // ui.Label_QXL->setEnabled( use ); // ui.Label_Number_of_QXL_Devices->setEnabled( use ); // ui.SB_QXL_Num->setEnabled( use ); // ui.Label_RAM_Size->setEnabled( use ); // ui.CB_RAM_Size->setEnabled( use ); } void SPICE_Settings_Widget::on_TB_Up_clicked() { if( ! ui.Renderer_Order_List->currentItem() ) return; if( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) <= 0 ) return; // Swap QString tmpStr = ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->text(); VM::SPICE_Renderer tmpRender = (VM::SPICE_Renderer)ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->data( Qt::UserRole ).toInt(); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->setText( ui.Renderer_Order_List->item(ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())-1)->text() ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->setData( Qt::UserRole, ui.Renderer_Order_List->item(ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())-1)->data(Qt::UserRole) ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())-1 )->setText( tmpStr ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())-1 )->setData( Qt::UserRole, tmpRender ); // Select item ui.Renderer_Order_List->setCurrentRow( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())-1 ); } void SPICE_Settings_Widget::on_TB_Down_clicked() { if( ! ui.Renderer_Order_List->currentItem() ) return; if( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) >= ui.Renderer_Order_List->count()-1 ) return; // Swap QString tmpStr = ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->text(); VM::SPICE_Renderer tmpRender = (VM::SPICE_Renderer)ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->data( Qt::UserRole ).toInt(); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->setText( ui.Renderer_Order_List->item(ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())+1)->text() ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem()) )->setData( Qt::UserRole, ui.Renderer_Order_List->item(ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())+1)->data(Qt::UserRole) ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())+1 )->setText( tmpStr ); ui.Renderer_Order_List->item( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())+1 )->setData( Qt::UserRole, tmpRender ); // Select item ui.Renderer_Order_List->setCurrentRow( ui.Renderer_Order_List->row(ui.Renderer_Order_List->currentItem())+1 ); } void SPICE_Settings_Widget::Show_Renderer_List( const QList &list ) { ui.Renderer_Order_List->clear(); for( int ix = 0; ix < list.count(); ++ix ) { QString renderStr; switch( list[ix] ) { case VM::SPICE_Renderer_cairo: renderStr = tr( "cairo" ); break; case VM::SPICE_Renderer_oglpbuf: renderStr = tr( "oglpbuf" ); break; case VM::SPICE_Renderer_oglpixmap: renderStr = tr( "oglpixmap" ); break; default: renderStr = tr( "Error!" ); AQError( "void SPICE_Settings_Widget::Show_Renderer_List( const QList &list )", "Invalid SPICE render type!" ); break; } QListWidgetItem *tmpItem = new QListWidgetItem( renderStr, ui.Renderer_Order_List, QListWidgetItem::Type ); tmpItem->setData( Qt::UserRole, list[ix] ); ui.Renderer_Order_List->addItem( tmpItem ); } } aqemu-0.9.2/src/SPICE_Settings_Widget.h000066400000000000000000000031461272330227200176240ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SPICE_SETTINGS_WIDGET_H #define SPICE_SETTINGS_WIDGET_H #include "ui_SPICE_Settings_Widget.h" #include "VM_Devices.h" class SPICE_Settings_Widget: public QWidget { Q_OBJECT public: SPICE_Settings_Widget( QWidget *parent ); const VM_SPICE &Get_Settings( bool &settingsValidated ); void Set_Settings( const VM_SPICE &settings ); void Set_PSO_GXL( bool use ); void My_Set_Enabled( bool enabled ); private slots: void on_TB_Up_clicked(); void on_TB_Down_clicked(); signals: void State_Changed(); private: void Show_Renderer_List( const QList &list ); Ui::SPICE_Settings_Widget ui; VM_SPICE spiceSettings; }; #endif aqemu-0.9.2/src/SPICE_Settings_Widget.ui000066400000000000000000000500261272330227200200110ustar00rootroot00000000000000 SPICE_Settings_Widget 0 0 648 779 SPICE Settings 4 8 8 Enable SPICE Qt::Horizontal QFrame::NoFrame QFrame::Plain true 0 0 687 707 0 0 0 9 0 true 7 0 0 0 0 Network false 10 Port: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 10000 Qt::Horizontal 13 20 Secure port: false Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 10000 Qt::Horizontal 13 20 Host: false 0 0 Qt::Horizontal Image, Video and Audio false 10 0 0 Set image compression false 0 0 on auto_glz auto_lz quic glz lz off Set renderer 4 15 false :/up.png:/up.png Qt::Vertical 20 13 false :/down.png:/down.png Use video streams detection and compression true Use playback compression (Using the CELT algorithm) true Qt::Horizontal Security false 10 Enable client connection with &no password true &Use password false QLineEdit::Password Qt::Horizontal Qt::Vertical QSizePolicy::Fixed 150 10 CH_SPICE_SPort CH_SPICE_Host Edit_SPICE_Host CH_Use_Image_Compression CB_Image_Compression CH_Set_Renderer TB_Up TB_Down CH_Use_Video_Compression CH_Use_Playback_Compression RB_No_Password RB_Use_Password CH_Use_SPICE toggled(bool) Network_Widget setEnabled(bool) 327 22 327 201 CH_Use_SPICE toggled(bool) Security_Widget setEnabled(bool) 327 22 327 726 CH_Use_SPICE toggled(bool) Media_Widget setEnabled(bool) 327 22 327 460 RB_Use_Password toggled(bool) Edit_Password setEnabled(bool) 108 739 406 739 CH_Use_Image_Compression toggled(bool) CB_Image_Compression setEnabled(bool) 143 304 440 304 CH_Set_Renderer toggled(bool) TB_Up setEnabled(bool) 332 344 610 382 CH_Set_Renderer toggled(bool) TB_Down setEnabled(bool) 332 344 610 545 CH_SPICE_Host toggled(bool) Edit_SPICE_Host setEnabled(bool) 421 201 545 201 CH_SPICE_SPort toggled(bool) Edit_SPICE_SPort setEnabled(bool) 230 201 316 201 aqemu-0.9.2/src/Select_Icon_Window.cpp000066400000000000000000000111421272330227200176420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Utils.h" #include "Select_Icon_Window.h" Select_Icon_Window::Select_Icon_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); // load all icons QDir *icons_dir = new QDir( QDir::toNativeSeparators(Settings.value("AQEMU_Data_Folder", "").toString() + "/os_icons/") ); QFileInfoList icon_files = icons_dir->entryInfoList( QDir::Files, QDir::Name | QDir::IgnoreCase ); for( int ix = 0; ix < icon_files.count(); ++ix ) { QListWidgetItem *ic = new QListWidgetItem( QIcon(icon_files[ix].absoluteFilePath()), icon_files[ix].baseName(), ui.All_Icons_List ); ic->setData( 128, icon_files[ix].absoluteFilePath() ); } } void Select_Icon_Window::Set_Previous_Icon_Path( const QString& path ) { // Analise path... if( path[0] == ':' ) // AQEMU Default Icons { if( path.contains("linux", Qt::CaseInsensitive) ) ui.RB_Icon_Linux->setChecked( true ); else if( path.contains("windows", Qt::CaseInsensitive) ) ui.RB_Icon_Windows->setChecked( true ); else ui.RB_Icon_Other->setChecked( true ); } else if( path.indexOf(QDir::toNativeSeparators(Settings.value("AQEMU_Data_Folder", "").toString() + "/os_icons/")) == 0 ) // AQEMU Icons Folder { ui.RB_All_System_Icons->setChecked( true ); QFileInfo fl = QFileInfo( path ); for( int ix = 0; ix < ui.All_Icons_List->count(); ++ix ) { if( ui.All_Icons_List->item(ix)->text() == fl.baseName() ) { ui.All_Icons_List->setCurrentRow( ix ); // This hack :) ui.All_Icons_List->setViewMode( QListView::ListMode ); ui.All_Icons_List->setViewMode( QListView::IconMode ); return; } } } else // Other Path { ui.RB_User_Icons->setChecked( true ); ui.Edit_Other_Icon_Path->setText( path ); } } QString Select_Icon_Window::Get_New_Icon_Path() const { return New_Icon_Path; } void Select_Icon_Window::done(int r) { if ( r == QDialog::Accepted ) { // Check values if( ui.RB_Icon_Other->isChecked() ) { New_Icon_Path = ":/other.png"; QDialog::done(r); return; } else if( ui.RB_Icon_Windows->isChecked() ) { New_Icon_Path = ":/default_windows.png"; QDialog::done(r); return; } else if( ui.RB_Icon_Linux->isChecked() ) { New_Icon_Path = ":/default_linux.png"; QDialog::done(r); return; } else if( ui.RB_All_System_Icons->isChecked() ) { if( ui.All_Icons_List->currentItem() != NULL ) { New_Icon_Path = ui.All_Icons_List->currentItem()->data( 128 ).toString(); QDialog::done(r); return; } AQGraphic_Warning( tr("Error!"), tr("No icon selected!") ); return; } else if( ui.RB_User_Icons->isChecked() ) { if( QFile::exists(ui.Edit_Other_Icon_Path->text()) ) { New_Icon_Path = ui.Edit_Other_Icon_Path->text(); QDialog::done(r); return; } else { AQGraphic_Warning( tr("Error!"), tr("Icon file doesn't exist!") ); return; } } } QDialog::done(r); } void Select_Icon_Window::on_Button_Browse_clicked() { QString iconPath = QFileDialog::getOpenFileName( this, tr("Select Icon File:"), Get_Last_Dir_Path(ui.Edit_Other_Icon_Path->text()), tr("PNG Images (*.png)") ); if( iconPath.isEmpty() ) return; iconPath = QDir::toNativeSeparators( iconPath ); if( ! QFile::exists(iconPath) ) { AQError( "void Select_Icon_Window::done(int)", "File No Exists!" ); } else { ui.Edit_Other_Icon_Path->setText( iconPath ); } } void Select_Icon_Window::on_All_Icons_List_itemDoubleClicked( QListWidgetItem *item ) { emit accepted(); } aqemu-0.9.2/src/Select_Icon_Window.h000066400000000000000000000027351272330227200173170ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SELECT_ICON_WINDOW_H #define SELECT_ICON_WINDOW_H #include #include "ui_Select_Icon_Window.h" class Select_Icon_Window: public QDialog { Q_OBJECT public: Select_Icon_Window( QWidget *parent = 0 ); void Set_Previous_Icon_Path( const QString& path ); QString Get_New_Icon_Path() const; private slots: void done(int); void on_Button_Browse_clicked(); void on_All_Icons_List_itemDoubleClicked( QListWidgetItem *item ); private: bool GB_Locked; QSettings Settings; QString New_Icon_Path; Ui::Select_Icon_Window ui; }; #endif aqemu-0.9.2/src/Select_Icon_Window.ui000066400000000000000000000305611272330227200175030ustar00rootroot00000000000000 Andrey Rijov Select_Icon_Window 0 0 488 440 Change Icon :/icon.png:/icon.png Select an Icon for this Virtual Machine 0 10 Default Linu&x icon :/default_linux.png:/default_linux.png 24 24 Defa&ult Windows icon :/default_windows.png:/default_windows.png 24 24 &Default icon for other systems :/other.png:/other.png 24 24 true 0 0 OS icon from A&QEMU collection 10 false true QAbstractItemView::NoEditTriggers QAbstractItemView::NoDragDrop 64 64 Qt::ElideMiddle QAbstractItemView::ScrollPerPixel QAbstractItemView::ScrollPerPixel QListView::Static true QListView::Adjust QListView::Batched 80 85 QListView::IconMode true true Qt::Vertical QSizePolicy::Fixed 40 10 0 0 Cus&tom icon Qt::Horizontal 40 20 10 false Icon path: false false &Browse... :/open-file.png:/open-file.png Qt::Horizontal 0 0 0 0 6 Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
RB_Icon_Other All_Icons_List RB_User_Icons Edit_Other_Icon_Path Button_Browse RB_All_System_Icons toggled(bool) All_Icons_List setEnabled(bool) 179 131 72 206 RB_User_Icons toggled(bool) Label_You_Icon_Path setEnabled(bool) 56 364 21 396 RB_User_Icons toggled(bool) Edit_Other_Icon_Path setEnabled(bool) 69 367 64 430 buttonBox accepted() Select_Icon_Window accept() 361 411 243 219 buttonBox rejected() Select_Icon_Window reject() 361 411 243 219 RB_User_Icons toggled(bool) Button_Browse setEnabled(bool) 104 301 449 335
aqemu-0.9.2/src/Settings_Widget.cpp000066400000000000000000000157111272330227200172350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include "Settings_Widget.h" #include "Utils.h" #include My_List_Widget::My_List_Widget(QWidget* parent) : QListWidget(parent) { } void My_List_Widget::wheelEvent(QWheelEvent* e) { if ( e->angleDelta().y() > 0 ) { if ( currentRow() == 0 ) setCurrentRow(count()-1); else setCurrentRow(currentRow()-1); e->accept(); } else if ( e->angleDelta().y() < 0 ) { if ( currentRow() == count() -1 ) setCurrentRow(0); else setCurrentRow(currentRow()+1); e->accept(); } } Settings_Widget::Settings_Widget(QTabWidget* tab_widget, QBoxLayout::Direction dir, bool erase_margins, bool erase_parent_margins) { QBoxLayout *l = nullptr; splitter = nullptr; stack = new QStackedWidget(this); list = new My_List_Widget(this); if ( dir == QBoxLayout::TopToBottom ) { l = new QBoxLayout(QBoxLayout::LeftToRight); list->setFlow( QListView::TopToBottom ); list->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Preferred ); } else { l = new QBoxLayout(QBoxLayout::TopToBottom); //list->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); //list->setMaximumHeight(60); //FIXME: dynamic would be preferred /*auto app = dynamic_cast(QApplication::instance()); if ( app != nullptr ) { QPalette pal = list->palette(); pal.setColor(QPalette::Base, app->palette("QWidget").color(QPalette::Midlight)); list->setPalette(pal); }*/ //stack->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); list->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred ); list->setFlow( QListView::LeftToRight ); list->setViewMode( QListView::IconMode ); list->setMovement( QListView::Static ); list->setWrapping( false ); stack->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Expanding ); } splitter = new QSplitter(this); if ( dir != QBoxLayout::TopToBottom ) splitter->setOrientation(Qt::Vertical); else splitter->setOrientation(Qt::Horizontal); splitter->addWidget(list); splitter->addWidget(stack); l->addWidget(splitter); if ( erase_margins ) l->setContentsMargins(0,0,0,0); setLayout(l); int i = 0; QWidget* widget = nullptr; while( ( widget = tab_widget->widget(i) ) != 0 ) { list->addItem( new QListWidgetItem( tab_widget->tabIcon(i), tab_widget->tabText(i) ) ); stack->addWidget(widget); } connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int))); tab_widget->hide(); tab_widget->parentWidget()->layout()->replaceWidget( tab_widget, this ); if ( erase_margins && erase_parent_margins ) tab_widget->parentWidget()->layout()->setContentsMargins(0,0,0,0); if ( dir != QBoxLayout::TopToBottom ) { list->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff); list->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); list->setSpacing(5); list->setMinimumHeight(list->sizeHintForRow(0)+15); list->setMaximumHeight(list->sizeHintForRow(0)+15); } else { if ( erase_margins ) stack->setContentsMargins(0,0,0,0); } } QMap> Settings_Widget::groups = QMap>(); void Settings_Widget::addToGroup(QString g) { if(g.isEmpty()) return; my_Group = g; groups[g].append(this); } void Settings_Widget::syncGroupIconSizes(QString g) { QList list = groups[g]; QList max_width; int max_list_height = 0; //first find max_width for each index for( int i = 0; i < list.count(); i++ ) { auto sw = list.at(i); for ( int j = 0; j < sw->list->count(); j++ ) { int w = sw->list->item(j)->sizeHint().width(); int list_h = sw->list->minimumSizeHint().height(); if ( list_h > 0 ) { if ( max_list_height == 0 ) max_list_height = list_h; else if ( max_list_height > list_h ) max_list_height = list_h; } if ( w == -1 ) // which will always be the case :-( { QString t = sw->list->item(j)->text(); QLabel l(t); w = l.sizeHint().width() + 20; } if ( max_width.count() < j + 1 ) { //index number not in list max_width.append( w); } else { //index number is in list if ( w > max_width.at(j) ) max_width.replace(j, w); } } } //minimum total list width int min_total_list_width = 15; for ( int j = 0; j < max_width.count(); j++ ) { //int h = sw->list->item(j)->sizeHint().height(); min_total_list_width += max_width.at(j) +5; } //then apply max_width to all for( int i = 0; i < list.count(); i++ ) { auto sw = list.at(i); for ( int j = 0; j < sw->list->count(); j++ ) { //int h = sw->list->item(j)->sizeHint().height(); sw->list->item(j)->setSizeHint(QSize(max_width.at(j),58)); } if ( max_list_height > 0 ) { sw->list->setMinimumHeight(max_list_height); sw->list->setMaximumHeight(max_list_height); } sw->list->setMinimumWidth(min_total_list_width); sw->stack->setMinimumWidth(min_total_list_width); } } void Settings_Widget::setIconSize(QSize s) { list->setIconSize(s); } Settings_Widget::~Settings_Widget() { delete list; delete stack; delete splitter; } aqemu-0.9.2/src/Settings_Widget.h000066400000000000000000000035361272330227200167040ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SETTINGS_WIDGET_H #define SETTINGS_WIDGET_H #include #include #include #include #include class QTabWidget; class QStackedWidget; class QBoxLayout; class QSize; class QSplitter; class My_List_Widget : public QListWidget { Q_OBJECT public: My_List_Widget(QWidget* parent); protected: virtual void wheelEvent(QWheelEvent* e); }; class Settings_Widget : public QWidget { Q_OBJECT public: Settings_Widget(QTabWidget*, QBoxLayout::Direction dir, bool erase_margins = false, bool erase_parent_margins = true); ~Settings_Widget(); void setIconSize(QSize); void addToGroup(QString); static void syncGroupIconSizes(QString); private: My_List_Widget* list; QStackedWidget* stack; QSplitter* splitter; QString my_Group; static QMap> groups; }; #endif aqemu-0.9.2/src/Settings_Window.ui000066400000000000000000000322321272330227200171110ustar00rootroot00000000000000 Andrey Rijov Settings_Window 0 0 474 639 General Settings :/configure.png:/configure.png Basic Settings 10 0 0 AQEMU VM folder: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ... :/open-folder.png:/open-folder.png 0 0 &Default VM template: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter CB_Default_VM_Template 0 0 Create Template :/add.png:/add.png Qt::Vertical QSizePolicy::MinimumExpanding 50 10 User Interface 10 0 0 Language: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter VM icon size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 4 16x16 24x24 32x32 48x48 64x64 0 0 English Qt::Horizontal 40 20 Use screenshot for OS icon in save mode true New removable device menu Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::MinimumExpanding 50 10 Virtual Machine User Interface 10 Show in separa&te windows true Show in window with embedded disp&lay Show in A&QEMU main window Show in AQEM&U main window with embedded display &None Qt::Horizontal 6 Qt::Horizontal 40 20 &OK :/ok.png:/ok.png &Cancel :/cancel.png:/cancel.png Edit_VM_Folder TB_VM_Folder CB_Default_VM_Template Button_Create_Template_from_VM CB_Language CB_VM_Icons_Size RB_Emul_Show_Window RB_Emul_Show_VNC RB_Emul_Show_In_Main_Window RB_Emul_Show_VNC_In_Main_Window RB_Emul_No_Show Button_OK Button_Cancel Button_Cancel clicked() Settings_Window reject() 300 410 129 427 aqemu-0.9.2/src/Snapshot_Properties_Window.cpp000066400000000000000000000034601272330227200214720ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "Utils.h" #include "Snapshot_Properties_Window.h" Snapshot_Properties_Window::Snapshot_Properties_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } QString Snapshot_Properties_Window::Get_Snapshot_Name() const { return ui.Edit_Name->text(); } void Snapshot_Properties_Window::Set_Snapshot_Name( const QString &name ) { ui.Edit_Name->setText( name ); } QString Snapshot_Properties_Window::Get_Snapshot_Description() const { return ui.Edit_Description->toPlainText(); } void Snapshot_Properties_Window::Set_Snapshot_Description( const QString &desc ) { ui.Edit_Description->setPlainText( desc ); } void Snapshot_Properties_Window::done(int r) { if ( r == QDialog::Accepted ) { if( ui.Edit_Name->text().isEmpty() ) { AQGraphic_Warning( tr("Warning"), tr("Snapshot name is empty!") ); return; } } QDialog::done(r); } aqemu-0.9.2/src/Snapshot_Properties_Window.h000066400000000000000000000027021272330227200211350ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SNAPSHOT_PROPERTIES_WINDOW_H #define SNAPSHOT_PROPERTIES_WINDOW_H #include "ui_Snapshot_Properties_Window.h" class Snapshot_Properties_Window: public QDialog { Q_OBJECT public: Snapshot_Properties_Window( QWidget *parent = 0 ); QString Get_Snapshot_Name() const; void Set_Snapshot_Name( const QString &name ); QString Get_Snapshot_Description() const; void Set_Snapshot_Description( const QString &desc ); private slots: void done(int); private: Ui::Snapshot_Properties_Window ui; }; #endif aqemu-0.9.2/src/Snapshot_Properties_Window.ui000066400000000000000000000101041272330227200213160ustar00rootroot00000000000000 Andrey Rijov Snapshot_Properties_Window 0 0 283 264 Snapshot Properties :/edit.png:/edit.png Snapshot Name: 10 512 Qt::Vertical QSizePolicy::Fixed 40 10 Snapshot Description: 10 6 0 0 0 0 Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
Edit_Name buttonBox accepted() Snapshot_Properties_Window accept() 181 234 141 131 buttonBox rejected() Snapshot_Properties_Window reject() 181 234 141 131
aqemu-0.9.2/src/Snapshots_Window.cpp000066400000000000000000000255021272330227200174420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Utils.h" #include "Snapshots_Window.h" #include "Snapshot_Properties_Window.h" #include "HDD_Image_Info.h" Snapshots_Window::Snapshots_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } void Snapshots_Window::Set_VM( Virtual_Machine *vm ) { Current_VM = vm; on_Button_Update_clicked(); if( Current_VM->Get_State() != VM::VMS_Running ) { ui.Button_Create->setEnabled( false ); ui.Button_Delete->setEnabled( false ); } } void Snapshots_Window::on_Snapshots_Tree_itemSelectionChanged() { QList sel_list = ui.Snapshots_Tree->selectedItems(); if( sel_list.count() > 0 ) { QString name = sel_list[0]->text( ui.Snapshots_Tree->currentColumn() ); for( int ix = 0; ix < Current_VM->Get_Snapshots().count(); ++ix ) { QString tmp_str = ""; if( Current_VM->Get_Snapshots()[ix].Get_Name().isEmpty() ) { tmp_str = Current_VM->Get_Snapshots()[ix].Get_Tag(); } else { tmp_str = Current_VM->Get_Snapshots()[ix].Get_Name(); } if( tmp_str == name ) { ui.Label_ID->setText( tr("ID:") + " " + Current_VM->Get_Snapshots()[ix].Get_ID() ); ui.Label_Size->setText( tr("Size:") + " " + Current_VM->Get_Snapshots()[ix].Get_Size() ); ui.Label_Date->setText( tr("Date:") + " " + Current_VM->Get_Snapshots()[ix].Get_Date() ); ui.Label_VM_Clock->setText( tr("VM Clock:") + " " + Current_VM->Get_Snapshots()[ix].Get_VM_Clock() ); ui.Label_Description->setText( tr("Description:") + " " + Current_VM->Get_Snapshots()[ix].Get_Description() ); } } } } void Snapshots_Window::on_Button_Create_clicked() { Snapshot_Properties_Window prop_win( this ); if( prop_win.exec() == QDialog::Accepted ) { QString tag = Get_FS_Compatible_VM_Name( prop_win.Get_Snapshot_Name() ); bool next = true; for( int sx = 0; sx < Current_VM->Get_Snapshots().count(); ++sx ) { if( Current_VM->Get_Snapshots()[sx].Get_Tag() == tag ) { next = false; } } if( next == false ) { for( int ix = 0; ix < 1024; ++ix ) { tag = "snapshot" + QString::number( ix ); bool find = false; for( int sx = 0; sx < Current_VM->Get_Snapshots().count(); ++sx ) { if( Current_VM->Get_Snapshots()[sx].Get_Tag() == tag ) { find = true; } } if( ! find ) break; } } Current_VM->Add_Snapshot( tag, prop_win.Get_Snapshot_Name(), prop_win.Get_Snapshot_Description() ); Current_VM->Save_VM_State( tag, false ); accept(); } } void Snapshots_Window::on_Button_Delete_clicked() { if( ui.Snapshots_Tree->currentItem() == NULL ) return; if( ui.Snapshots_Tree->currentItem()->text(0).isEmpty() ) { AQGraphic_Warning( tr("Warning!"), tr("Please select snapshot that you want to delete!") ); return; } int ret = QMessageBox::question( this, tr("Warning"), tr("Delete Current Snapshot?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( ret == QMessageBox::Yes ) { Current_VM->Delete_Snapshot( ui.Snapshots_Tree->currentItem()->text(0) ); ui.Snapshots_Tree->currentItem()->setHidden( true ); } } void Snapshots_Window::on_Button_Start_clicked() { if( ui.Snapshots_Tree->currentItem() == NULL ) return; if( Current_VM->Get_State() == VM::VMS_Power_Off || Current_VM->Get_State() == VM::VMS_Saved ) { if( ui.Snapshots_Tree->currentItem()->text(0).isEmpty() ) { AQGraphic_Warning( tr("Warning!"), tr("Please select snapshot that you want to start!") ); return; } else { if( Current_VM->Start_Snapshot(ui.Snapshots_Tree->currentItem()->text(0)) ) { if( Settings.value("Show_Emulator_Control_Window", "yes").toString() == "yes" ) { Current_VM->Show_Emu_Ctl_Win(); } accept(); } else { AQError( "void Snapshots_Window::on_Button_Start_clicked()", "Cannot Start VM!" ); } } } else { int ret = QMessageBox::question( this, tr("Warning"), tr("This VM is Running now! Stop VM and Load Snapshot?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if( ret == QMessageBox::Yes ) { Current_VM->Load_VM_State( ui.Snapshots_Tree->currentItem()->text(0) ); accept(); } } } void Snapshots_Window::on_Button_Properties_clicked() { if( ui.Snapshots_Tree->currentItem() == NULL ) return; Snapshot_Properties_Window *prop_win = new Snapshot_Properties_Window( this ); QList sel_list = ui.Snapshots_Tree->selectedItems(); if( sel_list.count() > 0 ) { QString tag = sel_list[0]->text( ui.Snapshots_Tree->currentColumn() ); for( int ix = 0; ix < Current_VM->Get_Snapshots().count(); ++ix ) { QString tmp_str = ""; if( Current_VM->Get_Snapshots()[ix].Get_Name().isEmpty() ) { tmp_str = Current_VM->Get_Snapshots()[ix].Get_Tag(); } else { tmp_str = Current_VM->Get_Snapshots()[ix].Get_Name(); } if( tmp_str == tag ) { if( Current_VM->Get_Snapshots()[ix].Get_Name().isEmpty() ) { prop_win->Set_Snapshot_Name( Current_VM->Get_Snapshots()[ix].Get_Tag() ); } else { prop_win->Set_Snapshot_Name( Current_VM->Get_Snapshots()[ix].Get_Name() ); } prop_win->Set_Snapshot_Description( Current_VM->Get_Snapshots()[ix].Get_Description() ); if( prop_win->exec() == QDialog::Accepted ) { VM_Snapshot tmp = Current_VM->Get_Snapshots()[ix]; tmp.Set_Name( prop_win->Get_Snapshot_Name() ); tmp.Set_Description( prop_win->Get_Snapshot_Description() ); Current_VM->Set_Snapshot( ix, tmp ); Current_VM->Save_VM(); on_Button_Update_clicked(); return; } } } } } void Snapshots_Window::on_Button_Update_clicked() { ui.Snapshots_Tree->clear(); if( Update_Info() ) { for( int ix = 0; ix < Current_VM->Get_Snapshots().count(); ++ix ) { QTreeWidgetItem *tmp_it = new QTreeWidgetItem( ui.Snapshots_Tree ); if( Current_VM->Get_Snapshots()[ix].Get_Name().isEmpty() ) { tmp_it->setText( 0, Current_VM->Get_Snapshots()[ix].Get_Tag() ); } else { tmp_it->setText( 0, Current_VM->Get_Snapshots()[ix].Get_Name() ); } ui.Snapshots_Tree->insertTopLevelItem( 0, tmp_it ); } } if( Current_VM->Get_Snapshots().count() < 1 ) { ui.Button_Start->setEnabled( false ); } } bool Snapshots_Window::Update_Info() { if( Current_VM == NULL ) { AQError( "bool Snapshots_Window::Update_Info()", "Current_VM == NULL" ); return false; } // Find HDD image QString imagePath = ""; if( QFile::exists(Current_VM->Get_HDA().Get_File_Name()) ) imagePath = Current_VM->Get_HDA().Get_File_Name(); else if( QFile::exists(Current_VM->Get_HDB().Get_File_Name()) ) imagePath = Current_VM->Get_HDB().Get_File_Name(); else if( QFile::exists(Current_VM->Get_HDC().Get_File_Name()) ) imagePath = Current_VM->Get_HDC().Get_File_Name(); else if( QFile::exists(Current_VM->Get_HDD().Get_File_Name()) ) imagePath = Current_VM->Get_HDD().Get_File_Name(); else if( Current_VM->Get_Storage_Devices_List().isEmpty() == false ) { for( int ix = 0; ix < Current_VM->Get_Storage_Devices_List().count(); ++ix ) { if( Current_VM->Get_Storage_Devices_List()[ix].Use_Media() == false || Current_VM->Get_Storage_Devices_List()[ix].Get_Media() == VM::DM_Disk ) { if( QFile::exists(Current_VM->Get_Storage_Devices_List()[ix].Get_File_Path()) ) imagePath = Current_VM->Get_Storage_Devices_List()[ix].Get_File_Path(); } } } if( imagePath.isEmpty() ) { AQGraphic_Warning( tr("Error!"), tr("You must add HDD image in QCOW2 format if you want to use snapshots!") ); return false; } QProcess *qimg = new QProcess( this ); QStringList qimg_args; qimg_args << "info" << imagePath; qimg->start( Settings.value("QEMU-IMG_Path", "qemu-img").toString(), qimg_args ); if( ! qimg->waitForFinished(500) ) { AQError( "bool Snapshots_Window::Update_Info()", "qemu-img Not Finished! Hard Disk Info Cannot Read!" ); return false; } QByteArray info_str_ba = qimg->readAll(); QString info_str = QString( info_str_ba ); // Create QString delete qimg; // Pre Str RegExp: // .*Snapshot list:.*ID[\s]+TAG[\s]+VM[\s]+SIZE[\s]+DATE[\s]+VM[\s]+CLOCK(.+) QRegExp RegInfo = QRegExp( ".*Snapshot list:.*ID[\\s]+TAG[\\s]+VM[\\s]+SIZE[\\s]+DATE[\\s]+VM[\\s]+CLOCK(.+)" ); if( ! RegInfo.exactMatch(info_str) ) { AQError( "bool Snapshots_Window::Update_Info()", "QRegExp Not Matched!" ); return false; } QStringList info_lines = RegInfo.capturedTexts(); QList found_snapshots; if( info_lines.count() == 2 ) { // Snapshot Line RegExp: // ([\d])+[\s]+([a-zA-Z0-9_]+)[\s]+([0-9KMG]+|[0-9]+.[0-9KMG]+)[\s]+(.+)[\s]{2,}(.+) QStringList snapshots_list = info_lines[1].split( "\n", QString::SkipEmptyParts ); QRegExp snap_regexp = QRegExp( "([\\d])+[\\s]+([a-zA-Z0-9_]+)[\\s]+([0-9KMG]+|[0-9]+.[0-9KMG]+)[\\s]+(.+)[\\s]{2,}(.+)" ); for( int sx = 0; sx < snapshots_list.count(); ++sx ) { if( ! snap_regexp.exactMatch(snapshots_list[sx]) ) continue; QStringList snap_info = snap_regexp.capturedTexts(); if( snap_info.count() != 6 ) continue; VM_Snapshot tmp_snap; tmp_snap.Set_ID( snap_info[1] ); tmp_snap.Set_Tag( snap_info[2] ); tmp_snap.Set_Size( snap_info[3] ); tmp_snap.Set_Date( snap_info[4] ); tmp_snap.Set_VM_Clock( snap_info[5] ); found_snapshots << tmp_snap; } } else { return false; } // Unique QList compare_list = Current_VM->Get_Snapshots(); for( int fx = 0; fx < found_snapshots.count(); ++fx ) { bool next = true; for( int cx = 0; next && cx < compare_list.count(); ++cx ) { if( found_snapshots[fx].Get_Tag() == compare_list[cx].Get_Tag() ) { next = false; found_snapshots[fx].Set_Name( compare_list[cx].Get_Name() ); found_snapshots[fx].Set_Description( compare_list[cx].Get_Description() ); compare_list.removeAt( cx ); } } } // Add and Save Current_VM->Set_Snapshots( found_snapshots ); Current_VM->Save_VM(); return true; } aqemu-0.9.2/src/Snapshots_Window.h000066400000000000000000000030631272330227200171050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SNAPSHOT_WINDOW_H #define SNAPSHOT_WINDOW_H #include #include "VM.h" #include "ui_Snapshots_Window.h" class Snapshots_Window: public QDialog { Q_OBJECT public: Snapshots_Window( QWidget *parent = 0 ); void Set_VM( Virtual_Machine *vm ); private slots: void on_Snapshots_Tree_itemSelectionChanged(); void on_Button_Create_clicked(); void on_Button_Delete_clicked(); void on_Button_Start_clicked(); void on_Button_Properties_clicked(); void on_Button_Update_clicked(); private: bool Update_Info(); Ui::Snapshots_Window ui; Virtual_Machine *Current_VM; QSettings Settings; }; #endif aqemu-0.9.2/src/Snapshots_Window.ui000066400000000000000000000241731272330227200173000ustar00rootroot00000000000000 Andrey Rijov Snapshots_Window 0 0 475 362 Manage VM Snapshots :/clock.png:/clock.png 9 9 9 9 6 Qt::Vertical 20 40 TextLabel Snapshot List: 0 0 QFrame::StyledPanel QFrame::Sunken 9 9 9 9 6 Description: 0 0 VM Clock: 0 0 Size: 0 0 ID: 0 0 Date: 0 0 Create :/add.png:/add.png 24 24 Qt::ToolButtonFollowStyle 0 0 Delete :/remove.png:/remove.png 24 24 Qt::ToolButtonFollowStyle 0 0 Close :/dialog-close.png:/dialog-close.png 24 24 Qt::ToolButtonFollowStyle 0 0 Properties :/edit.png:/edit.png 24 24 Qt::ToolButtonFollowStyle 0 0 Start :/play.png:/play.png 24 24 Qt::ToolButtonFollowStyle 0 0 Update Info :/update.png:/update.png 24 24 Qt::ToolButtonFollowStyle QFrame::WinPanel QFrame::Sunken <html><head/><body><p><span style=" font-size:9pt;">Note: This feature is supported on QCOW2 images only</span></p></body></html> Snapshots_Tree Button_Create Button_Delete Button_Start Button_Properties Button_Update Button_Close Button_Close clicked() Snapshots_Window close() 398 287 237 155 aqemu-0.9.2/src/System_Info.cpp000066400000000000000000002656021272330227200163770ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include "Utils.h" #include "System_Info.h" System_Info::System_Info() { } bool System_Info::Update_VM_Computers_List() { Available_Devices tmp_sys; // Devices Lists QList CPU_x86; QList CPU_ARM; QList CPU_MIPS; QList CPU_PPC; QList CPU_Sparc; QList Machine_x86; QList Machine_ARM; QList Machine_M68K; QList Machine_MIPS; QList Machine_PPC; QList Machine_SH4; QList Machine_Sparc; QList Network_Card_x86; QList Network_Card_x86_v090; QList Network_Card_ARM; QList Network_Card_M68K; QList Network_Card_MIPS; QList Network_Card_PPC; QList Network_Card_Sparc; QList Video_Card_Standart; QList Video_Card_x86; VM::Sound_Cards Audio_Card_x86; VM::Sound_Cards Audio_Card_PPC; CPU_x86 << Device_Map( "QEMU 32Bit", "qemu32" ); CPU_x86 << Device_Map( "Intel 486", "486" ); CPU_x86 << Device_Map( "Pentium", "pentium" ); CPU_x86 << Device_Map( "Pentium 2", "pentium2" ); CPU_x86 << Device_Map( "Pentium 3", "pentium3" ); CPU_ARM << Device_Map( "ARM 926", "arm926" ); CPU_ARM << Device_Map( "ARM 946", "arm946" ); CPU_ARM << Device_Map( "ARM 1026", "arm1026" ); CPU_ARM << Device_Map( "ARM 1136", "arm1136" ); CPU_ARM << Device_Map( "ARM 11 MPCORE", "arm11mpcore" ); CPU_ARM << Device_Map( "Cortex-M3", "cortex-m3" ); CPU_ARM << Device_Map( "Cortex-A8", "cortex-a8" ); CPU_ARM << Device_Map( "Ti925T", "ti925t" ); CPU_ARM << Device_Map( "PXA 250", "pxa250" ); CPU_ARM << Device_Map( "PXA 255", "pxa255" ); CPU_ARM << Device_Map( "PXA 260", "pxa260" ); CPU_ARM << Device_Map( "PXA 261", "pxa261" ); CPU_ARM << Device_Map( "PXA 262", "pxa262" ); CPU_ARM << Device_Map( "PXA 270", "pxa270" ); CPU_ARM << Device_Map( "PXA 270-a0", "pxa270-a0" ); CPU_ARM << Device_Map( "PXA 270-a1", "pxa270-a1" ); CPU_ARM << Device_Map( "PXA 270-b0", "pxa270-b0" ); CPU_ARM << Device_Map( "PXA 270-b1", "pxa270-b1" ); CPU_ARM << Device_Map( "PXA 270-c0", "pxa270-c0" ); CPU_ARM << Device_Map( "PXA 270-c5", "pxa270-c5" ); CPU_ARM << Device_Map( "Any", "any" ); CPU_MIPS << Device_Map( "4Kc", "4Kc" ); CPU_MIPS << Device_Map( "4Km", "4Km" ); CPU_MIPS << Device_Map( "4KEcR1", "4KEcR1" ); CPU_MIPS << Device_Map( "4KEmR1", "4KEmR1" ); CPU_MIPS << Device_Map( "4KEc", "4KEc" ); CPU_MIPS << Device_Map( "4KEm", "4KEm" ); CPU_MIPS << Device_Map( "24Kc", "24Kc" ); CPU_MIPS << Device_Map( "24Kf", "24Kf" ); CPU_MIPS << Device_Map( "34Kf", "34Kf" ); CPU_PPC << Device_Map( "401", "401" ); CPU_PPC << Device_Map( "401A1", "401A1" ); CPU_PPC << Device_Map( "401B2", "401B2" ); CPU_PPC << Device_Map( "401C2", "401C2" ); CPU_PPC << Device_Map( "401D2", "401D2" ); CPU_PPC << Device_Map( "401E2", "401E2" ); CPU_PPC << Device_Map( "401F2", "401F2" ); CPU_PPC << Device_Map( "401G2", "401G2" ); CPU_PPC << Device_Map( "IOP480", "IOP480" ); CPU_PPC << Device_Map( "Cobra", "Cobra" ); CPU_PPC << Device_Map( "403", "403" ); CPU_PPC << Device_Map( "403GA", "403GA" ); CPU_PPC << Device_Map( "403GB", "403GB" ); CPU_PPC << Device_Map( "403GC", "403GC" ); CPU_PPC << Device_Map( "403GCX", "403GCX" ); CPU_PPC << Device_Map( "405", "405" ); CPU_PPC << Device_Map( "405D2", "405D2" ); CPU_PPC << Device_Map( "405D4", "405D4" ); CPU_PPC << Device_Map( "405CR", "405CR" ); CPU_PPC << Device_Map( "405CRa", "405CRa" ); CPU_PPC << Device_Map( "405CRb", "405CRb" ); CPU_PPC << Device_Map( "405CRc", "405CRc" ); CPU_PPC << Device_Map( "405EP", "405EP" ); CPU_PPC << Device_Map( "405EZ", "405EZ" ); CPU_PPC << Device_Map( "405GP", "405GP" ); CPU_PPC << Device_Map( "405GPa", "405GPa" ); CPU_PPC << Device_Map( "405GPb", "405GPb" ); CPU_PPC << Device_Map( "405GPc", "405GPc" ); CPU_PPC << Device_Map( "405GPd", "405GPd" ); CPU_PPC << Device_Map( "405GPe", "405GPe" ); CPU_PPC << Device_Map( "405GPR", "405GPR" ); CPU_PPC << Device_Map( "405LP", "405LP" ); CPU_PPC << Device_Map( "Npe405H", "Npe405H" ); CPU_PPC << Device_Map( "Npe405H2", "Npe405H2" ); CPU_PPC << Device_Map( "Npe405L", "Npe405L" ); CPU_PPC << Device_Map( "Npe4GS3", "Npe4GS3" ); CPU_PPC << Device_Map( "STB03", "STB03" ); CPU_PPC << Device_Map( "STB04", "STB04" ); CPU_PPC << Device_Map( "STB25", "STB25" ); CPU_PPC << Device_Map( "x2vp4", "x2vp4" ); CPU_PPC << Device_Map( "x2vp7", "x2vp7" ); CPU_PPC << Device_Map( "x2vp20", "x2vp20" ); CPU_PPC << Device_Map( "x2vp50", "x2vp50" ); CPU_PPC << Device_Map( "MPC52xx", "MPC52xx" ); CPU_PPC << Device_Map( "MPC82xx", "MPC82xx" ); CPU_PPC << Device_Map( "PowerQUICC-II", "\"PowerQUICC-II\"" ); CPU_PPC << Device_Map( "G2", "G2" ); CPU_PPC << Device_Map( "G2H4", "G2H4" ); CPU_PPC << Device_Map( "G2GP", "G2GP" ); CPU_PPC << Device_Map( "G2LS", "G2LS" ); CPU_PPC << Device_Map( "G2HiP3", "G2HiP3" ); CPU_PPC << Device_Map( "G2HiP4", "G2HiP4" ); CPU_PPC << Device_Map( "MPC603", "MPC603" ); CPU_PPC << Device_Map( "G2le", "G2le" ); CPU_PPC << Device_Map( "G2leGP", "G2leGP" ); CPU_PPC << Device_Map( "G2leLS", "G2leLS" ); CPU_PPC << Device_Map( "G2leGP1", "G2leGP1" ); CPU_PPC << Device_Map( "G2leGP3", "G2leGP3" ); CPU_PPC << Device_Map( "MPC8240", "MPC8240" ); CPU_PPC << Device_Map( "MPC5200", "MPC5200" ); CPU_PPC << Device_Map( "MPC5200_v10", "MPC5200_v10" ); CPU_PPC << Device_Map( "MPC5200_v11", "MPC5200_v11" ); CPU_PPC << Device_Map( "MPC5200_v12", "MPC5200_v12" ); CPU_PPC << Device_Map( "MPC5200B", "MPC5200B" ); CPU_PPC << Device_Map( "MPC5200B_v20", "MPC5200B_v20" ); CPU_PPC << Device_Map( "MPC5200B_v21", "MPC5200B_v21" ); CPU_PPC << Device_Map( "MPC8241", "MPC8241" ); CPU_PPC << Device_Map( "MPC8245", "MPC8245" ); CPU_PPC << Device_Map( "MPC8247", "MPC8247" ); CPU_PPC << Device_Map( "MPC8248", "MPC8248" ); CPU_PPC << Device_Map( "MPC8250", "MPC8250" ); CPU_PPC << Device_Map( "MPC8250_HiP3", "MPC8250_HiP3" ); CPU_PPC << Device_Map( "MPC8250_HiP4", "MPC8250_HiP4" ); CPU_PPC << Device_Map( "MPC8255", "MPC8255" ); CPU_PPC << Device_Map( "MPC8255_HiP3", "MPC8255_HiP3" ); CPU_PPC << Device_Map( "MPC8255_HiP4", "MPC8255_HiP4" ); CPU_PPC << Device_Map( "MPC8260", "MPC8260" ); CPU_PPC << Device_Map( "MPC8260_HiP3", "MPC8260_HiP3" ); CPU_PPC << Device_Map( "MPC8260_HiP4", "MPC8260_HiP4" ); CPU_PPC << Device_Map( "MPC8264", "MPC8264" ); CPU_PPC << Device_Map( "MPC8264_HiP3", "MPC8264_HiP3" ); CPU_PPC << Device_Map( "MPC8264_HiP4", "MPC8264_HiP4" ); CPU_PPC << Device_Map( "MPC8265", "MPC8265" ); CPU_PPC << Device_Map( "MPC8265_HiP3", "MPC8265_HiP3" ); CPU_PPC << Device_Map( "MPC8265_HiP4", "MPC8265_HiP4" ); CPU_PPC << Device_Map( "MPC8266", "MPC8266" ); CPU_PPC << Device_Map( "MPC8266_HiP3", "MPC8266_HiP3" ); CPU_PPC << Device_Map( "MPC8266_HiP4", "MPC8266_HiP4" ); CPU_PPC << Device_Map( "MPC8270", "MPC8270" ); CPU_PPC << Device_Map( "MPC8271", "MPC8271" ); CPU_PPC << Device_Map( "MPC8272", "MPC8272" ); CPU_PPC << Device_Map( "MPC8275", "MPC8275" ); CPU_PPC << Device_Map( "MPC8280", "MPC8280" ); CPU_PPC << Device_Map( "e200", "e200" ); CPU_PPC << Device_Map( "e200z5", "e200z5" ); CPU_PPC << Device_Map( "e200z6", "e200z6" ); CPU_PPC << Device_Map( "e300", "e300" ); CPU_PPC << Device_Map( "e300c1", "e300c1" ); CPU_PPC << Device_Map( "e300c2", "e300c2" ); CPU_PPC << Device_Map( "e300c3", "e300c3" ); CPU_PPC << Device_Map( "e300c4", "e300c4" ); CPU_PPC << Device_Map( "MPC8343A", "MPC8343A" ); CPU_PPC << Device_Map( "MPC8343EA", "MPC8343EA" ); CPU_PPC << Device_Map( "MPC8347A", "MPC8347A" ); CPU_PPC << Device_Map( "MPC8347AT", "MPC8347AT" ); CPU_PPC << Device_Map( "MPC8347AP", "MPC8347AP" ); CPU_PPC << Device_Map( "MPC8347EA", "MPC8347EA" ); CPU_PPC << Device_Map( "MPC8347EAT", "MPC8347EAT" ); CPU_PPC << Device_Map( "MPC8347EAP", "MPC8347EAP" ); CPU_PPC << Device_Map( "MPC8349", "MPC8349" ); CPU_PPC << Device_Map( "MPC8349A", "MPC8349A" ); CPU_PPC << Device_Map( "MPC8349E", "MPC8349E" ); CPU_PPC << Device_Map( "MPC8349EA", "MPC8349EA" ); CPU_PPC << Device_Map( "MPC8377", "MPC8377" ); CPU_PPC << Device_Map( "MPC8377E", "MPC8377E" ); CPU_PPC << Device_Map( "MPC8378", "MPC8378" ); CPU_PPC << Device_Map( "MPC8378E", "MPC8378E" ); CPU_PPC << Device_Map( "MPC8379", "MPC8379" ); CPU_PPC << Device_Map( "MPC8379E", "MPC8379E" ); CPU_PPC << Device_Map( "e500", "e500" ); CPU_PPC << Device_Map( "e500_v10", "e500_v10" ); CPU_PPC << Device_Map( "e500_v20", "e500_v20" ); CPU_PPC << Device_Map( "e500v2", "e500v2" ); CPU_PPC << Device_Map( "e500v2_v10", "e500v2_v10" ); CPU_PPC << Device_Map( "e500v2_v20", "e500v2_v20" ); CPU_PPC << Device_Map( "e500v2_v21", "e500v2_v21" ); CPU_PPC << Device_Map( "e500v2_v22", "e500v2_v22" ); CPU_PPC << Device_Map( "e500v2_v30", "e500v2_v30" ); CPU_PPC << Device_Map( "MPC8533", "MPC8533" ); CPU_PPC << Device_Map( "MPC8533_v10", "MPC8533_v10" ); CPU_PPC << Device_Map( "MPC8533_v11", "MPC8533_v11" ); CPU_PPC << Device_Map( "MPC8533E", "MPC8533E" ); CPU_PPC << Device_Map( "MPC8533E_v10", "MPC8533E_v10" ); CPU_PPC << Device_Map( "MPC8533E_v11", "MPC8533E_v11" ); CPU_PPC << Device_Map( "MPC8540", "MPC8540" ); CPU_PPC << Device_Map( "MPC8540_v10", "MPC8540_v10" ); CPU_PPC << Device_Map( "MPC8540_v20", "MPC8540_v20" ); CPU_PPC << Device_Map( "MPC8540_v21", "MPC8540_v21" ); CPU_PPC << Device_Map( "MPC8541", "MPC8541" ); CPU_PPC << Device_Map( "MPC8541_v10", "MPC8541_v10" ); CPU_PPC << Device_Map( "MPC8541_v11", "MPC8541_v11" ); CPU_PPC << Device_Map( "MPC8541E", "MPC8541E" ); CPU_PPC << Device_Map( "MPC8541E_v10", "MPC8541E_v10" ); CPU_PPC << Device_Map( "MPC8541E_v11", "MPC8541E_v11" ); CPU_PPC << Device_Map( "MPC8543", "MPC8543" ); CPU_PPC << Device_Map( "MPC8543_v10", "MPC8543_v10" ); CPU_PPC << Device_Map( "MPC8543_v11", "MPC8543_v11" ); CPU_PPC << Device_Map( "MPC8543_v20", "MPC8543_v20" ); CPU_PPC << Device_Map( "MPC8543_v21", "MPC8543_v21" ); CPU_PPC << Device_Map( "MPC8543E", "MPC8543E" ); CPU_PPC << Device_Map( "MPC8543E_v10", "MPC8543E_v10" ); CPU_PPC << Device_Map( "MPC8543E_v11", "MPC8543E_v11" ); CPU_PPC << Device_Map( "MPC8543E_v20", "MPC8543E_v20" ); CPU_PPC << Device_Map( "MPC8543E_v21", "MPC8543E_v21" ); CPU_PPC << Device_Map( "MPC8544", "MPC8544" ); CPU_PPC << Device_Map( "MPC8544_v10", "MPC8544_v10" ); CPU_PPC << Device_Map( "MPC8544_v11", "MPC8544_v11" ); CPU_PPC << Device_Map( "MPC8544E", "MPC8544E" ); CPU_PPC << Device_Map( "MPC8544E_v10", "MPC8544E_v10" ); CPU_PPC << Device_Map( "MPC8544E_v11", "MPC8544E_v11" ); CPU_PPC << Device_Map( "MPC8545", "MPC8545" ); CPU_PPC << Device_Map( "MPC8545_v20", "MPC8545_v20" ); CPU_PPC << Device_Map( "MPC8545_v21", "MPC8545_v21" ); CPU_PPC << Device_Map( "MPC8545E", "MPC8545E" ); CPU_PPC << Device_Map( "MPC8545E_v20", "MPC8545E_v20" ); CPU_PPC << Device_Map( "MPC8545E_v21", "MPC8545E_v21" ); CPU_PPC << Device_Map( "MPC8547E", "MPC8547E" ); CPU_PPC << Device_Map( "MPC8547E_v20", "MPC8547E_v20" ); CPU_PPC << Device_Map( "MPC8547E_v21", "MPC8547E_v21" ); CPU_PPC << Device_Map( "MPC8548", "MPC8548" ); CPU_PPC << Device_Map( "MPC8548_v10", "MPC8548_v10" ); CPU_PPC << Device_Map( "MPC8548_v11", "MPC8548_v11" ); CPU_PPC << Device_Map( "MPC8548_v20", "MPC8548_v20" ); CPU_PPC << Device_Map( "MPC8548_v21", "MPC8548_v21" ); CPU_PPC << Device_Map( "MPC8548E", "MPC8548E" ); CPU_PPC << Device_Map( "MPC8548E_v10", "MPC8548E_v10" ); CPU_PPC << Device_Map( "MPC8548E_v11", "MPC8548E_v11" ); CPU_PPC << Device_Map( "MPC8548E_v20", "MPC8548E_v20" ); CPU_PPC << Device_Map( "MPC8548E_v21", "MPC8548E_v21" ); CPU_PPC << Device_Map( "MPC8555", "MPC8555" ); CPU_PPC << Device_Map( "MPC8555_v10", "MPC8555_v10" ); CPU_PPC << Device_Map( "MPC8555_v11", "MPC8555_v11" ); CPU_PPC << Device_Map( "MPC8555E", "MPC8555E" ); CPU_PPC << Device_Map( "MPC8555E_v10", "MPC8555E_v10" ); CPU_PPC << Device_Map( "MPC8555E_v11", "MPC8555E_v11" ); CPU_PPC << Device_Map( "MPC8560", "MPC8560" ); CPU_PPC << Device_Map( "MPC8560_v10", "MPC8560_v10" ); CPU_PPC << Device_Map( "MPC8560_v20", "MPC8560_v20" ); CPU_PPC << Device_Map( "MPC8560_v21", "MPC8560_v21" ); CPU_PPC << Device_Map( "MPC8567", "MPC8567" ); CPU_PPC << Device_Map( "MPC8567E", "MPC8567E" ); CPU_PPC << Device_Map( "MPC8568", "MPC8568" ); CPU_PPC << Device_Map( "MPC8568E", "MPC8568E" ); CPU_PPC << Device_Map( "MPC8572", "MPC8572" ); CPU_PPC << Device_Map( "MPC8572E", "MPC8572E" ); CPU_PPC << Device_Map( "e600", "e600" ); CPU_PPC << Device_Map( "MPC8641", "MPC8641" ); CPU_PPC << Device_Map( "MPC8641D", "MPC8641D" ); CPU_PPC << Device_Map( "601", "601" ); CPU_PPC << Device_Map( "601_v0", "601_v0" ); CPU_PPC << Device_Map( "601_v1", "601_v1" ); CPU_PPC << Device_Map( "601v", "601v" ); CPU_PPC << Device_Map( "601_v2", "601_v2" ); CPU_PPC << Device_Map( "602", "602" ); CPU_PPC << Device_Map( "603", "603" ); CPU_PPC << Device_Map( "Vanilla", "Vanilla" ); CPU_PPC << Device_Map( "603e", "603e" ); CPU_PPC << Device_Map( "Stretch", "Stretch" ); CPU_PPC << Device_Map( "603e_v1.1", "\"603e_v1.1\"" ); CPU_PPC << Device_Map( "603e_v1.2", "\"603e_v1.2\"" ); CPU_PPC << Device_Map( "603e_v1.3", "\"603e_v1.3\"" ); CPU_PPC << Device_Map( "603e_v1.4", "\"603e_v1.4\"" ); CPU_PPC << Device_Map( "603e_v2.2", "\"603e_v2.2\"" ); CPU_PPC << Device_Map( "603e_v3", "603e_v3" ); CPU_PPC << Device_Map( "603e_v4", "603e_v4" ); CPU_PPC << Device_Map( "603e_v4.1", "\"603e_v4.1\"" ); CPU_PPC << Device_Map( "603e7", "603e7" ); CPU_PPC << Device_Map( "603e7t", "603e7t" ); CPU_PPC << Device_Map( "603e7v", "603e7v" ); CPU_PPC << Device_Map( "Vaillant", "Vaillant" ); CPU_PPC << Device_Map( "603e7v1", "603e7v1" ); CPU_PPC << Device_Map( "603e7v2", "603e7v2" ); CPU_PPC << Device_Map( "603p", "603p" ); CPU_PPC << Device_Map( "603r", "603r" ); CPU_PPC << Device_Map( "Goldeneye", "Goldeneye" ); CPU_PPC << Device_Map( "604", "604" ); CPU_PPC << Device_Map( "604e", "604e" ); CPU_PPC << Device_Map( "Sirocco", "Sirocco" ); CPU_PPC << Device_Map( "604e_v1.0", "\"604e_v1.0\"" ); CPU_PPC << Device_Map( "604e_v2.2", "\"604e_v2.2\"" ); CPU_PPC << Device_Map( "604e_v2.4", "\"604e_v2.4\"" ); CPU_PPC << Device_Map( "604r", "604r" ); CPU_PPC << Device_Map( "Mach5", "Mach5" ); CPU_PPC << Device_Map( "740", "740" ); CPU_PPC << Device_Map( "Arthur", "Arthur" ); CPU_PPC << Device_Map( "750", "750" ); CPU_PPC << Device_Map( "Typhoon", "Typhoon" ); CPU_PPC << Device_Map( "G3", "G3" ); CPU_PPC << Device_Map( "740_v1.0", "\"740_v1.0\"" ); CPU_PPC << Device_Map( "750_v1.0", "\"750_v1.0\"" ); CPU_PPC << Device_Map( "740_v2.0", "\"740_v2.0\"" ); CPU_PPC << Device_Map( "750_v2.0", "\"750_v2.0\"" ); CPU_PPC << Device_Map( "740_v2.1", "\"740_v2.1\"" ); CPU_PPC << Device_Map( "750_v2.1", "\"750_v2.1\"" ); CPU_PPC << Device_Map( "740_v2.2", "\"740_v2.2\"" ); CPU_PPC << Device_Map( "750_v2.2", "\"750_v2.2\"" ); CPU_PPC << Device_Map( "740_v3.0", "\"740_v3.0\"" ); CPU_PPC << Device_Map( "750_v3.0", "\"750_v3.0\"" ); CPU_PPC << Device_Map( "740_v3.1", "\"740_v3.1\"" ); CPU_PPC << Device_Map( "750_v3.1", "\"750_v3.1\"" ); CPU_PPC << Device_Map( "740e", "740e" ); CPU_PPC << Device_Map( "750e", "750e" ); CPU_PPC << Device_Map( "740p", "740p" ); CPU_PPC << Device_Map( "750p", "750p" ); CPU_PPC << Device_Map( "Conan/Doyle", "\"Conan/Doyle\"" ); CPU_PPC << Device_Map( "750cl", "750cl" ); CPU_PPC << Device_Map( "750cl_v1.0", "\"750cl_v1.0\"" ); CPU_PPC << Device_Map( "750cl_v2.0", "\"750cl_v2.0\"" ); CPU_PPC << Device_Map( "750cx", "750cx" ); CPU_PPC << Device_Map( "750cx_v1.0", "\"750cx_v1.0\"" ); CPU_PPC << Device_Map( "750cx_v2.0", "\"750cx_v2.0\"" ); CPU_PPC << Device_Map( "750cx_v2.1", "\"750cx_v2.1\"" ); CPU_PPC << Device_Map( "750cx_v2.2", "\"750cx_v2.2\"" ); CPU_PPC << Device_Map( "750cxe", "750cxe" ); CPU_PPC << Device_Map( "750cxe_v2.1", "\"750cxe_v2.1\"" ); CPU_PPC << Device_Map( "750cxe_v2.2", "\"750cxe_v2.2\"" ); CPU_PPC << Device_Map( "750cxe_v2.3", "\"750cxe_v2.3\"" ); CPU_PPC << Device_Map( "750cxe_v2.4", "\"750cxe_v2.4\"" ); CPU_PPC << Device_Map( "750cxe_v2.4b", "\"750cxe_v2.4b\"" ); CPU_PPC << Device_Map( "750cxe_v3.0", "\"750cxe_v3.0\"" ); CPU_PPC << Device_Map( "750cxe_v3.1", "\"750cxe_v3.1\"" ); CPU_PPC << Device_Map( "750cxe_v3.1b", "\"750cxe_v3.1b\"" ); CPU_PPC << Device_Map( "750cxr", "750cxr" ); CPU_PPC << Device_Map( "750fl", "750fl" ); CPU_PPC << Device_Map( "750fx", "750fx" ); CPU_PPC << Device_Map( "750fx_v1.0", "\"750fx_v1.0\"" ); CPU_PPC << Device_Map( "750fx_v2.0", "\"750fx_v2.0\"" ); CPU_PPC << Device_Map( "750fx_v2.1", "\"750fx_v2.1\"" ); CPU_PPC << Device_Map( "750fx_v2.2", "\"750fx_v2.2\"" ); CPU_PPC << Device_Map( "750fx_v2.3", "\"750fx_v2.3\"" ); CPU_PPC << Device_Map( "750gl", "750gl" ); CPU_PPC << Device_Map( "750gx", "750gx" ); CPU_PPC << Device_Map( "750gx_v1.0", "\"750gx_v1.0\"" ); CPU_PPC << Device_Map( "750gx_v1.1", "\"750gx_v1.1\"" ); CPU_PPC << Device_Map( "750gx_v1.2", "\"750gx_v1.2\"" ); CPU_PPC << Device_Map( "750l", "750l" ); CPU_PPC << Device_Map( "LoneStar", "LoneStar" ); CPU_PPC << Device_Map( "750l_v2.0", "\"750l_v2.0\"" ); CPU_PPC << Device_Map( "750l_v2.1", "\"750l_v2.1\"" ); CPU_PPC << Device_Map( "750l_v2.2", "\"750l_v2.2\"" ); CPU_PPC << Device_Map( "750l_v3.0", "\"750l_v3.0\"" ); CPU_PPC << Device_Map( "750l_v3.2", "\"750l_v3.2\"" ); CPU_PPC << Device_Map( "745", "745" ); CPU_PPC << Device_Map( "755", "755" ); CPU_PPC << Device_Map( "Goldfinger", "Goldfinger" ); CPU_PPC << Device_Map( "745_v1.0", "\"745_v1.0\"" ); CPU_PPC << Device_Map( "755_v1.0", "\"755_v1.0\"" ); CPU_PPC << Device_Map( "745_v1.1", "\"745_v1.1\"" ); CPU_PPC << Device_Map( "755_v1.1", "\"755_v1.1\"" ); CPU_PPC << Device_Map( "745_v2.0", "\"745_v2.0\"" ); CPU_PPC << Device_Map( "755_v2.0", "\"755_v2.0\"" ); CPU_PPC << Device_Map( "745_v2.1", "\"745_v2.1\"" ); CPU_PPC << Device_Map( "755_v2.1", "\"755_v2.1\"" ); CPU_PPC << Device_Map( "745_v2.2", "\"745_v2.2\"" ); CPU_PPC << Device_Map( "755_v2.2", "\"755_v2.2\"" ); CPU_PPC << Device_Map( "745_v2.3", "\"745_v2.3\"" ); CPU_PPC << Device_Map( "755_v2.3", "\"755_v2.3\"" ); CPU_PPC << Device_Map( "745_v2.4", "\"745_v2.4\"" ); CPU_PPC << Device_Map( "755_v2.4", "\"755_v2.4\"" ); CPU_PPC << Device_Map( "745_v2.5", "\"745_v2.5\"" ); CPU_PPC << Device_Map( "755_v2.5", "\"755_v2.5\"" ); CPU_PPC << Device_Map( "745_v2.6", "\"745_v2.6\"" ); CPU_PPC << Device_Map( "755_v2.6", "\"755_v2.6\"" ); CPU_PPC << Device_Map( "745_v2.7", "\"745_v2.7\"" ); CPU_PPC << Device_Map( "755_v2.7", "\"755_v2.7\"" ); CPU_PPC << Device_Map( "745_v2.8", "\"745_v2.8\"" ); CPU_PPC << Device_Map( "755_v2.8", "\"755_v2.8\"" ); CPU_PPC << Device_Map( "7400", "7400" ); CPU_PPC << Device_Map( "Max", "Max" ); CPU_PPC << Device_Map( "G4", "G4" ); CPU_PPC << Device_Map( "7400_v1.0", "\"7400_v1.0\"" ); CPU_PPC << Device_Map( "7400_v1.1", "\"7400_v1.1\"" ); CPU_PPC << Device_Map( "7400_v2.0", "\"7400_v2.0\"" ); CPU_PPC << Device_Map( "7400_v2.1", "\"7400_v2.1\"" ); CPU_PPC << Device_Map( "7400_v2.2", "\"7400_v2.2\"" ); CPU_PPC << Device_Map( "7400_v2.6", "\"7400_v2.6\"" ); CPU_PPC << Device_Map( "7400_v2.7", "\"7400_v2.7\"" ); CPU_PPC << Device_Map( "7400_v2.8", "\"7400_v2.8\"" ); CPU_PPC << Device_Map( "7400_v2.9", "\"7400_v2.9\"" ); CPU_PPC << Device_Map( "7410", "7410" ); CPU_PPC << Device_Map( "Nitro", "Nitro" ); CPU_PPC << Device_Map( "7410_v1.0", "\"7410_v1.0\"" ); CPU_PPC << Device_Map( "7410_v1.1", "\"7410_v1.1\"" ); CPU_PPC << Device_Map( "7410_v1.2", "\"7410_v1.2\"" ); CPU_PPC << Device_Map( "7410_v1.3", "\"7410_v1.3\"" ); CPU_PPC << Device_Map( "7410_v1.4", "\"7410_v1.4\"" ); CPU_PPC << Device_Map( "7448", "7448" ); CPU_PPC << Device_Map( "7448_v1.0", "\"7448_v1.0\"" ); CPU_PPC << Device_Map( "7448_v1.1", "\"7448_v1.1\"" ); CPU_PPC << Device_Map( "7448_v2.0", "\"7448_v2.0\"" ); CPU_PPC << Device_Map( "7448_v2.1", "\"7448_v2.1\"" ); CPU_PPC << Device_Map( "7450", "7450" ); CPU_PPC << Device_Map( "Vger", "Vger" ); CPU_PPC << Device_Map( "7450_v1.0", "\"7450_v1.0\"" ); CPU_PPC << Device_Map( "7450_v1.1", "\"7450_v1.1\"" ); CPU_PPC << Device_Map( "7450_v1.2", "\"7450_v1.2\"" ); CPU_PPC << Device_Map( "7450_v2.0", "\"7450_v2.0\"" ); CPU_PPC << Device_Map( "7450_v2.1", "\"7450_v2.1\"" ); CPU_PPC << Device_Map( "7441", "7441" ); CPU_PPC << Device_Map( "7451", "7451" ); CPU_PPC << Device_Map( "7441_v2.1", "\"7441_v2.1\"" ); CPU_PPC << Device_Map( "7441_v2.3", "\"7441_v2.3\"" ); CPU_PPC << Device_Map( "7451_v2.3", "\"7451_v2.3\"" ); CPU_PPC << Device_Map( "7441_v2.10", "\"7441_v2.10\"" ); CPU_PPC << Device_Map( "7451_v2.10", "\"7451_v2.10\"" ); CPU_PPC << Device_Map( "7445", "7445" ); CPU_PPC << Device_Map( "7455", "7455" ); CPU_PPC << Device_Map( "Apollo6", "Apollo6" ); CPU_PPC << Device_Map( "7445_v1.0", "\"7445_v1.0\"" ); CPU_PPC << Device_Map( "7455_v1.0", "\"7455_v1.0\"" ); CPU_PPC << Device_Map( "7445_v2.1", "\"7445_v2.1\"" ); CPU_PPC << Device_Map( "7455_v2.1", "\"7455_v2.1\"" ); CPU_PPC << Device_Map( "7445_v3.2", "\"7445_v3.2\"" ); CPU_PPC << Device_Map( "7455_v3.2", "\"7455_v3.2\"" ); CPU_PPC << Device_Map( "7445_v3.3", "\"7445_v3.3\"" ); CPU_PPC << Device_Map( "7455_v3.3", "\"7455_v3.3\"" ); CPU_PPC << Device_Map( "7445_v3.4", "\"7445_v3.4\"" ); CPU_PPC << Device_Map( "7455_v3.4", "\"7455_v3.4\"" ); CPU_PPC << Device_Map( "7447", "7447" ); CPU_PPC << Device_Map( "7457", "7457" ); CPU_PPC << Device_Map( "Apollo7", "Apollo7" ); CPU_PPC << Device_Map( "7447_v1.0", "\"7447_v1.0\"" ); CPU_PPC << Device_Map( "7457_v1.0", "\"7457_v1.0\"" ); CPU_PPC << Device_Map( "7447_v1.1", "\"7447_v1.1\"" ); CPU_PPC << Device_Map( "7457_v1.1", "\"7457_v1.1\"" ); CPU_PPC << Device_Map( "7457_v1.2", "\"7457_v1.2\"" ); CPU_PPC << Device_Map( "7447A", "7447A" ); CPU_PPC << Device_Map( "7457A", "7457A" ); CPU_PPC << Device_Map( "7447A_v1.0", "\"7447A_v1.0\"" ); CPU_PPC << Device_Map( "7457A_v1.0", "\"7457A_v1.0\"" ); CPU_PPC << Device_Map( "Apollo7PM", "Apollo7PM" ); CPU_PPC << Device_Map( "7447A_v1.1", "\"7447A_v1.1\"" ); CPU_PPC << Device_Map( "7457A_v1.1", "\"7457A_v1.1\"" ); CPU_PPC << Device_Map( "7447A_v1.2", "\"7447A_v1.2\"" ); CPU_PPC << Device_Map( "7457A_v1.2", "\"7457A_v1.2\"" ); CPU_PPC << Device_Map( "ppc32", "ppc32" ); CPU_PPC << Device_Map( "ppc", "ppc" ); // Machines Machine_x86 << Device_Map( QObject::tr("Standard PC"), "pc" ); Machine_x86 << Device_Map( QObject::tr("ISA-only PC"), "isapc" ); Machine_ARM << Device_Map( QObject::tr("Integrator/CP (ARM926EJ-S)"), "integratorcp926" ); Machine_ARM << Device_Map( QObject::tr("Integrator/CP (ARM1026EJ-S)"), "integratorcp1026" ); Machine_ARM << Device_Map( QObject::tr("Versatile/PB (ARM926EJ-S)"), "versatilepb" ); Machine_ARM << Device_Map( QObject::tr("Versatile/AB (ARM926EJ-S)"), "versatileab" ); Machine_ARM << Device_Map( QObject::tr("RealView (ARM926EJ-S)"), "realview" ); Machine_MIPS << Device_Map( QObject::tr("R4k platform"), "mips" ); Machine_MIPS << Device_Map( QObject::tr("Malta Core LV"), "malta" ); Machine_PPC << Device_Map( QObject::tr("Heathrow PowerMAC"), "g3bw" ); Machine_PPC << Device_Map( QObject::tr("Mac99 PowerMAC"), "mac99" ); Machine_PPC << Device_Map( QObject::tr("PowerPC PREP"), "prep" ); Machine_Sparc << Device_Map( QObject::tr("SPARCstation 2 (Sun4c)"), "SS-2" ); Machine_Sparc << Device_Map( QObject::tr("SPARCstation 5 (Sun4m)"), "SS-5" ); Machine_Sparc << Device_Map( QObject::tr("SPARCstation 10 (Sun4m)"), "SS-10" ); Machine_Sparc << Device_Map( QObject::tr("SPARCstation 20 (Sun4m)"), "SS-20" ); Machine_Sparc << Device_Map( QObject::tr("SPARCserver 600MP (Sun4m)"), "SS-600MP" ); Machine_Sparc << Device_Map( QObject::tr("SPARCserver 1000 (Sun4d)"), "SS-1000" ); Machine_Sparc << Device_Map( QObject::tr("SPARCcenter 2000 (Sun4d)"), "SS-2000" ); // Net Cards Network_Card_x86 << Device_Map( QObject::tr("NE2000 PCI"), "ne2k_pci" ); Network_Card_x86 << Device_Map( QObject::tr("NE2000 ISA"), "ne2k_isa" ); Network_Card_x86 << Device_Map( QObject::tr("i82551"), "i82551" ); Network_Card_x86 << Device_Map( QObject::tr("i82557B"), "i82557b" ); Network_Card_x86 << Device_Map( QObject::tr("i82559ER"), "i82559er" ); Network_Card_x86 << Device_Map( QObject::tr("PCnet32 PCI"), "pcnet" ); Network_Card_x86 << Device_Map( QObject::tr("RTL8139"), "rtl8139" ); Network_Card_x86_v090 << Device_Map( QObject::tr("NE2000 PCI"), "ne2k_pci" ); Network_Card_x86_v090 << Device_Map( QObject::tr("NE2000 ISA"), "ne2k_isa" ); Network_Card_x86_v090 << Device_Map( QObject::tr("RTL8139"), "rtl8139" ); Network_Card_ARM << Device_Map( QObject::tr("SMC91C111"), "smc91c111" ); Network_Card_M68K << Device_Map( QObject::tr("MCF FEC"), "mcf_fec" ); Network_Card_MIPS << Device_Map( QObject::tr("NE2000 ISA"), "ne2k_isa" ); Network_Card_PPC << Device_Map( QObject::tr("i82551"), "i82551" ); Network_Card_PPC << Device_Map( QObject::tr("i82557B"), "i82557b" ); Network_Card_PPC << Device_Map( QObject::tr("i82559ER"), "i82559er" ); Network_Card_PPC << Device_Map( QObject::tr("NE2000 PCI"), "ne2k_pci" ); Network_Card_PPC << Device_Map( QObject::tr("PCnet32 PCI"), "pcnet" ); Network_Card_PPC << Device_Map( QObject::tr("RTL8139"), "rtl8139" ); Machine_SH4 << Device_Map( QObject::tr("shix card"), "shix" ); Machine_SH4 << Device_Map( QObject::tr("r2d-plus board"), "r2d" ); Network_Card_Sparc << Device_Map( QObject::tr("Lance"), "lance" ); // Video Video_Card_Standart << Device_Map( QObject::tr("No Video Card"), "-nographic" ); Video_Card_x86 << Device_Map( QObject::tr("Cirrus CLGD 5446"), "" ); Video_Card_x86 << Device_Map( QObject::tr("No Video Card"), "-nographic" ); Video_Card_x86 << Device_Map( QObject::tr("Standard VGA"), "-std-vga" ); // Sound Cards Audio_Card_x86.Audio_PC_Speaker = true; Audio_Card_x86.Audio_sb16 = true; Audio_Card_x86.Audio_Adlib = true; Audio_Card_x86.Audio_es1370 = true; Audio_Card_PPC.Audio_sb16 = true; Audio_Card_PPC.Audio_Adlib = true; Audio_Card_PPC.Audio_es1370 = true; // QEMU 0.10.0 QList QEMU_Video_Cards_v0_10_0; QEMU_Video_Cards_v0_10_0 << Device_Map( QObject::tr("StdVGA (VESA 2.0)"), "std" ); QEMU_Video_Cards_v0_10_0 << Device_Map( QObject::tr("Cirrus CLGD 5446"), "cirrus" ); QEMU_Video_Cards_v0_10_0 << Device_Map( QObject::tr("VMWare Video Card"), "vmware" ); QEMU_Video_Cards_v0_10_0 << Device_Map( QObject::tr("None Video Card"), "none" ); QList CPU_x86_v0_10_0 = CPU_x86; CPU_x86_v0_10_0 << Device_Map( QObject::tr("Core Duo"), "coreduo" ); CPU_x86_v0_10_0 << Device_Map( QObject::tr("Athlon"), "athlon" ); CPU_x86_v0_10_0 << Device_Map( QObject::tr("Atom N270"), "n270" ); QList Network_Card_v0_10_0 = Network_Card_x86; Network_Card_v0_10_0 << Device_Map( QObject::tr("e1000"), "e1000" ); Network_Card_v0_10_0 << Device_Map( QObject::tr("virtio"), "virtio" ); QList CPU_x86_64_v0_10_0 = CPU_x86_v0_10_0; CPU_x86_64_v0_10_0 << Device_Map( QObject::tr("Phenom"), "phenom" ); CPU_x86_64_v0_10_0 << Device_Map( QObject::tr("Core 2 Duo"), "core2duo" ); CPU_x86_64_v0_10_0 << Device_Map( QObject::tr("QEMU 64Bit"), "qemu64" ); auto ad = Available_Devices(); ad.System = Device_Map( "IBM PC 64Bit", "qemu-system-x86_64" ); ad.CPU_List += CPU_x86_64_v0_10_0; ad.Machine_List += Machine_x86; ad.Network_Card_List += Network_Card_v0_10_0; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = Audio_Card_x86; ad.Audio_Card_List.Audio_GUS = true; ad.Audio_Card_List.Audio_AC97 = true; ad.PSO_SMP_Count = 255; ad.PSO_No_FB_Boot_Check = true; ad.PSO_Win2K_Hack = true; ad.PSO_RTC_TD_Hack = true; ad.PSO_Kernel_KQEMU = true; ad.PSO_No_ACPI = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-x86_64" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "ARM", "qemu-system-arm" ); CPU_ARM.insert( 1, Device_Map(QObject::tr("ARM 1136 R2"), "arm1136-r2") ); ad.CPU_List += CPU_ARM; QList Machine_ARM_0_10_0; Machine_ARM_0_10_0 << Device_Map( QObject::tr("Integrator/CP (ARM926EJ-S)"), "integratorcp" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Versatile/PB (ARM926EJ-S)"), "versatilepb" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Versatile/AB (ARM926EJ-S)"), "versatileab" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("RealView (ARM926EJ-S)"), "realview" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Akita PDA (PXA270)"), "akita" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Spitz PDA (PXA270)"), "spitz" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Borzoi PDA (PXA270)"), "borzoi" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Terrier PDA (PXA270)"), "terrier" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Siemens SX1 (OMAP310) V1"), "sx1-v1" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Siemens SX1 (OMAP310) V2"), "sx1" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Palm Tungsten (OMAP310)"), "cheetah" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Nokia N800"), "n800" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Nokia N810"), "n810" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Stellaris LM3S811EVB"), "lm3s811evb" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Stellaris LM3S6965EVB"), "lm3s6965evb" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Gumstix Connex (PXA255)"), "connex" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Gumstix Verdex (PXA270)"), "verdex" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Mainstone II (PXA27x)"), "mainstone" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Marvell 88w8618 / MusicPal"), "musicpal" ); Machine_ARM_0_10_0 << Device_Map( QObject::tr("Tosa PDA (PXA255)"), "tosa" ); ad.Machine_List += Machine_ARM_0_10_0; ad.Network_Card_List += Network_Card_ARM; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-arm" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Cris", "qemu-system-cris" ); ad.Machine_List << Device_Map( QObject::tr("Bare ETRAX FS board"), "bareetraxfs" ); ad.Machine_List << Device_Map( QObject::tr("AXIS devboard 88"), "axis-dev88" ); ad.Network_Card_List << Device_Map( QObject::tr("fseth"), "fseth" ); ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-cris" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "ColdFire (M68K)", "qemu-system-m68k" ); ad.Machine_List << Device_Map( QObject::tr("MCF5206EVB"), "mcf5208evb" ); ad.Machine_List << Device_Map( QObject::tr("Arnewsh 5206"), "an5206 " ); ad.Machine_List << Device_Map( QObject::tr("Dummy board"), "dummy" ); ad.Network_Card_List += Network_Card_M68K; ad.Video_Card_List = QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-m68k" ] = ad; QList Machine_MIPS_v0_10_0; Machine_MIPS << Device_Map( QObject::tr("MIPS Malta Core LV"), "malta" ); Machine_MIPS << Device_Map( QObject::tr("MIPS Magnum"), "magnum" ); Machine_MIPS << Device_Map( QObject::tr("Acer Pica 61"), "pica61" ); Machine_MIPS << Device_Map( QObject::tr("MIPS MIPSsim platform"), "mipssim" ); Machine_MIPS << Device_Map( QObject::tr("mips r4k platform"), "mips" ); ad = Available_Devices(); ad.System = Device_Map( "MIPS", "qemu-system-mips" ); ad.CPU_List += CPU_MIPS; ad.Machine_List += Machine_MIPS_v0_10_0; ad.Network_Card_List += Network_Card_MIPS; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-mips" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "MIPS EL", "qemu-system-mipsel" ); ad.CPU_List += CPU_MIPS; ad.Machine_List += Machine_MIPS_v0_10_0; ad.Network_Card_List += Network_Card_MIPS; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-mipsel" ] = ad; QList MIPS_CPU_64Bit = CPU_MIPS; MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS R4000"), "R4000" ); MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS VR5432"), "VR5432" ); MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS 5Kc"), "5Kc" ); MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS 5Kf"), "5Kf" ); MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS 20Kc"), "20Kc" ); MIPS_CPU_64Bit << Device_Map( QObject::tr("MIPS MIPS64R2-generic"), "MIPS64R2-generic" ); ad = Available_Devices(); ad.System = Device_Map( "MIPS64", "qemu-system-mips64" ); ad.CPU_List += MIPS_CPU_64Bit; ad.Machine_List += Machine_MIPS_v0_10_0; ad.Network_Card_List += Network_Card_MIPS; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-mips64" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "MIPS64 EL", "qemu-system-mips64el" ); ad.CPU_List += MIPS_CPU_64Bit; ad.Machine_List += Machine_MIPS_v0_10_0; ad.Network_Card_List += Network_Card_MIPS; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-mips64el" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Microblaze", "qemu-system-microblaze" ); ad.Machine_List << Device_Map( QObject::tr("Spartan 3ADSP1800"), "petalogix-s3adsp1800" ); ad.Network_Card_List << Device_Map( QObject::tr("xilinx-ethlite"), "xilinx-ethlite" ); ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; System_Info::Emulator_QEMU_2_0[ "qemu-system-microblaze" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Power PC 32Bit", "qemu-system-ppc" ); CPU_PPC.insert( 121, Device_Map(QObject::tr("e500v1"), "e500v1") ); ad.CPU_List += CPU_PPC; QList Machine_PPC_0_10_0; Machine_PPC_0_10_0 << Device_Map( QObject::tr("Heathrow PowerMAC"), "g3beige" ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("Mac99 based PowerMAC"), "mac99" ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("PowerPC PREP platform"), "prep" ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("ref405ep"), "ref405ep" ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("taihu"), "taihu" ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("bamboo "), "bamboo " ); Machine_PPC_0_10_0 << Device_Map( QObject::tr("mpc8544ds"), "mpc8544ds" ); ad.Machine_List += Machine_PPC_0_10_0; ad.Network_Card_List += Network_Card_v0_10_0; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = Audio_Card_PPC; ad.PSO_Initial_Graphic_Mode = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-ppc" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Power PC EMB 32Bit", "qemu-system-ppcemb" ); ad.CPU_List += CPU_PPC; ad.Machine_List += Machine_PPC_0_10_0; ad.Network_Card_List += Network_Card_PPC; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = Audio_Card_PPC; ad.PSO_Initial_Graphic_Mode = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-ppcemb" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Power PC 64Bit", "qemu-system-ppc64" ); QList CPU_PPC_64 = CPU_PPC; CPU_PPC_64 << Device_Map( "620", "620" ); CPU_PPC_64 << Device_Map( "Trident", "Trident" ); CPU_PPC_64 << Device_Map( "970", "970" ); CPU_PPC_64 << Device_Map( "970fx", "970fx" ); CPU_PPC_64 << Device_Map( "970fx_v1.0", "\"970fx_v1.0\"" ); CPU_PPC_64 << Device_Map( "970fx_v2.0", "\"970fx_v2.0\"" ); CPU_PPC_64 << Device_Map( "970fx_v2.1", "\"970fx_v2.1\"" ); CPU_PPC_64 << Device_Map( "970fx_v3.0", "\"970fx_v3.0\"" ); CPU_PPC_64 << Device_Map( "970fx_v3.1", "\"970fx_v3.1\"" ); CPU_PPC_64 << Device_Map( "970gx", "970gx" ); CPU_PPC_64 << Device_Map( "970mp", "970mp" ); CPU_PPC_64 << Device_Map( "970mp_v1.0", "\"970mp_v1.0\"" ); CPU_PPC_64 << Device_Map( "970mp_v1.1", "\"970mp_v1.1\"" ); CPU_PPC_64 << Device_Map( "PPC64", "ppc64" ); ad.CPU_List += CPU_PPC_64; ad.Machine_List += Machine_PPC_0_10_0; ad.Network_Card_List += Network_Card_PPC; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = Audio_Card_PPC; ad.PSO_Initial_Graphic_Mode = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-ppc64" ] = ad; QList CPU_SH4; CPU_SH4 << Device_Map( QObject::tr("SH7750R"), "SH7750R" ); CPU_SH4 << Device_Map( QObject::tr("SH7751R"), "SH7751R" ); CPU_SH4 << Device_Map( QObject::tr("SH7785"), "SH7785" ); ad = Available_Devices(); ad.System = Device_Map( "SH4", "qemu-system-sh4" ); ad.CPU_List += CPU_SH4; ad.Machine_List += Machine_SH4; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-sh4" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "SH4 EB", "qemu-system-sh4eb" ); ad.CPU_List += CPU_SH4; ad.Machine_List += Machine_SH4; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); System_Info::Emulator_QEMU_2_0[ "qemu-system-sh4eb" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Sparc 32Bit", "qemu-system-sparc" ); //ad.CPU_List = CPU_Sparc; // FIXME sparc CPU's... ad.Machine_List += Machine_Sparc; ad.Machine_List << Device_Map( QObject::tr("SPARCstation Voyager (Sun4m)"), "Voyager" ); ad.Machine_List << Device_Map( QObject::tr("SPARCstation LX (Sun4m)"), "LX" ); ad.Machine_List << Device_Map( QObject::tr("SPARCstation 4 (Sun4m)"), "SS-4" ); ad.Machine_List << Device_Map( QObject::tr("SPARCClassic (Sun4m)"), "SPARCClassic" ); ad.Machine_List << Device_Map( QObject::tr("SPARCbook (Sun4m)"), "SPARCbook" ); ad.Network_Card_List += Network_Card_Sparc; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); ad.PSO_SMP_Count = 4; ad.PSO_Initial_Graphic_Mode = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-sparc" ] = ad; ad = Available_Devices(); ad.System = Device_Map( "Sparc 64Bit", "qemu-system-sparc64" ); //ad.CPU_List = CPU_Sparc; // FIXME sparc CPU's... ad.Machine_List << Device_Map( QObject::tr("Sun4u"), "sun4u" ); ad.Machine_List << Device_Map( QObject::tr("Sun4v"), "sun4v" ); ad.Machine_List << Device_Map( QObject::tr("Sun4v (Niagara)"), "Niagara" ); ad.Network_Card_List += Network_Card_Sparc; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = VM::Sound_Cards(); ad.PSO_Initial_Graphic_Mode = true; System_Info::Emulator_QEMU_2_0[ "qemu-system-sparc64" ] = ad; ad.PSO_SMP_Cores = true; ad.PSO_SMP_Threads = true; ad.PSO_SMP_Sockets = true; ad.PSO_SMP_MaxCPUs = true; ad.PSO_Drive = true; ad.PSO_Drive_File = true; ad.PSO_Drive_If = true; ad.PSO_Drive_Bus_Unit = true; ad.PSO_Drive_Index = true; ad.PSO_Drive_Media = true; ad.PSO_Drive_Cyls_Heads_Secs_Trans = true; ad.PSO_Drive_Snapshot = true; ad.PSO_Drive_Cache = true; ad.PSO_Drive_AIO = true; ad.PSO_Drive_Format = true; ad.PSO_Drive_Serial = true; ad.PSO_Drive_ADDR = true; ad.PSO_Boot_Order = true; //PSO_Initial_Graphic_Mode = true; ad.PSO_No_FB_Boot_Check = true; ad.PSO_Win2K_Hack = true; //PSO_Kernel_KQEMU = true; ad.PSO_No_ACPI = true; ad.PSO_KVM = false; ad.PSO_Enable_KVM = false; ad.PSO_RTC_TD_Hack = true; ad.PSO_MTDBlock = true; ad.PSO_SD = true; ad.PSO_PFlash = true; ad.PSO_Name = true; ad.PSO_Curses = true; ad.PSO_No_Frame = true; ad.PSO_Alt_Grab = true; ad.PSO_No_Quit = true; ad.PSO_SDL = true; ad.PSO_Portrait = true; ad.PSO_No_Shutdown = true; ad.PSO_Startdate = true; ad.PSO_Show_Cursor = true; ad.PSO_Bootp = true; ad.PSO_Net_type_vde = true; ad.PSO_Net_type_dump = true; ad.PSO_Net_name = true; ad.PSO_Net_addr = true; ad.PSO_Net_vectors = true; ad.PSO_Net_net = true; ad.PSO_Net_host = true; ad.PSO_Net_restrict = true; ad.PSO_Net_dhcpstart = true; ad.PSO_Net_dns = true; ad.PSO_Net_tftp = true; ad.PSO_Net_bootfile = true; ad.PSO_Net_smb = true; ad.PSO_Net_hostfwd = true; ad.PSO_Net_guestfwd = true; ad.PSO_Net_ifname = true; ad.PSO_Net_script = true; ad.PSO_Net_downscript = true; ad.PSO_Net_listen = true; ad.PSO_Net_connect = true; ad.PSO_Net_mcast = true; ad.PSO_Net_sock = true; ad.PSO_Net_port = true; ad.PSO_Net_group = true; ad.PSO_Net_mode = true; ad.PSO_Net_file = true; ad.PSO_Net_len = true; ad.PSO_Enable_KVM = false; ad.PSO_No_KVM = false; ad.PSO_No_KVM_IRQChip = false; ad.PSO_No_KVM_Pit = false; ad.PSO_No_KVM_Pit_Reinjection = false; ad.PSO_Enable_Nesting = false; ad.PSO_KVM_Shadow_Memory = false; /*// KVM 0.12 ad = Available_Devices(); ad.System = Device_Map( "KVM (Intel VT/AMD SVM)", "qemu-kvm" ); ad.CPU_List += CPU_x86_64_v0_10_0; ad.Machine_List += Machine_x86; ad.Network_Card_List += Network_Card_v0_10_0; ad.Video_Card_List += QEMU_Video_Cards_v0_10_0; ad.Audio_Card_List = Audio_Card_x86; ad.Audio_Card_List.Audio_GUS = true; ad.Audio_Card_List.Audio_AC97 = true; ad.PSO_SMP_Count = 255; ad.PSO_SMP_Cores = true; ad.PSO_SMP_Threads = true; ad.PSO_SMP_Sockets = true; ad.PSO_SMP_MaxCPUs = true; ad.PSO_Drive = true; ad.PSO_Drive_File = true; ad.PSO_Drive_If = true; ad.PSO_Drive_Bus_Unit = true; ad.PSO_Drive_Index = true; ad.PSO_Drive_Media = true; ad.PSO_Drive_Cyls_Heads_Secs_Trans = true; ad.PSO_Drive_Snapshot = true; ad.PSO_Drive_Cache = true; ad.PSO_Drive_AIO = true; ad.PSO_Drive_Format = true; ad.PSO_Drive_Serial = true; ad.PSO_Drive_ADDR = true; ad.PSO_Boot_Order = true; //PSO_Initial_Graphic_Mode = true; ad.PSO_No_FB_Boot_Check = true; ad.PSO_Win2K_Hack = true; //PSO_Kernel_KQEMU = true; ad.PSO_No_ACPI = true; ad.PSO_KVM = true; ad.PSO_Enable_KVM = true; ad.PSO_RTC_TD_Hack = true; ad.PSO_MTDBlock = true; ad.PSO_SD = true; ad.PSO_PFlash = true; ad.PSO_Name = true; ad.PSO_Curses = true; ad.PSO_No_Frame = true; ad.PSO_Alt_Grab = true; ad.PSO_No_Quit = true; ad.PSO_SDL = true; ad.PSO_Portrait = true; ad.PSO_No_Shutdown = true; ad.PSO_Startdate = true; ad.PSO_Show_Cursor = true; ad.PSO_Bootp = true; ad.PSO_Net_type_vde = true; ad.PSO_Net_type_dump = true; ad.PSO_Net_name = true; ad.PSO_Net_addr = true; ad.PSO_Net_vectors = true; ad.PSO_Net_net = true; ad.PSO_Net_host = true; ad.PSO_Net_restrict = true; ad.PSO_Net_dhcpstart = true; ad.PSO_Net_dns = true; ad.PSO_Net_tftp = true; ad.PSO_Net_bootfile = true; ad.PSO_Net_smb = true; ad.PSO_Net_hostfwd = true; ad.PSO_Net_guestfwd = true; ad.PSO_Net_ifname = true; ad.PSO_Net_script = true; ad.PSO_Net_downscript = true; ad.PSO_Net_listen = true; ad.PSO_Net_connect = true; ad.PSO_Net_mcast = true; ad.PSO_Net_sock = true; ad.PSO_Net_port = true; ad.PSO_Net_group = true; ad.PSO_Net_mode = true; ad.PSO_Net_file = true; ad.PSO_Net_len = true; ad.PSO_Enable_KVM = true; ad.PSO_No_KVM = true; ad.PSO_No_KVM_IRQChip = true; ad.PSO_No_KVM_Pit = true; ad.PSO_No_KVM_Pit_Reinjection = true; ad.PSO_Enable_Nesting = true; ad.PSO_KVM_Shadow_Memory = true; //System_Info::Emulator_KVM_2_0[ "qemu-kvm" ] = ad; */ //tobgle //FIXME? return true; } VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path ) { if( path.isEmpty() ) { AQWarning( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "path is Empty" ); return VM::Obsolete; } // Get help text QString emulHelpText = Get_Emulator_Help_Output( path ); QTextStream allHelpOutput( &emulHelpText, QIODevice::ReadOnly ); QRegExp emulVerLineRegExp = QRegExp( ".*version.*" ); QString line = ""; for( int ix = 0; ix < 5; ++ix ) { QString tmpLine = allHelpOutput.readLine(); if( tmpLine.isEmpty() ) { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "Result String is Empty!" ); break; } if( ! emulVerLineRegExp.exactMatch(tmpLine) ) continue; else { line = tmpLine; break; } } if( line.isEmpty() ) { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "Cannot get emulator version!" ); return VM::Obsolete; } // This QEMU or KVM? bool emulatorKVM = false; if( path.contains("kvm", Qt::CaseInsensitive) ) emulatorKVM = true; //if( path.contains("qemu", Qt::CaseInsensitive) ) emulatorKVM = false; // QEMU //QRegExp emulVerRegExp = QRegExp( ".*version\\s+([\\d]+)[.]([\\d]+)[.]([\\d]+).*" ); QRegExp emulVerRegExpNew = QRegExp( ".*version\\s+([\\d]+)[.]([\\d]+).*" ); if( ! emulVerRegExpNew.exactMatch(line) ) { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "Cannot match emulVerRegExp! Line: " + line ); return VM::Obsolete; } else // Version like: 1.0 { QStringList versionLines = emulVerRegExpNew.capturedTexts(); if( versionLines.count() < 3 ) { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "Cannot get major_ver, minor_ver vairables!" ); return VM::Obsolete; } int major_ver, minor_ver; bool ok1, ok2; major_ver = versionLines[1].toInt( &ok1, 10 ); minor_ver = versionLines[2].toInt( &ok2, 10 ); if( ! (ok1 && ok2) ) { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", "Cannot Convert to Int! Line: " + versionLines[0] ); return VM::Obsolete; } if( major_ver > 1 || (major_ver == 1 && minor_ver > 0) ) { return VM::QEMU_2_0; } else { AQError( "VM::Emulator_Version System_Info::Get_Emulator_Version( const QString &path )", QString("QEMU Version %1.%2 not defined!").arg(major_ver).arg(minor_ver) ); return VM::Obsolete; } } } QMap System_Info::Find_QEMU_Binary_Files( const QString &path ) { QMap emulFiles; emulFiles[ "qemu-system-x86_64" ] = ""; emulFiles[ "qemu-system-arm" ] = ""; emulFiles[ "qemu-system-cris" ] = ""; emulFiles[ "qemu-system-m68k" ] = ""; emulFiles[ "qemu-system-microblaze" ] = ""; emulFiles[ "qemu-system-mips" ] = ""; emulFiles[ "qemu-system-mips64" ] = ""; emulFiles[ "qemu-system-mips64el" ] = ""; emulFiles[ "qemu-system-mipsel" ] = ""; emulFiles[ "qemu-system-ppc" ] = ""; emulFiles[ "qemu-system-ppc64" ] = ""; emulFiles[ "qemu-system-ppcemb" ] = ""; emulFiles[ "qemu-system-sh4" ] = ""; emulFiles[ "qemu-system-sh4eb" ] = ""; emulFiles[ "qemu-system-sparc" ] = ""; emulFiles[ "qemu-system-sparc64" ] = ""; // path empty - this not error. It return empty bin files list if( path.isEmpty() ) return emulFiles; // Path valid? if( ! QFile::exists(path) ) { AQError( "QMap System_Info::Find_QEMU_Binary_Files( const QString &path )", QString("Path \"%1\" not exists!").arg(path) ); return emulFiles; } // Find QString dirPath = QDir::toNativeSeparators( (path.endsWith("/") || path.endsWith("\\")) ? path : path + "/" ); QMap::iterator iter = emulFiles.begin(); while( iter != emulFiles.end() ) { #ifdef Q_OS_WIN32 if( QFile::exists(dirPath + iter.key() + ".exe") ) iter.value() = dirPath + iter.key() + ".exe"; #else if( QFile::exists(dirPath + iter.key()) ) iter.value() = dirPath + iter.key(); #endif ++iter; } /*// Next code for QEMU 1.0 in it version 'qemu' binary name changed to 'qemu-system-i386' if( emulFiles["qemu"].isEmpty() ) { #ifdef Q_OS_WIN32 if( QFile::exists(dirPath + "qemu-system-i386.exe") ) emulFiles[ "qemu" ] = dirPath + "qemu-system-i386.exe"; #else if( QFile::exists(dirPath + "qemu-system-i386") ) emulFiles[ "qemu" ] = dirPath + "qemu-system-i386"; #endif }*/ return emulFiles; } /* QMap System_Info::Find_KVM_Binary_Files( const QString &path ) { QMap emulFiles; emulFiles[ "qemu-kvm" ] = ""; // path empty - this not error. It return empty bin files list if( path.isEmpty() ) return emulFiles; // Path valid? if( ! QFile::exists(path) ) { AQError( "QMap System_Info::Find_QEMU_Binary_Files( const QString &path )", QString("Path \"%1\" not exists!").arg(path) ); return emulFiles; } // Find QString dirPath = QDir::toNativeSeparators( (path.endsWith("/") || path.endsWith("\\")) ? path : path + "/" ); if( QFile::exists(dirPath + "kvm") ) emulFiles[ "qemu-kvm" ] = dirPath + "kvm"; else if( QFile::exists(dirPath + "qemu-kvm") ) emulFiles[ "qemu-kvm" ] = dirPath + "qemu-kvm"; return emulFiles; }*/ QString System_Info::Find_IMG( const QStringList &paths ) { if( paths.isEmpty() ) { AQError( "static QString System_Info::Find_IMG( const QStringList &paths )", "paths.isEmpty()" ); return ""; } // Find qemu-img or kvm-img for( int ix = 0; ix < paths.count(); ++ix ) { QString dirPath = QDir::toNativeSeparators( (paths[ix].endsWith("/") || paths[ix].endsWith("\\")) ? paths[ix] : paths[ix] + "/" ); if( QFile::exists(dirPath + "qemu-img") ) return dirPath + "qemu-img"; else if( QFile::exists(dirPath + "kvm-img") ) return dirPath + "kvm-img"; } // No qemu-img or kvm-img in paths... AQWarning( "static QString System_Info::Find_IMG( const QStringList &paths )", "Cannot find qemu-img or kvm-img!" ); return ""; } Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok, VM::Emulator_Version version, const QString &internalName ) { if( ! QFile::exists(path) ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Emulator binary \"" + path + "\" not exists!" ); *ok = false; return Available_Devices(); } // Get All Help QString all_help = Get_Emulator_Help_Output( path ); if( all_help.isEmpty() ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot read emulator help text" ); *ok = false; return Available_Devices(); } // Device for return Available_Devices tmp_dev; // Find Options // -M bool scan_Machines_List = false; QRegExp rx = QRegExp( ".*-M\\s+.*" ); if( rx.exactMatch(all_help) ) scan_Machines_List = true; // -cpu bool scan_CPU_List = false; rx = QRegExp( ".*-cpu\\s.*" ); if( rx.exactMatch(all_help) ) scan_CPU_List = true; // -smp FIXME PSO_SMP_Count use base emulator settings rx = QRegExp( ".*-smp\\s.*" ); if( rx.exactMatch(all_help) ) { // New Style? rx = QRegExp( ".*-smp\\s+.*\\[(.*)\\].*" ); if( internalName == "qemu-system-x86_64" ) tmp_dev.PSO_SMP_Count = 255; else if( internalName == "qemu-system-sparc" ) tmp_dev.PSO_SMP_Count = 4; if( rx.exactMatch(all_help) ) { if( rx.capturedTexts().count() > 1 ) { if( rx.capturedTexts()[1].indexOf("cores") != -1 ) tmp_dev.PSO_SMP_Cores = true; if( rx.capturedTexts()[1].indexOf("threads") != -1 ) tmp_dev.PSO_SMP_Threads = true; if( rx.capturedTexts()[1].indexOf("sockets") != -1 ) tmp_dev.PSO_SMP_Sockets = true; if( rx.capturedTexts()[1].indexOf("maxcpus") != -1 ) tmp_dev.PSO_SMP_MaxCPUs = true; } } } // -device rx = QRegExp( ".*-device\\s.*" ); if( rx.exactMatch(all_help) ) { tmp_dev.PSO_Device = true; // Get available devices list QString emulDevList = Get_Emulator_Output( path, QStringList() << "-device" << "?" ); // Find usb-ehci support (USB 2.0) rx = QRegExp( ".*usb\\-ehci.*" ); if( rx.exactMatch(emulDevList) ) tmp_dev.PSO_Device_USB_EHCI = true; // Find usb-xhci support (USB 3.0) rx = QRegExp( ".*usb\\-xhci.*" ); if( rx.exactMatch(emulDevList) ) tmp_dev.PSO_Device_USB_XHCI = true; } // -drive rx = QRegExp( ".*-drive\\s+(\\[.*\\]).*-.*" ); if( rx.exactMatch(all_help) ) { tmp_dev.PSO_Drive = true; QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) { // Parse drive options list QString drive_str = rx_list[ 1 ]; if( drive_str.indexOf("file=") != -1 ) tmp_dev.PSO_Drive_File = true; if( drive_str.indexOf("if=") != -1 ) tmp_dev.PSO_Drive_If = true; if( drive_str.indexOf("bus=") != -1 ) tmp_dev.PSO_Drive_Bus_Unit = true; if( drive_str.indexOf("index=") != -1 ) tmp_dev.PSO_Drive_Index = true; if( drive_str.indexOf("media=") != -1 ) tmp_dev.PSO_Drive_Media = true; if( drive_str.indexOf("cyls=") != -1 ) tmp_dev.PSO_Drive_Cyls_Heads_Secs_Trans = true; if( drive_str.indexOf("snapshot=") != -1 ) tmp_dev.PSO_Drive_Snapshot = true; if( drive_str.indexOf("cache=") != -1 ) tmp_dev.PSO_Drive_Cache = true; if( drive_str.indexOf("aio=") != -1 ) tmp_dev.PSO_Drive_AIO = true; if( drive_str.indexOf("format=") != -1 ) tmp_dev.PSO_Drive_Format = true; if( drive_str.indexOf("serial=") != -1 ) tmp_dev.PSO_Drive_Serial = true; if( drive_str.indexOf("addr=") != -1 ) tmp_dev.PSO_Drive_ADDR = true; if( drive_str.indexOf("boot=") != -1 ) tmp_dev.PSO_Drive_Boot = true; } } // -boot [order=drives][,once=drives][,menu=on|off] rx = QRegExp( ".*-boot\\s+\\[order.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Boot_Order = true; // -g WxH[xDEPTH] rx = QRegExp( ".*-g\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Initial_Graphic_Mode = true; // -no-fd-bootchk rx = QRegExp( ".*-no-fd-bootchk\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_FB_Boot_Check = true; // -win2k-hack rx = QRegExp( ".*-win2k-hack\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Win2K_Hack = true; // -no-acpi rx = QRegExp( ".*-no-acpi\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_ACPI = true; // (old option -rtc-td-hack) -rtc *,drift=slew rx = QRegExp( ".*-rtc\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_RTC_TD_Hack = true; // -mtdblock rx = QRegExp( ".*-mtdblock\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_MTDBlock = true; // -sd rx = QRegExp( ".*-sd\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_SD = true; // -pflash rx = QRegExp( ".*-pflash\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_PFlash = true; // -name rx = QRegExp( ".*-name\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Name = true; // -curses rx = QRegExp( ".*-curses\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Curses = true; // -no-frame rx = QRegExp( ".*-no-frame\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_Frame = true; // -alt-grab rx = QRegExp( ".*-alt-grab\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Alt_Grab = true; // -no-quit rx = QRegExp( ".*-no-quit\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_Quit = true; // -sdl rx = QRegExp( ".*-sdl\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_SDL = true; // -portrait rx = QRegExp( ".*-portrait\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Portrait = true; // -no-shutdown rx = QRegExp( ".*-no-shutdown\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_Shutdown = true; // (old -startdate option) -rtc base=date rx = QRegExp( ".*-rtc\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Startdate = true; // -show-cursor rx = QRegExp( ".*-show-cursor\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Show_Cursor = true; // -bootp rx = QRegExp( ".*-bootp\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Bootp = true; // -netdev QString net_str = ""; rx = QRegExp( ".*(-netdev\\s+.*)-net.*" ); if( rx.exactMatch(all_help) ) { QStringList rx_list = rx.capturedTexts(); /*for ( int i = 0; i < rx_list.count(); i++) { AQDebug(rx_list.at(i),"----------------------------------------------------------------------------"); }*/ if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net nic rx = QRegExp( ".*(-net\\s+nic.*)-net.*" ); if( rx.exactMatch(all_help) ) { QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net user rx = QRegExp( ".*(-net\\s+user.*)-net.*" ); if( rx.exactMatch(all_help) ) { QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net tap rx = QRegExp( ".*(-net\\s+tap.*)-net.*" ); if( rx.exactMatch(all_help) ) { QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net socket rx = QRegExp( ".*(-net\\s+socket.*)-net.*" ); if( rx.exactMatch(all_help) ) { QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net vde rx = QRegExp( ".*(-net\\s+vde.*)-net.*" ); if( rx.exactMatch(all_help) ) { tmp_dev.PSO_Net_type_vde = true; QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // -net dump rx = QRegExp( ".*(-net\\s+dump.*)-net.*" ); if( rx.exactMatch(all_help) ) { tmp_dev.PSO_Net_type_dump = true; QStringList rx_list = rx.capturedTexts(); if( rx_list.count() > 1 ) net_str += rx_list[ 1 ]; } // Check Network Arguments if( net_str.isEmpty() ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "net_str is Empty" ); } else { // name rx = QRegExp( ".*name=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_name = true; // addr rx = QRegExp( ".*addr=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_addr = true; // vectors rx = QRegExp( ".*vectors=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_vectors = true; // net rx = QRegExp( ".*net=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_net = true; // host rx = QRegExp( ".*host=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_host = true; // restrict rx = QRegExp( ".*restrict=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_restrict = true; // dhcpstart rx = QRegExp( ".*dhcpstart=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_dhcpstart = true; // dns rx = QRegExp( ".*dns=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_dns = true; // tftp rx = QRegExp( ".*tftp=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_tftp = true; // bootfile rx = QRegExp( ".*bootfile=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_bootfile = true; // smb rx = QRegExp( ".*smb=.*" ); if( rx.exactMatch(net_str) ) { tmp_dev.PSO_Net_smb = true; } // hostfwd rx = QRegExp( ".*hostfwd=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_hostfwd = true; // guestfwd rx = QRegExp( ".*guestfwd=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_guestfwd = true; // ifname rx = QRegExp( ".*ifname=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_ifname = true; // script rx = QRegExp( ".*script=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_script = true; // downscript rx = QRegExp( ".*downscript=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_downscript = true; // sndbuf rx = QRegExp( ".*sndbuf=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_sndbuf = true; // vnet_hdr rx = QRegExp( ".*vnet_hdr=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_vnet_hdr = true; // vhost rx = QRegExp( ".*vhost=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_vhost = true; // vhostfd rx = QRegExp( ".*vhostfd=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_vhostfd = true; // listen rx = QRegExp( ".*listen=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_listen = true; // connect rx = QRegExp( ".*connect=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_connect = true; // mcast rx = QRegExp( ".*mcast=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_mcast = true; // sock rx = QRegExp( ".*sock=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_sock = true; // port rx = QRegExp( ".*port=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_port = true; // group rx = QRegExp( ".*group=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_group = true; // mode rx = QRegExp( ".*mode=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_mode = true; // file rx = QRegExp( ".*file=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_file = true; // len rx = QRegExp( ".*len=.*" ); if( rx.exactMatch(net_str) ) tmp_dev.PSO_Net_len = true; } // -enable-kvm rx = QRegExp( ".*-enable-kvm\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Enable_KVM = true; // -no-kvm rx = QRegExp( ".*-no-kvm\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_KVM = true; // -no-kvm-irqchip rx = QRegExp( ".*-no-kvm-irqchip\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_KVM_IRQChip = true; // -no-kvm-pit rx = QRegExp( ".*-no-kvm-pit\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_KVM_Pit = true; // -no-kvm-pit-reinjection rx = QRegExp( ".*-no-kvm-pit-reinjection\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_No_KVM_Pit_Reinjection = true; // -enable-nesting rx = QRegExp( ".*-enable-nesting\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Enable_Nesting = true; // -kvm-shadow-memory rx = QRegExp( ".*kvm_shadow_mem=.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_KVM_Shadow_Memory = true; // -tftp rx = QRegExp( ".*-tftp\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_TFTP = true; if ( tmp_dev.PSO_Net_tftp == true ) { //hack, all this code should probably be rewritten or removed //but in the meantime this hopefully makes things work tmp_dev.PSO_TFTP = true; } // -smb rx = QRegExp( ".*-smb\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_SMB = true; if ( tmp_dev.PSO_Net_smb == true ) { //hack, all this code should probably be rewritten or removed //but in the meantime this hopefully makes things work tmp_dev.PSO_SMB = true; } // -std-vga rx = QRegExp( ".*-std-vga\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_Std_VGA = true; // -spice rx = QRegExp( ".*-spice\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_SPICE = true; // -qxl rx = QRegExp( ".*-qxl\\s.*" ); if( rx.exactMatch(all_help) ) tmp_dev.PSO_QXL = true; // Base emulator // Get Default Devices List Available_Devices default_device; switch( version ) { case VM::QEMU_2_0: default_device = Emulator_QEMU_2_0[ internalName ]; break; default: AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Emulator version invalid!" ); *ok = false; return Available_Devices(); } if( default_device.System.QEMU_Name.isEmpty() ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot get system default device list!" ); *ok = false; return Available_Devices(); } tmp_dev.System.Caption = default_device.System.Caption; tmp_dev.System.QEMU_Name = internalName; AQDebug( "Start device search for:", internalName ); QStringList args_list; QString tmp = ""; // Get CPU Models args_list << "-cpu" << "?"; QString cpu_list_str = Get_Emulator_Output( path, args_list ); QTextStream *text_stream = new QTextStream( &cpu_list_str ); do { tmp = text_stream->readLine(); QString qemu_dev_name = ""; if( tmp.indexOf("Available CPUs") != -1 ) continue; if( tmp.indexOf("Sparc") != -1 ) break; // FIXME Sparc -cpu not supported in this release QStringList regExpVariants; regExpVariants << ".*x86\\s+([\\w-]+).*|.*x86\\s+\\[([\\w-]+)\\].*" // x86 pentium3 | x86 [core2duo] << ".*PowerPC\\s+(.*)\\s+PVR.*" // PowerPC 750 PVR 00080301 << ".*MIPS\\s+\\'(.*)\\'.*" // MIPS '4Kc' << ".*\\s*([\\w-]+).*"; // cortex-a9 // Get QEMU ID String for( int lx = 0; lx < regExpVariants.count(); ++lx ) { QRegExp tmp_rx = QRegExp( regExpVariants[lx] ); if( tmp_rx.exactMatch(tmp) ) { QStringList rx_list = tmp_rx.capturedTexts(); if( rx_list.count() > 1 ) { if( ! rx_list[1].isEmpty() ) qemu_dev_name = rx_list[ 1 ]; else if( rx_list.count() > 2 ) qemu_dev_name = rx_list[ 2 ]; break; } else { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot get QEMU CPU ID string!" ); continue; } } else continue; } // String empty? if( ! (qemu_dev_name.isEmpty() || qemu_dev_name.indexOf(QRegExp("/^\\S+$/"), 0) != -1) ) { bool cpu_found = false; for( int ix = 0; ix < default_device.CPU_List.count(); ix++ ) { if( qemu_dev_name == default_device.CPU_List[ix].QEMU_Name ) { tmp_dev.CPU_List << default_device.CPU_List[ ix ]; cpu_found = true; } } // No this device name in default list if( cpu_found == false ) tmp_dev.CPU_List << Device_Map( qemu_dev_name, qemu_dev_name ); } else continue; } while( ! tmp.isNull() ); // No CPU's... Set Default List if( tmp_dev.CPU_List.count() < 2 ) { tmp_dev.CPU_List = default_device.CPU_List; // FIXME Emul Version AQWarning( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", QString("Cannot get CPU's info from emulator \"%1\". Use default list").arg(path) ); } // Get Machines Models args_list.clear(); args_list << "-M" << "?"; QString machines_list_str = Get_Emulator_Output( path, args_list ); text_stream = new QTextStream( &machines_list_str ); do { tmp = text_stream->readLine(); Device_Map dev_map; // This description? if( tmp.startsWith("Supported machines are") ) continue; // Get QEMU ID String QRegExp tmp_rx = QRegExp( "([\\w-.]+)\\s+(\\S.*)" ); if( tmp_rx.exactMatch(tmp) ) { QStringList rx_list = tmp_rx.capturedTexts(); if( rx_list.count() > 2 ) { dev_map.Caption = rx_list[ 2 ]; dev_map.QEMU_Name = rx_list[ 1 ]; } else { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot get QEMU Machine ID string!" ); continue; } } if( ! (dev_map.QEMU_Name.isEmpty() || dev_map.QEMU_Name.indexOf(QRegExp("/^\\S+$/"), 0) != -1) ) { bool machine_found = false; for( int ix = 0; ix < default_device.Machine_List.count(); ix++ ) { if( dev_map.QEMU_Name == default_device.Machine_List[ix].QEMU_Name ) { tmp_dev.Machine_List << default_device.Machine_List[ ix ]; machine_found = true; } } // No this device name in default list if( machine_found == false ) tmp_dev.Machine_List << dev_map; } else continue; } while( ! tmp.isNull() ); // No Machines... Set Default List if( tmp_dev.Machine_List.count() < 2 ) { tmp_dev.Machine_List = default_device.Machine_List; // FIXME Emul Version AQWarning( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", QString("Cannot get machines info from emulator \"%1\". Use default list").arg(path) ); } // -vga QString vga_list_string = ""; text_stream = new QTextStream( &all_help ); // Find -vga line do { vga_list_string = text_stream->readLine(); if( vga_list_string.startsWith("-vga") ) break; } while( ! vga_list_string.isNull() ); // Get video cards names rx = QRegExp( ".*-vga\\s+\\[(.*)\\].*" ); if( rx.exactMatch(vga_list_string) ) { // Parse vga devices list string if( rx.capturedTexts().count() > 1 ) { QStringList vga_devices_list = rx.capturedTexts()[1].split( "|", QString::SkipEmptyParts ); if( vga_devices_list.isEmpty() ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "VGA Devices List is Empty. Data is: \"" + rx.capturedTexts()[0] + "\"" ); } else { for( int gx = 0; gx < vga_devices_list.count(); gx++ ) { bool vga_found = false; for( int ix = 0; ix < default_device.Video_Card_List.count(); ix++ ) { if( vga_devices_list[gx] == default_device.Video_Card_List[ix].QEMU_Name ) { tmp_dev.Video_Card_List << default_device.Video_Card_List[ ix ]; vga_found = true; } } // No this device name in default list if( vga_found == false ) tmp_dev.Video_Card_List << Device_Map( vga_devices_list[gx], vga_devices_list[gx] ); } } } else { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot parse VGA string regExp. Data is: \"" + rx.capturedTexts()[0] + "\"" ); } } // Get Audio Cards Models args_list.clear(); args_list << "-soundhw" << "?"; QString audio_list_str = Get_Emulator_Output( path, args_list ); text_stream = new QTextStream( &audio_list_str ); do { tmp = text_stream->readLine(); QString qemu_dev_name = ""; // This target platform support soundhw? if( tmp.contains("not supported") ) break; // This description? if( tmp.isEmpty() || tmp.startsWith("Valid sound card names") || tmp.startsWith("-soundhw") || tmp.indexOf(QRegExp("/^\\S+$/"), 0) != -1 ) continue; // Get QEMU ID String QRegExp tmp_rx = QRegExp( "([\\w-.]+)\\s+.*" ); if( tmp_rx.exactMatch(tmp) ) { QStringList rx_list = tmp_rx.capturedTexts(); if( rx_list.count() > 1 ) qemu_dev_name = rx_list[ 1 ]; else { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot get QEMU Audio ID string!" ); continue; } } if( qemu_dev_name == "sb16" ) tmp_dev.Audio_Card_List.Audio_sb16 = true; else if( qemu_dev_name == "es1370" ) tmp_dev.Audio_Card_List.Audio_es1370 = true; else if( qemu_dev_name == "gus" ) tmp_dev.Audio_Card_List.Audio_GUS = true; else if( qemu_dev_name == "adlib" ) tmp_dev.Audio_Card_List.Audio_Adlib = true; else if( qemu_dev_name == "pcspk" ) tmp_dev.Audio_Card_List.Audio_PC_Speaker = true; else if( qemu_dev_name == "ac97" ) tmp_dev.Audio_Card_List.Audio_AC97 = true; else if( qemu_dev_name == "hda" ) tmp_dev.Audio_Card_List.Audio_HDA = true; else if( qemu_dev_name == "cs4231a" ) tmp_dev.Audio_Card_List.Audio_cs4231a = true; else { if( ! qemu_dev_name.isEmpty() ) AQWarning( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Unregistred Sound Card Name: \"" + qemu_dev_name + "\"" ); continue; } } while( ! tmp.isNull() ); // Get Network Card Models args_list.clear(); args_list << "-net" << "nic,model=?"; QString net_list_str = Get_Emulator_Output( path, args_list ); text_stream = new QTextStream( &net_list_str ); do { tmp = text_stream->readLine(); // This description? if( tmp.indexOf("models:") == -1 ) continue; // Get all models string QString all_models = tmp.mid( tmp.indexOf("models:") + QString("models:").count(), tmp.count() ); all_models.remove( QChar(' ') ); // Remove all spaces QStringList net_cards_models = all_models.split( ',', QString::SkipEmptyParts ); if( net_cards_models.isEmpty() ) { AQError( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Cannot get QEMU network card ID string!" ); continue; } // Find names in devices list for( int ax = 0; ax < net_cards_models.count(); ax++ ) { bool net_found = false; QString net_dev_str = ""; for( int bx = 0; bx < default_device.Network_Card_List.count(); bx++ ) { net_dev_str = net_cards_models[ ax ]; if( net_dev_str == default_device.Network_Card_List[bx].QEMU_Name ) { tmp_dev.Network_Card_List << default_device.Network_Card_List[ bx ]; net_found = true; break; } } // No this device name in default list if( net_found == false ) tmp_dev.Network_Card_List << Device_Map( net_dev_str, net_dev_str ); } break; // All Done } while( ! tmp.isNull() ); // No Cards... Set Default List if( tmp_dev.Network_Card_List.count() < 2 ) { tmp_dev.Network_Card_List = default_device.Network_Card_List; // FIXME Emul Version AQWarning( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", QString("Cannot get net cards info from emulator \"%1\". Use default list").arg(path) ); } // Return info AQDebug( "Available_Devices System_Info::Get_Emulator_Info( const QString &path, bool *ok," "VM::Emulator_Version version, const QString &internalName )", "Done" ); *ok = true; return tmp_dev; } QString System_Info::Get_Emulator_Help_Output( const QString &path ) { QString result = Get_Emulator_Output( path, QStringList("-h") ); if( result.isEmpty() ) { result = Get_Emulator_Output( path, QStringList("-nographic") ); if( result.isEmpty() ) { AQError( "QString System_Info::Get_Emulator_Help_Output( const QString &path )", "Cannot get emulator help!" ); return ""; } } return result; } QString System_Info::Get_Emulator_Output( const QString &path, const QStringList &args ) { QProcess *qemu_pr = new QProcess(); qemu_pr->start( path, args ); if( ! qemu_pr->waitForFinished(2000) ) { AQError( "QStringList System_Info::Get_Emulator_Output( const QString &path, const QStringList &args )", QString("Time left. File: \"%1\" Args: \"%1\"").arg(path).arg(args.join(" ")) ); qemu_pr->kill(); return QString(); } QString result = qemu_pr->readAllStandardOutput(); result += qemu_pr->readAllStandardError(); // readAll() not read cerr messages... delete qemu_pr; return result; } const QList &System_Info::Get_All_Host_USB() { if( All_Host_USB.count() <= 0 ) Update_Host_USB(); return All_Host_USB; } const QList &System_Info::Get_Used_USB_List() { return Used_Host_USB; } bool System_Info::Add_To_Used_USB_List( const VM_USB &device ) { if( Used_Host_USB.indexOf(device) == -1 ) { Used_Host_USB << device; return true; } else return false; } bool System_Info::Delete_From_Used_USB_List( const VM_USB &device ) { return Used_Host_USB.removeOne( device ); } #ifdef Q_OS_LINUX bool System_Info::Update_Host_USB() { QList list; if( QFile::exists("/sys/bus/usb") ) { if( Scan_USB_Sys(list) ) { All_Host_USB = list; return true; } } if( QFile::exists("/proc/bus/usb/devices") ) { if( Scan_USB_Proc(list) ) { All_Host_USB = list; return true; } } // Error... AQError( "bool System_Info::Update_Host_USB()", "Cannot read USB information from /sys, /proc, /dev!" ); return false; } bool System_Info::Scan_USB_Sys( QList &list ) { list.clear(); QDir dir("/sys/bus/usb/devices/"); QStringList usb_dirs; QStringList all_usb_dirs = dir.entryList( QStringList("*"), QDir::Dirs, QDir::Name ); // add only unique usb device folders QRegExp re_usbNum = QRegExp( "^usb\\d+$" ); // like: usb5 QRegExp re_NumNum = QRegExp( "^\\d+[-]\\d+$" ); // like: 1-2 QRegExp re_NumNumNum = QRegExp( "^\\d+[-]\\d+[.]\\d+$" ); // like: 1-2.1 foreach( QString cur_dir, all_usb_dirs ) { if( re_usbNum.exactMatch(cur_dir) ) usb_dirs << cur_dir; else if( re_NumNum.exactMatch(cur_dir) ) usb_dirs << cur_dir; else if( re_NumNumNum.exactMatch(cur_dir) ) usb_dirs << cur_dir; else continue; } if( usb_dirs.isEmpty() ) { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "No USB Folders in /sys/bus/usb/devices/" ); return false; } for( int dx = 0; dx < usb_dirs.count(); dx++ ) { QString usb_path = "/sys/bus/usb/devices/" + usb_dirs[ dx ] + "/"; QString data = ""; VM_USB tmp_usb; // idVendor if( Read_SysFS_File(usb_path + "idVendor", data) ) { tmp_usb.Set_Vendor_ID( data ); } else { AQError( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read idVendor from /sys/bus/usb/devices/" ); continue; } // idProduct if( Read_SysFS_File(usb_path + "idProduct", data) ) { tmp_usb.Set_Product_ID( data ); } else { AQError( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read idProduct from /sys/bus/usb/devices/" ); continue; } // manufacturer if( Read_SysFS_File(usb_path + "manufacturer", data) ) { tmp_usb.Set_Manufacturer_Name( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read manufacturer from /sys/bus/usb/devices/" ); tmp_usb.Set_Manufacturer_Name( "Unknown Manufacturer" ); } // product if( Read_SysFS_File(usb_path + "product", data) ) { tmp_usb.Set_Product_Name( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read product from /sys/bus/usb/devices/" ); tmp_usb.Set_Product_Name( "Unknown Product" ); } // speed if( Read_SysFS_File(usb_path + "speed", data) ) { tmp_usb.Set_Speed( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read speed from /sys/bus/usb/devices/" ); } // Serial Number if( Read_SysFS_File(usb_path + "serial", data) ) { tmp_usb.Set_Serial_Number( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read serial from /sys/bus/usb/devices/" ); } // Bus if( Read_SysFS_File(usb_path + "busnum", data) ) { tmp_usb.Set_Bus( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read busnum from /sys/bus/usb/devices/" ); continue; } // Addr if( Read_SysFS_File(usb_path + "devnum", data) ) { tmp_usb.Set_Addr( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read devnum from /sys/bus/usb/devices/" ); continue; } // DevPath if( Read_SysFS_File(usb_path + "devpath", data) ) { tmp_usb.Set_DevPath( data ); } else { AQWarning( "bool System_Info::Scan_USB_Sys( QList &list )", "Cannot read devpath from /sys/bus/usb/devices/" ); continue; } // All Data Read tmp_usb.Set_Use_Host_Device( true ); list << tmp_usb; } return true; } bool System_Info::Read_SysFS_File( const QString &path, QString &data ) { QFile sysfs_file( path ); if( ! sysfs_file.open(QIODevice::ReadOnly | QIODevice::Text) ) { AQWarning( "bool System_Info::Read_SysFS_File( const QString &path, QString &data )", QString("Cannot Open File \"%1\"!").arg(path) ); return false; } QTextStream in( &sysfs_file ); QString line = in.readAll(); sysfs_file.close(); if( line.isEmpty() ) { AQWarning( "bool System_Info::Read_SysFS_File( const QString &path, QString &data )", "File is Empty!" ); return false; } else { line = line.remove( "\n" ); data = line; return true; } } bool System_Info::Scan_USB_Proc( QList &list ) { list.clear(); QFile proc_file( "/proc/bus/usb/devices" ); if( ! proc_file.open(QIODevice::ReadOnly | QIODevice::Text) ) { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Open File \"/proc/bus/usb/devices\"! USB information not found!" ); return false; } QTextStream in( &proc_file ); QList linux_usb_dev; QString line = in.readLine(); while( ! line.isNull() ) { QStringList tmp_str; if( line.startsWith("T:") ) { tmp_str << line; while( ! in.atEnd() ) { line = in.readLine(); if( line.startsWith("P:") || line.startsWith("S: Manufacturer") || line.startsWith("S: Product") || line.startsWith("S: SerialNumber") ) tmp_str << line; else if( line.startsWith("E:") ) break; } linux_usb_dev << tmp_str; } line = in.readLine(); } proc_file.close(); for( int ex = 0; ex < linux_usb_dev.count(); ++ex ) { if( linux_usb_dev[ex].count() < 4 ) { AQWarning( "bool System_Info::Scan_USB_Proc( QList &list )", "linux_usb_dev[ex].count() < 4" ); } } // T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6 QRegExp busAddr = QRegExp( "T:[\\s]+Bus=([\\d]{2}).+Dev#=[\\s]*([\\d]+).+Spd=([\\d]{1,3}).*" ); // P: Vendor=0123 ProdID=abcd Rev= 0.01 QRegExp idHex = QRegExp( "P:[\\s]+Vendor=([\\dabcdef]{4})[\\s]+ProdID=([\\dabcdef]{4}).+" ); // S: Manufacturer=Mega Cool Manufacturer QRegExp manufacturer = QRegExp( "S:[\\s]+Manufacturer=(.+)" ); // S: Product=Super USB Device QRegExp product = QRegExp( "S:[\\s]+Product=(.+)" ); // S: SerialNumber=0000:00:12.2 QRegExp serialNumber = QRegExp( "S:[\\s]+SerialNumber=(.+)" ); for( int ix = 0; ix < linux_usb_dev.count(); ix++ ) { if( linux_usb_dev[ix].count() <= 0 ) { AQWarning( "bool System_Info::Scan_USB_Proc( QList &list )", "linux_usb_dev[ix].count() <= 0" ); continue; } QStringList busAddr_list; QStringList idHex_list; QStringList manufacturer_list; QStringList product_list; QStringList serialNumber_list; for( int bx = 0; bx < linux_usb_dev[ix].count(); bx++ ) { if( busAddr_list.count() <= 0 ) { if( busAddr.exactMatch(linux_usb_dev[ix][bx]) ) { busAddr_list = busAddr.capturedTexts(); continue; } else { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Match busAddr! String: " + linux_usb_dev[ix][bx] ); } } if( idHex_list.count() <= 0 ) { if( idHex.exactMatch(linux_usb_dev[ix][bx]) ) { idHex_list = idHex.capturedTexts(); continue; } else { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Match idHex! String: " + linux_usb_dev[ix][bx] ); } } if( manufacturer_list.count() <= 0 ) { if( manufacturer.exactMatch(linux_usb_dev[ix][bx]) ) { manufacturer_list = manufacturer.capturedTexts(); continue; } else { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Match manufacturer! String: " + linux_usb_dev[ix][bx] ); } } if( product_list.count() <= 0 ) { if( product.exactMatch(linux_usb_dev[ix][bx]) ) { product_list = product.capturedTexts(); continue; } else { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Match product! String: " + linux_usb_dev[ix][bx] ); } } if( serialNumber_list.count() <= 0 ) { if( serialNumber.exactMatch(linux_usb_dev[ix][bx]) ) { serialNumber_list = serialNumber.capturedTexts(); continue; } else { AQError( "bool System_Info::Scan_USB_Proc( QList &list )", "Cannot Match serialNumber! String: " + linux_usb_dev[ix][bx] ); } } } // Create VM_USB if( idHex_list.count() > 1 ) { if( idHex_list[1] != "0000" && idHex_list[2] != "0000" ) { VM_USB tmp_usb; tmp_usb.Set_Vendor_ID( idHex_list[1] ); tmp_usb.Set_Product_ID( idHex_list[2] ); if( manufacturer_list.count() > 0 ) { tmp_usb.Set_Manufacturer_Name( manufacturer_list[1] ); } if( product_list.count() > 0 ) { tmp_usb.Set_Product_Name( product_list[1] ); } if( busAddr_list.count() >= 3 ) { QString busStr = (busAddr_list[1][0] == '0') ? QString(busAddr_list[1][1]) : busAddr_list[1]; tmp_usb.Set_Bus( busStr ); tmp_usb.Set_Addr( busAddr_list[2] ); // FIXME add usb device path also tmp_usb.Set_Speed( busAddr_list[3] ); } if( serialNumber_list.count() > 0 ) { tmp_usb.Set_Serial_Number( serialNumber_list[1] ); } list << tmp_usb; } } } return true; } #include #include #include void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM ) { // proc fs is exists? if( QFile::exists("/proc/meminfo") ) { QFile proc_file( "/proc/meminfo" ); if( ! proc_file.open(QIODevice::ReadOnly | QIODevice::Text) ) { AQDebug( "int System_Info::Get_Free_Memory_Size()", "void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM )" ); } else { QTextStream in( &proc_file ); QString line = in.readLine(); int all_mem, free_mem, cached_mem, buf_mem; all_mem = free_mem = cached_mem = buf_mem = -1; while( ! line.isNull() ) { if( (all_mem != -1 ) && (free_mem != -1) && (cached_mem != -1) && (buf_mem != -1) ) { allRAM = (int)(all_mem / 1024.0); freeRAM = (int)((free_mem + cached_mem + buf_mem) / 1024.0); return; // exit this } if( line.startsWith("MemTotal") ) { QRegExp rx = QRegExp( "MemTotal:\\s+(\\d+)\\s+.*" ); if( rx.exactMatch(line) ) { QStringList res = rx.capturedTexts(); if( res.count() != 2 ) break; else all_mem = res[1].toInt(); } else break; } else if( line.startsWith("MemFree") ) { QRegExp rx = QRegExp( "MemFree:\\s+(\\d+)\\s+.*" ); if( rx.exactMatch(line) ) { QStringList res = rx.capturedTexts(); if( res.count() != 2 ) break; else free_mem = res[1].toInt(); } else break; } else if( line.startsWith("Cached") ) { QRegExp rx = QRegExp( "Cached:\\s+(\\d+)\\s+.*" ); if( rx.exactMatch(line) ) { QStringList res = rx.capturedTexts(); if( res.count() != 2 ) break; else cached_mem = res[1].toInt(); } else break; } else if( line.startsWith("Buffers") ) { QRegExp rx = QRegExp( "Buffers:\\s+(\\d+)\\s+.*" ); if( rx.exactMatch(line) ) { QStringList res = rx.capturedTexts(); if( res.count() != 2 ) break; else buf_mem = res[1].toInt(); } else break; } line = in.readLine(); // Read next line } } } // If proc fs not exists struct sysinfo sysInfo; sysinfo( &sysInfo ); allRAM = (int)(unsigned long)(sysInfo.totalram * sysInfo.mem_unit) / 1024.0 / 1024.0; freeRAM = (int)(unsigned long)((sysInfo.freeram + sysInfo.bufferram) * sysInfo.mem_unit) / 1024.0 / 1024.0; } QStringList System_Info::Get_Host_FDD_List() { // Find Floppy's QDir dev_dir( "/dev/" ); QFileInfoList devices = dev_dir.entryInfoList( QStringList("fd*"), QDir::System, QDir::Name ); QStringList tmp_list; for( int d = 0; d < devices.count(); ++d ) { tmp_list << devices[d].absoluteFilePath(); } return tmp_list; } QStringList System_Info::Get_Host_CDROM_List() { // Find CD-ROM's QDir dev_dir( "/dev/" ); QStringList name_filters; name_filters << "cdrom*" << "sr*"; QFileInfoList devices = dev_dir.entryInfoList( name_filters, QDir::System, QDir::Name ); QStringList tmp_list; for( int d = 0; d < devices.count(); ++d ) { tmp_list << devices[ d ].absoluteFilePath(); } // Additional CDROM Devices (This Added By User) QSettings settings; int cdrom_count = settings.value( "Additional_CDROM_Devices/Count", "0" ).toString().toInt(); for( int ix = 0; ix < cdrom_count; ix++ ) { tmp_list << settings.value("Additional_CDROM_Devices/Device" + QString::number(ix), "").toString(); } return tmp_list; } #endif // Linux #ifdef Q_OS_FREEBSD #include #include #include void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM ) { size_t all_ram = 0, free_ram = 0, cached_mem = 0; size_t len = sizeof( all_ram ); if( (sysctlbyname("vm.stats.vm.v_page_count", &all_ram, &len, NULL, 0) == -1) || ! len ) { all_ram = 0; AQError( "void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM )", "Cannot Get Information on Memory! (vm.stats.vm.v_page_count)" ); } if( (sysctlbyname("vm.stats.vm.v_free_count", &free_ram, &len, NULL, 0) == -1) || ! len ) { free_ram = 0; AQError( "void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM )", "Cannot Get Information on Memory! (vm.stats.vm.v_free_count)" ); } if( (sysctlbyname("vm.stats.vm.v_cache_count", &cached_mem, &len, NULL, 0) == -1) || ! len ) { cached_mem = 0; AQError( "void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM )", "Cannot Get Information on Memory! (vm.stats.vm.v_cache_count)" ); } int page_size = getpagesize(); all_ram *= page_size; free_ram *= page_size; cached_mem *= page_size; allRAM = (int)(all_ram / 1024.0 / 1024.0); freeRAM = (int)((free_ram + cached_mem) / 1024.0 / 1024.0); } QStringList System_Info::Get_Host_FDD_List() { // Find Floppy's QDir dev_dir( "/dev/fd/" ); QFileInfoList devices = dev_dir.entryInfoList( QStringList("*"), QDir::System, QDir::Name ); QStringList tmp_list; for( int d = 0; d < devices.count(); ++d ) { tmp_list << devices[d].absoluteFilePath(); } return tmp_list; } QStringList System_Info::Get_Host_CDROM_List() { // Find CD-ROM's QDir dev_dir( "/dev/" ); QFileInfoList devices = dev_dir.entryInfoList( QStringList("acd*"), QDir::System, QDir::Name ); QStringList tmp_list; for( int d = 0; d < devices.count(); ++d ) { tmp_list << devices[d].absoluteFilePath(); } return tmp_list; } bool System_Info::Update_Host_USB() { AQError( "System_Info::Update_Host_USB()", "Not implemented!" ); return false; } #endif // FreeBSD #ifdef Q_OS_WIN32 #include #include void System_Info::Get_Free_Memory_Size( int &allRAM, int &freeRAM ) { MEMORYSTATUS mem; memset( (void*)&mem, 0, sizeof(mem) ); mem.dwLength = sizeof( mem ); GlobalMemoryStatus( &mem ); freeRAM = (int)mem.dwAvailPhys / 1024.0 / 1024.0; allRAM = (int)mem.dwTotalPhys / 1024.0 / 1024.0; } QStringList System_Info::Get_Host_FDD_List() { DWORD len = GetLogicalDriveStrings( 0, NULL ); TCHAR buf[ len ]; int buf_size = sizeof(buf) / sizeof(TCHAR); GetLogicalDriveStrings( buf_size, buf ); QStringList ret_list; QString tmp = ""; for( int ix = 0; ix < buf_size-1; ix++ ) { if( buf[ix] != NULL ) { tmp += (char)buf[ix]; } else { WCHAR *w = new WCHAR[ tmp.count() ]; tmp.toWCharArray( w ); UINT uDriveType = GetDriveType( w ); delete w; if( uDriveType == DRIVE_REMOVABLE ) { ret_list << tmp; } tmp = ""; } } return ret_list; } QStringList System_Info::Get_Host_CDROM_List() { DWORD len = GetLogicalDriveStrings( 0, NULL ); TCHAR buf[ len ]; int buf_size = sizeof(buf) / sizeof(TCHAR); GetLogicalDriveStrings( buf_size, buf ); QStringList ret_list; QString tmp = ""; for( int ix = 0; ix < buf_size-1; ix++ ) { if( buf[ix] != NULL ) { tmp += (char)buf[ix]; } else { WCHAR *w = new WCHAR[ tmp.count() ]; tmp.toWCharArray( w ); UINT uDriveType = GetDriveType( w ); delete w; if( uDriveType == DRIVE_CDROM ) { ret_list << tmp; } tmp = ""; } } return ret_list; } bool System_Info::Update_Host_USB() { AQError( "System_Info::Update_Host_USB()", "Not implemented!" ); return false; } #endif // Windows aqemu-0.9.2/src/System_Info.h000066400000000000000000000050241272330227200160320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef SYSTEM_INFO_H #define SYSTEM_INFO_H #include "Utils.h" #include "VM_Devices.h" class System_Info { public: System_Info(); static bool Update_VM_Computers_List(); static VM::Emulator_Version Get_Emulator_Version( const QString &path = "" ); static QMap Find_QEMU_Binary_Files( const QString &path ); //static QMap Find_KVM_Binary_Files( const QString &path ); static QString Find_IMG( const QStringList &paths ); static Available_Devices Get_Emulator_Info( const QString &path, bool *ok, VM::Emulator_Version version, const QString &internalName ); static QString Get_Emulator_Help_Output( const QString &path ); static QString Get_Emulator_Output( const QString &path, const QStringList &args ); static const QList &Get_All_Host_USB(); static const QList &Get_Used_USB_List(); static bool Add_To_Used_USB_List( const VM_USB &device ); static bool Delete_From_Used_USB_List( const VM_USB &device ); static bool Update_Host_USB(); static void Get_Free_Memory_Size( int &allRAM, int &freeRAM ); static QStringList Get_Host_FDD_List(); static QStringList Get_Host_CDROM_List(); //removed legacy support for all QEMU versions before 2.0 static QMap Emulator_QEMU_2_0; private: #ifdef Q_OS_LINUX static bool Scan_USB_Sys( QList &list ); static bool Scan_USB_Proc( QList &list ); static bool Read_SysFS_File( const QString &path, QString &data ); #endif static QList All_Host_USB; static QList Used_Host_USB; }; #endif aqemu-0.9.2/src/Utils.cpp000066400000000000000000000621771272330227200152420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #include HANDLE Console_HANDLE = GetStdHandle( STD_OUTPUT_HANDLE ); #else #include #include #endif #include "Utils.h" #include "System_Info.h" static uint Messages_Index = 0; static bool Save_Messages_To_Log = true; static QString Log_Path = ""; static bool Use_Stdout; static bool Stdout_Debug; static bool Stdout_Warning; static bool Stdout_Error; static bool Show_User_Graphic_Warning = true; static QStringList Recent_CD_Images; static QStringList Recent_FDD_Images; Disable_User_Graphic_Warning::Disable_User_Graphic_Warning() { Show_User_Graphic_Warning = false; } Disable_User_Graphic_Warning::~Disable_User_Graphic_Warning() { Show_User_Graphic_Warning = true; } void AQDebugStdCout(const QString& s) { std::cout << s.toLatin1().constData() << std::endl; } void AQDebug( const QString &sender, const QString &mes ) { if( Use_Stdout && Stdout_Debug ) { #ifdef Q_OS_WIN32 SetConsoleTextAttribute( Console_HANDLE, 10 ); std::cout << QString( "\nAQEMU Debug [%1] >>>\nSender: %2\nMessage: %3" ) .arg(Messages_Index).arg(sender).arg(mes).toStdString(); #else AQDebugStdCout( QString( "\n\33[32mAQEMU Debug\33[0m [%1] >>>\n\33[32mSender:\33[0m %2\n\33[32mMessage:\33[0m %3") .arg(Messages_Index).arg(sender).arg(mes)); #endif } if( Save_Messages_To_Log && Stdout_Debug ) AQSave_To_Log( "Debug", sender, mes ); Messages_Index++; } void AQWarning( const QString &sender, const QString &mes ) { if( Use_Stdout && Stdout_Warning ) { #ifdef Q_OS_WIN32 SetConsoleTextAttribute( Console_HANDLE, 14 ); std::cout << QString( "\nAQEMU Warning [%1] >>>\nSender: %2\nMessage: %3" ) .arg(Messages_Index).arg(sender).arg(mes).toStdString(); #else AQDebugStdCout( QString( "\n\33[34mAQEMU Warning\33[0m [%1] >>>\n\33[34mSender:\33[0m %2\n\33[34mMessage:\33[0m %3") .arg(Messages_Index).arg(sender).arg(mes)); #endif } if( Save_Messages_To_Log && Stdout_Warning ) AQSave_To_Log( "Warning", sender, mes ); Messages_Index++; } void AQError( const QString &sender, const QString &mes ) { if( Use_Stdout && Stdout_Error ) { #ifdef Q_OS_WIN32 SetConsoleTextAttribute( Console_HANDLE, 12 ); std::cout << QString( "\nAQEMU Error [%1] >>>\nSender: %2\nMessage: %3" ) .arg(Messages_Index).arg(sender).arg(mes).toStdString(); #else AQDebugStdCout( QString( "\n\33[31mAQEMU Error\33[0m [%1] >>>\n\33[31mSender:\33[0m %2\n\33[31mMessage:\33[0m %3") .arg(Messages_Index).arg(sender).arg(mes)); #endif } if( Save_Messages_To_Log && Stdout_Error ) AQSave_To_Log( "Error", sender, mes ); Messages_Index++; } void AQGraphic_Warning( const QString &caption, const QString &mes ) { if ( Show_User_Graphic_Warning == false ) return; QMessageBox::warning( NULL, caption, mes, QMessageBox::Ok ); } void AQGraphic_Warning( const QString &sender, const QString &caption, const QString &mes, bool fatal ) { if ( Show_User_Graphic_Warning == false ) return; if( fatal ) { QMessageBox::warning( NULL, caption, QString("Sender: %1\nMessage: %2\n").arg(sender).arg(mes) + QObject::tr("This Fatal Error. Recomend Close AQEMU."), QMessageBox::Ok ); } else { QMessageBox::warning( NULL, caption, QString("Sender: %1\nMessage: %2").arg(sender).arg(mes), QMessageBox::Ok ); } if( Save_Messages_To_Log ) AQSave_To_Log( "Warning", sender, mes ); } void AQGraphic_Error( const QString &sender, const QString &caption, const QString &mes, bool fatal ) { if( fatal ) { QMessageBox::critical( NULL, caption, QString("Sender: %1\nMessage: %2\n").arg(sender).arg(mes) + QObject::tr("Fatal error. It's recommended to close AQEMU"), QMessageBox::Ok ); } else { QMessageBox::critical( NULL, caption, QString("Sender: %1\nMessage: %2").arg(sender).arg(mes), QMessageBox::Ok ); } if( Save_Messages_To_Log ) AQSave_To_Log( "Error", sender, mes ); } void AQUse_Log( bool use ) { Save_Messages_To_Log = use; } void AQUse_Debug_Output( bool use, bool d, bool w, bool e ) { Use_Stdout = use; Stdout_Debug = d; Stdout_Warning = w; Stdout_Error = e; } void AQLog_Path( const QString& path ) { Log_Path = path; } void AQSave_To_Log( const QString &mes_type, const QString &sender, const QString &mes ) { if( Log_Path.isEmpty() ) return; QFile log_file( Log_Path ); if( ! log_file.open(QIODevice::Append | QIODevice::Text) ) { AQUse_Log( false ); // off loging AQError( "void AQSave_To_Log( const QString& mes_type, const QString& sender, const QString& mes )", "Cannot Open Log file to Write! Log Path: \"" + Log_Path + "\"" ); } else { QTextStream out( &log_file ); out << "Type: " << mes_type << " Num: " << Messages_Index << "\nDate: " << QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss zzz") << "\nSender: " << sender << "\nMessage: " << mes << "\n\n"; } } bool Create_New_HDD_Image( bool encrypted, const QString &base_image, const QString &file_name, const QString &format, VM::Device_Size size, bool verbose ) { // Create command line QStringList args; args << "create"; if( encrypted ) args << "-e"; if( ! base_image.isEmpty() ) args << "-b" << base_image; args << "-f" << format; args << file_name; switch( size.Suffix ) { case VM::Size_Suf_Mb: // MB args << QString::number( size.Size ) + "M"; break; case VM::Size_Suf_Gb: // GB args << QString::number( size.Size ) + "G"; break; default: // KG args << QString::number( size.Size ); break; } // Start qemu-img process QProcess qemu_img; QSettings settings; qemu_img.start( settings.value("QEMU-IMG_Path", "qemu-img").toString(), args ); if( ! qemu_img.waitForStarted(2000) ) { AQGraphic_Error( "bool Create_New_HDD_Image( bool encrypted, const QString &base_image," "const QString &file_name, const QString &format, VM::Device_Size size, bool verbose )", QObject::tr("Error!"), QObject::tr("Cannot Start qemu-img! Image isn't Created!") ); return false; } if( ! qemu_img.waitForFinished(10000) ) { AQGraphic_Error( "bool Create_New_HDD_Image( bool encrypted, const QString &base_image," "const QString &file_name, const QString &format, VM::Device_Size size, bool verbose )", QObject::tr("Error!"), QObject::tr("qemu-img Cannot Finish! Image isn't Created!") ); return false; } else { QByteArray err = qemu_img.readAllStandardError(); QByteArray out = qemu_img.readAllStandardOutput(); if( err.count() > 0 ) { AQGraphic_Error( "bool Create_New_HDD_Image( bool encrypted, const QString &base_image," "const QString &file_name, const QString &format, VM::Device_Size size, bool verbose )", QObject::tr("Error!"), QObject::tr("Cannot Create Image!\nInformation: ") + err ); } QRegExp rx( "Format*ing*fmt*size*" ); rx.setPatternSyntax( QRegExp::Wildcard ); if( verbose ) { if( rx.exactMatch( out ) ) { QMessageBox::information( NULL, QObject::tr("Complete!"), QObject::tr("QEMU-IMG is Creates HDD Image.\nAdditional Information:\n") + out ); } else { QMessageBox::information( NULL, QObject::tr("Warning!"), QObject::tr("QEMU-IMG is Returned non Standard Message!.\nAdditional Information:\n") + out ); } } return true; } } bool Create_New_HDD_Image( const QString &file_name, VM::Device_Size size ) { QSettings settings; QString format = settings.value( "Default_HDD_Image_Format", "qcow2" ).toString(); return Create_New_HDD_Image( false, "", file_name, format, size, false ); } bool Format_HDD_Image( const QString &file_name, VM::Disk_Info info ) { if( file_name.isEmpty() ) { AQError( "bool Format_HDD_Image( const QString &file_name )", "File Name is Empty!" ); return false; } VM_HDD tmp_hd = VM_HDD( true, file_name ); tmp_hd.Set_Disk_Info( info ); QString hd_format = tmp_hd.Get_Image_Format(); if( hd_format.isEmpty() ) { AQError( "bool Format_HDD_Image( const QString &file_name )", "Format is Empty!" ); return false; } return Create_New_HDD_Image( false, "", file_name, hd_format, tmp_hd.Get_Virtual_Size(), false ); } QList Get_Templates_List() { QList all_templates; QSettings settings; // VM Templates QDir sys_templates_dir( QDir::toNativeSeparators(settings.value("AQEMU_Data_Folder", "").toString() + "/os_templates/") ); QFileInfoList sys_templates_list = sys_templates_dir.entryInfoList( QStringList("*.aqvmt"), QDir::Files, QDir::Unsorted ); QDir user_templates_dir( QDir::toNativeSeparators(settings.value("VM_Directory", "").toString() + "/os_templates/") ); QFileInfoList user_templates_list = user_templates_dir.entryInfoList( QStringList("*.aqvmt"), QDir::Files, QDir::Unsorted ); for( int tx = 0; tx < sys_templates_list.count(); ++tx ) { for( int ux = 0; ux < user_templates_list.count(); ++ux ) { if( sys_templates_list[tx].completeBaseName() == user_templates_list[ux].completeBaseName() ) { sys_templates_list.takeAt( tx ); // delete system template tx -= 1; ux = user_templates_list.count(); } } } // OK. In Template Lists Only Unique Values for( int ix = 0; ix < sys_templates_list.count(); ++ix ) all_templates.append( sys_templates_list[ix].absoluteFilePath() ); for( int ix = 0; ix < user_templates_list.count(); ++ix ) all_templates.append( user_templates_list[ix].absoluteFilePath() ); // sort qSort( all_templates ); return all_templates; } QString Get_FS_Compatible_VM_Name( const QString &name ) { //QRegExp vm_name_val = QRegExp( "[^a-zA-Z0-9_]" ); // old style QRegExp vm_name_val = QRegExp( "[^\\w\\.]" ); QString tmp = name; tmp = tmp.replace( vm_name_val, "_" ); return tmp.replace( "__", "_" ); } QString Get_Complete_VM_File_Path( const QString &vm_name ) { //QRegExp vm_name_val = QRegExp( "[^a-zA-Z0-9_]" ); // old style QRegExp vm_name_val = QRegExp( "[^\\w]" ); QString tmp = vm_name; tmp = tmp.replace( vm_name_val, "_" ); QString new_name = tmp.replace( "__", "_" ); QString tmp_str = new_name; QSettings settings; QString ret_str = settings.value("VM_Directory", "").toString() + tmp_str; if( ! ret_str.endsWith(".aqemu") ) ret_str += ".aqemu"; for( int ix = 0; QFile::exists(ret_str); ++ix ) tmp_str = new_name + QString::number( ix ); return ret_str; } QString Get_TR_Size_Suffix( VM::Device_Size suf ) { switch( suf.Suffix ) { case VM::Size_Suf_Kb: return QObject::tr("Kb"); case VM::Size_Suf_Mb: return QObject::tr("Mb"); case VM::Size_Suf_Gb: return QObject::tr("Gb"); default: AQError( "QString Get_TR_Size_Suffix( VM::Device_Size suf )", "Virtual Size Suffix Default Section!" ); return ""; } } QString Get_Last_Dir_Path( const QString &path ) { QFileInfo info( path ); QString dir = info.path(); if( dir.isEmpty() ) return "/"; else return dir; } bool It_Host_Device( const QString &path ) { #ifdef Q_OS_WIN32 // FIXME return false; #else if( path.startsWith("/dev/") ) return true; else return false; #endif } void Check_AQEMU_Permissions() { QSettings settings; QFileInfo test_perm; #ifndef Q_OS_WIN32 // This Section For Unix Like OS. test_perm = QFileInfo( settings.fileName() ); if( test_perm.exists() ) { if( ! test_perm.isWritable() ) { AQGraphic_Error( "void Check_AQEMU_Permissions()", QObject::tr("Error!"), QObject::tr("AQEMU Config File is Read Only!\nCheck Permissions For File: ") + settings.fileName(), true ); } } #endif // Check VM Dir Permissions test_perm = QFileInfo( settings.value("VM_Directory", "~").toString() ); if( test_perm.exists() ) { if( ! test_perm.isWritable() ) { AQGraphic_Error( "void Check_AQEMU_Permissions()", QObject::tr("Error!"), QObject::tr("AQEMU VM Directory is Read Only!\nCheck Permissions For: ") + settings.value("VM_Directory", "~").toString(), true ); } } // Check VM Templates Dir Permissions test_perm = QFileInfo( settings.value("VM_Directory", "~").toString() + "os_templates" ); if( test_perm.exists() ) { if( ! test_perm.isWritable() ) { AQGraphic_Error( "void Check_AQEMU_Permissions()", QObject::tr("Error!"), QObject::tr("AQEMU VM Template Directory is Read Only!\nCheck Permissions For: ") + settings.value("VM_Directory", "~").toString() + "os_templates", true ); } } // Check AQEMU Log File Permissions if( ! settings.value("Log/Log_Path", "").toString().isEmpty() ) { test_perm = QFileInfo( settings.value("Log/Log_Path", "").toString() ); if( test_perm.exists() ) { if( ! test_perm.isWritable() ) { AQGraphic_Error( "void Check_AQEMU_Permissions()", QObject::tr("Error!"), QObject::tr("AQEMU Log File is Read Only!\nCheck Permissions For File: ") + settings.value("Log/Log_Path", "").toString(), false ); } } } } VM::Emulator_Version String_To_Emulator_Version( const QString &str ) { if( str == "QEMU 0.9.0" ) return VM::QEMU_2_0; else if( str == "QEMU 0.9.1" ) return VM::QEMU_2_0; else if( str == "QEMU 0.10.X" ) return VM::QEMU_2_0; else if( str == "QEMU 0.11.X" ) return VM::QEMU_2_0; else if( str == "QEMU 0.12.X" ) return VM::QEMU_2_0; else if( str == "QEMU 0.13.X" ) return VM::QEMU_2_0; else if( str == "QEMU 0.14.X" ) return VM::QEMU_2_0; else if( str == "QEMU 0.15.X" ) return VM::QEMU_2_0; else if( str == "QEMU 1.0" ) return VM::QEMU_2_0; else if( str == "QEMU 2.0" ) return VM::QEMU_2_0; else if( str == "KVM 7X" ) return VM::QEMU_2_0; else if( str == "KVM 8X" ) return VM::QEMU_2_0; else if( str == "KVM 0.11.X" ) return VM::QEMU_2_0; else if( str == "KVM 0.12.X" ) return VM::QEMU_2_0; else if( str == "KVM 0.13.X" ) return VM::QEMU_2_0; else if( str == "KVM 0.14.X" ) return VM::QEMU_2_0; else if( str == "KVM 0.15.X" ) return VM::QEMU_2_0; else if( str == "KVM 1.0" ) return VM::QEMU_2_0; else if( str == "Obsolete" ) return VM::Obsolete; else { AQError( "VM::Emulator_Version String_To_Emulator_Version( const QString &str )", QString("Emulator version \"%1\" not valid!").arg(str) ); return VM::Obsolete; } } QString Emulator_Version_To_String( VM::Emulator_Version ver ) { switch( ver ) { case VM::QEMU_2_0: return "QEMU 2.0"; case VM::Obsolete: return "Obsolete"; default: AQError( "QString Emulator_Version_To_String( VM::Emulator_Version ver )", QString("Emulator version \"%1\" not valid!").arg((int)ver) ); return ""; } } static QList Emulators_List; static QList Empty_Emul_List; static Emulator Empty_Emul; bool Update_Emulators_List() { // Clear old emulator list Emulators_List.clear(); // Get dir path QSettings settings; QFileInfo info( settings.fileName() ); QString aqemuSettingsFolder = info.absoluteDir().absolutePath(); if( ! (aqemuSettingsFolder.endsWith("/") || aqemuSettingsFolder.endsWith("\\")) ) aqemuSettingsFolder = QDir::toNativeSeparators( aqemuSettingsFolder + "/" ); if( ! QFile::exists(aqemuSettingsFolder) ) { AQError( "bool Update_Emulators_List()", QString("Cannot get path for save emulator! Folder \"%1\" not exists!").arg(aqemuSettingsFolder) ); return false; } // Get all *.emulators files QDir emulDir( aqemuSettingsFolder ); QStringList emulFiles = emulDir.entryList( QStringList("*.emulator"), QDir::Files, QDir::Name ); if( emulFiles.isEmpty() ) { AQWarning( "bool Update_Emulators_List()", QString("No emulators found in \"%1\"").arg(aqemuSettingsFolder) ); return false; } // Check default emulators bool qDef = false; // Load emulators for( int ex = 0; ex < emulFiles.count(); ++ex ) { Emulator tmp; if( ! tmp.Load(aqemuSettingsFolder + emulFiles[ex]) ) { AQError( "bool Update_Emulators_List()", QString("Cannot load emulator from file: \"%1\"").arg(emulFiles[ex]) ); continue; } // Default? if( tmp.Get_Default() ) { if( qDef ) { AQWarning( "bool Update_Emulators_List()", "Default QEMU emulator already loaded." ); tmp.Set_Default( false ); } else qDef = true; } // Update available options? if( tmp.Get_Check_Available_Options() ) { QMap tmpBinFiles = tmp.Get_Binary_Files(); QMap tmpDevMap; // result for( QMap::const_iterator it = tmpBinFiles.constBegin(); it != tmpBinFiles.constEnd(); ++it ) { if( ! it.value().isEmpty() ) { bool ok = false; Available_Devices tmpDev = System_Info::Get_Emulator_Info( it.value(), &ok, tmp.Get_Version(), it.key() ); if( ! ok ) { AQError( "bool Update_Emulators_List()", "Cannot set new emulator available options!" ); continue; } // Adding device tmpDevMap[ it.key() ] = tmpDev; } } // Set all devices tmp.Set_Devices( tmpDevMap ); } // Check version? if( tmp.Get_Check_Version() ) { // Get bin file path QString binFilePath = ""; QMap tmpBinFiles = tmp.Get_Binary_Files(); for( QMap::const_iterator it = tmpBinFiles.constBegin(); it != tmpBinFiles.constEnd(); ++it ) { if( QFile::exists(it.value()) ) { binFilePath = it.value(); break; } } if( binFilePath.isEmpty() ) { AQError( "bool Update_Emulators_List()", QString("Cannot find exists emulator binary file for emulator \"%1\"!").arg(tmp.Get_Name()) ); } // All OK, check version tmp.Set_Version( System_Info::Get_Emulator_Version(binFilePath) ); } // Adding emulator Emulators_List << tmp; } // Emulator loaded? if( Emulators_List.isEmpty() ) { AQWarning( "bool Update_Emulators_List()", "No emulators loaded!" ); return false; } // Check defaults if( qDef == false ) { for( int ex = 0; ex < Emulators_List.count(); ++ex ) { Emulators_List[ex].Set_Default( true ); break; } } // All OK return true; } const QList &Get_Emulators_List() { if( Update_Emulators_List() ) return Emulators_List; // FIXME Update else { AQError( "QList Get_Emulators_List()", "Cannot Update Emulators List" ); return Empty_Emul_List; } } bool Remove_All_Emulators_Files() { // Get emulators dir path QSettings settings; QFileInfo info( settings.fileName() ); QString aqemuSettingsFolder = info.absoluteDir().absolutePath(); aqemuSettingsFolder += aqemuSettingsFolder.endsWith( QDir::toNativeSeparators("/") ) ? "" : QDir::toNativeSeparators( "/" ); if( ! QFile::exists(aqemuSettingsFolder) ) { AQError( "bool Remove_All_Emulators_Files()", QString("Cannot get path for save emulator! Folder \"%1\" not exists!").arg(aqemuSettingsFolder) ); return false; } else { // Get all *.emulators files QDir emulDir( aqemuSettingsFolder ); QStringList emulFiles = emulDir.entryList( QStringList("*.emulator"), QDir::Files, QDir::Name ); bool allFilesRemoved = true; for( int dx = 0; dx < emulFiles.count(); ++dx ) { if( ! QFile::remove(aqemuSettingsFolder + emulFiles[dx]) ) { AQError( "bool Remove_All_Emulators_Files()", QString("Cannot delete file \"%1\"!").arg(emulFiles[dx]) ); allFilesRemoved = false; } } return allFilesRemoved; } } const Emulator &Get_Default_Emulator() { if( Emulators_List.count() <= 0 ) AQError( "const Emulator &Get_Default_Emulator()", "Emulator Count == 0" ); else { for( int ix = 0; ix < Emulators_List.count(); ix++ ) { if( Emulators_List[ix].Get_Default() ) { return Emulators_List[ ix ]; } } } AQWarning( "const Emulator &Get_Default_Emulator()", "Cannot Find!" ); return Empty_Emul; } const Emulator &Get_Emulator_By_Name( const QString &name ) { if( Emulators_List.count() <= 0 ) AQError( "const Emulator Get_Emulator_By_Name( const QString &name )", "Emulator Count == 0" ); else { for( int ix = 0; ix < Emulators_List.count(); ix++ ) { if( Emulators_List[ix].Get_Name() == name ) return Emulators_List[ ix ]; } } AQWarning( "const Emulator Get_Emulator_By_Name( const QString &name )", "Cannot Find!" ); return Empty_Emul; } int Get_Random( int min, int max ) { if( min < 0 || max > RAND_MAX || min > max ) { return -1; } qsrand( QTime::currentTime().msec() ); return int( qrand() / (RAND_MAX + 1.0) * (max + 1 - min) + min ); } void Load_Recent_Images_List() { QSettings settings; // CD int max_cd = settings.value( "CD_ROM_Existing_Images/Max", "5" ).toString().toInt(); Recent_CD_Images.clear(); for( int ix = 0; ix < max_cd; ++ix ) { QString tmp = settings.value( "CD_ROM_Existing_Images/item" + QString::number(ix), "" ).toString(); if( ! tmp.isEmpty() ) Recent_CD_Images << tmp; } // FDD int max_fdd = settings.value( "Floppy_Existing_Images/Max", "5" ).toString().toInt(); Recent_FDD_Images.clear(); for( int ix = 0; ix < max_fdd; ++ix ) { QString tmp = settings.value( "Floppy_Existing_Images/item" + QString::number(ix), "" ).toString(); if( ! tmp.isEmpty() ) Recent_FDD_Images << tmp; } } const QStringList &Get_CD_Recent_Images_List() { return Recent_CD_Images; } void Add_To_Recent_CD_Files( const QString &path ) { QSettings settings; int max = settings.value( "CD_ROM_Existing_Images/Max", "5" ).toString().toInt(); // This Unique Path? for( int fx = 0; fx < Recent_CD_Images.count() && fx < max; ++fx ) { if( Recent_CD_Images[fx] == path ) { AQDebug( "void Add_To_Recent_CD_Files( const QString &path )", "CD-ROM Path Not Unique." ); // Up it path in list if( fx < Recent_CD_Images.count()-1 ) { // swap items QString tmp = Recent_CD_Images[ fx+1 ]; Recent_CD_Images[ fx+1 ] = Recent_CD_Images[ fx ]; Recent_CD_Images[ fx ] = tmp; } else return; } } // Add to List if( Recent_CD_Images.count() < max ) { Recent_CD_Images << path; settings.setValue( "CD_ROM_Existing_Images/item" + QString::number(Recent_CD_Images.count()-1), path ); } else { // Delete first element and add new to end for( int ix = 0; ix < Recent_CD_Images.count() -1 && ix < max -1; ++ix ) { Recent_CD_Images[ ix ] = Recent_CD_Images[ ix +1 ]; } Recent_CD_Images[ max -1 ] = path; // Save Items for( int ix = 0; ix < Recent_CD_Images.count(); ix++ ) { settings.setValue( "CD_ROM_Existing_Images/item" + QString::number(ix), Recent_CD_Images[ix] ); } } } const QStringList &Get_FDD_Recent_Images_List() { return Recent_FDD_Images; } void Add_To_Recent_FDD_Files( const QString &path ) { QSettings settings; int max = settings.value( "Floppy_Existing_Images/Max", "5" ).toString().toInt(); // This Unique Path? for( int fx = 0; fx < Recent_FDD_Images.count() && fx < max; ++fx ) { if( Recent_FDD_Images[fx] == path ) { AQDebug( "void Add_To_Recent_FDD_Files( const QString &path )", "Floppy Path Not Unique." ); // Up it path in list if( fx < Recent_FDD_Images.count()-1 ) { // swap items QString tmp = Recent_FDD_Images[ fx+1 ]; Recent_FDD_Images[ fx+1 ] = Recent_FDD_Images[ fx ]; Recent_FDD_Images[ fx ] = tmp; } else return; } } // Add to List if( Recent_FDD_Images.count() < max ) { Recent_FDD_Images << path; settings.setValue( "Floppy_Existing_Images/item" + QString::number(Recent_FDD_Images.count()-1), path ); } else { // Delete first element and add new to end for( int ix = 0; ix < Recent_FDD_Images.count() -1 && ix < max -1; ++ix ) { Recent_FDD_Images[ ix ] = Recent_FDD_Images[ ix +1 ]; } Recent_FDD_Images[ max -1 ] = path; // Save Items for( int ix = 0; ix < Recent_FDD_Images.count(); ix++ ) { settings.setValue( "Floppy_Existing_Images/item" + QString::number(ix), Recent_FDD_Images[ix] ); } } } static bool Show_Error_Window; bool Get_Show_Error_Window() { return Show_Error_Window; } void Set_Show_Error_Window( bool show ) { Show_Error_Window = show; } #include void Checkbox_Dependend_Set_Enabled(QList& children_to_enable, QCheckBox* checkbox, bool enabled) { checkbox->setEnabled(enabled); if ( ! checkbox->isChecked() ) enabled = false; for( int i = 0; i < children_to_enable.count(); i++) children_to_enable[i]->setEnabled(enabled); } aqemu-0.9.2/src/Utils.h000066400000000000000000000065171272330227200147030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef UTILS_H #define UTILS_H #include #include #include "VM_Devices.h" class Disable_User_Graphic_Warning { public: Disable_User_Graphic_Warning(); ~Disable_User_Graphic_Warning(); }; void AQDebug( const QString &sender, const QString &mes ); void AQWarning( const QString &sender, const QString &mes ); void AQError( const QString &sender, const QString &mes ); void AQGraphic_Warning( const QString &caption, const QString &mes ); void AQGraphic_Warning( const QString &sender, const QString &caption, const QString &mes, bool fatal = false ); void AQGraphic_Error( const QString &sender, const QString &caption, const QString &mes, bool fatal = false ); void AQUse_Log( bool use ); void AQUse_Debug_Output( bool use, bool d, bool w, bool e ); void AQLog_Path( const QString &path ); void AQSave_To_Log( const QString &mes_type, const QString &sender, const QString &mes ); bool Create_New_HDD_Image( bool encrypted, const QString &base_image, const QString &file_name, const QString &format, VM::Device_Size size, bool verbose ); bool Create_New_HDD_Image( const QString &file_name, VM::Device_Size size ); bool Format_HDD_Image( const QString &file_name, VM::Disk_Info info ); QList Get_Templates_List(); QString Get_FS_Compatible_VM_Name( const QString &name ); QString Get_Complete_VM_File_Path( const QString &vm_name ); QString Get_TR_Size_Suffix( VM::Device_Size suf ); QString Get_Last_Dir_Path( const QString &path ); bool It_Host_Device( const QString &path ); void Check_AQEMU_Permissions(); VM::Emulator_Version String_To_Emulator_Version( const QString &str ); QString Emulator_Version_To_String( VM::Emulator_Version ver ); bool Update_Emulators_List(); const QList &Get_Emulators_List(); bool Remove_All_Emulators_Files(); const Emulator &Get_Default_Emulator( ); const Emulator &Get_Emulator_By_Name( const QString &name ); int Get_Random( int min, int max ); void Load_Recent_Images_List(); const QStringList &Get_CD_Recent_Images_List(); void Add_To_Recent_CD_Files( const QString &path ); const QStringList &Get_FDD_Recent_Images_List(); void Add_To_Recent_FDD_Files( const QString &path ); bool Get_Show_Error_Window(); void Set_Show_Error_Window( bool show ); class QWidget; class QCheckBox; void Checkbox_Dependend_Set_Enabled(QList& children_to_enable, QCheckBox* checkbox, bool enabled); #endif aqemu-0.9.2/src/VM.cpp000066400000000000000000010344101272330227200144520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include #else #include #endif #include #include #include #include #include "VM.h" #include "Utils.h" #include "Emulator_Control_Window.h" #include "System_Info.h" using namespace TinyXML2QDomWrapper; // VM Class ----------------------------------------------------------------- Virtual_Machine::Virtual_Machine() { // Default Machine Shared_Constructor(); } Virtual_Machine::Virtual_Machine( const QString &name ) { Shared_Constructor(); Machine_Name = name; } Virtual_Machine::Virtual_Machine( const Virtual_Machine &vm ) { QEMU_Process = new QProcess(); Monitor_Socket = new QTcpSocket( this ); Use_Monitor_TCP = false; Monitor_Hostname = "localhost"; Monitor_Port = 6000; State = vm.Get_State(); Emu_Ctl = new Emulator_Control_Window(); VM_XML_File_Path = vm.Get_VM_XML_File_Path(); Build_QEMU_Args_for_Script_Mode = false; Build_QEMU_Args_for_Tab_Info = false; UID = vm.Get_UID(); // Accel Machine_Accelerator = vm.Get_Machine_Accelerator(); Current_Emulator = vm.Get_Emulator(); QObject::connect( Emu_Ctl, SIGNAL(Ready_Read_Command(QString)), this, SLOT(Execute_Emu_Ctl_Command(QString)) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardError()), this, SLOT(Parse_StdErr()) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardOutput()), this, SLOT(Parse_StdOut()) ); QObject::connect( Monitor_Socket, SIGNAL(readyRead()), this, SLOT(Parse_StdOut()) ); QObject::connect( QEMU_Process, SIGNAL(started()), this, SLOT(QEMU_Started()) ); QObject::connect( QEMU_Process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(QEMU_Finished(int,QProcess::ExitStatus)) ); this->Icon_Path = vm.Get_Icon_Path(); this->Screenshot_Path = vm.Get_Screenshot_Path(); // General Tab this->Machine_Name = vm.Get_Machine_Name(); this->Computer_Type = vm.Get_Computer_Type(); this->Machine_Type = vm.Get_Machine_Type(); this->CPU_Type = vm.Get_CPU_Type(); this->SMP = vm.Get_SMP(); this->Keyboard_Layout = vm.Get_Keyboard_Layout(); this->Boot_Order_List = vm.Get_Boot_Order_List(); this->Show_Boot_Menu = vm.Get_Show_Boot_Menu(); this->Video_Card = vm.Get_Video_Card(); this->KQEMU_Mode = vm.Get_KQEMU_Mode(); this->Audio_Card = vm.Get_Audio_Cards(); this->Memory_Size = vm.Get_Memory_Size(); this->Remove_RAM_Size_Limitation = vm.Get_Remove_RAM_Size_Limitation(); this->Fullscreen = vm.Use_Fullscreen_Mode(); this->Win2K_Hack = vm.Use_Win2K_Hack(); this->Local_Time = vm.Use_Local_Time(); this->Check_FDD_Boot_Sector = vm.Use_Check_FDD_Boot_Sector(); this->ACPI = vm.Use_ACPI(); this->Snapshot_Mode = vm.Use_Snapshot_Mode(); this->Start_CPU = vm.Use_Start_CPU(); this->No_Reboot = vm.Use_No_Reboot(); this->No_Shutdown = vm.Use_No_Shutdown(); // FDD/CD/DVD Tab this->FD0 = vm.Get_FD0(); this->FD1 = vm.Get_FD1(); this->CD_ROM = vm.Get_CD_ROM(); // HDD Tab this->HDA = vm.Get_HDA(); this->HDB = vm.Get_HDB(); this->HDC = vm.Get_HDC(); this->HDD = vm.Get_HDD(); // Snapshots this->Set_Snapshots( vm.Get_Snapshots() ); // Storage Devices this->Set_Storage_Devices_List( vm.Get_Storage_Devices_List() ); // Shared Folders this->Set_Shared_Folders_List( vm.Get_Shared_Folders_List() ); // Network Tab this->Use_Network = vm.Get_Use_Network(); this->Nativ_Network = vm.Use_Nativ_Network(); this->Use_Redirections = vm.Get_Use_Redirections(); this->Network_Cards.clear(); for( int nx = 0; nx < vm.Get_Network_Cards_Count(); nx++ ) { VM_Net_Card n_card = vm.Get_Network_Card( nx ); this->Network_Cards.append( VM_Net_Card(n_card) ); } // Nativ this->Network_Cards_Nativ.clear(); this->Network_Cards_Nativ = vm.Get_Network_Cards_Nativ(); this->Network_Redirections.clear(); for( int rx = 0; rx < vm.Get_Network_Redirections_Count(); rx++ ) { VM_Redirection n_redir = vm.Get_Network_Redirection( rx ); this->Network_Redirections.append( VM_Redirection(n_redir) ); } this->SMB_Directory = vm.Get_SMB_Directory(); this->TFTP_Prefix = vm.Get_TFTP_Prefix(); // Ports Tab this->Serial_Ports = vm.Get_Serial_Ports(); this->Parallel_Ports = vm.Get_Parallel_Ports(); // USB this->USB_Ports.clear(); for( int ux = 0; ux < vm.Get_USB_Ports().count(); ++ux ) { this->USB_Ports.append( VM_USB(vm.Get_USB_Ports()[ux]) ); } // Other Tab this->Linux_Boot = vm.Get_Use_Linux_Boot(); this->bzImage_Path = vm.Get_bzImage_Path(); this->Initrd_Path = vm.Get_Initrd_Path(); this->Kernel_ComLine = vm.Get_Kernel_ComLine(); this->Additional_Args = vm.Get_Additional_Args(); this->Only_User_Args = vm.Get_Only_User_Args(); this->Use_User_Emulator_Binary = vm.Get_Use_User_Emulator_Binary(); this->Use_ROM_File = vm.Get_Use_ROM_File(); this->ROM_File = vm.Get_ROM_File(); this->MTDBlock = vm.Use_MTDBlock_File(); this->MTDBlock_File = vm.Get_MTDBlock_File(); this->SecureDigital = vm.Use_SecureDigital_File(); this->SecureDigital_File = vm.Get_SecureDigital_File(); this->PFlash = vm.Use_PFlash_File(); this->PFlash_File = vm.Get_PFlash_File(); this->Enable_KVM = vm.Use_KVM(); this->KVM_IRQChip = vm.Use_KVM_IRQChip(); this->No_KVM_Pit = vm.Use_No_KVM_Pit(); this->KVM_No_Pit_Reinjection = vm.Use_KVM_No_Pit_Reinjection(); this->KVM_Nesting = vm.Use_KVM_Nesting(); this->KVM_Shadow_Memory = vm.Use_KVM_Shadow_Memory(); this->KVM_Shadow_Memory_Size = vm.Get_KVM_Shadow_Memory_Size(); this->Init_Graphic_Mode = vm.Get_Init_Graphic_Mode(); this->No_Frame = vm.Use_No_Frame(); this->Alt_Grab = vm.Use_Alt_Grab(); this->No_Quit = vm.Use_No_Quit(); this->Portrait = vm.Use_Portrait(); this->Show_Cursor = vm.Use_Show_Cursor(); this->Curses = vm.Use_Curses(); this->RTC_TD_Hack = vm.Use_RTC_TD_Hack(); this->Start_Date = vm.Use_Start_Date(); this->Start_DateTime = vm.Get_Start_Date(); this->SPICE = vm.Get_SPICE(); this->VNC = vm.Use_VNC(); this->VNC_Socket_Mode = vm.Get_VNC_Socket_Mode(); this->VNC_Unix_Socket_Path = vm.Get_VNC_Unix_Socket_Path(); this->VNC_Display_Number = vm.Get_VNC_Display_Number(); this->VNC_Password = vm.Use_VNC_Password(); this->VNC_TLS = vm.Use_VNC_TLS(); this->VNC_x509 = vm.Use_VNC_x509(); this->VNC_x509_Folder_Path = vm.Get_VNC_x509_Folder_Path(); this->VNC_x509verify = vm.Use_VNC_x509verify(); this->VNC_x509verify_Folder_Path = vm.Get_VNC_x509verify_Folder_Path(); this->Load_VM_Window = nullptr; this->Save_VM_Window = nullptr; this->QEMU_Error_Win = nullptr; this->Load_Mode = false; this->Quit_Before_Save = false; Update_Current_Emulator_Devices(); // FIXME } Virtual_Machine::~Virtual_Machine() { if( QEMU_Process != NULL ) delete QEMU_Process; if( Emu_Ctl != NULL ) delete Emu_Ctl; Boot_Order_List.clear(); Snapshots.clear(); Storage_Devices.clear(); Shared_Folders.clear(); Network_Cards.clear(); Network_Redirections.clear(); USB_Ports.clear(); delete Load_VM_Window; delete Save_VM_Window; delete QEMU_Error_Win; } void Virtual_Machine::Shared_Constructor() { QEMU_Process = new QProcess(); Monitor_Socket = new QTcpSocket( this ); Use_Monitor_TCP = false; Monitor_Hostname = "localhost"; Monitor_Port = 6000; this->State = VM::VMS_Power_Off; Emu_Ctl = new Emulator_Control_Window(); Removable_Devices_List = ""; Update_Removable_Devices_Mode = false; VM_XML_File_Path = ""; Build_QEMU_Args_for_Script_Mode = false; Build_QEMU_Args_for_Tab_Info = false; UID = ""; // Accel Machine_Accelerator = VM::TCG; Current_Emulator = Emulator(); Current_Emulator_Devices = Available_Devices(); QObject::connect( Emu_Ctl, SIGNAL(Ready_Read_Command(QString)), this, SLOT(Execute_Emu_Ctl_Command(QString)) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardError()), this, SLOT(Parse_StdErr()) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardOutput()), this, SLOT(Parse_StdOut()) ); QObject::connect( Monitor_Socket, SIGNAL(readyRead()), this, SLOT(Parse_StdOut()) ); QObject::connect( QEMU_Process, SIGNAL(started()), this, SLOT(QEMU_Started()) ); QObject::connect( QEMU_Process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(QEMU_Finished(int, QProcess::ExitStatus)) ); Icon_Path = ":/other.png"; Screenshot_Path = ""; Machine_Name = "NO_NAME"; Computer_Type = ""; Machine_Type = ""; CPU_Type = ""; SMP.SMP_Count = 1; Keyboard_Layout = "Default"; VM::Boot_Order tmpBootOrder; tmpBootOrder.Enabled = true; tmpBootOrder.Type = VM::Boot_From_FDA; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = false; tmpBootOrder.Type = VM::Boot_From_FDB; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = true; tmpBootOrder.Type = VM::Boot_From_CDROM; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_HDD; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = false; tmpBootOrder.Type = VM::Boot_From_Network1; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network2; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network3; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network4; this->Boot_Order_List << tmpBootOrder; Show_Boot_Menu = true; Video_Card = ""; KQEMU_Mode = VM::KQEMU_Default; Audio_Card = VM::Sound_Cards(); Remove_RAM_Size_Limitation = false; Memory_Size = 128; Fullscreen = false; Win2K_Hack = false; Local_Time = true; Check_FDD_Boot_Sector = true; ACPI = true; Snapshot_Mode = false; Start_CPU = true; No_Reboot = false; No_Shutdown = false; FD0 = VM_Storage_Device(); FD1 = VM_Storage_Device(); CD_ROM = VM_Storage_Device(); HDA = VM_HDD(); HDB = VM_HDD(); HDC = VM_HDD(); HDD = VM_HDD(); Use_Network = true; Nativ_Network = false; Use_Redirections = false; TFTP_Prefix = ""; SMB_Directory = ""; Linux_Boot = false; bzImage_Path = ""; Initrd_Path = ""; Kernel_ComLine = ""; Additional_Args = ""; Only_User_Args = false; Use_User_Emulator_Binary = false; Use_ROM_File = false; ROM_File = ""; MTDBlock = false; MTDBlock_File = ""; SecureDigital = false; SecureDigital_File = ""; PFlash = false; PFlash_File = ""; Enable_KVM = true; KVM_IRQChip = false; No_KVM_Pit = false; KVM_No_Pit_Reinjection = false; KVM_Nesting = false; KVM_Shadow_Memory = false; KVM_Shadow_Memory_Size = 0; Init_Graphic_Mode = VM_Init_Graphic_Mode(); No_Frame = false; Alt_Grab = false; No_Quit = false; Portrait = false; Show_Cursor = false; Curses = false; RTC_TD_Hack = false; Start_Date = false; Start_DateTime = QDateTime::fromString( "20.10.2000 23:59:00", "dd.MM.yyyy HH:mm:ss" ); SPICE = VM_SPICE(); VNC = false; VNC_Socket_Mode = false; VNC_Unix_Socket_Path = ""; VNC_Display_Number = 1; VNC_Password = false; VNC_TLS = false; VNC_x509 = ""; VNC_x509_Folder_Path = ""; VNC_x509verify = false; VNC_x509verify_Folder_Path = ""; Embedded_Display_Port = -1; Template_Opts = Create_Template_Window::Template_Save_Default; Load_VM_Window = nullptr; Save_VM_Window = nullptr; QEMU_Error_Win = nullptr; Load_Mode = false; Quit_Before_Save = false; } bool Virtual_Machine::operator==( const Virtual_Machine &vm ) const { if( this->Icon_Path == vm.Get_Icon_Path() && this->Computer_Type == vm.Get_Computer_Type() && this->Machine_Name == vm.Get_Machine_Name() && this->Machine_Accelerator == vm.Get_Machine_Accelerator() && this->Machine_Type == vm.Get_Machine_Type() && this->CPU_Type == vm.Get_CPU_Type() && this->SMP == vm.Get_SMP() && this->Keyboard_Layout == vm.Get_Keyboard_Layout() && this->Show_Boot_Menu == vm.Get_Show_Boot_Menu() && this->Video_Card == vm.Get_Video_Card() && this->KQEMU_Mode == vm.Get_KQEMU_Mode() && this->Audio_Card == vm.Get_Audio_Cards() && this->Memory_Size == vm.Get_Memory_Size() && this->Remove_RAM_Size_Limitation == vm.Get_Remove_RAM_Size_Limitation() && this->Fullscreen == vm.Use_Fullscreen_Mode() && this->Win2K_Hack == vm.Use_Win2K_Hack() && this->Local_Time == vm.Use_Local_Time() && this->Check_FDD_Boot_Sector == vm.Use_Check_FDD_Boot_Sector() && this->ACPI == vm.Use_ACPI() && this->Snapshot_Mode == vm.Use_Snapshot_Mode() && this->No_Shutdown == vm.Use_No_Shutdown() && this->Start_CPU == vm.Use_Start_CPU() && this->No_Reboot == vm.Use_No_Reboot() && this->FD0 == vm.Get_FD0() && this->FD1 == vm.Get_FD1() && this->CD_ROM == vm.Get_CD_ROM() && this->HDA == vm.Get_HDA() && this->HDB == vm.Get_HDB() && this->HDC == vm.Get_HDC() && this->HDD == vm.Get_HDD() && this->Use_Network == vm.Get_Use_Network() && this->Nativ_Network == vm.Use_Nativ_Network() && this->Use_Redirections == vm.Get_Use_Redirections() && this->Get_Network_Cards_Count() == vm.Get_Network_Cards_Count() && this->Get_Network_Redirections_Count() == vm.Get_Network_Redirections_Count() && this->TFTP_Prefix == vm.Get_TFTP_Prefix() && this->SMB_Directory == vm.Get_SMB_Directory() && this->Linux_Boot == vm.Get_Use_Linux_Boot() && this->bzImage_Path == vm.Get_bzImage_Path() && this->Initrd_Path == vm.Get_Initrd_Path() && this->Kernel_ComLine == vm.Get_Kernel_ComLine() && this->Additional_Args == vm.Get_Additional_Args() && this->Only_User_Args == vm.Get_Only_User_Args() && this->Use_User_Emulator_Binary == vm.Get_Use_User_Emulator_Binary() && this->Use_ROM_File == vm.Get_Use_ROM_File() && this->ROM_File == vm.Get_ROM_File() && this->MTDBlock == vm.Use_MTDBlock_File() && this->MTDBlock_File == vm.Get_MTDBlock_File() && this->SecureDigital == vm.Use_SecureDigital_File() && this->SecureDigital_File == vm.Get_SecureDigital_File() && this->PFlash == vm.Use_PFlash_File() && this->PFlash_File == vm.Get_PFlash_File() && this->Enable_KVM == vm.Use_KVM() && this->KVM_IRQChip == vm.Use_KVM_IRQChip() && this->No_KVM_Pit == vm.Use_No_KVM_Pit() && this->KVM_No_Pit_Reinjection == vm.Use_KVM_No_Pit_Reinjection() && this->KVM_Nesting == vm.Use_KVM_Nesting() && this->KVM_Shadow_Memory == vm.Use_KVM_Shadow_Memory() && this->KVM_Shadow_Memory_Size == vm.Get_KVM_Shadow_Memory_Size() && this->Init_Graphic_Mode == vm.Get_Init_Graphic_Mode() && this->No_Frame == vm.Use_No_Frame() && this->Alt_Grab == vm.Use_Alt_Grab() && this->No_Quit == vm.Use_No_Quit() && this->Portrait == vm.Use_Portrait() && this->Show_Cursor == vm.Use_Show_Cursor() && this->Curses == vm.Use_Curses() && this->RTC_TD_Hack == vm.Use_RTC_TD_Hack() && this->Start_Date == vm.Use_Start_Date() && this->Start_DateTime == vm.Get_Start_Date() && this->SPICE == vm.Get_SPICE() && this->VNC == vm.Use_VNC() && this->VNC_Socket_Mode == vm.Get_VNC_Socket_Mode() && this->VNC_Unix_Socket_Path == vm.Get_VNC_Unix_Socket_Path() && this->VNC_Display_Number == vm.Get_VNC_Display_Number() && this->VNC_Password == vm.Use_VNC_Password() && this->VNC_TLS == vm.Use_VNC_TLS() && this->VNC_x509 == vm.Use_VNC_x509() && this->VNC_x509_Folder_Path == vm.Get_VNC_x509_Folder_Path() && this->VNC_x509verify == vm.Use_VNC_x509verify() && this->VNC_x509verify_Folder_Path == vm.Get_VNC_x509verify_Folder_Path() ) { // Boot Order if( Boot_Order_List.count() == vm.Get_Boot_Order_List().count() ) { for( int bx = 0; bx < Boot_Order_List.count(); bx++ ) { if( (Boot_Order_List[bx].Enabled != vm.Get_Boot_Order_List()[bx].Enabled) || (Boot_Order_List[bx].Type != vm.Get_Boot_Order_List()[bx].Type) ) return false; } } else return false; // Storage Devices if( Storage_Devices.count() == vm.Get_Storage_Devices_List().count() ) { for( int sx = 0; sx < Storage_Devices.count(); ++sx ) { if( Storage_Devices[sx] != vm.Get_Storage_Devices_List()[sx] ) return false; } } else return false; // Storage Devices if( Shared_Folders.count() == vm.Get_Shared_Folders_List().count() ) { for( int sx = 0; sx < Shared_Folders.count(); ++sx ) { if( Shared_Folders[sx] != vm.Get_Shared_Folders_List()[sx] ) return false; } } else return false; // Network Cards if( Get_Network_Cards_Count() == vm.Get_Network_Cards_Count() ) { for( int nx = 0; nx < Get_Network_Cards_Count(); ++nx ) { if( Network_Cards[nx] != vm.Get_Network_Card(nx) ) return false; } } else return false; // Network Cards Nativ QList tmp_card_nativ = vm.Get_Network_Cards_Nativ(); if( Network_Cards_Nativ.count() == tmp_card_nativ.count() ) { for( int nx = 0; nx < tmp_card_nativ.count(); ++nx ) { if( Network_Cards_Nativ[nx] != tmp_card_nativ[nx] ) return false; } } else return false; // Network Redirections if( Get_Network_Redirections_Count() == vm.Get_Network_Redirections_Count() ) { for( int rx = 0; rx < Get_Network_Redirections_Count(); ++rx ) { if( Network_Redirections[rx] != vm.Get_Network_Redirection(rx) ) return false; } } else return false; // Serial Port if( Serial_Ports.count() == vm.Get_Serial_Ports().count() ) { for( int sx = 0; sx < Serial_Ports.count(); ++sx ) { if( Serial_Ports[sx] != vm.Get_Serial_Ports()[sx] ) return false; } } else return false; // Parallel Ports if( Parallel_Ports.count() == vm.Get_Parallel_Ports().count() ) { for( int px = 0; px < Parallel_Ports.count(); ++px ) { if( Parallel_Ports[px] != vm.Get_Parallel_Ports()[px] ) return false; } } else return false; // USB if( USB_Ports.count() == vm.Get_USB_Ports().count() ) { for( int ux = 0; ux < USB_Ports.count(); ++ux ) { if( USB_Ports[ux] != vm.Get_USB_Ports()[ux] ) return false; } } else return false; return true; } else { return false; } } bool Virtual_Machine::operator!=( const Virtual_Machine &v1 ) const { return ! ( operator==(v1) ); } Virtual_Machine &Virtual_Machine::operator=( const Virtual_Machine &vm ) { QEMU_Process = new QProcess(); Monitor_Socket = new QTcpSocket( this ); Use_Monitor_TCP = false; Monitor_Hostname = "localhost"; Monitor_Port = 6000; delete Emu_Ctl; Emu_Ctl = new Emulator_Control_Window(); VM_XML_File_Path = vm.Get_VM_XML_File_Path(); State = vm.Get_State(); Build_QEMU_Args_for_Script_Mode = false; Build_QEMU_Args_for_Tab_Info = false; UID = vm.Get_UID(); // Accel Machine_Accelerator = vm.Get_Machine_Accelerator(); Current_Emulator = vm.Get_Emulator(); QObject::connect( Emu_Ctl, SIGNAL(Ready_Read_Command(QString)), this, SLOT(Execute_Emu_Ctl_Command(QString)) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardError()), this, SLOT(Parse_StdErr()) ); QObject::connect( QEMU_Process, SIGNAL(readyReadStandardOutput()), this, SLOT(Parse_StdOut()) ); QObject::connect( Monitor_Socket, SIGNAL(readyRead()), this, SLOT(Parse_StdOut()) ); QObject::connect( QEMU_Process, SIGNAL(started()), this, SLOT(QEMU_Started()) ); QObject::connect( QEMU_Process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(QEMU_Finished(int,QProcess::ExitStatus)) ); this->Icon_Path = vm.Get_Icon_Path(); this->Screenshot_Path = vm.Get_Screenshot_Path(); // General Tab this->Machine_Name = vm.Get_Machine_Name(); this->Computer_Type = vm.Get_Computer_Type(); this->Machine_Accelerator = vm.Get_Machine_Accelerator(); this->Machine_Type = vm.Get_Machine_Type(); this->CPU_Type = vm.Get_CPU_Type(); this->SMP = vm.Get_SMP(); this->Keyboard_Layout = vm.Get_Keyboard_Layout(); this->Boot_Order_List = vm.Get_Boot_Order_List(); this->Show_Boot_Menu = vm.Get_Show_Boot_Menu(); this->Video_Card = vm.Get_Video_Card(); this->KQEMU_Mode = vm.Get_KQEMU_Mode(); this->Audio_Card = vm.Get_Audio_Cards(); this->Memory_Size = vm.Get_Memory_Size(); this->Remove_RAM_Size_Limitation = vm.Get_Remove_RAM_Size_Limitation(); this->Fullscreen = vm.Use_Fullscreen_Mode(); this->Win2K_Hack = vm.Use_Win2K_Hack(); this->Local_Time = vm.Use_Local_Time(); this->Check_FDD_Boot_Sector = vm.Use_Check_FDD_Boot_Sector(); this->ACPI = vm.Use_ACPI(); this->Snapshot_Mode = vm.Use_Snapshot_Mode(); this->Start_CPU = vm.Use_Start_CPU(); this->No_Reboot = vm.Use_No_Reboot(); this->No_Shutdown = vm.Use_No_Shutdown(); // FDD/CD/DVD Tab this->FD0 = vm.Get_FD0(); this->FD1 = vm.Get_FD1(); this->CD_ROM = vm.Get_CD_ROM(); // HDD Tab this->HDA = vm.Get_HDA(); this->HDB = vm.Get_HDB(); this->HDC = vm.Get_HDC(); this->HDD = vm.Get_HDD(); // Snapshots this->Set_Snapshots( vm.Get_Snapshots() ); // Storage Devices this->Set_Storage_Devices_List( vm.Get_Storage_Devices_List() ); // Shared Folders this->Set_Shared_Folders_List( vm.Get_Shared_Folders_List() ); // Network Tab this->Use_Network = vm.Get_Use_Network(); this->Nativ_Network = vm.Use_Nativ_Network(); this->Use_Redirections = vm.Get_Use_Redirections(); this->Network_Cards.clear(); for( int nx = 0; nx < vm.Get_Network_Cards_Count(); nx++ ) { VM_Net_Card n_card = vm.Get_Network_Card( nx ); this->Network_Cards.append( VM_Net_Card(n_card) ); } // Nativ this->Network_Cards_Nativ.clear(); this->Network_Cards_Nativ = vm.Get_Network_Cards_Nativ(); this->Network_Redirections.clear(); for( int rx = 0; rx < vm.Get_Network_Redirections_Count(); rx++ ) { VM_Redirection n_redir = vm.Get_Network_Redirection( rx ); this->Network_Redirections.append( VM_Redirection(n_redir) ); } this->SMB_Directory = vm.Get_SMB_Directory(); this->TFTP_Prefix = vm.Get_TFTP_Prefix(); // Port tab this->Serial_Ports = vm.Get_Serial_Ports(); this->Parallel_Ports = vm.Get_Parallel_Ports(); this->USB_Ports.clear(); for( int ux = 0; ux < vm.Get_USB_Ports().count(); ++ux ) { this->USB_Ports.append( VM_USB(vm.Get_USB_Ports()[ux]) ); } // Other Tab this->Linux_Boot = vm.Get_Use_Linux_Boot(); this->bzImage_Path = vm.Get_bzImage_Path(); this->Initrd_Path = vm.Get_Initrd_Path(); this->Kernel_ComLine = vm.Get_Kernel_ComLine(); this->Additional_Args = vm.Get_Additional_Args(); this->Only_User_Args = vm.Get_Only_User_Args(); this->Use_User_Emulator_Binary = vm.Get_Use_User_Emulator_Binary(); this->Use_ROM_File = vm.Get_Use_ROM_File(); this->ROM_File = vm.Get_ROM_File(); this->MTDBlock = vm.Use_MTDBlock_File(); this->MTDBlock_File = vm.Get_MTDBlock_File(); this->SecureDigital = vm.Use_SecureDigital_File(); this->SecureDigital_File = vm.Get_SecureDigital_File(); this->PFlash = vm.Use_PFlash_File(); this->PFlash_File = vm.Get_PFlash_File(); this->Enable_KVM = vm.Use_KVM(); this->KVM_IRQChip = vm.Use_KVM_IRQChip(); this->No_KVM_Pit = vm.Use_No_KVM_Pit(); this->KVM_No_Pit_Reinjection = vm.Use_KVM_No_Pit_Reinjection(); this->KVM_Nesting = vm.Use_KVM_Nesting(); this->KVM_Shadow_Memory = vm.Use_KVM_Shadow_Memory(); this->KVM_Shadow_Memory_Size = vm.Get_KVM_Shadow_Memory_Size(); this->Init_Graphic_Mode = vm.Get_Init_Graphic_Mode(); this->No_Frame = vm.Use_No_Frame(); this->Alt_Grab = vm.Use_Alt_Grab(); this->No_Quit = vm.Use_No_Quit(); this->Portrait = vm.Use_Portrait(); this->Show_Cursor = vm.Use_Show_Cursor(); this->Curses = vm.Use_Curses(); this->RTC_TD_Hack = vm.Use_RTC_TD_Hack(); this->Start_Date = vm.Use_Start_Date(); this->Start_DateTime = vm.Get_Start_Date(); this->SPICE = vm.Get_SPICE(); this->VNC = vm.Use_VNC(); this->VNC_Socket_Mode = vm.Get_VNC_Socket_Mode(); this->VNC_Unix_Socket_Path = vm.Get_VNC_Unix_Socket_Path(); this->VNC_Display_Number = vm.Get_VNC_Display_Number(); this->VNC_Password = vm.Use_VNC_Password(); this->VNC_TLS = vm.Use_VNC_TLS(); this->VNC_x509 = vm.Use_VNC_x509(); this->VNC_x509_Folder_Path = vm.Get_VNC_x509_Folder_Path(); this->VNC_x509verify = vm.Use_VNC_x509verify(); this->VNC_x509verify_Folder_Path = vm.Get_VNC_x509verify_Folder_Path(); this->Load_VM_Window = nullptr; this->Save_VM_Window = nullptr; this->Load_Mode = false; Update_Current_Emulator_Devices(); return *this; } const QString &Virtual_Machine::Get_VM_XML_File_Path() const { return VM_XML_File_Path; } void Virtual_Machine::Set_VM_XML_File_Path( const QString &path ) { VM_XML_File_Path = path; } bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode ) { VM_XML_File_Path = file_name; if( file_name.isEmpty() ) { AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "File Name is Empty!" ); return false; } QDomDocument New_Dom_Document( "AQEMU" ); QDomProcessingInstruction Pro_Instr = New_Dom_Document.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ); New_Dom_Document.appendChild( Pro_Instr ); QDomElement Root_Element; if( template_mode ) Root_Element = New_Dom_Document.createElement( "AQEMU_Template" ); else Root_Element = New_Dom_Document.createElement( "AQEMU" ); Root_Element.setAttribute( "version", "0.8" ); // This is AQEMU Version New_Dom_Document.appendChild( Root_Element ); QDomElement VM_Element = New_Dom_Document.createElement( "Virtual_Machine" ); Root_Element.appendChild( VM_Element ); // Save New VM Data QDomElement Dom_Element; QDomText Dom_Text; if( template_mode ) { // Temlate Options Dom_Element = New_Dom_Document.createElement( "Template_Options" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number((int)Template_Opts) ); Dom_Element.appendChild( Dom_Text ); } // VM State Dom_Element = New_Dom_Document.createElement( "VM_State" ); VM_Element.appendChild( Dom_Element ); if( template_mode ) { Dom_Text = New_Dom_Document.createTextNode( "Power_Off" ); } else { switch( State ) { case VM::VMS_Power_Off: Dom_Text = New_Dom_Document.createTextNode( "Power_Off" ); break; case VM::VMS_Saved: Dom_Text = New_Dom_Document.createTextNode( "Saved" ); break; default: Dom_Text = New_Dom_Document.createTextNode( "Power_Off" ); break; } } Dom_Element.appendChild( Dom_Text ); // Icon Path Dom_Element = New_Dom_Document.createElement( "Icon_Path" ); VM_Element.appendChild( Dom_Element ); QSettings settings; QString data_folder = settings.value("AQEMU_Data_Folder", "").toString(); if ( ! data_folder.isEmpty() ) { if ( Icon_Path.startsWith( data_folder ) ) //save relative path if possible Dom_Text = New_Dom_Document.createTextNode( QString(Icon_Path).replace(data_folder, "") ); else Dom_Text = New_Dom_Document.createTextNode( Icon_Path ); } Dom_Element.appendChild( Dom_Text ); // Screenshot Path Dom_Element = New_Dom_Document.createElement( "Screenshot_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Screenshot_Path ); Dom_Element.appendChild( Dom_Text ); // Machine Name Dom_Element = New_Dom_Document.createElement( "Machine_Name" ); VM_Element.appendChild( Dom_Element ); if( template_mode ) Dom_Text = New_Dom_Document.createTextNode( Template_Name ); else Dom_Text = New_Dom_Document.createTextNode( Machine_Name ); Dom_Element.appendChild( Dom_Text ); // Emulator Name Dom_Element = New_Dom_Document.createElement( "Emulator_Name" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Current_Emulator.Get_Name() ); Dom_Element.appendChild( Dom_Text ); // Emulator Type (legacy name) = now Machine_Accelerator Dom_Element = New_Dom_Document.createElement( "Machine_Accelerator" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( VM::Accel_To_String(Machine_Accelerator) ); Dom_Element.appendChild( Dom_Text ); // Computer Type Dom_Element = New_Dom_Document.createElement( "Computer_Type" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Computer_Type ); Dom_Element.appendChild( Dom_Text ); // Machine Type Dom_Element = New_Dom_Document.createElement( "Machine_Type" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Machine_Type ); Dom_Element.appendChild( Dom_Text ); // CPU Type Dom_Element = New_Dom_Document.createElement( "CPU_Type" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( CPU_Type ); Dom_Element.appendChild( Dom_Text ); // SMP_CPU_Count Dom_Element = New_Dom_Document.createElement( "SMP_CPU_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SMP.SMP_Count) ); Dom_Element.appendChild( Dom_Text ); // SMP_Cores Dom_Element = New_Dom_Document.createElement( "SMP_Cores" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SMP.SMP_Cores) ); Dom_Element.appendChild( Dom_Text ); // SMP_Threads Dom_Element = New_Dom_Document.createElement( "SMP_Threads" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SMP.SMP_Threads) ); Dom_Element.appendChild( Dom_Text ); // SMP_Sockets Dom_Element = New_Dom_Document.createElement( "SMP_Sockets" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SMP.SMP_Sockets) ); Dom_Element.appendChild( Dom_Text ); // SMP_MaxCPUs Dom_Element = New_Dom_Document.createElement( "SMP_MaxCPUs" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SMP.SMP_MaxCPUs) ); Dom_Element.appendChild( Dom_Text ); // Keyboard Layout Dom_Element = New_Dom_Document.createElement( "Keyboard_Layout" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Keyboard_Layout ); Dom_Element.appendChild( Dom_Text ); // Create new element QDomElement Sec_Element; // Boot Device Dom_Element = New_Dom_Document.createElement( "Boot_Device_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Boot_Order_List.count()) ); Dom_Element.appendChild( Dom_Text ); for( int bx = 0; bx < Boot_Order_List.count(); bx++ ) { Dom_Element = New_Dom_Document.createElement( "Boot_Device_" + QString::number(bx) ); Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( Boot_Order_List[bx].Enabled ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Type" ); Dom_Element.appendChild( Sec_Element ); switch( Boot_Order_List[bx].Type ) { case VM::Boot_From_FDA: Dom_Text = New_Dom_Document.createTextNode( "FDA" ); break; case VM::Boot_From_FDB: Dom_Text = New_Dom_Document.createTextNode( "FDB" ); break; case VM::Boot_From_CDROM: Dom_Text = New_Dom_Document.createTextNode( "CDROM" ); break; case VM::Boot_From_HDD: Dom_Text = New_Dom_Document.createTextNode( "HDD" ); break; case VM::Boot_From_Network1: Dom_Text = New_Dom_Document.createTextNode( "Network1" ); break; case VM::Boot_From_Network2: Dom_Text = New_Dom_Document.createTextNode( "Network2" ); break; case VM::Boot_From_Network3: Dom_Text = New_Dom_Document.createTextNode( "Network3" ); break; case VM::Boot_From_Network4: Dom_Text = New_Dom_Document.createTextNode( "Network4" ); break; default: AQWarning( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "Use Default Boot Device: CD-ROM" ); Dom_Text = New_Dom_Document.createTextNode( "CDROM" ); break; } Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // Show Boot Menu Dom_Element = New_Dom_Document.createElement( "Show_Boot_Menu" ); VM_Element.appendChild( Dom_Element ); if( Show_Boot_Menu ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Video_Card Dom_Element = New_Dom_Document.createElement( "Video_Card" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Video_Card ); Dom_Element.appendChild( Dom_Text ); // KQEMU Mode ( Acceleration ) Dom_Element = New_Dom_Document.createElement( "KQEMU_Mode" ); VM_Element.appendChild( Dom_Element ); switch( KQEMU_Mode ) { case VM::KQEMU_Disabled: Dom_Text = New_Dom_Document.createTextNode( "Disabled" ); break; case VM::KQEMU_Enabled: Dom_Text = New_Dom_Document.createTextNode( "Enabled" ); break; case VM::KQEMU_Full: Dom_Text = New_Dom_Document.createTextNode( "Full" ); break; case VM::KQEMU_Default: Dom_Text = New_Dom_Document.createTextNode( "Default" ); break; default: AQWarning( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "Use Default KQEMU Mode: Enabled" ); Dom_Text = New_Dom_Document.createTextNode( "Enabled" ); break; } Dom_Element.appendChild( Dom_Text ); // Audio Cards Dom_Element = New_Dom_Document.createElement( "Audio_Cards" ); // Audio_sb16 Sec_Element = New_Dom_Document.createElement( "Audio_sb16" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_sb16 ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Audio_es1370 Sec_Element = New_Dom_Document.createElement( "Audio_es1370" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_es1370 ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Audio_Adlib Sec_Element = New_Dom_Document.createElement( "Audio_Adlib" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_Adlib ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Audio_PC_Speaker Sec_Element = New_Dom_Document.createElement( "Audio_PC_Speaker" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_PC_Speaker ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Audio_GUS Sec_Element = New_Dom_Document.createElement( "Audio_GUS" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_GUS ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Audio_AC97 Sec_Element = New_Dom_Document.createElement( "Audio_AC97" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_AC97 ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Audio_HDA Sec_Element = New_Dom_Document.createElement( "Audio_HDA" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_HDA ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Audio_cs4231a Sec_Element = New_Dom_Document.createElement( "Audio_cs4231a" ); Dom_Element.appendChild( Sec_Element ); if( Audio_Card.Audio_cs4231a ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Check Free RAM Dom_Element = New_Dom_Document.createElement( "Remove_RAM_Size_Limitation" ); VM_Element.appendChild( Dom_Element ); if( Remove_RAM_Size_Limitation ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Memory Size ( RAM ) Dom_Element = New_Dom_Document.createElement( "Memory_Size" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Memory_Size) ); Dom_Element.appendChild( Dom_Text ); // Fullscreen Dom_Element = New_Dom_Document.createElement( "Fullscreen" ); VM_Element.appendChild( Dom_Element ); if( Fullscreen ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Win2K_Hack Dom_Element = New_Dom_Document.createElement( "Win2K_Hack" ); VM_Element.appendChild( Dom_Element ); if( Win2K_Hack ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Localtime Dom_Element = New_Dom_Document.createElement( "Local_Time" ); VM_Element.appendChild( Dom_Element ); if( Local_Time ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Check FDD Boot Sector Dom_Element = New_Dom_Document.createElement( "Check_FDD_Boot_Sector" ); VM_Element.appendChild( Dom_Element ); if( Check_FDD_Boot_Sector ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // ACPI Dom_Element = New_Dom_Document.createElement( "ACPI" ); VM_Element.appendChild( Dom_Element ); if( ACPI ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Snapshot_Mode Dom_Element = New_Dom_Document.createElement( "Snapshot_Mode" ); VM_Element.appendChild( Dom_Element ); if( Snapshot_Mode ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Start_CPU Dom_Element = New_Dom_Document.createElement( "Start_CPU" ); VM_Element.appendChild( Dom_Element ); if( Start_CPU ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // No_Reboot Dom_Element = New_Dom_Document.createElement( "No_Reboot" ); VM_Element.appendChild( Dom_Element ); if( No_Reboot ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // No_Shutdown Dom_Element = New_Dom_Document.createElement( "No_Shutdown" ); VM_Element.appendChild( Dom_Element ); if( No_Shutdown ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Floppy's and CD-ROM if( template_mode && ! (Template_Opts & Create_Template_Window::Template_Save_FDD_CD) ) { // Floppy 0 Dom_Element = New_Dom_Document.createElement( "FD0" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // Floppy 1 Dom_Element = New_Dom_Document.createElement( "FD1" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // CD-ROM Dom_Element = New_Dom_Document.createElement( "CD_ROM" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); } else { // Floppy 0 Dom_Element = New_Dom_Document.createElement( "FD0" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( FD0.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( FD0.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, FD0.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // Floppy 1 Dom_Element = New_Dom_Document.createElement( "FD1" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( FD1.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( FD1.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, FD1.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // CD-ROM Dom_Element = New_Dom_Document.createElement( "CD_ROM" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( CD_ROM.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( CD_ROM.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, CD_ROM.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); } if( template_mode && ! (Template_Opts & Create_Template_Window::Template_Save_HDD) ) { // HDA Dom_Element = New_Dom_Document.createElement( "HDA" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDB Dom_Element = New_Dom_Document.createElement( "HDB" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDC Dom_Element = New_Dom_Document.createElement( "HDC" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDD Dom_Element = New_Dom_Document.createElement( "HDD" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, VM_Nativ_Storage_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); } else { // HDA Dom_Element = New_Dom_Document.createElement( "HDA" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( HDA.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( HDA.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, HDA.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDB Dom_Element = New_Dom_Document.createElement( "HDB" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( HDB.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( HDB.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, HDB.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDC Dom_Element = New_Dom_Document.createElement( "HDC" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( HDC.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( HDC.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, HDC.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); // HDD Dom_Element = New_Dom_Document.createElement( "HDD" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( HDD.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Image File Name Sec_Element = New_Dom_Document.createElement( "Image_File_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( HDD.Get_File_Name() ); Sec_Element.appendChild( Dom_Text ); // Nativ Device Sec_Element = New_Dom_Document.createElement( "Nativ_Device" ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Sec_Element, HDD.Get_Nativ_Device() ); Dom_Element.appendChild( Sec_Element ); VM_Element.appendChild( Dom_Element ); } // Storage Devices if( Get_Current_Emulator_Devices()->PSO_Drive && (template_mode == false || (template_mode == true && Template_Opts & Create_Template_Window::Template_Save_HDD)) ) { // Storage Device Count Dom_Element = New_Dom_Document.createElement( "Storage_Device_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Storage_Devices.count()) ); Dom_Element.appendChild( Dom_Text ); for( int sx = 0; sx < Storage_Devices.count(); ++sx ) { Dom_Element = New_Dom_Document.createElement( "Storage_Device_" + QString::number(sx) ); Save_VM_Nativ_Storage_Device( New_Dom_Document, Dom_Element, Storage_Devices[sx] ); VM_Element.appendChild( Dom_Element ); } } else { // Not Devices Dom_Element = New_Dom_Document.createElement( "Storage_Device_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); } // Shared Folders if( true /*(template_mode == false || (template_mode == true && Template_Opts & Create_Template_Window::Template_Save_Shared_Folders)) //TODO: not using template mode, not sure if it's needed */ ) { // Storage Device Count Dom_Element = New_Dom_Document.createElement( "Shared_Folder_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Shared_Folders.count()) ); Dom_Element.appendChild( Dom_Text ); for( int sx = 0; sx < Shared_Folders.count(); ++sx ) { Dom_Element = New_Dom_Document.createElement( "Shared_Folder_" + QString::number(sx) ); Save_VM_Shared_Folder( New_Dom_Document, Dom_Element, Shared_Folders[sx] ); VM_Element.appendChild( Dom_Element ); } } /* else { // Not Devices Dom_Element = New_Dom_Document.createElement( "Shared_Folders_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); }*/ // Snapshots if( template_mode ) { // Snapshots Count Dom_Element = New_Dom_Document.createElement( "Snapshots_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "0" ); Dom_Element.appendChild( Dom_Text ); } else { // Snapshots Count Dom_Element = New_Dom_Document.createElement( "Snapshots_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Snapshots.count()) ); Dom_Element.appendChild( Dom_Text ); for( int sx = 0; sx < Snapshots.count(); ++sx ) { Dom_Element = New_Dom_Document.createElement( "Snapshot_" + QString::number(sx) ); // Tag Sec_Element = New_Dom_Document.createElement( "Tag" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Snapshots[sx].Get_Tag() ); Sec_Element.appendChild( Dom_Text ); // Name Sec_Element = New_Dom_Document.createElement( "Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Snapshots[sx].Get_Name() ); Sec_Element.appendChild( Dom_Text ); // Description Sec_Element = New_Dom_Document.createElement( "Description" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Snapshots[sx].Get_Description() ); Sec_Element.appendChild( Dom_Text ); // END VM_Element.appendChild( Dom_Element ); } } // Network if( template_mode && ! (Template_Opts & Create_Template_Window::Template_Save_Network) ) { // Use Network Dom_Element = New_Dom_Document.createElement( "Use_Network" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Nativ_Network Dom_Element = New_Dom_Document.createElement( "Nativ_Network" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Redirections Dom_Element = New_Dom_Document.createElement( "Use_Redirections" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Network Cards Count Dom_Element = New_Dom_Document.createElement( "Network_Cards_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); // Network Cards Count Dom_Element = New_Dom_Document.createElement( "Network_Cards_Nativ_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); // Redirections count Dom_Element = New_Dom_Document.createElement( "Redirections_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); // TFTP Prefix Dom_Element = New_Dom_Document.createElement( "TFTP_Prefix" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Dom_Element.appendChild( Dom_Text ); // SMB Directory Dom_Element = New_Dom_Document.createElement( "SMB_Directory" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( "" ); Dom_Element.appendChild( Dom_Text ); } else { // Use Network Dom_Element = New_Dom_Document.createElement( "Use_Network" ); VM_Element.appendChild( Dom_Element ); if( Use_Network ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Redirections Dom_Element = New_Dom_Document.createElement( "Use_Redirections" ); VM_Element.appendChild( Dom_Element ); if( Use_Redirections ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Network Cards Count Dom_Element = New_Dom_Document.createElement( "Network_Cards_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards.count()) ); Dom_Element.appendChild( Dom_Text ); for( int nx = 0; nx < Network_Cards.count(); nx++ ) { Dom_Element = New_Dom_Document.createElement( "Network_Card_" + QString::number(nx) ); // Card Model Sec_Element = New_Dom_Document.createElement( "Card_Model" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_Card_Model() ); Sec_Element.appendChild( Dom_Text ); // Network Mode Sec_Element = New_Dom_Document.createElement( "Network_Mode" ); Dom_Element.appendChild( Sec_Element ); switch( Network_Cards[nx].Get_Net_Mode() ) { case VM::Net_Mode_None: Dom_Text = New_Dom_Document.createTextNode( "None" ); break; case VM::Net_Mode_Usermode: Dom_Text = New_Dom_Document.createTextNode( "Usermode" ); break; case VM::Net_Mode_Tuntap: Dom_Text = New_Dom_Document.createTextNode( "Tuntap" ); break; case VM::Net_Mode_Tuntapfd: Dom_Text = New_Dom_Document.createTextNode( "Tuntapfd" ); break; case VM::Net_Mode_Tcplisten: Dom_Text = New_Dom_Document.createTextNode( "Tcplisten" ); break; case VM::Net_Mode_Tcpfd: Dom_Text = New_Dom_Document.createTextNode( "Tcpfd" ); break; case VM::Net_Mode_Tcpconnect: Dom_Text = New_Dom_Document.createTextNode( "Tcpconnect" ); break; case VM::Net_Mode_Multicast: Dom_Text = New_Dom_Document.createTextNode( "Multicast" ); break; case VM::Net_Mode_Multicastfd: Dom_Text = New_Dom_Document.createTextNode( "Multicastfd" ); break; default: Dom_Text = New_Dom_Document.createTextNode( "Dummy" ); break; } Sec_Element.appendChild( Dom_Text ); // Hostname Sec_Element = New_Dom_Document.createElement( "Hostname" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_Hostname() ); Sec_Element.appendChild( Dom_Text ); // IP Address Sec_Element = New_Dom_Document.createElement( "IP_Address" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_IP_Address() ); Sec_Element.appendChild( Dom_Text ); // MAC Address Sec_Element = New_Dom_Document.createElement( "MAC_Address" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_MAC_Address() ); Sec_Element.appendChild( Dom_Text ); // Port Sec_Element = New_Dom_Document.createElement( "Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards[nx].Get_Port()) ); Sec_Element.appendChild( Dom_Text ); // VLAN Sec_Element = New_Dom_Document.createElement( "VLAN" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards[nx].Get_VLAN()) ); Sec_Element.appendChild( Dom_Text ); // Use TUN TAP Script Sec_Element = New_Dom_Document.createElement( "Use_TUN_TAP_Script" ); Dom_Element.appendChild( Sec_Element ); if( Network_Cards[nx].Get_Use_TUN_TAP_Script() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // TUN TAP Script Sec_Element = New_Dom_Document.createElement( "TUN_TAP_Script" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_TUN_TAP_Script() ); Sec_Element.appendChild( Dom_Text ); // Interface Name Sec_Element = New_Dom_Document.createElement( "Interface_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards[nx].Get_Interface_Name() ); Sec_Element.appendChild( Dom_Text ); // File Descriptor Sec_Element = New_Dom_Document.createElement( "File_Descriptor" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards[nx].Get_File_Descriptor()) ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // Use Nativ_Network Dom_Element = New_Dom_Document.createElement( "Nativ_Network" ); VM_Element.appendChild( Dom_Element ); if( Nativ_Network ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Nativ Network Card // Network Cards Count Dom_Element = New_Dom_Document.createElement( "Network_Cards_Nativ_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ.count()) ); Dom_Element.appendChild( Dom_Text ); for( int nx = 0; nx < Network_Cards_Nativ.count(); nx++ ) { Dom_Element = New_Dom_Document.createElement( "Network_Card_Nativ_" + QString::number(nx) ); Sec_Element = New_Dom_Document.createElement( "Network_Type" ); Dom_Element.appendChild( Sec_Element ); switch( Network_Cards_Nativ[nx].Get_Network_Type() ) { case VM::Net_Mode_Nativ_NIC: Dom_Text = New_Dom_Document.createTextNode( "NIC" ); break; case VM::Net_Mode_Nativ_User: Dom_Text = New_Dom_Document.createTextNode( "User" ); break; case VM::Net_Mode_Nativ_Chanel: Dom_Text = New_Dom_Document.createTextNode( "Chanel" ); break; case VM::Net_Mode_Nativ_TAP: Dom_Text = New_Dom_Document.createTextNode( "TAP" ); break; case VM::Net_Mode_Nativ_Socket: Dom_Text = New_Dom_Document.createTextNode( "Socket" ); break; case VM::Net_Mode_Nativ_MulticastSocket: Dom_Text = New_Dom_Document.createTextNode( "MulticastSocket" ); break; case VM::Net_Mode_Nativ_VDE: Dom_Text = New_Dom_Document.createTextNode( "VDE" ); break; case VM::Net_Mode_Nativ_Dump: Dom_Text = New_Dom_Document.createTextNode( "Dump" ); break; default: AQWarning( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "Invalid Network Type. Use Default: User" ); Dom_Text = New_Dom_Document.createTextNode( "User" ); break; } Sec_Element.appendChild( Dom_Text ); // Card_Model Sec_Element = New_Dom_Document.createElement( "Card_Model" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Card_Model() ); Sec_Element.appendChild( Dom_Text ); // MAC_Address Sec_Element = New_Dom_Document.createElement( "Use_MAC_Address" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_MAC_Address() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "MAC_Address" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_MAC_Address() ); Sec_Element.appendChild( Dom_Text ); // VLAN Sec_Element = New_Dom_Document.createElement( "Use_VLAN" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_VLAN() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "VLAN" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_VLAN()) ); Sec_Element.appendChild( Dom_Text ); // Name Sec_Element = New_Dom_Document.createElement( "Use_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Name() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Name() ); Sec_Element.appendChild( Dom_Text ); // Hostname Sec_Element = New_Dom_Document.createElement( "Use_Hostname" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Hostname() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Hostname" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Hostname() ); Sec_Element.appendChild( Dom_Text ); // PortDev Sec_Element = New_Dom_Document.createElement( "PortDev" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_PortDev() ); Sec_Element.appendChild( Dom_Text ); // File_Descriptor Sec_Element = New_Dom_Document.createElement( "Use_File_Descriptor" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_File_Descriptor() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "File_Descriptor" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_File_Descriptor()) ); Sec_Element.appendChild( Dom_Text ); // Interface_Name Sec_Element = New_Dom_Document.createElement( "Use_Interface_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Interface_Name() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Interface_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Interface_Name() ); Sec_Element.appendChild( Dom_Text ); // TUN_TAP_Script Sec_Element = New_Dom_Document.createElement( "Use_TUN_TAP_Script" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_TUN_TAP_Script() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "TUN_TAP_Script" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_TUN_TAP_Script() ); Sec_Element.appendChild( Dom_Text ); // TUN_TAP_Down_Script Sec_Element = New_Dom_Document.createElement( "Use_TUN_TAP_Down_Script" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_TUN_TAP_Down_Script() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "TUN_TAP_Down_Script" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_TUN_TAP_Down_Script() ); Sec_Element.appendChild( Dom_Text ); // Listen Sec_Element = New_Dom_Document.createElement( "Use_Listen" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Listen() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Listen" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Listen() ); Sec_Element.appendChild( Dom_Text ); // Connect Sec_Element = New_Dom_Document.createElement( "Use_Connect" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Connect() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Connect" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Connect() ); Sec_Element.appendChild( Dom_Text ); // MCast Sec_Element = New_Dom_Document.createElement( "Use_MCast" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_MCast() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "MCast" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_MCast() ); Sec_Element.appendChild( Dom_Text ); // Sock Sec_Element = New_Dom_Document.createElement( "Use_Sock" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Sock() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Sock" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Sock() ); Sec_Element.appendChild( Dom_Text ); // Port Sec_Element = New_Dom_Document.createElement( "Use_Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Port() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_Port()) ); Sec_Element.appendChild( Dom_Text ); // Group Sec_Element = New_Dom_Document.createElement( "Use_Group" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Group() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Group" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Group() ); Sec_Element.appendChild( Dom_Text ); // Mode Sec_Element = New_Dom_Document.createElement( "Use_Mode" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Mode() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Mode" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Mode() ); Sec_Element.appendChild( Dom_Text ); // File Sec_Element = New_Dom_Document.createElement( "Use_File" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_File() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "File" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_File() ); Sec_Element.appendChild( Dom_Text ); // Len Sec_Element = New_Dom_Document.createElement( "Use_Len" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Len() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Len" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_Len()) ); Sec_Element.appendChild( Dom_Text ); // Addr Sec_Element = New_Dom_Document.createElement( "Use_Addr" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Addr() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Addr" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Addr() ); Sec_Element.appendChild( Dom_Text ); // Vectors Sec_Element = New_Dom_Document.createElement( "Use_Vectors" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Vectors() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Vectors" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_Vectors()) ); Sec_Element.appendChild( Dom_Text ); // Net Sec_Element = New_Dom_Document.createElement( "Use_Net" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Net() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Net" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Net() ); Sec_Element.appendChild( Dom_Text ); // Host Sec_Element = New_Dom_Document.createElement( "Use_Host" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Host() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Host" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Host() ); Sec_Element.appendChild( Dom_Text ); // Restrict Sec_Element = New_Dom_Document.createElement( "Use_Restrict" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Restrict() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Restrict" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Restrict() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); // DHCPstart Sec_Element = New_Dom_Document.createElement( "Use_DHCPstart" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_DHCPstart() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "DHCPstart" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_DHCPstart() ); Sec_Element.appendChild( Dom_Text ); // DNS Sec_Element = New_Dom_Document.createElement( "Use_DNS" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_DNS() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "DNS" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_DNS() ); Sec_Element.appendChild( Dom_Text ); // Tftp Sec_Element = New_Dom_Document.createElement( "Use_Tftp" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Tftp() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Tftp" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Tftp() ); Sec_Element.appendChild( Dom_Text ); // Bootfile Sec_Element = New_Dom_Document.createElement( "Use_Bootfile" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Bootfile() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Bootfile" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_Bootfile() ); Sec_Element.appendChild( Dom_Text ); // HostFwd Sec_Element = New_Dom_Document.createElement( "Use_HostFwd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_HostFwd() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "HostFwd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_HostFwd() ); Sec_Element.appendChild( Dom_Text ); // GuestFwd Sec_Element = New_Dom_Document.createElement( "Use_GuestFwd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_GuestFwd() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "GuestFwd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_GuestFwd() ); Sec_Element.appendChild( Dom_Text ); // SMB Sec_Element = New_Dom_Document.createElement( "Use_SMB" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_SMB() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "SMB" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_SMB() ); Sec_Element.appendChild( Dom_Text ); // SMBserver Sec_Element = New_Dom_Document.createElement( "Use_SMBserver" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_SMBserver() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "SMBserver" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_SMBserver() ); Sec_Element.appendChild( Dom_Text ); // Sndbuf Sec_Element = New_Dom_Document.createElement( "Use_Sndbuf" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_Sndbuf() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "Sndbuf" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_Sndbuf()) ); Sec_Element.appendChild( Dom_Text ); // VNet_hdr Sec_Element = New_Dom_Document.createElement( "Use_VNet_hdr" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_VNet_hdr() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "VNet_hdr" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_VNet_hdr() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); // VHost Sec_Element = New_Dom_Document.createElement( "Use_VHost" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_VHost() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "VHost" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Get_VHost() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); // VHostFd Sec_Element = New_Dom_Document.createElement( "Use_VHostFd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Cards_Nativ[nx].Use_VHostFd() ? "yes" : "no" ); Sec_Element.appendChild( Dom_Text ); Sec_Element = New_Dom_Document.createElement( "VHostFd" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Cards_Nativ[nx].Get_VHostFd()) ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // Redirections count Dom_Element = New_Dom_Document.createElement( "Redirections_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Redirections.count()) ); Dom_Element.appendChild( Dom_Text ); // Network Redirections for( int rx = 0; rx < Network_Redirections.count(); rx++ ) { Dom_Element = New_Dom_Document.createElement( "Network_Redirections_" + QString::number(rx) ); // Protocol Sec_Element = New_Dom_Document.createElement( "Protocol" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Redirections[rx].Get_Protocol() ); Sec_Element.appendChild( Dom_Text ); // Host Port Sec_Element = New_Dom_Document.createElement( "Host_Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Redirections[rx].Get_Host_Port()) ); Sec_Element.appendChild( Dom_Text ); // Guest IP Sec_Element = New_Dom_Document.createElement( "Guest_IP" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Network_Redirections[rx].Get_Guest_IP() ); Sec_Element.appendChild( Dom_Text ); // Guest Port Sec_Element = New_Dom_Document.createElement( "Guest_Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Network_Redirections[rx].Get_Guest_Port()) ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // TFTP Prefix Dom_Element = New_Dom_Document.createElement( "TFTP_Prefix" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( TFTP_Prefix ); Dom_Element.appendChild( Dom_Text ); // SMB Directory Dom_Element = New_Dom_Document.createElement( "SMB_Directory" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( SMB_Directory ); Dom_Element.appendChild( Dom_Text ); } if( template_mode && ! (Template_Opts & Create_Template_Window::Template_Save_Ports) ) { // Serial Port Dom_Element = New_Dom_Document.createElement( "Serial_Ports_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); // Parallel Port Dom_Element = New_Dom_Document.createElement( "Parallel_Ports_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); // USB Ports Dom_Element = New_Dom_Document.createElement( "USB_Ports_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(0) ); Dom_Element.appendChild( Dom_Text ); } else { // Serial Port Dom_Element = New_Dom_Document.createElement( "Serial_Port_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Serial_Ports.count()) ); Dom_Element.appendChild( Dom_Text ); for( int px = 0; px < Serial_Ports.count(); px++ ) { Dom_Element = New_Dom_Document.createElement( "Serial_Port_" + QString::number(px) ); // Port Redirection Sec_Element = New_Dom_Document.createElement( "Port_Redirection" ); Dom_Element.appendChild( Sec_Element ); switch( Serial_Ports[px].Get_Port_Redirection() ) { case VM::PR_vc: Dom_Text = New_Dom_Document.createTextNode( "vc" ); break; case VM::PR_pty: Dom_Text = New_Dom_Document.createTextNode( "pty" ); break; case VM::PR_none: Dom_Text = New_Dom_Document.createTextNode( "none" ); break; case VM::PR_null: Dom_Text = New_Dom_Document.createTextNode( "null" ); break; case VM::PR_dev: Dom_Text = New_Dom_Document.createTextNode( "dev" ); break; case VM::PR_file: Dom_Text = New_Dom_Document.createTextNode( "file" ); break; case VM::PR_stdio: Dom_Text = New_Dom_Document.createTextNode( "stdio" ); break; case VM::PR_pipe: Dom_Text = New_Dom_Document.createTextNode( "pipe" ); break; case VM::PR_udp: Dom_Text = New_Dom_Document.createTextNode( "udp" ); break; case VM::PR_tcp: Dom_Text = New_Dom_Document.createTextNode( "tcp" ); break; case VM::PR_telnet: Dom_Text = New_Dom_Document.createTextNode( "telnet" ); break; case VM::PR_unix: Dom_Text = New_Dom_Document.createTextNode( "unix" ); break; case VM::PR_com: Dom_Text = New_Dom_Document.createTextNode( "com" ); break; case VM::PR_msmouse: Dom_Text = New_Dom_Document.createTextNode( "msmouse" ); break; case VM::PR_mon: Dom_Text = New_Dom_Document.createTextNode( "mon" ); break; case VM::PR_braille: Dom_Text = New_Dom_Document.createTextNode( "braille" ); break; default: Dom_Text = New_Dom_Document.createTextNode( "Default" ); break; } Sec_Element.appendChild( Dom_Text ); // Parametrs Line Sec_Element = New_Dom_Document.createElement( "Parametrs" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Serial_Ports[px].Get_Parametrs_Line() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // Parallel Port Dom_Element = New_Dom_Document.createElement( "Parallel_Port_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Parallel_Ports.count()) ); Dom_Element.appendChild( Dom_Text ); for( int px = 0; px < Parallel_Ports.count(); px++ ) { Dom_Element = New_Dom_Document.createElement( "Parallel_Port_" + QString::number(px) ); // Port Redirection Sec_Element = New_Dom_Document.createElement( "Port_Redirection" ); Dom_Element.appendChild( Sec_Element ); switch( Parallel_Ports[px].Get_Port_Redirection() ) { case VM::PR_vc: Dom_Text = New_Dom_Document.createTextNode( "vc" ); break; case VM::PR_pty: Dom_Text = New_Dom_Document.createTextNode( "pty" ); break; case VM::PR_none: Dom_Text = New_Dom_Document.createTextNode( "none" ); break; case VM::PR_null: Dom_Text = New_Dom_Document.createTextNode( "null" ); break; case VM::PR_dev: Dom_Text = New_Dom_Document.createTextNode( "dev" ); break; case VM::PR_file: Dom_Text = New_Dom_Document.createTextNode( "file" ); break; case VM::PR_stdio: Dom_Text = New_Dom_Document.createTextNode( "stdio" ); break; case VM::PR_pipe: Dom_Text = New_Dom_Document.createTextNode( "pipe" ); break; case VM::PR_udp: Dom_Text = New_Dom_Document.createTextNode( "udp" ); break; case VM::PR_tcp: Dom_Text = New_Dom_Document.createTextNode( "tcp" ); break; case VM::PR_telnet: Dom_Text = New_Dom_Document.createTextNode( "telnet" ); break; case VM::PR_unix: Dom_Text = New_Dom_Document.createTextNode( "unix" ); break; case VM::PR_com: Dom_Text = New_Dom_Document.createTextNode( "com" ); break; case VM::PR_msmouse: Dom_Text = New_Dom_Document.createTextNode( "msmouse" ); break; case VM::PR_mon: Dom_Text = New_Dom_Document.createTextNode( "mon" ); break; case VM::PR_braille: Dom_Text = New_Dom_Document.createTextNode( "braille" ); break; default: Dom_Text = New_Dom_Document.createTextNode( "Default" ); break; } Sec_Element.appendChild( Dom_Text ); // Parametrs Line Sec_Element = New_Dom_Document.createElement( "Parametrs" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( Parallel_Ports[px].Get_Parametrs_Line() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); } // USB Ports Dom_Element = New_Dom_Document.createElement( "USB_Ports_Count" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(USB_Ports.count()) ); Dom_Element.appendChild( Dom_Text ); // USB Devices for( int ux = 0; ux < USB_Ports.count(); ++ux ) { Dom_Element = New_Dom_Document.createElement( "USB_Port_" + QString::number(ux) ); // Use Host Device Sec_Element = New_Dom_Document.createElement( "Use_Host_Device" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Use_Host_Device() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Manufacturer Name Sec_Element = New_Dom_Document.createElement( "Manufacturer_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Manufacturer_Name() ); Sec_Element.appendChild( Dom_Text ); // Product Name Sec_Element = New_Dom_Document.createElement( "Product_Name" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Product_Name() ); Sec_Element.appendChild( Dom_Text ); // Vendor_ID Sec_Element = New_Dom_Document.createElement( "Vendor_ID" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Vendor_ID() ); Sec_Element.appendChild( Dom_Text ); // Product_ID Sec_Element = New_Dom_Document.createElement( "Product_ID" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Product_ID() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Bus Sec_Element = New_Dom_Document.createElement( "Bus" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Bus() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Addr Sec_Element = New_Dom_Document.createElement( "Addr" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Addr() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Path Sec_Element = New_Dom_Document.createElement( "Path" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_DevPath() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Serial Number Sec_Element = New_Dom_Document.createElement( "Serial_Number" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Serial_Number() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Speed Sec_Element = New_Dom_Document.createElement( "Speed" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( USB_Ports[ux].Get_Speed() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // QEMU USB Devices bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; USB_Ports[ux].Get_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); // Keyboard Dom_Element = New_Dom_Document.createElement( "USB_Keyboard" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( usb_k ? "true" : "false" ); Dom_Element.appendChild( Dom_Text ); // Mouse Dom_Element = New_Dom_Document.createElement( "USB_Mouse" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( usb_m ? "true" : "false" ); Dom_Element.appendChild( Dom_Text ); // Tablet Dom_Element = New_Dom_Document.createElement( "USB_Tablet" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( usb_t ? "true" : "false" ); Dom_Element.appendChild( Dom_Text ); // Wacom Tablet Dom_Element = New_Dom_Document.createElement( "USB_WacomTablet" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( usb_wt ? "true" : "false" ); Dom_Element.appendChild( Dom_Text ); // Braille Dom_Element = New_Dom_Document.createElement( "USB_Braille" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( usb_b ? "true" : "false" ); Dom_Element.appendChild( Dom_Text ); } } // Linux Boot Dom_Element = New_Dom_Document.createElement( "Linux_Boot" ); VM_Element.appendChild( Dom_Element ); if( Linux_Boot ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // bzImage Path Dom_Element = New_Dom_Document.createElement( "bzImage_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( bzImage_Path ); Dom_Element.appendChild( Dom_Text ); // Initrd Path Dom_Element = New_Dom_Document.createElement( "Initrd_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Initrd_Path ); Dom_Element.appendChild( Dom_Text ); // Kernel Command Line Arguments Dom_Element = New_Dom_Document.createElement( "Kernel_ComLine" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Kernel_ComLine ); Dom_Element.appendChild( Dom_Text ); // Use ROM File Dom_Element = New_Dom_Document.createElement( "Use_ROM_File" ); VM_Element.appendChild( Dom_Element ); if( Use_ROM_File ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // ROM File Path Dom_Element = New_Dom_Document.createElement( "ROM_File" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( ROM_File ); Dom_Element.appendChild( Dom_Text ); // Use MTDBlock File Dom_Element = New_Dom_Document.createElement( "Use_MTDBlock_File" ); VM_Element.appendChild( Dom_Element ); if( MTDBlock ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // MTDBlock File Dom_Element = New_Dom_Document.createElement( "MTDBlock_File" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( MTDBlock_File ); Dom_Element.appendChild( Dom_Text ); // Use SecureDigital File Dom_Element = New_Dom_Document.createElement( "Use_SecureDigital_File" ); VM_Element.appendChild( Dom_Element ); if( SecureDigital ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // SecureDigital File Dom_Element = New_Dom_Document.createElement( "SecureDigital_File" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( SecureDigital_File ); Dom_Element.appendChild( Dom_Text ); // Use PFlash File Dom_Element = New_Dom_Document.createElement( "Use_PFlash_File" ); VM_Element.appendChild( Dom_Element ); if( PFlash ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // PFlash File Dom_Element = New_Dom_Document.createElement( "PFlash_File" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( PFlash_File ); Dom_Element.appendChild( Dom_Text ); // Additional Arguments Dom_Element = New_Dom_Document.createElement( "Additional_Args" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Additional_Args ); Dom_Element.appendChild( Dom_Text ); // Only_User_Args Dom_Element = New_Dom_Document.createElement( "Only_User_Args" ); VM_Element.appendChild( Dom_Element ); if( Only_User_Args ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use_User_Emulator_Binary Dom_Element = New_Dom_Document.createElement( "Use_User_Emulator_Binary" ); VM_Element.appendChild( Dom_Element ); if( Use_User_Emulator_Binary ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Enable KVM Dom_Element = New_Dom_Document.createElement( "Enable_KVM" ); VM_Element.appendChild( Dom_Element ); if( Enable_KVM ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use KVM IRQChip Dom_Element = New_Dom_Document.createElement( "Use_KVM_IRQChip" ); VM_Element.appendChild( Dom_Element ); if( KVM_IRQChip ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use No KVM Pit Dom_Element = New_Dom_Document.createElement( "Use_No_KVM_Pit" ); VM_Element.appendChild( Dom_Element ); if( No_KVM_Pit ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // KVM_Nesting Dom_Element = New_Dom_Document.createElement( "Use_KVM_Nesting" ); VM_Element.appendChild( Dom_Element ); if( KVM_Nesting ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // KVM_No_Pit_Reinjection Dom_Element = New_Dom_Document.createElement( "Use_KVM_No_Pit_Reinjection" ); VM_Element.appendChild( Dom_Element ); if( KVM_No_Pit_Reinjection ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use_KVM_Shadow_Memory Dom_Element = New_Dom_Document.createElement( "Use_KVM_Shadow_Memory" ); VM_Element.appendChild( Dom_Element ); if( KVM_Shadow_Memory ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // KVM_Shadow_Memory_Size Dom_Element = New_Dom_Document.createElement( "KVM_Shadow_Memory_Size" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(KVM_Shadow_Memory_Size) ); Dom_Element.appendChild( Dom_Text ); // Init_Graphic_Mode Dom_Element = New_Dom_Document.createElement( "Init_Graphic_Mode" ); // Enabled Sec_Element = New_Dom_Document.createElement( "Enabled" ); Dom_Element.appendChild( Sec_Element ); if( Init_Graphic_Mode.Get_Enabled() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Width Sec_Element = New_Dom_Document.createElement( "Width" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Init_Graphic_Mode.Get_Width()) ); Sec_Element.appendChild( Dom_Text ); // Height Sec_Element = New_Dom_Document.createElement( "Height" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Init_Graphic_Mode.Get_Height()) ); Sec_Element.appendChild( Dom_Text ); // Depth Sec_Element = New_Dom_Document.createElement( "Depth" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(Init_Graphic_Mode.Get_Depth()) ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Use No Frame Dom_Element = New_Dom_Document.createElement( "Use_No_Frame" ); VM_Element.appendChild( Dom_Element ); if( No_Frame ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Alt Grab Dom_Element = New_Dom_Document.createElement( "Use_Alt_Grab" ); VM_Element.appendChild( Dom_Element ); if( Alt_Grab ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use No Quit Dom_Element = New_Dom_Document.createElement( "Use_No_Quit" ); VM_Element.appendChild( Dom_Element ); if( No_Quit ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Portrait Dom_Element = New_Dom_Document.createElement( "Use_Portrait" ); VM_Element.appendChild( Dom_Element ); if( Portrait ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Show_Cursor Dom_Element = New_Dom_Document.createElement( "Show_Cursor" ); VM_Element.appendChild( Dom_Element ); if( Show_Cursor ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use Curses Dom_Element = New_Dom_Document.createElement( "Curses" ); VM_Element.appendChild( Dom_Element ); if( Curses ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Use RTC_TD_Hack Dom_Element = New_Dom_Document.createElement( "RTC_TD_Hack" ); VM_Element.appendChild( Dom_Element ); if( RTC_TD_Hack ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Start Date Dom_Element = New_Dom_Document.createElement( "Use_Start_Date" ); VM_Element.appendChild( Dom_Element ); if( Start_Date ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Dom_Element.appendChild( Dom_Text ); // Start_DateTime Dom_Element = New_Dom_Document.createElement( "Start_Date" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( Start_DateTime.toString("dd.MM.yyyy HH:mm:ss") ); Dom_Element.appendChild( Dom_Text ); // SPICE Dom_Element = New_Dom_Document.createElement( "SPICE" ); // Use SPICE Sec_Element = New_Dom_Document.createElement( "Use_SPICE" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_SPICE() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // GXL_Devices_Count Sec_Element = New_Dom_Document.createElement( "GXL_Devices_Count" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SPICE.Get_GXL_Devices_Count()) ); Sec_Element.appendChild( Dom_Text ); // RAM_Size Sec_Element = New_Dom_Document.createElement( "RAM_Size" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SPICE.Get_RAM_Size()) ); Sec_Element.appendChild( Dom_Text ); // Port Sec_Element = New_Dom_Document.createElement( "Port" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SPICE.Get_Port()) ); Sec_Element.appendChild( Dom_Text ); // Use_SPort Sec_Element = New_Dom_Document.createElement( "Use_SPort" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_SPort() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // SPort Sec_Element = New_Dom_Document.createElement( "SPort" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(SPICE.Get_SPort()) ); Sec_Element.appendChild( Dom_Text ); // Use_Hostname Sec_Element = New_Dom_Document.createElement( "Use_Hostname" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Hostname() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Hostname Sec_Element = New_Dom_Document.createElement( "Hostname" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Get_Hostname() ); Sec_Element.appendChild( Dom_Text ); // Use_Image_Compression Sec_Element = New_Dom_Document.createElement( "Use_Image_Compression" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Image_Compression() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Image_Compression_Type Sec_Element = New_Dom_Document.createElement( "Image_Compression_Type" ); Dom_Element.appendChild( Sec_Element ); switch( SPICE.Get_Image_Compression() ) { case VM::SPICE_IC_Type_on: Dom_Text = New_Dom_Document.createTextNode( "on" ); break; case VM::SPICE_IC_Type_auto_glz: Dom_Text = New_Dom_Document.createTextNode( "auto_glz" ); break; case VM::SPICE_IC_Type_auto_lz: Dom_Text = New_Dom_Document.createTextNode( "auto_lz" ); break; case VM::SPICE_IC_Type_quic: Dom_Text = New_Dom_Document.createTextNode( "quic" ); break; case VM::SPICE_IC_Type_glz: Dom_Text = New_Dom_Document.createTextNode( "glz" ); break; case VM::SPICE_IC_Type_lz: Dom_Text = New_Dom_Document.createTextNode( "lz" ); break; case VM::SPICE_IC_Type_off: Dom_Text = New_Dom_Document.createTextNode( "off" ); break; default: AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "SPICE image compression type invalid!" ); Dom_Text = New_Dom_Document.createTextNode( "on" ); break; } Sec_Element.appendChild( Dom_Text ); // Use_Video_Stream_Compression Sec_Element = New_Dom_Document.createElement( "Use_Video_Stream_Compression" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Video_Stream_Compression() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Use_Renderer Sec_Element = New_Dom_Document.createElement( "Use_Renderer" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Renderer() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Renderers_List QDomElement rendererListElement = New_Dom_Document.createElement( "Renderers_List" ); for( int ix = 0; ix < SPICE.Get_Renderer_List().count(); ++ix ) { switch( SPICE.Get_Renderer_List()[ix] ) { case VM::SPICE_Renderer_oglpbuf: Sec_Element = New_Dom_Document.createElement( "oglpbuf" ); break; case VM::SPICE_Renderer_oglpixmap: Sec_Element = New_Dom_Document.createElement( "oglpixmap" ); break; case VM::SPICE_Renderer_cairo: Sec_Element = New_Dom_Document.createElement( "cairo" ); break; default: AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "SPICE renderer type invalid!" ); Sec_Element = New_Dom_Document.createElement( "cairo" ); break; } rendererListElement.appendChild( Sec_Element ); } Dom_Element.appendChild( rendererListElement ); // Use_Playback_Compression Sec_Element = New_Dom_Document.createElement( "Use_Playback_Compression" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Playback_Compression() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Use_Password Sec_Element = New_Dom_Document.createElement( "Use_Password" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Use_Password() ? "true" : "false" ); Sec_Element.appendChild( Dom_Text ); // Password Sec_Element = New_Dom_Document.createElement( "Password" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( SPICE.Get_Password() ); Sec_Element.appendChild( Dom_Text ); VM_Element.appendChild( Dom_Element ); // Use VNC Dom_Element = New_Dom_Document.createElement( "Use_VNC" ); VM_Element.appendChild( Dom_Element ); if( VNC ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // VNC Socket Mode Dom_Element = New_Dom_Document.createElement( "VNC_Socket_Mode" ); VM_Element.appendChild( Dom_Element ); if( VNC_Socket_Mode ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // VNC Unix Socket Path Dom_Element = New_Dom_Document.createElement( "VNC_Unix_Socket_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( VNC_Unix_Socket_Path ); Dom_Element.appendChild( Dom_Text ); // VNC Display Number Dom_Element = New_Dom_Document.createElement( "VNC_Display_Number" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(VNC_Display_Number) ); Dom_Element.appendChild( Dom_Text ); // Use VNC Password Dom_Element = New_Dom_Document.createElement( "Use_VNC_Password" ); VM_Element.appendChild( Dom_Element ); if( VNC_Password ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // Use VNC TLS Dom_Element = New_Dom_Document.createElement( "Use_VNC_TLS" ); VM_Element.appendChild( Dom_Element ); if( VNC_TLS ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // Use VNC x509 Dom_Element = New_Dom_Document.createElement( "Use_VNC_x509" ); VM_Element.appendChild( Dom_Element ); if( VNC_x509 ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // VNC x509 Folder Path Dom_Element = New_Dom_Document.createElement( "VNC_x509_Folder_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( VNC_x509_Folder_Path ); Dom_Element.appendChild( Dom_Text ); // Use VNC x509verify Dom_Element = New_Dom_Document.createElement( "Use_VNC_x509verify" ); VM_Element.appendChild( Dom_Element ); if( VNC_x509verify ) { Dom_Text = New_Dom_Document.createTextNode( "true" ); } else { Dom_Text = New_Dom_Document.createTextNode( "false" ); } Dom_Element.appendChild( Dom_Text ); // VNC x509verify Folder Path Dom_Element = New_Dom_Document.createElement( "VNC_x509verify_Folder_Path" ); VM_Element.appendChild( Dom_Element ); Dom_Text = New_Dom_Document.createTextNode( VNC_x509verify_Folder_Path ); Dom_Element.appendChild( Dom_Text ); // Create File and Save Data QFile VM_XML_File( file_name ); if( ! VM_XML_File.open(QFile::WriteOnly | QFile::Truncate) ) { AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", QString("Cannot Create New VM File \"%1\"").arg(file_name) ); return false; } QTextStream Out_Stream( &VM_XML_File ); New_Dom_Document.save( Out_Stream, 4 ); return true; } bool Virtual_Machine::Create_Template( const QString &vm_path, const QString &template_name, Create_Template_Window::Template_Options opts ) { Template_Name = template_name; Template_Opts = opts; return Create_VM_File( vm_path, true ); } bool Virtual_Machine::Load_VM( const QString &file_name ) { TXML2QDOM::QDomDocument VM_Dom_Document; // vm xml file VM_XML_File_Path = file_name; QFile VM_File( file_name ); if( ! VM_File.open(QFile::ReadOnly | QFile::Text) ) { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", QString("Cannot Read VM File \"%1\"! Error String: %2") .arg(file_name).arg(VM_File.errorString()) ); return false; } else { QString Error_String; int Error_Line, Error_Column; if( ! VM_Dom_Document.setContent(&VM_File, true, &Error_String, &Error_Line, &Error_Column) ) { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", QString("Parse Error!\nLine: %1\nColumn: %2\nString: %3" ) .arg(Error_Line).arg(Error_Column).arg(Error_String) ); return false; } else { QDomElement Root_Element = VM_Dom_Document.documentElement(); bool template_mode = false; if( Root_Element.tagName() != "AQEMU" ) { if( Root_Element.tagName() != "AQEMU_Template" ) { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "This is not a AQEMU VM File!" ); return false; } else { template_mode = true; } } // Read All Data in File QDomElement Child_Element = Root_Element.firstChildElement( "Virtual_Machine" ); bool load_emulator = true; bool old_version_storage_devices = false; bool load_boot_order_setcton = false; QString aqemu_vm_file_version = ""; if( Root_Element.hasAttribute("version") ) { aqemu_vm_file_version = Root_Element.attribute( "version" ); } if( aqemu_vm_file_version == "0.8" ) { AQDebug( "bool Virtual_Machine::Load_VM( const QString &file_name )", "This is AQEMU VM File Version 0.8!" ); load_boot_order_setcton = true; // for QEMU > 0.11 } else if( aqemu_vm_file_version == "0.7.2" ) { AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "This is AQEMU VM File Version 0.7.2!" ); old_version_storage_devices = true; } else if( aqemu_vm_file_version == "0.5" ) { AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Uses compatible mode for config version 0.5" ); Current_Emulator = Get_Default_Emulator( ); Current_Emulator.Set_Name( "" ); Machine_Accelerator = VM::TCG; // KVM ? if( Child_Element.firstChildElement("Computer_Type").text() == "qemu-kvm" ) { Machine_Accelerator = VM::KVM; } old_version_storage_devices = true; load_emulator = false; } else { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "This is AQEMU VM File Version Not Support!" ); int ret_but = QMessageBox::question( NULL, tr("Version Invalid!"), tr("Version of this AQEMU VM File isn't 0.5\nLoad This File anyway?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if( ret_but != QMessageBox::Yes ) return false; } if( template_mode ) { // Template Options Template_Opts = (Create_Template_Window::Template_Options)Child_Element.firstChildElement("Template_Options").text().toInt(); } if( load_emulator ) { // Emulator Name QString emul_name = Child_Element.firstChildElement("Emulator_Name").text(); // Emulator Type (legacy option) = equals Machine Name QString accel = ""; if( ! Child_Element.firstChildElement("Machine_Accelerator").text().isEmpty() ) { accel = Child_Element.firstChildElement("Machine_Accelerator").text(); } else { if ( ! Child_Element.firstChildElement("Emulator_Type").text().isEmpty() ) accel = Child_Element.firstChildElement("Emulator_Type").text(); } Machine_Accelerator = VM::String_To_Accel(accel); Current_Emulator = Get_Default_Emulator(); Current_Emulator.Set_Name( "" ); } // Computer Type Computer_Type = Child_Element.firstChildElement("Computer_Type").text(); if( Computer_Type == "qemu-system-x86" ) Computer_Type = "qemu-system-x86_64"; if( Computer_Type == "qemu-kvm" ) { Computer_Type = "qemu-system-x86_64"; Machine_Accelerator = VM::KVM; } // VM State if( Child_Element.firstChildElement("VM_State").text() == "Saved" ) { Set_State( VM::VMS_Saved ); } else { Set_State( VM::VMS_Power_Off ); } // Check Emulator AQDebug( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Emulator Name: " + Current_Emulator.Get_Name() ); // Emulator Found? /*if( Current_Emulator.Get_Name().isEmpty() && (Current_Emulator.Get_Version() == VM::Obsolete) ) { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Cannot Load Emulator!" ); Set_State( VM::VMS_In_Error ); } else {*/ Update_Current_Emulator_Devices(); /*}*/ // Icon Path Icon_Path = Child_Element.firstChildElement("Icon_Path").text(); if ( Icon_Path.startsWith(":/images/") ) //for compatibility with old .aqemu files { Icon_Path.replace(":/images/",":/"); } if ( ! Icon_Path.startsWith(":/") ) { //correct absolute paths saved by old versions QStringList dataDirs; dataDirs << "/usr/share/aqemu/" << "/usr/share/apps/aqemu/" << "/usr/local/share/aqemu/"; QSettings settings; bool abs_found = false; for ( int i = 0; i < dataDirs.count(); i++ ) { if ( Icon_Path.startsWith(dataDirs.at(i)) ) { Icon_Path.replace(dataDirs.at(i),settings.value( "AQEMU_Data_Folder","").toString()); abs_found = true; break; } } if ( ! abs_found ) { Icon_Path = settings.value( "AQEMU_Data_Folder","").toString() + Icon_Path; } } // Screenshot Path Screenshot_Path = Child_Element.firstChildElement("Screenshot_Path").text(); // Machine Name Machine_Name = Child_Element.firstChildElement("Machine_Name").text(); // Machine Type Machine_Type = Child_Element.firstChildElement("Machine_Type").text(); // CPU Type CPU_Type = Child_Element.firstChildElement("CPU_Type").text(); // SMP SMP.SMP_Count = Child_Element.firstChildElement("SMP_CPU_Count").text().toInt(); SMP.SMP_Cores = Child_Element.firstChildElement("SMP_Cores").text().toInt(); SMP.SMP_Threads = Child_Element.firstChildElement("SMP_Threads").text().toInt(); SMP.SMP_Sockets = Child_Element.firstChildElement("SMP_Sockets").text().toInt(); SMP.SMP_MaxCPUs = Child_Element.firstChildElement("SMP_MaxCPUs").text().toInt(); // Keyboard Layout Keyboard_Layout = Child_Element.firstChildElement("Keyboard_Layout").text(); QDomElement Second_Element; // Boot Device Boot_Order_List.clear(); if( load_boot_order_setcton && Child_Element.firstChildElement("Boot_Device").text().isEmpty() ) { int bootOrderCount = Child_Element.firstChildElement( "Boot_Device_Count" ).text().toInt(); if( bootOrderCount == 0 ) { VM::Boot_Order tmpBootOrder; tmpBootOrder.Enabled = true; tmpBootOrder.Type = VM::Boot_From_FDA; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = false; tmpBootOrder.Type = VM::Boot_From_FDB; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = true; tmpBootOrder.Type = VM::Boot_From_CDROM; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_HDD; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Enabled = false; tmpBootOrder.Type = VM::Boot_From_Network1; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network2; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network3; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network4; this->Boot_Order_List << tmpBootOrder; } for( int bx = 0; bx < bootOrderCount; bx++ ) { Second_Element = Child_Element.firstChildElement( "Boot_Device_" + QString::number(bx) ); VM::Boot_Order tmpBootDev; tmpBootDev.Enabled = Second_Element.firstChildElement( "Enabled" ).text() == "true"; QString bootType = Second_Element.firstChildElement( "Type" ).text(); if( bootType == "FDA" ) tmpBootDev.Type = VM::Boot_From_FDA; else if( bootType == "FDB" ) tmpBootDev.Type = VM::Boot_From_FDB; else if( bootType == "CDROM" ) tmpBootDev.Type = VM::Boot_From_CDROM; else if( bootType == "HDD" ) tmpBootDev.Type = VM::Boot_From_HDD; else if( bootType == "Network1" ) tmpBootDev.Type = VM::Boot_From_Network1; else if( bootType == "Network2" ) tmpBootDev.Type = VM::Boot_From_Network2; else if( bootType == "Network3" ) tmpBootDev.Type = VM::Boot_From_Network3; else if( bootType == "Network4" ) tmpBootDev.Type = VM::Boot_From_Network4; else { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Incorrect boot device type! Use default: CDROM" ); tmpBootDev.Type = VM::Boot_From_HDD; } Boot_Order_List << tmpBootDev; } } else { VM::Boot_Order tmpBootOrder; tmpBootOrder.Enabled = false; tmpBootOrder.Type = VM::Boot_From_FDA; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_FDB; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_CDROM; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_HDD; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network1; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network2; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network3; this->Boot_Order_List << tmpBootOrder; tmpBootOrder.Type = VM::Boot_From_Network4; this->Boot_Order_List << tmpBootOrder; QString tmp_str = Child_Element.firstChildElement("Boot_Device").text(); VM::Boot_Device bootDev; if( tmp_str == "FDD" ) bootDev = VM::Boot_From_FDA; else if( tmp_str == "CDROM" ) bootDev = VM::Boot_From_CDROM; else if( tmp_str == "HDD" ) bootDev = VM::Boot_From_HDD; else if( tmp_str == "Network" ) bootDev = VM::Boot_From_Network1; else if( tmp_str == "None" ) bootDev = VM::Boot_None; else { bootDev = VM::Boot_From_CDROM; AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Use Default Boot Device: CD-ROM" ); } for( int bx = 0; bx < Boot_Order_List.count(); bx++ ) { if( Boot_Order_List[bx].Type == bootDev ) Boot_Order_List[ bx ].Enabled = true; } } // Show Boot Menu Show_Boot_Menu = (Child_Element.firstChildElement("Show_Boot_Menu").text() == "true"); // Video Card Video_Card = Child_Element.firstChildElement("Video_Card").text(); // KQEMU Mode ( Acseleration ) QString tmp_str = Child_Element.firstChildElement("KQEMU_Mode").text(); if( tmp_str == "Enabled" ) { KQEMU_Mode = VM::KQEMU_Enabled; } else if( tmp_str == "Disabled" ) { KQEMU_Mode = VM::KQEMU_Disabled; } else if( tmp_str == "Full" ) { KQEMU_Mode = VM::KQEMU_Full; } else if( tmp_str == "Default" ) { KQEMU_Mode = VM::KQEMU_Default; } else { KQEMU_Mode = VM::KQEMU_Enabled; AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "KQEMU_Mode Invalid! Use Default!" ); } // Audio Cards Second_Element = Child_Element.firstChildElement( "Audio_Cards" ); VM::Sound_Cards snd_card; // Audio_sb16 snd_card.Audio_sb16 = Second_Element.firstChildElement("Audio_sb16").text() == "true"; // Audio_es1370 snd_card.Audio_es1370 = Second_Element.firstChildElement("Audio_es1370").text() == "true" ; // Audio_Adlib snd_card.Audio_Adlib = Second_Element.firstChildElement("Audio_Adlib").text() == "true"; // Audio_PC_Speaker snd_card.Audio_PC_Speaker = Second_Element.firstChildElement("Audio_PC_Speaker").text() == "true"; // Audio_GUS snd_card.Audio_GUS = Second_Element.firstChildElement("Audio_GUS").text() == "true"; // Audio_AC97 snd_card.Audio_AC97 = Second_Element.firstChildElement("Audio_AC97").text() == "true"; // Audio_HDA snd_card.Audio_HDA = Second_Element.firstChildElement("Audio_HDA").text() == "true"; // Audio_cs4231 snd_card.Audio_cs4231a = Second_Element.firstChildElement("Audio_cs4231a").text() == "true"; Set_Audio_Cards( snd_card ); // Check Free RAM Remove_RAM_Size_Limitation = (Child_Element.firstChildElement("Remove_RAM_Size_Limitation").text() == "true"); // Memory Size ( RAM ) Memory_Size = Child_Element.firstChildElement("Memory_Size").text().toInt(); // Fullscreen Fullscreen = (Child_Element.firstChildElement("Fullscreen").text() == "true"); // Win2K_Hack Win2K_Hack = (Child_Element.firstChildElement("Win2K_Hack").text() == "true"); // Localtime Local_Time = (Child_Element.firstChildElement("Local_Time").text() == "true"); // Check FDD Boot Sector Check_FDD_Boot_Sector = (Child_Element.firstChildElement("Check_FDD_Boot_Sector").text() == "true"); // ACPI ACPI = (Child_Element.firstChildElement("ACPI").text() == "true"); // Snapshot_Mode Snapshot_Mode = (Child_Element.firstChildElement("Snapshot_Mode").text() == "true"); // Start_CPU Start_CPU = (Child_Element.firstChildElement("Start_CPU").text() == "true"); // No_Reboot No_Reboot = (Child_Element.firstChildElement("No_Reboot").text() == "true"); // No_Shutdown No_Shutdown = (Child_Element.firstChildElement("No_Shutdown").text() == "true"); // Floppy and CD-ROM if( template_mode && Template_Opts ^ Create_Template_Window::Template_Save_FDD_CD ) { // Floppy 0 FD0 = VM_Storage_Device( false, "" ); // Floppy 1 FD1 = VM_Storage_Device( false, "" ); // CD-ROM CD_ROM = VM_Storage_Device( false, "" ); } else { if( old_version_storage_devices ) { // Floppy 0 FD0 = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "FD0" ); FD0.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); if( Second_Element.firstChildElement("Host_Device").text() == "true" ) FD0.Set_File_Name( Second_Element.firstChildElement("Host_File_Name").text() ); else FD0.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); // Floppy 1 FD1 = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "FD1" ); FD1.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); if( Second_Element.firstChildElement("Host_Device").text() == "true" ) FD1.Set_File_Name( Second_Element.firstChildElement("Host_File_Name").text() ); else FD1.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); // CD-ROM CD_ROM = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "CD_ROM" ); CD_ROM.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); if( Second_Element.firstChildElement("Host_Device").text() == "true" ) CD_ROM.Set_File_Name( Second_Element.firstChildElement("Host_File_Name").text() ); else CD_ROM.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); } else { // Floppy 0 FD0 = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "FD0" ); FD0.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); FD0.Set_File_Name( Second_Element.firstChildElement("File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); FD0.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // Floppy 1 FD1 = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "FD1" ); FD1.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); FD1.Set_File_Name( Second_Element.firstChildElement("File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); FD1.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // CD-ROM CD_ROM = VM_Storage_Device(); Second_Element = Child_Element.firstChildElement( "CD_ROM" ); CD_ROM.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); CD_ROM.Set_File_Name( Second_Element.firstChildElement("File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); CD_ROM.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); } } // Hard Disk's if( template_mode ) { if( Template_Opts | Create_Template_Window::Template_Save_HDD ) { // HDA Second_Element = Child_Element.firstChildElement( "HDA" ); HDA.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDA.Set_Virtual_Size( HDA.String_to_Device_Size(Second_Element.firstChildElement("Size").text()) ); HDA.Set_Image_Format( Second_Element.firstChildElement("Format").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDA.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDB Second_Element = Child_Element.firstChildElement( "HDB" ); HDB.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDB.Set_Virtual_Size( HDB.String_to_Device_Size(Second_Element.firstChildElement("Size").text()) ); HDB.Set_Image_Format( Second_Element.firstChildElement("Format").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDB.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDC Second_Element = Child_Element.firstChildElement( "HDC" ); HDC.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDC.Set_Virtual_Size( HDC.String_to_Device_Size(Second_Element.firstChildElement("Size").text()) ); HDC.Set_Image_Format( Second_Element.firstChildElement("Format").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDC.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDD Second_Element = Child_Element.firstChildElement( "HDD" ); HDD.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDD.Set_Virtual_Size( HDD.String_to_Device_Size(Second_Element.firstChildElement("Size").text()) ); HDD.Set_Image_Format( Second_Element.firstChildElement("Format").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDD.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); } else { // HDA Second_Element = Child_Element.firstChildElement( "HDA" ); HDA.Set_Enabled( false ); HDA.Set_File_Name( "" ); // HDB Second_Element = Child_Element.firstChildElement( "HDB" ); HDB.Set_Enabled( false ); HDB.Set_File_Name( "" ); // HDC Second_Element = Child_Element.firstChildElement( "HDC" ); HDC.Set_Enabled( false ); HDC.Set_File_Name( "" ); // HDD Second_Element = Child_Element.firstChildElement( "HDD" ); HDD.Set_Enabled( false ); HDD.Set_File_Name( "" ); } } else { // HDA Second_Element = Child_Element.firstChildElement( "HDA" ); HDA.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDA.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDA.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDB Second_Element = Child_Element.firstChildElement( "HDB" ); HDB.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDB.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDB.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDC Second_Element = Child_Element.firstChildElement( "HDC" ); HDC.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDC.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDC.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); // HDD Second_Element = Child_Element.firstChildElement( "HDD" ); HDD.Set_Enabled( (Second_Element.firstChildElement("Enabled").text() == "true") ); HDD.Set_File_Name( Second_Element.firstChildElement("Image_File_Name").text() ); Second_Element = Second_Element.firstChildElement( "Nativ_Device" ); HDD.Set_Nativ_Device( Load_VM_Nativ_Storage_Device(Second_Element) ); } // Nativ Storage Devices int Storage_Device_Count = Child_Element.firstChildElement( "Storage_Device_Count" ).text().toInt(); for( int sx = 0; sx < Storage_Device_Count; ++sx ) { Second_Element = Child_Element.firstChildElement( "Storage_Device_" + QString::number(sx) ); // Add Device Storage_Devices << Load_VM_Nativ_Storage_Device( Second_Element ); } // Shared Folders int Shared_Folder_Count = Child_Element.firstChildElement( "Shared_Folder_Count" ).text().toInt(); for( int sx = 0; sx < Shared_Folder_Count; ++sx ) { Second_Element = Child_Element.firstChildElement( "Shared_Folder_" + QString::number(sx) ); // Add Device Shared_Folders << Load_VM_Shared_Folder( Second_Element ); } // Snapshots int Snapshots_Count = Child_Element.firstChildElement( "Snapshots_Count" ).text().toInt(); for( int sx = 0; sx < Snapshots_Count; ++sx ) { Second_Element = Child_Element.firstChildElement( "Snapshot_" + QString::number(sx) ); VM_Snapshot tmp_snapshot; // Tag tmp_snapshot.Set_Tag( Second_Element.firstChildElement("Tag").text() ); // Name tmp_snapshot.Set_Name( Second_Element.firstChildElement("Name").text() ); // Description tmp_snapshot.Set_Description( Second_Element.firstChildElement("Description").text() ); // add snapshot Snapshots << tmp_snapshot; } // Use Network Use_Network = (Child_Element.firstChildElement("Use_Network").text() == "true"); // Use Redirections Use_Redirections = (Child_Element.firstChildElement("Use_Redirections").text() == "true"); // Network Cards Count int NetCardsCount = Child_Element.firstChildElement( "Network_Cards_Count" ).text().toInt(); Network_Cards.clear(); // Network Cards... for( int nx = 0; nx < NetCardsCount; nx++ ) { Second_Element = Child_Element.firstChildElement( "Network_Card_" + QString::number(nx) ); VM_Net_Card tmp_card; // Card Model tmp_card.Set_Card_Model( Second_Element.firstChildElement( "Card_Model" ).text() ); tmp_str = Second_Element.firstChildElement( "Network_Mode" ).text(); // Network Mode if( tmp_str == "None" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_None ); } else if( tmp_str == "Usermode" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Usermode ); } else if( tmp_str == "Tuntap" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Tuntap ); } else if( tmp_str == "Tuntapfd" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Tuntapfd ); } else if( tmp_str == "Tcplisten" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Tcplisten ); } else if( tmp_str == "Tcpfd" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Tcpfd ); } else if( tmp_str == "Tcpconnect" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Tcpconnect ); } else if( tmp_str == "Multicast" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Multicast ); } else if( tmp_str == "Multicastfd" ) { tmp_card.Set_Net_Mode( VM::Net_Mode_Multicastfd ); } else { tmp_card.Set_Net_Mode( VM::Net_Mode_Dummy ); AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Net Card Network Mode Invalid! Use Default!" ); } // Hostname tmp_card.Set_Hostname( Second_Element.firstChildElement("Hostname").text() ); // IP Address tmp_card.Set_IP_Address( Second_Element.firstChildElement("IP_Address").text() ); // MAC Address tmp_card.Set_MAC_Address( Second_Element.firstChildElement("MAC_Address").text() ); // Port tmp_card.Set_Port( Second_Element.firstChildElement("Port").text().toInt() ); // VLAN tmp_card.Set_VLAN( Second_Element.firstChildElement("VLAN").text().toInt() ); // Use TUN TAP Script tmp_card.Set_Use_TUN_TAP_Script( ! (Second_Element.firstChildElement("Use_TUN_TAP_Script").text() == "false") ); // TUN TAP Script tmp_card.Set_TUN_TAP_Script( Second_Element.firstChildElement("TUN_TAP_Script").text() ); // Interface Name tmp_card.Set_Interface_Name( Second_Element.firstChildElement("Interface_Name").text() ); // File Descriptor tmp_card.Set_File_Descriptor( Second_Element.firstChildElement("File_Descriptor").text().toInt() ); Add_Network_Card( tmp_card ); } // Nativ Network Card // Use Nativ_Network Nativ_Network = (Child_Element.firstChildElement("Nativ_Network").text() == "true"); // Network Cards Count int NetCardsNativCount = Child_Element.firstChildElement( "Network_Cards_Nativ_Count" ).text().toInt(); Network_Cards_Nativ.clear(); // Network Cards... for( int nx = 0; nx < NetCardsNativCount; nx++ ) { Second_Element = Child_Element.firstChildElement( "Network_Card_Nativ_" + QString::number(nx) ); VM_Net_Card_Nativ tmp_card; // Network_Type QString netCardNativ_Type = Second_Element.firstChildElement( "Network_Type" ).text(); if( netCardNativ_Type == "NIC" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_NIC ); else if( netCardNativ_Type == "User" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_User ); else if( netCardNativ_Type == "Chanel" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_Chanel ); else if( netCardNativ_Type == "TAP" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_TAP ); else if( netCardNativ_Type == "Socket" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_Socket ); else if( netCardNativ_Type == "MulticastSocket" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_MulticastSocket ); else if( netCardNativ_Type == "VDE" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_VDE ); else if( netCardNativ_Type == "Dump" ) tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_Dump ); else { AQWarning( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Invalid Network Type. Use Default: User" ); tmp_card.Set_Network_Type( VM::Net_Mode_Nativ_User ); } tmp_card.Set_Card_Model( Second_Element.firstChildElement("Card_Model").text() ); tmp_card.Use_MAC_Address( Second_Element.firstChildElement("Use_MAC_Address").text() == "yes" ); tmp_card.Set_MAC_Address( Second_Element.firstChildElement("MAC_Address").text() ); tmp_card.Use_VLAN( Second_Element.firstChildElement("Use_VLAN").text() == "yes" ); tmp_card.Set_VLAN( Second_Element.firstChildElement("VLAN").text().toInt() ); tmp_card.Use_Name( Second_Element.firstChildElement("Use_Name").text() == "yes" ); tmp_card.Set_Name( Second_Element.firstChildElement("Name").text() ); tmp_card.Use_Hostname( Second_Element.firstChildElement("Use_Hostname").text() == "yes" ); tmp_card.Set_Hostname( Second_Element.firstChildElement("Hostname").text() ); tmp_card.Set_PortDev( Second_Element.firstChildElement("PortDev").text() ); tmp_card.Use_File_Descriptor( Second_Element.firstChildElement("Use_File_Descriptor").text() == "yes" ); tmp_card.Set_File_Descriptor( Second_Element.firstChildElement("File_Descriptor").text().toInt() ); tmp_card.Use_Interface_Name( Second_Element.firstChildElement("Use_Interface_Name").text() == "yes" ); tmp_card.Set_Interface_Name( Second_Element.firstChildElement("Interface_Name").text() ); tmp_card.Use_TUN_TAP_Script( Second_Element.firstChildElement("Use_TUN_TAP_Script").text() == "yes" ); tmp_card.Set_TUN_TAP_Script( Second_Element.firstChildElement("TUN_TAP_Script").text() ); tmp_card.Use_TUN_TAP_Down_Script( Second_Element.firstChildElement("Use_TUN_TAP_Down_Script").text() == "yes" ); tmp_card.Set_TUN_TAP_Down_Script( Second_Element.firstChildElement("TUN_TAP_Down_Script").text() ); tmp_card.Use_Listen( Second_Element.firstChildElement("Use_Listen").text() == "yes" ); tmp_card.Set_Listen( Second_Element.firstChildElement("Listen").text() ); tmp_card. Use_Connect( Second_Element.firstChildElement("Use_Connect").text() == "yes" ); tmp_card.Set_Connect( Second_Element.firstChildElement("Connect").text() ); tmp_card.Use_MCast( Second_Element.firstChildElement("Use_MCast").text() == "yes" ); tmp_card.Set_MCast( Second_Element.firstChildElement("MCast").text() ); tmp_card.Use_Sock( Second_Element.firstChildElement("Use_Sock").text() == "yes" ); tmp_card.Set_Sock( Second_Element.firstChildElement("Sock").text() ); tmp_card.Use_Port( Second_Element.firstChildElement("Use_Port").text() == "yes" ); tmp_card.Set_Port( Second_Element.firstChildElement("Port").text().toInt() ); tmp_card.Use_Group( Second_Element.firstChildElement("Use_Group").text() == "yes" ); tmp_card.Set_Group( Second_Element.firstChildElement("Group").text() ); tmp_card.Use_Mode( Second_Element.firstChildElement("Use_Mode").text() == "yes" ); tmp_card.Set_Mode( Second_Element.firstChildElement("Mode").text() ); tmp_card.Use_File( Second_Element.firstChildElement("Use_File").text() == "yes" ); tmp_card.Set_File( Second_Element.firstChildElement("File").text() ); tmp_card.Use_Len( Second_Element.firstChildElement("Use_Len").text() == "yes" ); tmp_card.Set_Len( Second_Element.firstChildElement("Len").text().toInt() ); tmp_card.Use_Addr( Second_Element.firstChildElement("Use_Addr").text() == "yes" ); tmp_card.Set_Addr( Second_Element.firstChildElement("Addr").text() ); tmp_card.Use_Vectors( Second_Element.firstChildElement("Use_Vectors").text() == "yes" ); tmp_card.Set_Vectors( Second_Element.firstChildElement("Vectors").text().toInt() ); tmp_card.Use_Net( Second_Element.firstChildElement("Use_Net").text() == "yes" ); tmp_card.Set_Net( Second_Element.firstChildElement("Net").text() ); tmp_card.Use_Host( Second_Element.firstChildElement("Use_Host").text() == "yes" ); tmp_card.Set_Host( Second_Element.firstChildElement("Host").text() ); tmp_card.Use_Restrict( Second_Element.firstChildElement("Use_Restrict").text() == "yes" ); tmp_card.Set_Restrict( Second_Element.firstChildElement("Restrict").text() == "yes" ); tmp_card.Use_DHCPstart( Second_Element.firstChildElement("Use_DHCPstart").text() == "yes" ); tmp_card.Set_DHCPstart( Second_Element.firstChildElement("DHCPstart").text() ); tmp_card.Use_DNS( Second_Element.firstChildElement("Use_DNS").text() == "yes" ); tmp_card.Set_DNS( Second_Element.firstChildElement("DNS").text() ); tmp_card.Use_Tftp( Second_Element.firstChildElement("Use_Tftp").text() == "yes" ); tmp_card.Set_Tftp( Second_Element.firstChildElement("Tftp").text() ); tmp_card.Use_Bootfile( Second_Element.firstChildElement("Use_Bootfile").text() == "yes" ); tmp_card.Set_Bootfile( Second_Element.firstChildElement("Bootfile").text() ); tmp_card.Use_HostFwd( Second_Element.firstChildElement("Use_HostFwd").text() == "yes" ); tmp_card.Set_HostFwd( Second_Element.firstChildElement("HostFwd").text() ); tmp_card.Use_GuestFwd( Second_Element.firstChildElement("Use_GuestFwd").text() == "yes" ); tmp_card.Set_GuestFwd( Second_Element.firstChildElement("GuestFwd").text() ); tmp_card.Use_SMB( Second_Element.firstChildElement("Use_SMB").text() == "yes" ); tmp_card.Set_SMB( Second_Element.firstChildElement("SMB").text() ); tmp_card.Use_SMBserver( Second_Element.firstChildElement("Use_SMBserver").text() == "yes" ); tmp_card.Set_SMBserver( Second_Element.firstChildElement("SMBserver").text() ); tmp_card.Use_Sndbuf( Second_Element.firstChildElement("Use_Sndbuf").text() == "yes" ); tmp_card.Set_Sndbuf( Second_Element.firstChildElement("Sndbuf").text().toInt() ); tmp_card.Use_VNet_hdr( Second_Element.firstChildElement("Use_VNet_hdr").text() == "yes" ); tmp_card.Set_VNet_hdr( Second_Element.firstChildElement("VNet_hdr").text() == "yes" ); tmp_card.Use_VHost( Second_Element.firstChildElement("Use_VHost").text() == "yes" ); tmp_card.Set_VHost( Second_Element.firstChildElement("VHost").text() == "yes" ); tmp_card.Use_VHostFd( Second_Element.firstChildElement("Use_VHostFd").text() == "yes" ); tmp_card.Set_VHostFd( Second_Element.firstChildElement("VHostFd").text().toInt() ); Network_Cards_Nativ << tmp_card; } // Redirections count int RedirsCount = Child_Element.firstChildElement( "Redirections_Count" ).text().toInt(); // Network Redirections... for( int rx = 0; rx < RedirsCount; rx++ ) { Second_Element = Child_Element.firstChildElement( "Network_Redirections_" + QString::number(rx) ); VM_Redirection tmp_redir; tmp_redir.Set_Protocol( Second_Element.firstChildElement("Protocol").text() ); tmp_redir.Set_Host_Port( (Second_Element.firstChildElement("Host_Port").text().toInt()) ); tmp_redir.Set_Guest_IP( Second_Element.firstChildElement("Guest_IP").text() ); tmp_redir.Set_Guest_Port( Second_Element.firstChildElement("Guest_Port").text().toInt() ); Add_Network_Redirection( tmp_redir ); } // TFTP Prefix TFTP_Prefix = Child_Element.firstChildElement( "TFTP_Prefix" ).text(); // SMB Directory SMB_Directory = Child_Element.firstChildElement( "SMB_Directory" ).text(); // Serial Ports Count int serial_count = Child_Element.firstChildElement( "Serial_Port_Count" ).text().toInt(); // Serial Port for( int px = 0; px < serial_count; ++px ) { VM_Port tmp_port; Second_Element = Child_Element.firstChildElement( "Serial_Port_" + QString::number(px) ); tmp_str = Second_Element.firstChildElement( "Port_Redirection" ).text(); if( tmp_str == "vc" ) tmp_port.Set_Port_Redirection( VM::PR_vc ); else if( tmp_str == "pty" ) tmp_port.Set_Port_Redirection( VM::PR_pty ); else if( tmp_str == "none" ) tmp_port.Set_Port_Redirection( VM::PR_none ); else if( tmp_str == "null" ) tmp_port.Set_Port_Redirection( VM::PR_null ); else if( tmp_str == "dev" ) tmp_port.Set_Port_Redirection( VM::PR_dev ); else if( tmp_str == "file" ) tmp_port.Set_Port_Redirection( VM::PR_file ); else if( tmp_str == "stdio" ) tmp_port.Set_Port_Redirection( VM::PR_stdio ); else if( tmp_str == "pipe" ) tmp_port.Set_Port_Redirection( VM::PR_pipe ); else if( tmp_str == "udp" ) tmp_port.Set_Port_Redirection( VM::PR_udp ); else if( tmp_str == "tcp" ) tmp_port.Set_Port_Redirection( VM::PR_tcp ); else if( tmp_str == "telnet" ) tmp_port.Set_Port_Redirection( VM::PR_telnet ); else if( tmp_str == "unix" ) tmp_port.Set_Port_Redirection( VM::PR_unix ); else if( tmp_str == "com" ) tmp_port.Set_Port_Redirection( VM::PR_com ); else if( tmp_str == "msmouse" ) tmp_port.Set_Port_Redirection( VM::PR_msmouse ); else if( tmp_str == "mon" ) tmp_port.Set_Port_Redirection( VM::PR_mon ); else if( tmp_str == "braille" ) tmp_port.Set_Port_Redirection( VM::PR_braille ); else tmp_port.Set_Port_Redirection( VM::PR_Default ); // Parametrs Line tmp_port.Set_Parametrs_Line( Second_Element.firstChildElement("Parametrs").text() ); Serial_Ports << tmp_port; } // Parallel Ports Count int parallel_count = Child_Element.firstChildElement( "Parallel_Port_Count" ).text().toInt(); // Parallel Port for( int px = 0; px < parallel_count; ++px ) { VM_Port tmp_port; Second_Element = Child_Element.firstChildElement( "Parallel_Port_" + QString::number(px) ); tmp_str = Second_Element.firstChildElement( "Port_Redirection" ).text(); if( tmp_str == "vc" ) tmp_port.Set_Port_Redirection( VM::PR_vc ); else if( tmp_str == "pty" ) tmp_port.Set_Port_Redirection( VM::PR_pty ); else if( tmp_str == "none" ) tmp_port.Set_Port_Redirection( VM::PR_none ); else if( tmp_str == "null" ) tmp_port.Set_Port_Redirection( VM::PR_null ); else if( tmp_str == "dev" ) tmp_port.Set_Port_Redirection( VM::PR_dev ); else if( tmp_str == "file" ) tmp_port.Set_Port_Redirection( VM::PR_file ); else if( tmp_str == "stdio" ) tmp_port.Set_Port_Redirection( VM::PR_stdio ); else if( tmp_str == "pipe" ) tmp_port.Set_Port_Redirection( VM::PR_pipe ); else if( tmp_str == "udp" ) tmp_port.Set_Port_Redirection( VM::PR_udp ); else if( tmp_str == "tcp" ) tmp_port.Set_Port_Redirection( VM::PR_tcp ); else if( tmp_str == "telnet" ) tmp_port.Set_Port_Redirection( VM::PR_telnet ); else if( tmp_str == "unix" ) tmp_port.Set_Port_Redirection( VM::PR_unix ); else if( tmp_str == "com" ) tmp_port.Set_Port_Redirection( VM::PR_com ); else if( tmp_str == "msmouse" ) tmp_port.Set_Port_Redirection( VM::PR_msmouse ); else if( tmp_str == "mon" ) tmp_port.Set_Port_Redirection( VM::PR_mon ); else if( tmp_str == "braille" ) tmp_port.Set_Port_Redirection( VM::PR_braille ); else tmp_port.Set_Port_Redirection( VM::PR_Default ); // Parametrs Line tmp_port.Set_Parametrs_Line( Second_Element.firstChildElement("Parametrs").text() ); Parallel_Ports << tmp_port; } // USB Count int usb_count = Child_Element.firstChildElement( "USB_Ports_Count" ).text().toInt(); // USB Devices for( int ux = 0; ux < usb_count; ++ux ) { Second_Element = Child_Element.firstChildElement( "USB_Port_" + QString::number(ux) ); VM_USB tmp_usb; tmp_usb.Set_Use_Host_Device( Second_Element.firstChildElement("Use_Host_Device").text() == "true" ); tmp_usb.Set_Manufacturer_Name( Second_Element.firstChildElement("Manufacturer_Name").text() ); tmp_usb.Set_Product_Name( Second_Element.firstChildElement("Product_Name").text() ); tmp_usb.Set_Vendor_ID( Second_Element.firstChildElement("Vendor_ID").text() ); tmp_usb.Set_Product_ID( Second_Element.firstChildElement("Product_ID").text() ); tmp_usb.Set_Serial_Number( Second_Element.firstChildElement("Serial_Number").text() ); tmp_usb.Set_Speed( Second_Element.firstChildElement("Speed").text() ); // For AQEMU VM files version 0.8.2 and oldest if( ! Second_Element.firstChildElement("BusAddr").text().isEmpty() ) { QStringList busAddrList = Second_Element.firstChildElement("BusAddr").text().split( ':', QString::SkipEmptyParts ); if( busAddrList.count() != 2 ) { AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "Cannot parse obsolete USB Bus.Addr string! Data: " + Second_Element.firstChildElement("BusAddr").text() ); } else { tmp_usb.Set_Bus( busAddrList[0] ); tmp_usb.Set_Addr( busAddrList[1] ); } } else // AQEMU Version > 0.8.2 { tmp_usb.Set_Bus( Second_Element.firstChildElement("Bus").text() ); tmp_usb.Set_Addr( Second_Element.firstChildElement("Addr").text() ); tmp_usb.Set_DevPath( Second_Element.firstChildElement("Path").text() ); } // QEMU USB Devices bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; // Keyboard usb_k = (Child_Element.firstChildElement("USB_Keyboard").text() == "true" ); // Mouse usb_m = (Child_Element.firstChildElement("USB_Mouse").text() == "true" ); // Tablet usb_t = (Child_Element.firstChildElement("USB_Tablet").text() == "true" ); // Wacom Tablet usb_wt = (Child_Element.firstChildElement("USB_WacomTablet").text() == "true" ); // Braille usb_b = (Child_Element.firstChildElement("USB_Braille").text() == "true" ); // Set tmp_usb.Set_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); // Next code for compatibity old versions if( usb_k == false && usb_m == false && usb_t == false && usb_wt == false && usb_b == false ) tmp_usb.Set_Use_Host_Device( true ); // Add device USB_Ports << tmp_usb; } // Linux Boot Linux_Boot = (Child_Element.firstChildElement("Linux_Boot").text() == "true" ); // bzImage Path bzImage_Path = Child_Element.firstChildElement( "bzImage_Path" ).text(); // Initrd Path Initrd_Path = Child_Element.firstChildElement( "Initrd_Path" ).text(); // Kernel Command Line Arguments Kernel_ComLine = Child_Element.firstChildElement( "Kernel_ComLine" ).text(); // Use ROM File Use_ROM_File = (Child_Element.firstChildElement("Use_ROM_File").text() == "true"); // ROM File Path ROM_File = Child_Element.firstChildElement( "ROM_File" ).text(); // Use MTDBlock File MTDBlock = (Child_Element.firstChildElement("Use_MTDBlock_File").text() == "true" ); // MTDBlock File MTDBlock_File = Child_Element.firstChildElement( "MTDBlock_File" ).text(); // Use SecureDigital File SecureDigital = (Child_Element.firstChildElement("Use_SecureDigital_File").text() == "true" ); // SecureDigital File SecureDigital_File = Child_Element.firstChildElement( "SecureDigital_File" ).text(); // Use PFlash File PFlash = (Child_Element.firstChildElement("Use_PFlash_File").text() == "true" ); // PFlash File PFlash_File = Child_Element.firstChildElement( "PFlash_File" ).text(); // Enable KVM Enable_KVM = ! (Child_Element.firstChildElement("Enable_KVM").text() == "false" ); // Use KVM IRQChip KVM_IRQChip = (Child_Element.firstChildElement("Use_KVM_IRQChip").text() == "true" ); // Use No KVM Pit No_KVM_Pit = (Child_Element.firstChildElement("Use_No_KVM_Pit").text() == "true" ); // KVM_No_Pit_Reinjection KVM_No_Pit_Reinjection = (Child_Element.firstChildElement("Use_KVM_No_Pit_Reinjection").text() == "true" ); // Use_No_KVM_Pit KVM_Nesting = (Child_Element.firstChildElement("Use_KVM_Nesting").text() == "true" ); // Use KVM Shadow Memory KVM_Shadow_Memory = (Child_Element.firstChildElement("Use_KVM_Shadow_Memory").text() == "true" ); // KVM_Shadow_Memory_Size KVM_Shadow_Memory_Size = (uint)Child_Element.firstChildElement( "KVM_Shadow_Memory_Size" ).text().toInt(); // Init Graphic Mode Second_Element = Child_Element.firstChildElement( "Init_Graphic_Mode" ); // Enabled Init_Graphic_Mode.Set_Enabled( Second_Element.firstChildElement("Enabled").text() == "true" ); // Width Init_Graphic_Mode.Set_Width( Second_Element.firstChildElement("Width").text().toInt() ); // Height Init_Graphic_Mode.Set_Height( Second_Element.firstChildElement("Height").text().toInt() ); // Depth Init_Graphic_Mode.Set_Depth( Second_Element.firstChildElement("Depth").text().toInt() ); // Use No Frame No_Frame = (Child_Element.firstChildElement("Use_No_Frame").text() == "true" ); // Use Alt Grab Alt_Grab = (Child_Element.firstChildElement("Use_Alt_Grab").text() == "true" ); // Use No Quit No_Quit = (Child_Element.firstChildElement("Use_No_Quit").text() == "true"); // Use Portrait Portrait = (Child_Element.firstChildElement("Use_Portrait").text() == "true"); // Show_Cursor Show_Cursor = (Child_Element.firstChildElement("Show_Cursor").text() == "true"); // Curses Curses = (Child_Element.firstChildElement("Curses").text() == "true"); // RTC_TD_Hack RTC_TD_Hack = (Child_Element.firstChildElement("RTC_TD_Hack").text() == "true"); // Start Date Start_Date = (Child_Element.firstChildElement("Use_Start_Date").text() == "true"); // Start DateTime Start_DateTime = QDateTime::fromString( Child_Element.firstChildElement("Start_Date").text(), "dd.MM.yyyy HH:mm:ss" ); // SPICE Second_Element = Child_Element.firstChildElement( "SPICE" ); if( ! Second_Element.isNull() ) { bool ok = false; SPICE.Use_SPICE( Second_Element.firstChildElement("Use_SPICE").text() == "true" ); SPICE.Set_GXL_Devices_Count( Second_Element.firstChildElement("GXL_Devices_Count").text().toUInt(&ok) ); if( ! ok ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE GXL_Devices_Count invalid!" ); SPICE.Set_RAM_Size( Second_Element.firstChildElement("RAM_Size").text().toInt(&ok) ); if( ! ok ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE RAM_Size invalid!" ); SPICE.Set_Port( Second_Element.firstChildElement("Port").text().toUInt(&ok) ); if( ! ok ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE Port invalid" ); SPICE.Use_SPort( Second_Element.firstChildElement( "Use_SPort" ).text() == "true" ); SPICE.Set_SPort( Second_Element.firstChildElement("SPort").text().toUInt(&ok) ); if( ! ok ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE SPort invalid!" ); SPICE.Use_Hostname( Second_Element.firstChildElement( "Use_Hostname" ).text() == "true" ); SPICE.Set_Hostname( Second_Element.firstChildElement( "Hostname" ).text() ); SPICE.Use_Image_Compression( Second_Element.firstChildElement( "Use_Image_Compression" ).text() == "true" ); QString spiceIC = Second_Element.firstChildElement( "Image_Compression_Type" ).text(); if( spiceIC == "on" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_on ); else if( spiceIC == "auto_glz" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_auto_glz ); else if( spiceIC == "auto_lz" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_auto_lz ); else if( spiceIC == "quic" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_quic ); else if( spiceIC == "glz" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_glz ); else if( spiceIC == "lz" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_lz ); else if( spiceIC == "off" ) SPICE.Set_Image_Compression( VM::SPICE_IC_Type_off ); else AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE image compression type invalid!" ); SPICE.Use_Video_Stream_Compression( Second_Element.firstChildElement( "Use_Video_Stream_Compression" ).text() == "true" ); SPICE.Use_Renderer( Second_Element.firstChildElement( "Use_Renderer" ).text() == "true" ); QDomElement rendererListElement = Second_Element.firstChildElement( "Renderers_List" ); if( rendererListElement.isNull() ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE renderer list is empty!" ); else { QList rendererList; QList renderNodes = rendererListElement.childNodes(); QListIterator it(renderNodes); while( it.hasNext() ) { QDomElement el = it.next(); QString rendererTypeStr = el.tagName(); if( rendererTypeStr == "oglpbuf" ) rendererList << VM::SPICE_Renderer_oglpbuf; else if( rendererTypeStr == "oglpixmap" ) rendererList << VM::SPICE_Renderer_oglpixmap; else if( rendererTypeStr == "cairo" ) rendererList << VM::SPICE_Renderer_cairo; else AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE renderer type invalid!" ); } if( rendererList.isEmpty() ) AQError( "bool Virtual_Machine::Load_VM( const QString &file_name )", "SPICE renderers list is empty!" ); else SPICE.Set_Renderer_List( rendererList ); } SPICE.Use_Playback_Compression( Second_Element.firstChildElement( "Use_Playback_Compression" ).text() == "true" ); SPICE.Use_Password( Second_Element.firstChildElement( "Use_Password" ).text() == "true" ); SPICE.Set_Password( Second_Element.firstChildElement( "Password" ).text() ); } // Use VNC VNC = (Child_Element.firstChildElement("Use_VNC").text() == "true"); // VNC Socket Mode VNC_Socket_Mode = (Child_Element.firstChildElement("VNC_Socket_Mode").text() == "true"); // VNC Unix Socket Path VNC_Unix_Socket_Path = Child_Element.firstChildElement( "VNC_Unix_Socket_Path" ).text(); // VNC Display Number VNC_Display_Number = (uint)Child_Element.firstChildElement( "VNC_Display_Number" ).text().toInt(); // Use VNC Password VNC_Password = (Child_Element.firstChildElement("Use_VNC_Password").text() == "true"); // Use VNC TLS VNC_TLS = (Child_Element.firstChildElement("Use_VNC_TLS").text() == "true"); // Use VNC x509 VNC_x509 = (Child_Element.firstChildElement("Use_VNC_x509").text() == "true"); // VNC x509 Folder Path VNC_x509_Folder_Path = Child_Element.firstChildElement( "VNC_x509_Folder_Path" ).text(); // Use VNC x509verify VNC_x509verify = (Child_Element.firstChildElement("Use_VNC_x509verify").text() == "true"); // VNC x509verify Folder Path VNC_x509verify_Folder_Path = Child_Element.firstChildElement( "VNC_x509verify_Folder_Path" ).text(); // Additional Arguments Additional_Args = Child_Element.firstChildElement( "Additional_Args" ).text(); // Only_User_Args Only_User_Args = (Child_Element.firstChildElement("Only_User_Args").text() == "true"); // Use_User_Emulator_Binary Use_User_Emulator_Binary = (Child_Element.firstChildElement("Use_User_Emulator_Binary").text() == "true"); return true; } } } VM_Nativ_Storage_Device Virtual_Machine::Load_VM_Nativ_Storage_Device( const QDomElement &Second_Element ) const { VM_Nativ_Storage_Device tmp_device; // Use File Path tmp_device.Use_File_Path( Second_Element.firstChildElement("Use_File_Path").text() == "true" ); // File Path tmp_device.Set_File_Path( Second_Element.firstChildElement("File_Path").text() ); // Use Interface tmp_device.Use_Interface( Second_Element.firstChildElement("Use_Interface").text() == "true" ); // Interface QString interface_str = Second_Element.firstChildElement( "Interface" ).text(); if( interface_str == "IDE" ) tmp_device.Set_Interface( VM::DI_IDE ); else if( interface_str == "SCSI" ) tmp_device.Set_Interface( VM::DI_SCSI ); else if( interface_str == "SD" ) tmp_device.Set_Interface( VM::DI_SD ); else if( interface_str == "MTD" ) tmp_device.Set_Interface( VM::DI_MTD ); else if( interface_str == "Floppy" ) tmp_device.Set_Interface( VM::DI_Floppy ); else if( interface_str == "PFlash" ) tmp_device.Set_Interface( VM::DI_PFlash ); else if( interface_str == "Virtio" ) tmp_device.Set_Interface( VM::DI_Virtio ); else if( interface_str == "" ) ; // No Value else { AQError( "VM_Nativ_Storage_Device Virtual_Machine::Load_VM_Nativ_Storage_Device( const QDomElement &Second_Element ) const", "Storage Device Interface Default Section! Value: \"" + interface_str + "\"" ); } // Use Bus Unit tmp_device.Use_Bus_Unit( Second_Element.firstChildElement("Use_Bus_Unit").text() == "true" ); // Bus tmp_device.Set_Bus( Second_Element.firstChildElement("Bus").text().toInt() ); // Unit tmp_device.Set_Bus( Second_Element.firstChildElement("Unit").text().toInt() ); // Use Index tmp_device.Use_Index( Second_Element.firstChildElement("Use_Index").text() == "true" ); // Index tmp_device.Set_Index( Second_Element.firstChildElement("Index").text().toInt() ); // Use Media tmp_device.Use_Media( Second_Element.firstChildElement("Use_Media").text() == "true" ); // Media QString media_str = Second_Element.firstChildElement( "Media" ).text(); if( media_str == "Disk" ) tmp_device.Set_Index( VM::DM_Disk ); else if( media_str == "CD_ROM" ) tmp_device.Set_Index( VM::DM_CD_ROM ); else if( media_str == "" ) ; // No value else { AQError( "VM_Nativ_Storage_Device Virtual_Machine::Load_VM_Nativ_Storage_Device( const QDomElement &Second_Element ) const", "Storage Device Media Default Section!" ); } // Use hdachs tmp_device.Use_hdachs( Second_Element.firstChildElement("Use_hdachs").text() == "true" ); // Cyls tmp_device.Set_Cyls( Second_Element.firstChildElement("Cyls").text().toULongLong() ); // Heads tmp_device.Set_Heads( Second_Element.firstChildElement("Heads").text().toULongLong() ); // Secs tmp_device.Set_Secs( Second_Element.firstChildElement("Secs").text().toULongLong() ); // Trans tmp_device.Set_Cyls( Second_Element.firstChildElement("Trans").text().toULongLong() ); // Use Snapshot tmp_device.Use_Snapshot( Second_Element.firstChildElement("Use_Snapshot").text() == "true" ); // Snapshot tmp_device.Set_Snapshot( Second_Element.firstChildElement("Snapshot").text() == "true" ); // Use Cache tmp_device.Use_Cache( Second_Element.firstChildElement("Use_Cache").text() == "true" ); // Cache tmp_device.Set_Cache( Second_Element.firstChildElement("Cache").text() ); // Use AIO tmp_device.Use_AIO( Second_Element.firstChildElement("Use_AIO").text() == "true" ); // AIO tmp_device.Set_AIO( Second_Element.firstChildElement("AIO").text() ); // Use Boot tmp_device.Use_Boot( Second_Element.firstChildElement("Use_Boot").text() == "true" ); // Boot tmp_device.Set_Boot( Second_Element.firstChildElement("Boot").text() == "true" ); return tmp_device; } VM_Shared_Folder Virtual_Machine::Load_VM_Shared_Folder( const QDomElement &Second_Element ) const { VM_Shared_Folder tmp_device; // Folder Path tmp_device.Set_Folder( Second_Element.firstChildElement("Path").text() ); return tmp_device; } void Virtual_Machine::Save_VM_Nativ_Storage_Device( QDomDocument &New_Dom_Document, QDomElement &Dom_Element, const VM_Nativ_Storage_Device &device ) const { // Use File Path QDomElement Sec_Element = New_Dom_Document.createElement( "Use_File_Path" ); Dom_Element.appendChild( Sec_Element ); QDomText Dom_Text; if( device.Use_File_Path() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // File Path Sec_Element = New_Dom_Document.createElement( "File_Path" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( device.Get_File_Path() ); Sec_Element.appendChild( Dom_Text ); // Use Interface Sec_Element = New_Dom_Document.createElement( "Use_Interface" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Interface() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Interface switch( device.Get_Interface() ) { case VM::DI_IDE: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "IDE" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_SCSI: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "SCSI" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_SD: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "SD" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_MTD: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "MTD" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_Floppy: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "Floppy" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_PFlash: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "PFlash" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DI_Virtio: Sec_Element = New_Dom_Document.createElement( "Interface" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "Virtio" ); Sec_Element.appendChild( Dom_Text ); break; default: AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "Storage Device Interface Default Section!" ); break; } // Use Bus Unit Sec_Element = New_Dom_Document.createElement( "Use_Bus_Unit" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Bus_Unit() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Bus Sec_Element = New_Dom_Document.createElement( "Bus" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Bus()) ); Sec_Element.appendChild( Dom_Text ); // Unit Sec_Element = New_Dom_Document.createElement( "Unit" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Unit()) ); Sec_Element.appendChild( Dom_Text ); // Use Index Sec_Element = New_Dom_Document.createElement( "Use_Index" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Index() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Index Sec_Element = New_Dom_Document.createElement( "Index" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Index()) ); Sec_Element.appendChild( Dom_Text ); // Use Media Sec_Element = New_Dom_Document.createElement( "Use_Media" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Media() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Media switch( device.Get_Media() ) { case VM::DM_Disk: Sec_Element = New_Dom_Document.createElement( "Media" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "Disk" ); Sec_Element.appendChild( Dom_Text ); break; case VM::DM_CD_ROM: Sec_Element = New_Dom_Document.createElement( "Media" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( "CD_ROM" ); Sec_Element.appendChild( Dom_Text ); break; default: AQError( "bool Virtual_Machine::Create_VM_File( const QString &file_name, bool template_mode )", "Storage Device Media Default Section!" ); break; } // Use hdachs Sec_Element = New_Dom_Document.createElement( "Use_hdachs" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_hdachs() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Cyls Sec_Element = New_Dom_Document.createElement( "Cyls" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Cyls()) ); Sec_Element.appendChild( Dom_Text ); // Heads Sec_Element = New_Dom_Document.createElement( "Heads" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Heads()) ); Sec_Element.appendChild( Dom_Text ); // Secs Sec_Element = New_Dom_Document.createElement( "Secs" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Secs()) ); Sec_Element.appendChild( Dom_Text ); // Trans Sec_Element = New_Dom_Document.createElement( "Trans" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( QString::number(device.Get_Trans()) ); Sec_Element.appendChild( Dom_Text ); // Use Snapshot Sec_Element = New_Dom_Document.createElement( "Use_Snapshot" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Snapshot() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Snapshot Sec_Element = New_Dom_Document.createElement( "Snapshot" ); Dom_Element.appendChild( Sec_Element ); if( device.Get_Snapshot() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Use Cache Sec_Element = New_Dom_Document.createElement( "Use_Cache" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Cache() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Cache Sec_Element = New_Dom_Document.createElement( "Cache" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( device.Get_Cache() ); Sec_Element.appendChild( Dom_Text ); // Use AIO Sec_Element = New_Dom_Document.createElement( "Use_AIO" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_AIO() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // AIO Sec_Element = New_Dom_Document.createElement( "AIO" ); Dom_Element.appendChild( Sec_Element ); Dom_Text = New_Dom_Document.createTextNode( device.Get_AIO() ); Sec_Element.appendChild( Dom_Text ); // Use Boot Sec_Element = New_Dom_Document.createElement( "Use_Boot" ); Dom_Element.appendChild( Sec_Element ); if( device.Use_Boot() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); // Boot Sec_Element = New_Dom_Document.createElement( "Boot" ); Dom_Element.appendChild( Sec_Element ); if( device.Get_Boot() ) Dom_Text = New_Dom_Document.createTextNode( "true" ); else Dom_Text = New_Dom_Document.createTextNode( "false" ); Sec_Element.appendChild( Dom_Text ); } void Virtual_Machine::Save_VM_Shared_Folder( QDomDocument &New_Dom_Document, QDomElement &Dom_Element, const VM_Shared_Folder &shared_folder ) const { // Folder Path QDomElement Sec_Element = New_Dom_Document.createElement( "Path" ); Dom_Element.appendChild( Sec_Element ); QDomText Dom_Text = New_Dom_Document.createTextNode( shared_folder.Get_Folder() ); Sec_Element.appendChild( Dom_Text ); } bool Virtual_Machine::Save_VM() { return Create_VM_File( VM_XML_File_Path, false ); } bool Virtual_Machine::Save_VM( const QString &file_name ) { return Create_VM_File( file_name, false ); } QStringList Virtual_Machine::Build_QEMU_Args() { QStringList Args; #ifdef Q_OS_WIN32 Args << "-monitor" << QString("tcp:%1:%2,server,nowait") .arg(Settings.value("Emulator_Monitor_Hostname", "localhost").toString() ) .arg(Settings.value("Emulator_MonGitor_Port", 6000).toInt() + Embedded_Display_Port); Monitor_Hostname = Settings.value("Emulator_Monitor_Hostname", "localhost").toString(); Monitor_Port = (unsigned int)Settings.value("Emulator_MonGitor_Port", 6000).toInt() + Embedded_Display_Port; #else if( Settings.value("Emulator_Monitor_Type", "stdio").toString() == "tcp" ) { Args << "-monitor" << QString("tcp:%1:%2,server,nowait") .arg(Settings.value("Emulator_Monitor_Hostname", "localhost").toString() ) .arg(Settings.value("Emulator_MonGitor_Port", 6000).toInt() + Embedded_Display_Port); Monitor_Hostname = Settings.value("Emulator_Monitor_Hostname", "localhost").toString(); Monitor_Port = (unsigned int)Settings.value("Emulator_MonGitor_Port", 6000).toInt() + Embedded_Display_Port; } else { Args << "-monitor" << "stdio"; } #endif // Saved? if( ! Start_Snapshot_Tag.isEmpty() ) { Args << "-loadvm" << Start_Snapshot_Tag; Load_Mode = true; } else if( State == VM::VMS_Saved ) { Args << "-loadvm" << "aqemu_save"; Load_Mode = true; } else { Load_Mode = false; } if( Current_Emulator_Devices.System.QEMU_Name.isEmpty() ) { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "Current_Emulator_Devices is empty!" ); Update_Current_Emulator_Devices(); if( Current_Emulator_Devices.System.QEMU_Name.isEmpty() ) { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "Current_Emulator_Devices is empty! AQEMU Break :(" ); return Args; } } // SMP Mode if( SMP.SMP_Count <= Current_Emulator_Devices.PSO_SMP_Count ) { if( Current_Emulator_Devices.PSO_SMP_Cores || Current_Emulator_Devices.PSO_SMP_Threads || Current_Emulator_Devices.PSO_SMP_Sockets || Current_Emulator_Devices.PSO_SMP_MaxCPUs ) { if( SMP.SMP_Count > 1 || SMP.SMP_Cores > 0 || SMP.SMP_Threads > 0 || SMP.SMP_Sockets > 0 || SMP.SMP_MaxCPUs > 0 ) { QString smp_args = QString::number( SMP.SMP_Count ); if( Current_Emulator_Devices.PSO_SMP_Cores && SMP.SMP_Cores > 0 ) smp_args += ",cores=" + QString::number( SMP.SMP_Cores ); if( Current_Emulator_Devices.PSO_SMP_Threads && SMP.SMP_Threads > 0 ) smp_args += ",threads=" + QString::number( SMP.SMP_Threads ); if( Current_Emulator_Devices.PSO_SMP_Sockets && SMP.SMP_Sockets > 0 ) smp_args += ",sockets=" + QString::number( SMP.SMP_Sockets ); if( Current_Emulator_Devices.PSO_SMP_MaxCPUs && SMP.SMP_MaxCPUs > 0 ) smp_args += ",maxcpus=" + QString::number( SMP.SMP_MaxCPUs ); Args << "-smp" << smp_args; } } else { if( SMP.SMP_Count > 1 ) Args << "-smp" << QString::number( SMP.SMP_Count ); } } // CPU Model if( Current_Emulator_Devices.CPU_List.count() > 1 && CPU_Type.isEmpty() == false ) { Args << "-cpu" << CPU_Type; } // Audio QStringList audio_list; if( Audio_Card.Audio_sb16 && Current_Emulator_Devices.Audio_Card_List.Audio_sb16 ) audio_list << "sb16"; if( Audio_Card.Audio_es1370 && Current_Emulator_Devices.Audio_Card_List.Audio_es1370 ) audio_list << "es1370"; if( Audio_Card.Audio_Adlib && Current_Emulator_Devices.Audio_Card_List.Audio_Adlib ) audio_list << "adlib"; if( Audio_Card.Audio_PC_Speaker && Current_Emulator_Devices.Audio_Card_List.Audio_PC_Speaker ) audio_list << "pcspk"; if( Audio_Card.Audio_GUS && Current_Emulator_Devices.Audio_Card_List.Audio_GUS ) audio_list << "gus"; if( Audio_Card.Audio_AC97 && Current_Emulator_Devices.Audio_Card_List.Audio_AC97 ) audio_list << "ac97"; if( Audio_Card.Audio_HDA && Current_Emulator_Devices.Audio_Card_List.Audio_HDA ) audio_list << "hda"; if( Audio_Card.Audio_cs4231a && Current_Emulator_Devices.Audio_Card_List.Audio_cs4231a ) audio_list << "cs4231a"; if( audio_list.count() > 0 ) { Args << "-soundhw"; QString all_cards = ""; for( int ax = 0; ax < audio_list.count(); ++ax ) { // Next card end? if( ax != audio_list.count()-1 ) all_cards += audio_list[ ax ] + ","; else all_cards += audio_list[ ax ]; } Args << all_cards; } // Machine Type if( ! Machine_Type.isEmpty() ) Args << "-M" << Machine_Type; // Keyboard Layout (language) if( Keyboard_Layout != "Default" ) Args << "-k" << Get_Keyboard_Layout(); // Video if( Current_Emulator_Devices.PSO_Std_VGA ) // QEMU before 0.10 style Args << Video_Card; else if( ! Video_Card.isEmpty() ) // QEMU 0.10 style Args << "-vga" << Video_Card; // Acseleration Mode if( (Current_Emulator_Devices.PSO_KVM == false || Current_Emulator_Devices.PSO_Enable_KVM == false) && Current_Emulator_Devices.PSO_Kernel_KQEMU == true ) { switch( KQEMU_Mode ) { case VM::KQEMU_Disabled: Args << "-no-kqemu"; break; case VM::KQEMU_Full: Args << "-kernel-kqemu"; break; default: break; } } // Accelerator Args << "-machine"; QStringList props; props << "accel="+VM::Accel_To_String( Machine_Accelerator ); if( Current_Emulator_Devices.PSO_KVM_Shadow_Memory && KVM_Shadow_Memory ) props << "kvm_shadow_mem=" + QString::number( KVM_Shadow_Memory_Size * 1024 ); Args << props.join(","); // KVM Options //if( Current_Emulator_Devices.PSO_Enable_KVM && Enable_KVM ) // Args << "-enable-kvm"; if( Current_Emulator_Devices.PSO_No_KVM_IRQChip && KVM_IRQChip ) Args << "-no-kvm-irqchip"; if( Current_Emulator_Devices.PSO_No_KVM_Pit && No_KVM_Pit ) Args << "-no-kvm-pit"; if( Current_Emulator_Devices.PSO_No_KVM_Pit_Reinjection && KVM_No_Pit_Reinjection ) Args << "-no-kvm-pit-reinjection"; if( Current_Emulator_Devices.PSO_Enable_Nesting && KVM_Nesting ) Args << "-enable-nesting"; // Memory Args << "-m" << QString::number( Memory_Size, 10 ); // full screen if( Fullscreen ) Args << "-full-screen"; // Win2000 Hack if( Current_Emulator_Devices.PSO_Win2K_Hack && Win2K_Hack ) Args << "-win2k-hack"; // No Check FDD boot sector if( Current_Emulator_Devices.PSO_No_FB_Boot_Check && Check_FDD_Boot_Sector == false ) Args << "-no-fd-bootchk"; // No ACPI if( Current_Emulator_Devices.PSO_No_ACPI && ACPI == false ) Args << "-no-acpi"; // Snapshot if( Snapshot_Mode ) Args << "-snapshot"; // Do not start CPU at startup if( ! Start_CPU ) Args << "-S"; // Exit instead of rebooting if( No_Reboot ) Args << "-no-reboot"; if( Current_Emulator_Devices.PSO_Show_Cursor && Show_Cursor ) Args << "-show-cursor"; if( Current_Emulator_Devices.PSO_Curses && Curses ) Args << "-curses"; if( Current_Emulator_Devices.PSO_No_Shutdown && No_Shutdown ) Args << "-no-shutdown"; // FD0 if( FD0.Get_Enabled() ) { if( FD0.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( FD0.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(FD0.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-fda" << "\"" + FD0.Get_File_Name() + "\""; else Args << "-fda" << FD0.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exists!").arg(FD0.Get_File_Name()) ); } } } // FD1 if( FD1.Get_Enabled() ) { if( FD1.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( FD1.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(FD1.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-fdb" << "\"" + FD1.Get_File_Name() + "\""; else Args << "-fdb" << FD1.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(FD1.Get_File_Name()) ); } } } // CD-ROM if( CD_ROM.Get_Enabled() ) { if( CD_ROM.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( CD_ROM.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(CD_ROM.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-cdrom" << "\"" + CD_ROM.Get_File_Name() + "\""; else Args << "-cdrom" << CD_ROM.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(CD_ROM.Get_File_Name()) ); } } } // HDA if( HDA.Get_Enabled() ) { if( HDA.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( HDA.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(HDA.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-hda" << "\"" + HDA.Get_File_Name() + "\""; else Args << "-hda" << HDA.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(HDA.Get_File_Name()) ); } } } // HDB if( HDB.Get_Enabled() ) { if( HDB.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( HDB.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(HDB.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-hdb" << "\"" + HDB.Get_File_Name() + "\""; else Args << "-hdb" << HDB.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(HDB.Get_File_Name()) ); } } } // HDC if( HDC.Get_Enabled() ) { if( HDC.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( HDC.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(HDC.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-hdc" << "\"" + HDC.Get_File_Name() + "\""; else Args << "-hdc" << HDC.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(HDC.Get_File_Name()) ); } } } // HDD if( HDD.Get_Enabled() ) { if( HDD.Get_Nativ_Mode() ) { Args << Build_Nativ_Device_Args( HDD.Get_Nativ_Device(), Build_QEMU_Args_for_Tab_Info ); } else { if( QFile::exists(HDD.Get_File_Name()) || Build_QEMU_Args_for_Tab_Info ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-hdd" << "\"" + HDD.Get_File_Name() + "\""; else Args << "-hdd" << HDD.Get_File_Name(); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", QString("Image \"%1\" doesn't exist!").arg(HDD.Get_File_Name()) ); } } } // Storage Devices if( Current_Emulator_Devices.PSO_Drive && Storage_Devices.count() > 0 ) { for( int ix = 0; ix < Storage_Devices.count(); ++ix ) { Args << Build_Nativ_Device_Args( Storage_Devices[ix], Build_QEMU_Args_for_Tab_Info ); } } // Shared Folders //TODO if( Shared_Folders.count() > 0 ) { for( int ix = 0; ix < Shared_Folders.count(); ++ix ) { Args << Build_Shared_Folder_Args( Shared_Folders[ix], ix, Build_QEMU_Args_for_Tab_Info ); } } // Boot Device if( Current_Emulator_Devices.PSO_Boot_Order ) { int bootDevCount = 0; int onceBootDeviceIndex = -1; for( int ix = 0; ix < Boot_Order_List.count(); ix++ ) { if( Boot_Order_List[ix].Enabled ) { bootDevCount++; onceBootDeviceIndex = ix; } } if( bootDevCount > 1 ) { QString bootStr = ""; for( int ix = 0; ix < Boot_Order_List.count(); ix++ ) { if( Boot_Order_List[ix].Enabled ) { if( Boot_Order_List[ix].Type == VM::Boot_From_FDA ) bootStr += "a"; else if( Boot_Order_List[ix].Type == VM::Boot_From_FDB ) bootStr += "b"; else if( Boot_Order_List[ix].Type == VM::Boot_From_HDD ) bootStr += "c"; else if( Boot_Order_List[ix].Type == VM::Boot_From_CDROM ) bootStr += "d"; else if( Boot_Order_List[ix].Type == VM::Boot_From_Network1 ) bootStr += "n-1"; else if( Boot_Order_List[ix].Type == VM::Boot_From_Network2 ) bootStr += "n-2"; else if( Boot_Order_List[ix].Type == VM::Boot_From_Network3 ) bootStr += "n-3"; else if( Boot_Order_List[ix].Type == VM::Boot_From_Network4 ) bootStr += "n-4"; } } bootStr.prepend( (bootStr.isEmpty() ? "" : "order=") ); bootStr += QString(bootStr.isEmpty() ? "" : ",") + "menu=" + QString(Show_Boot_Menu ? "on" : "off"); Args << "-boot" << bootStr; } else if( onceBootDeviceIndex != -1 ) { QString bootStr = ""; if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_FDA ) bootStr = "a"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_FDB ) bootStr = "b"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_HDD ) bootStr = "c"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_CDROM ) bootStr = "d"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_Network1 ) bootStr = "n-1"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_Network2 ) bootStr = "n-2"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_Network3 ) bootStr = "n-3"; else if( Boot_Order_List[onceBootDeviceIndex].Type == VM::Boot_From_Network4 ) bootStr = "n-4"; bootStr.prepend( (bootStr.isEmpty() ? "" : "once=") ); bootStr += QString(bootStr.isEmpty() ? "" : ",") + "menu=" + QString(Show_Boot_Menu ? "on" : "off"); Args << "-boot" << bootStr; } else { AQWarning( "QStringList Virtual_Machine::Build_QEMU_Args()", "No boot devices? Use empty boot settings..." ); } } // Network Cards if( (Use_Nativ_Network() == false && Network_Cards.count() < 1) || (Use_Nativ_Network() == true && Network_Cards_Nativ.count() < 1) || Use_Network == false ) { Args << "-net" << "none"; } else { if( Use_Nativ_Network() ) { for( int nc = 0; nc < Network_Cards_Nativ.count(); nc++ ) { QString nic_str = ""; bool u_vlan, u_macaddr, u_model, u_name, u_hostname, u_port_dev, u_fd, u_ifname, u_script, u_downscript, u_listen, u_connect, u_mcast, u_sock, u_port, u_group, u_mode, u_file, u_len, u_addr, u_vectors, u_net, u_host, u_restrict, u_dhcpstart, u_dns, u_tftp, u_bootfile, u_hostfwd, u_guestfwd, u_smb, u_smbserver, u_sndbuf, u_vnet_hdr, u_vhost, u_vhostfd; u_vlan = u_macaddr = u_model = u_name = u_hostname = u_port_dev = u_fd = u_ifname = u_script = u_downscript = u_listen = u_connect = u_mcast = u_sock = u_port = u_group = u_mode = u_file = u_len = u_addr = u_vectors = u_net = u_host = u_restrict = u_dhcpstart = u_dns = u_tftp = u_bootfile = u_hostfwd = u_guestfwd = u_smb = u_smbserver = u_sndbuf = u_vnet_hdr = u_vhost = u_vhostfd = false; switch( Network_Cards_Nativ[nc].Get_Network_Type() ) { // -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v] case VM::Net_Mode_Nativ_NIC: nic_str += "nic"; u_vlan = u_macaddr = u_model = u_name = u_addr = u_vectors = true; break; // -net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n] // [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f] // [,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]] case VM::Net_Mode_Nativ_User: nic_str += "user"; u_vlan = u_name = u_net = u_host = u_restrict = u_hostname = u_dhcpstart = u_dns = u_tftp = u_bootfile = u_hostfwd = u_guestfwd = u_smb = u_smbserver = true; break; // -net channel,port:dev case VM::Net_Mode_Nativ_Chanel: nic_str += "channel"; u_port_dev = true; break; // -net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile] // [,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h] case VM::Net_Mode_Nativ_TAP: nic_str += "tap"; u_vlan = u_name = u_fd = u_ifname = u_script = u_downscript = u_sndbuf = u_vnet_hdr = u_vhost = u_vhostfd = true; break; // -net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port] case VM::Net_Mode_Nativ_Socket: nic_str += "socket"; u_vlan = u_name = u_fd = u_listen = u_connect = true; break; // -net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port] case VM::Net_Mode_Nativ_MulticastSocket: nic_str += "socket"; u_vlan = u_name = u_fd = u_mcast = true; break; // -net vde[,vlan=n][,name=str][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode] case VM::Net_Mode_Nativ_VDE: if( ! Current_Emulator_Devices.PSO_Net_type_vde ) continue; nic_str += "vde"; u_vlan = u_name = u_sock = u_port = u_group = u_mode = true; break; // -net dump[,vlan=n][,file=file][,len=len] case VM::Net_Mode_Nativ_Dump: if( ! Current_Emulator_Devices.PSO_Net_type_dump ) continue; nic_str += "dump"; u_vlan = u_file = u_len = true; break; default: break; } // Create String if( Network_Cards_Nativ[nc].Use_VLAN() && u_vlan ) nic_str += ",vlan=" + QString::number( Network_Cards_Nativ[nc].Get_VLAN() ); if( Network_Cards_Nativ[nc].Use_MAC_Address() && u_macaddr ) nic_str += ",macaddr=" + Network_Cards_Nativ[ nc ].Get_MAC_Address(); if( Network_Cards_Nativ[ nc ].Get_Card_Model().isEmpty() == false && u_model ) nic_str += ",model=" + Network_Cards_Nativ[ nc ].Get_Card_Model(); if( Network_Cards_Nativ[nc].Use_Name() && u_name && Current_Emulator_Devices.PSO_Net_name ) nic_str += ",name=\"" + Network_Cards_Nativ[ nc ].Get_Name() + "\""; if( Network_Cards_Nativ[nc].Use_Hostname() && u_hostname ) nic_str += ",hostname=" + Network_Cards_Nativ[ nc ].Get_Hostname(); if( u_port_dev ) nic_str += ",port:" + Network_Cards_Nativ[ nc ].Get_PortDev(); if( Network_Cards_Nativ[nc].Use_File_Descriptor() && u_fd ) nic_str += ",fd=" + QString::number( Network_Cards_Nativ[nc].Get_File_Descriptor() ); if( Network_Cards_Nativ[nc].Use_Interface_Name() && u_ifname && Current_Emulator_Devices.PSO_Net_ifname ) nic_str += ",ifname=" + Network_Cards_Nativ[ nc ].Get_Interface_Name(); if( u_script && Current_Emulator_Devices.PSO_Net_script ) { QString s_script; if( Network_Cards_Nativ[nc].Use_TUN_TAP_Script() ) s_script = Network_Cards_Nativ[ nc ].Get_TUN_TAP_Script(); else s_script = "no"; if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",script=\"" + s_script + "\""; else nic_str += ",script=" + s_script; } if( u_downscript && Current_Emulator_Devices.PSO_Net_downscript ) { QString s_downscript; if( Network_Cards_Nativ[nc].Use_TUN_TAP_Down_Script() ) s_downscript = Network_Cards_Nativ[ nc ].Get_TUN_TAP_Down_Script(); else s_downscript = "no"; if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",downscript=\"" + s_downscript + "\""; else nic_str += ",downscript=" + s_downscript; } if( Network_Cards_Nativ[nc].Use_Listen() && u_listen && Current_Emulator_Devices.PSO_Net_listen ) nic_str += ",listen=" + Network_Cards_Nativ[ nc ].Get_Listen(); if( Network_Cards_Nativ[nc].Use_Connect() && u_connect && Current_Emulator_Devices.PSO_Net_connect ) nic_str += ",connect=" + Network_Cards_Nativ[ nc ].Get_Connect(); if( Network_Cards_Nativ[nc].Use_MCast() && u_mcast && Current_Emulator_Devices.PSO_Net_mcast ) nic_str += ",mcast=" + Network_Cards_Nativ[ nc ].Get_MCast(); if( Network_Cards_Nativ[nc].Use_Sock() && u_sock && Current_Emulator_Devices.PSO_Net_sock ) nic_str += ",sock=" + Network_Cards_Nativ[ nc ].Get_Sock(); if( Network_Cards_Nativ[nc].Use_Port() && u_port && Current_Emulator_Devices.PSO_Net_port ) nic_str += ",port=" + QString::number( Network_Cards_Nativ[ nc ].Get_Port() ); if( Network_Cards_Nativ[nc].Use_Group() && u_group && Current_Emulator_Devices.PSO_Net_group ) nic_str += ",group=" + Network_Cards_Nativ[ nc ].Get_Group(); if( Network_Cards_Nativ[nc].Use_Mode() && u_mode && Current_Emulator_Devices.PSO_Net_mode ) nic_str += ",mode=" + Network_Cards_Nativ[ nc ].Get_Mode(); if( Network_Cards_Nativ[nc].Use_File() && u_file && Current_Emulator_Devices.PSO_Net_file ) { if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",file=\"" + Network_Cards_Nativ[ nc ].Get_File() + "\""; else nic_str += ",file=" + Network_Cards_Nativ[ nc ].Get_File(); } if( Network_Cards_Nativ[nc].Use_Len() && u_len && Current_Emulator_Devices.PSO_Net_len ) nic_str += ",len=" + QString::number( Network_Cards_Nativ[nc].Get_Len() ); if( Network_Cards_Nativ[nc].Use_Addr() && u_addr && Current_Emulator_Devices.PSO_Net_addr ) nic_str += ",addr=" + Network_Cards_Nativ[ nc ].Get_Addr(); if( Network_Cards_Nativ[nc].Use_Vectors() && u_vectors && Current_Emulator_Devices.PSO_Net_vectors ) nic_str += ",vectors=" + QString::number( Network_Cards_Nativ[ nc ].Get_Vectors() ); if( Network_Cards_Nativ[nc].Use_Net() && u_net && Current_Emulator_Devices.PSO_Net_net ) nic_str += ",net=" + Network_Cards_Nativ[ nc ].Get_Net(); if( Network_Cards_Nativ[nc].Use_Host() && u_host && Current_Emulator_Devices.PSO_Net_host ) nic_str += ",host=" + Network_Cards_Nativ[ nc ].Get_Host(); if( Network_Cards_Nativ[nc].Use_Restrict() && u_restrict && Current_Emulator_Devices.PSO_Net_restrict ) nic_str += ",restrict=" + Network_Cards_Nativ[nc].Get_Restrict() ? "y" : "n"; if( Network_Cards_Nativ[nc].Use_DHCPstart() && u_dhcpstart && Current_Emulator_Devices.PSO_Net_dhcpstart ) nic_str += ",dhcpstart=" + Network_Cards_Nativ[ nc ].Get_DHCPstart(); if( Network_Cards_Nativ[nc].Use_DNS() && u_dns && Current_Emulator_Devices.PSO_Net_dns ) nic_str += ",dns=" + Network_Cards_Nativ[ nc ].Get_DNS(); if( Network_Cards_Nativ[nc].Use_Tftp() && u_tftp && Current_Emulator_Devices.PSO_Net_tftp ) { if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",tftp=\"" + Network_Cards_Nativ[ nc ].Get_Tftp() + "\""; else nic_str += ",tftp=" + Network_Cards_Nativ[ nc ].Get_Tftp(); } if( Network_Cards_Nativ[nc].Use_Bootfile() && u_bootfile && Current_Emulator_Devices.PSO_Net_bootfile ) { if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",bootfile=\"" + Network_Cards_Nativ[ nc ].Get_Bootfile() + "\""; else nic_str += ",bootfile=" + Network_Cards_Nativ[ nc ].Get_Bootfile(); } if( Network_Cards_Nativ[nc].Use_HostFwd() && u_hostfwd && Current_Emulator_Devices.PSO_Net_hostfwd ) nic_str += ",hostfwd=" + Network_Cards_Nativ[ nc ].Get_HostFwd(); if( Network_Cards_Nativ[nc].Use_GuestFwd() && u_guestfwd && Current_Emulator_Devices.PSO_Net_guestfwd ) nic_str += ",guestfwd=" + Network_Cards_Nativ[ nc ].Get_GuestFwd(); if( Network_Cards_Nativ[nc].Use_SMB() && u_smb && Current_Emulator_Devices.PSO_Net_smb ) { if( Build_QEMU_Args_for_Script_Mode ) nic_str += ",smb=\"" + Network_Cards_Nativ[ nc ].Get_SMB() + "\""; else nic_str += ",smb=" + Network_Cards_Nativ[ nc ].Get_SMB(); if( Network_Cards_Nativ[nc].Use_SMBserver() && u_smbserver ) nic_str += ",smbserver=" + Network_Cards_Nativ[ nc ].Get_SMBserver(); } if( Network_Cards_Nativ[nc].Use_Sndbuf() && u_sndbuf && Current_Emulator_Devices.PSO_Net_sndbuf ) nic_str += ",sndbuf=" + QString::number( Network_Cards_Nativ[nc].Get_Sndbuf() ); if( Network_Cards_Nativ[nc].Use_VNet_hdr() && u_vnet_hdr && Current_Emulator_Devices.PSO_Net_vnet_hdr ) nic_str += ",vnet_hdr=" + Network_Cards_Nativ[ nc ].Get_VNet_hdr() ? "on" : "off"; if( Network_Cards_Nativ[nc].Get_VHost() && u_vhost && Current_Emulator_Devices.PSO_Net_vhost ) nic_str += ",vhost=" + Network_Cards_Nativ[ nc ].Get_VHost() ? "on" : "off"; if( Network_Cards_Nativ[nc].Use_VHostFd() && u_vhostfd && Current_Emulator_Devices.PSO_Net_vhostfd ) nic_str += ",vhostfd=" + QString::number( Network_Cards_Nativ[nc].Get_VHostFd() ); // Add to Args Args << "-net"; Args << nic_str; } } else { for( int nc = 0; nc < Network_Cards.count(); nc++ ) { Args << "-net"; QString nic_str = "nic,vlan=" + QString::number( Network_Cards[nc].Get_VLAN() ); if( ! Network_Cards[nc].Get_MAC_Address().isEmpty() ) // Use MAC? nic_str += ",macaddr=" + Network_Cards[nc].Get_MAC_Address(); if( ! Network_Cards[nc].Get_Card_Model().isEmpty() ) nic_str += ",model=" + Network_Cards[nc].Get_Card_Model(); Args << nic_str; // Net Modes QString tap_tmp; switch( Network_Cards[nc].Get_Net_Mode() ) { case VM::Net_Mode_None: break; case VM::Net_Mode_Usermode: if( Network_Cards[nc].Get_Hostname().isEmpty() ) Args << "-net" << QString( "user,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) ); else Args << "-net" << QString( "user,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",hostname=" + Network_Cards[nc].Get_Hostname() ); break; case VM::Net_Mode_Tuntap: Args << "-net" ; tap_tmp = QString( "tap,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) ); if( ! Network_Cards[nc].Get_Interface_Name().isEmpty() ) tap_tmp += QString( ",ifname=" + Network_Cards[nc].Get_Interface_Name() ); if( ! Network_Cards[nc].Get_Use_TUN_TAP_Script() ) { tap_tmp += QString( ",script=no" ); } else { if( ! Network_Cards[nc].Get_TUN_TAP_Script().isEmpty() ) { if( Build_QEMU_Args_for_Script_Mode ) tap_tmp += QString( ",script=\"%1\"" ).arg( Network_Cards[nc].Get_TUN_TAP_Script() ); else tap_tmp += ",script=" + Network_Cards[nc].Get_TUN_TAP_Script(); } } Args << tap_tmp; break; case VM::Net_Mode_Tuntapfd: Args << "-net" << QString( "tap,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ((Network_Cards[nc].Get_File_Descriptor() > 0) ? ",fd=" + QString::number(Network_Cards[nc].Get_File_Descriptor()) : "") + ((Network_Cards[nc].Get_Interface_Name().isEmpty() == false) ? ",ifname=" + Network_Cards[nc].Get_Interface_Name() : "") ); break; case VM::Net_Mode_Tcplisten: if( Network_Cards[nc].Get_IP_Address().isEmpty() ) { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",listen=:" + QString::number(Network_Cards[nc].Get_Port()) ); } else { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",listen=" + Network_Cards[nc].Get_IP_Address() + ":" + QString::number(Network_Cards[nc].Get_Port()) ); } break; case VM::Net_Mode_Tcpfd: Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",fd=" + QString::number(Network_Cards[nc].Get_File_Descriptor()) ); break; case VM::Net_Mode_Tcpconnect: if( Network_Cards[nc].Get_IP_Address().isEmpty() ) { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",connect=:" + QString::number(Network_Cards[nc].Get_Port()) ); } else { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",connect=" + Network_Cards[nc].Get_IP_Address() + ":" + QString::number(Network_Cards[nc].Get_Port()) ); } break; case VM::Net_Mode_Multicast: if( Network_Cards[nc].Get_IP_Address().isEmpty() ) { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",mcast=:" + QString::number(Network_Cards[nc].Get_Port()) ); } else { Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",mcast=" + Network_Cards[nc].Get_IP_Address() + ":" + QString::number(Network_Cards[nc].Get_Port()) ); } break; case VM::Net_Mode_Multicastfd: Args << "-net" << QString( "socket,vlan=" + QString::number(Network_Cards[nc].Get_VLAN()) + ",fd=" + QString::number(Network_Cards[nc].Get_File_Descriptor()) ); break; default: Args << "-net" << "none"; break; } } } // Network Tab. Redirections if( Use_Redirections ) { QString redir_str = ""; Args << "-net"; QStringList hostfwds; for( int rx = 0; rx < Get_Network_Redirections_Count(); rx++ ) { redir_str = "hostfwd="; if( Get_Network_Redirection(rx).Get_Protocol() == "TCP" ) redir_str += "tcp:"; else if( Get_Network_Redirection(rx).Get_Protocol() == "UDP" ) redir_str += "udp:"; else redir_str += ":"; //qemu uses TCP by default //FIXME/TODO: host_address doesn't get taken into account redir_str += ":" + QString::number( Get_Network_Redirection(rx).Get_Host_Port() ) + "-"; redir_str += Get_Network_Redirection(rx).Get_Guest_IP() + ":"; redir_str += QString::number( Get_Network_Redirection(rx).Get_Guest_Port() ); hostfwds << redir_str; } Args << "user," + hostfwds.join(","); } } // TFTP Prefix if( ! TFTP_Prefix.isEmpty() ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-net" << "user,tftp=" + QString("\"") + TFTP_Prefix + "\""; else Args << "-net" << "user,tftp=" + TFTP_Prefix; } // SMB Dir if( ! SMB_Directory.isEmpty() ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-net" << "user,smb=" + QString("\"") + SMB_Directory + "\""; else Args << "-net" << "user,smb=" + SMB_Directory; } // Ports Tabs for( int ix = 0; ix < Serial_Ports.count(); ix++ ) { if( Serial_Ports[ix].Get_Port_Redirection() == VM::PR_Default ) continue; Args << "-serial"; switch( Serial_Ports[ix].Get_Port_Redirection() ) { case VM::PR_vc: Args << "vc:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_pty: Args << "pty"; break; case VM::PR_none: Args << "none"; break; case VM::PR_null: Args << "null"; break; case VM::PR_dev: Args << Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_file: Args << "file:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_stdio: Args << "stdio"; break; case VM::PR_pipe: Args << "pipe:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_udp: Args << "udp:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_tcp: Args << "tcp:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_telnet: Args << "telnet:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_unix: Args << "unix:" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_com: Args << "COM" + Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_msmouse: Args << "msmouse"; break; case VM::PR_mon: Args << "mon:" << Serial_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_braille: Args << "braille"; break; default: break; } } // parallel port for( int ix = 0; ix < Parallel_Ports.count(); ix++ ) { if( Parallel_Ports[ix].Get_Port_Redirection() == VM::PR_Default ) continue; Args << "-Parallel"; switch( Parallel_Ports[ix].Get_Port_Redirection() ) { case VM::PR_vc: Args << "vc:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_pty: Args << "pty"; break; case VM::PR_none: Args << "none"; break; case VM::PR_null: Args << "null"; break; case VM::PR_dev: Args << Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_file: Args << "file:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_stdio: Args << "stdio"; break; case VM::PR_pipe: Args << "pipe:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_udp: Args << "udp:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_tcp: Args << "tcp:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_telnet: Args << "telnet:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_unix: Args << "unix:" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_com: Args << "COM" + Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_msmouse: Args << "msmouse"; break; case VM::PR_mon: Args << "mon:" << Parallel_Ports[ix].Get_Parametrs_Line(); break; case VM::PR_braille: Args << "braille"; break; default: break; } } // USB if( ! System_Info::Update_Host_USB() ) // check USB support { AQDebug( "QStringList Virtual_Machine::Build_QEMU_Args()", "No USB Support in This System!" ); } else { if( USB_Ports.count() > 0 ) { bool usb_ehci_arg_added = false; // USB 2.0 controller bool usb_xhci_arg_added = false; // USB 3.0 controller Args << "-usb"; if( Build_QEMU_Args_for_Tab_Info == false ) System_Info::Update_Host_USB(); QList all_usb = System_Info::Get_All_Host_USB(); // Add usb for( int ux = 0; ux < USB_Ports.count(); ux++ ) { if( USB_Ports[ux].Get_Use_Host_Device() ) { // Compare VM USB device and Host USB Device // Find device by Vendor and Product ID's bool usb_cmpr = false; VM_USB current_USB_Device; for( int ix = 0; ix < all_usb.count(); ix++ ) { if( all_usb[ix].Get_Vendor_ID() == USB_Ports[ux].Get_Vendor_ID() && all_usb[ix].Get_Product_ID() == USB_Ports[ux].Get_Product_ID() && all_usb[ix].Get_Serial_Number() == USB_Ports[ux].Get_Serial_Number() ) { usb_cmpr = true; current_USB_Device = all_usb[ ix ]; all_usb.removeAt( ix ); break; } } // Error! Not Found if( Build_QEMU_Args_for_Tab_Info == false && usb_cmpr == false ) { AQGraphic_Warning( tr("Warning!"), tr("USB Device %1 %2 (%3 %4) Not Found!").arg(USB_Ports[ux].Get_Manufacturer_Name()) .arg(USB_Ports[ux].Get_Product_Name()) .arg(USB_Ports[ux].Get_Vendor_ID()) .arg(USB_Ports[ux].Get_Product_ID()) ); continue; } /* ui.RB_USB_Style_device->isChecked() ) Settings.setValue( "USB_Style", "device" ); else Settings.setValue( "USB_Style", "usbdevice" ); if( ui.RB_USB_ID_BusAddr->isChecked() ) Settings.setValue( "USB_ID_Style", "BusAddr" ); else if( ui.RB_USB_ID_BusPath->isChecked() ) Settings.setValue( "USB_ID_Style", "BusPath" ); else if( ui.RB_USB_ID_VendorProduct->isChecked() ) Settings.setValue( "USB_ID_Style", "VendorProduct" ); */ if( Current_Emulator_Devices.PSO_Device == false || Settings.value("USB_Style", "device").toString() == "usbdevice" ) { if( Settings.value("USB_ID_Style","").toString() == "BusAddr" ) Args << "-usbdevice" << QString( "host:%1.%2" ).arg( current_USB_Device.Get_Bus() ).arg( current_USB_Device.Get_Addr() ); else if( Settings.value("USB_ID_Style","").toString() == "VendorProduct" ) Args << "-usbdevice" << QString( "host:%1:%2" ).arg( current_USB_Device.Get_Vendor_ID() ).arg( current_USB_Device.Get_Product_ID() ); else Args << "-usbdevice" << QString( "host:%1.%2" ).arg( current_USB_Device.Get_Bus() ).arg( current_USB_Device.Get_DevPath() ); } else { QString usbControllerID = ""; // Add USB 3.0 controller if need if( Current_Emulator_Devices.PSO_Device_USB_EHCI && current_USB_Device.Get_Speed().toInt() == 5000 ) { if( ! usb_xhci_arg_added ) { // Only needed once Args << "-device" << "nec-usb-xhci,id=xhci"; usb_xhci_arg_added = true; } usbControllerID = "xhci.0"; } // Add USB 2.0 controller if need else if( Current_Emulator_Devices.PSO_Device_USB_EHCI && current_USB_Device.Get_Speed().toInt() >= 480 ) { if( ! usb_ehci_arg_added ) { // Only needed once Args << "-device" << "usb-ehci,id=ehci"; usb_ehci_arg_added = true; } usbControllerID = "ehci.0"; } else // USB 1.1 { usbControllerID = "usb.0"; } // Add USB devices if( Settings.value("USB_ID_Style","").toString() == "BusAddr" ) { Args << "-device" << QString( "usb-host,bus=%1,hostbus=%2,hostaddr=%3" ) .arg( usbControllerID ) .arg( current_USB_Device.Get_Bus() ) .arg( current_USB_Device.Get_Addr() ); } else if( Settings.value("USB_ID_Style","").toString() == "VendorProduct" ) { Args << "-device" << QString( "usb-host,bus=%1,vendorid=%2,productid=%3" ) .arg( usbControllerID ) .arg( current_USB_Device.Get_Vendor_ID() ) .arg( current_USB_Device.Get_Product_ID() ); } else // Bus.Path { Args << "-device" << QString( "usb-host,bus=%1,hostbus=%2,hostport=%3" ) .arg( usbControllerID ) .arg( current_USB_Device.Get_Bus() ) .arg( current_USB_Device.Get_DevPath() ); } } } else { // QEMU USB Devices bool usb_k, usb_m, usb_t, usb_wt, usb_b; usb_k = usb_m = usb_t = usb_wt = usb_b = false; USB_Ports[ux].Get_USB_QEMU_Devices( usb_k, usb_m, usb_t, usb_wt, usb_b ); if( usb_k ) Args << "-usbdevice" << "keyboard"; else if( usb_m ) Args << "-usbdevice" << "mouse"; else if( usb_t ) Args << "-usbdevice" << "tablet"; else if( usb_wt ) Args << "-usbdevice" << "wacom-tablet"; else if( usb_b ) Args << "-usbdevice" << "braille"; else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "Incorrcect USB Device!" ); } } } } } // Other Tab if( Linux_Boot ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-kernel" << "\"" + bzImage_Path + "\""; else Args << "-kernel" << bzImage_Path; if( ! Initrd_Path.isEmpty() ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-initrd" << "\"" + Initrd_Path + "\""; else Args << "-initrd" << Initrd_Path; } if( ! Kernel_ComLine.isEmpty() ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-append" << "\"" + Kernel_ComLine + "\""; else Args << "-append" << Kernel_ComLine; } } // Use ROM File if( Use_ROM_File ) { if( QFile::exists(ROM_File) == false && Build_QEMU_Args_for_Tab_Info == false ) { AQGraphic_Warning( tr("Error!"), tr("ROM File doesn't Exists! Can't run emulator!") ); } else { if( Build_QEMU_Args_for_Script_Mode ) Args << "-option-rom" << "\"" + ROM_File + "\""; else Args << "-option-rom" << ROM_File; } } // Start Date // Localtime QStringList rtc_list; rtc_list << "-rtc"; if ( Local_Time ) rtc_list << "base=localtime"; else if ( Start_Date ) rtc_list << "base=" + Start_DateTime.toString( "yyyy-MM-ddTHH:mm:ss" ); // QEMU Format else rtc_list << "base=utc"; if( Current_Emulator_Devices.PSO_RTC_TD_Hack && RTC_TD_Hack ) rtc_list.last() += ",driftfix=slew"; Args << rtc_list; // QEMU 0.9.1 Options // on-board Flash memory image if( Current_Emulator_Devices.PSO_MTDBlock && MTDBlock ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-mtdblock" << "\"" + MTDBlock_File + "\""; else Args << "-mtdblock" << MTDBlock_File; } // SecureDigital card image if( Current_Emulator_Devices.PSO_SD && SecureDigital ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-sd" << "\"" + SecureDigital_File + "\""; else Args << "-sd" << SecureDigital_File; } // parallel flash image if( Current_Emulator_Devices.PSO_PFlash && PFlash ) { if( Build_QEMU_Args_for_Script_Mode ) Args << "-pflash" << "\"" + PFlash_File + "\""; else Args << "-pflash" << PFlash_File; } // Set the initial graphical resolution and depth if( Current_Emulator_Devices.PSO_Initial_Graphic_Mode && Init_Graphic_Mode.Get_Enabled() ) { Args << "-g" << QString::number( Init_Graphic_Mode.Get_Width() ) + "x" + QString::number( Init_Graphic_Mode.Get_Height() ) + "x" + QString::number( Init_Graphic_Mode.Get_Depth() ); } // open SDL window without a frame and window decorations if( Current_Emulator_Devices.PSO_No_Frame && No_Frame ) Args << "-no-frame"; // use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt) if( Current_Emulator_Devices.PSO_Alt_Grab && Alt_Grab ) Args << "-alt-grab"; // disable SDL window close capability if( Current_Emulator_Devices.PSO_No_Quit && No_Quit ) Args << "-no-quit"; // rotate graphical output 90 deg left (only PXA LCD) if( Current_Emulator_Devices.PSO_Portrait && Portrait ) Args << "-portrait"; // VM Name if( Current_Emulator_Devices.PSO_Name ) Args << "-name" << "\"" + Machine_Name + "\""; // SPICE // FIXME. VNC and SPICE together? if( SPICE.Use_SPICE() ) { // QLX devices count and RAM size if( Current_Emulator_Devices.PSO_QXL ) Args << "-qxl" << QString( "%1,ram=%2" ).arg( SPICE.Get_GXL_Devices_Count() ).arg( SPICE.Get_RAM_Size() ); // Basic SPICE options QStringList spiceArgs; spiceArgs << QString( "port=%1" ).arg( SPICE.Get_Port() ); if( SPICE.Use_SPort() ) spiceArgs << QString( "tls-port=%1" ).arg( SPICE.Get_SPort() ); if( SPICE.Use_Hostname() ) spiceArgs << QString( "addr=%1" ).arg( SPICE.Get_Hostname() ); // Image, video & audio options if( SPICE.Use_Image_Compression() ) { switch( SPICE.Get_Image_Compression() ) { case VM::SPICE_IC_Type_on: spiceArgs << "image-compression=on"; break; case VM::SPICE_IC_Type_auto_glz: spiceArgs << "image-compression=auto_glz"; break; case VM::SPICE_IC_Type_auto_lz: spiceArgs << "image-compressionc=auto_lz"; break; case VM::SPICE_IC_Type_quic: spiceArgs << "image-compression=quic"; break; case VM::SPICE_IC_Type_glz: spiceArgs << "image-compression=glz"; break; case VM::SPICE_IC_Type_lz: spiceArgs << "image-compression=lz"; break; case VM::SPICE_IC_Type_off: spiceArgs << "image-compression=off"; break; default: AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "SPICE image compression type invalid!" ); break; } } // Set video streams detection and (lossy) compression (default=on) if( ! SPICE.Use_Video_Stream_Compression() ) spiceArgs << "streaming-video=off"; // Select renderers. Multiple choice prioritized by order (default=cairo) if( SPICE.Use_Renderer() ) { QString spiceRendersStr = ""; for( int ix = 0; ix < SPICE.Get_Renderer_List().count(); ++ix ) { switch( SPICE.Get_Renderer_List()[ix] ) { case VM::SPICE_Renderer_oglpbuf: spiceRendersStr += "oglpbuf"; break; case VM::SPICE_Renderer_oglpixmap: spiceRendersStr += "oglpixmap"; break; case VM::SPICE_Renderer_cairo: spiceRendersStr += "cairo"; break; default: AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "SPICE render type invalid!" ); break; } if( ! spiceRendersStr.isEmpty() && ix != SPICE.Get_Renderer_List().count() -1 ) { spiceRendersStr += "+"; } } if( spiceRendersStr.isEmpty() ) { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "SPICE render type order list is empty!" ); } else { spiceArgs << "renderer=" + spiceRendersStr; } } // Set playback compression, using the CELT algorithm (default=on) if( ! SPICE.Use_Playback_Compression() ) spiceArgs << "playback-compression=off"; // Security options if( SPICE.Use_Password() ) { spiceArgs << "password=" + SPICE.Get_Password(); } else { spiceArgs << "disable-ticketing"; } // Add to args Args << "-spice" << spiceArgs.join( "," ); } // VNC if( VNC ) { Args << "-vnc"; QString vnc_args = ""; if( VNC_Socket_Mode ) vnc_args += "unix:" + VNC_Unix_Socket_Path; else vnc_args += ":" + QString::number( VNC_Display_Number ); if( VNC_Password ) vnc_args += ",password"; if( VNC_TLS ) { vnc_args += ",tls"; if( VNC_x509 ) { if( Build_QEMU_Args_for_Script_Mode ) vnc_args += QString( ",x509=\"%1\"" ).arg( VNC_x509_Folder_Path ); else vnc_args += ",x509=" + VNC_x509_Folder_Path; } if( VNC_x509verify ) { if( Build_QEMU_Args_for_Script_Mode ) vnc_args += QString( ",x509verify=\"%1\"" ).arg( VNC_x509verify_Folder_Path ); else vnc_args += ",x509verify=" + VNC_x509verify_Folder_Path; } } Args << vnc_args; } else { #ifdef VNC_DISPLAY if( Settings.value("Use_VNC_Display", "no").toString() == "yes" ) { if( Embedded_Display_Port >= 0 ) { int port = (Settings.value( "First_VNC_Port", "5910" ).toString().toInt() - 5900) + Embedded_Display_Port; if( port >= 1 && port < 59636 ) Args << "-vnc" << ":" + QString::number( port ); else AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "Port for Embedded Display > 1 or < 59636" ); } else { AQError( "QStringList Virtual_Machine::Build_QEMU_Args()", "Embedded_Display_Port < 0" ); } } #endif } // Additional Args... if( Only_User_Args ) { Args.clear(); if( Additional_Args.isEmpty() && Build_QEMU_Args_for_Tab_Info == false ) AQGraphic_Warning( tr("Error!"), tr("Additional Arguments is Empty! Cannot Use User Arguments!") ); } if( ! Additional_Args.isEmpty() ) { QString tmp_str = Additional_Args; tmp_str.replace( "\n", " " ); QStringList ad_args = tmp_str.split( " ", QString::SkipEmptyParts ); for( int ix = 0; ix < ad_args.count(); ix++ ) Args << ad_args[ ix ]; } // Set All Special Modes Off Build_QEMU_Args_for_Script_Mode = false; Build_QEMU_Args_for_Tab_Info = false; return Args; } QStringList Virtual_Machine::Build_QEMU_Args_For_Tab_Info() { Build_QEMU_Args_for_Tab_Info = true; return Build_QEMU_Args(); } QStringList Virtual_Machine::Build_QEMU_Args_For_Script() { Build_QEMU_Args_for_Script_Mode = true; return Build_QEMU_Args(); } QStringList Virtual_Machine::Build_Nativ_Device_Args( VM_Nativ_Storage_Device device, bool Build_QEMU_Args_for_Script_Mode ) { QStringList opt; // File if( device.Use_File_Path() ) { if( Build_QEMU_Args_for_Script_Mode ) opt << "file=\"" + device.Get_File_Path() + "\""; else opt << "file=" + device.Get_File_Path(); } // Interface if( device.Use_Interface() ) { switch( device.Get_Interface() ) { case VM::DI_IDE: opt << "if=ide"; break; case VM::DI_SCSI: opt << "if=scsi"; break; case VM::DI_SD: opt << "if=sd"; break; case VM::DI_MTD: opt << "if=mtd"; break; case VM::DI_Floppy: opt << "if=floppy"; break; case VM::DI_PFlash: opt << "if=pflash"; break; case VM::DI_Virtio: opt << "if=virtio"; break; default: AQError( "QStringList Virtual_Machine::Build_Nativ_Device_Args( VM_Nativ_Storage_Device device, bool Build_QEMU_Args_for_Script_Mode )", "Storage Device Interface Default Section!" ); break; } } // Bus, Unit if( device.Use_Bus_Unit() ) { opt << "bus=" + QString::number( device.Get_Bus() ); opt << "unit=" + QString::number( device.Get_Unit() ); } // Index if( device.Use_Index() ) opt << "index=" + QString::number( device.Get_Index() ); // Media if( device.Use_Media() ) { switch( device.Get_Media() ) { case VM::DM_Disk: opt << "media=disk"; break; case VM::DM_CD_ROM: opt << "media=cdrom"; break; default: AQError( "QStringList Virtual_Machine::Build_Nativ_Device_Args( VM_Nativ_Storage_Device device, bool Build_QEMU_Args_for_Script_Mode )", "Storage Device Media Default Section!" ); break; } } // hdachs if( device.Use_hdachs() ) { opt << "cyls=" + QString::number( device.Get_Cyls() ); opt << "heads=" + QString::number( device.Get_Heads() ); opt << "secs=" + QString::number( device.Get_Secs() ); opt << "trans=" + QString::number( device.Get_Trans() ); } // Snapshot if( device.Use_Snapshot() ) { if( device.Get_Snapshot() ) opt << "snapshot=on"; else opt << "snapshot=off"; } // Cache if( device.Use_Cache() ) opt << "cache=" + device.Get_Cache(); // AIO if( device.Use_AIO() ) opt << "aio=" + device.Get_AIO(); // Boot if( device.Use_Boot() ) { if( device.Get_Boot() ) opt << "boot=on"; else opt << "boot=off"; } // Create complete drive string QString driveStr = ""; for( int ox = 0; ox < opt.count(); ++ox ) { driveStr += opt[ox] + ((ox < opt.count() -1) ? "," : ""); } // return QStringList args; args << "-drive" << driveStr; return args; } QStringList Virtual_Machine::Build_Shared_Folder_Args( VM_Shared_Folder folder, int id, bool Build_QEMU_Args_for_Script_Mode ) { QStringList opt; QString path = folder.Get_Folder(); // -virtfs fsdriver,id=[id],path=[path to share],security_model=[mapped|passthrough|none][,writeout=writeout][,readonly] // [,socket=socket|sock_fd=sock_fd],mount_tag=[mount tag] opt << "-virtfs"; QStringList virtfs; QString driver = "local"; virtfs << driver+",id="+QString("shared_folder_dev_")+QString::number(id); virtfs << "path="+path; virtfs << "security_model=none"; virtfs << "mount_tag=shared"+QString::number(id); opt << virtfs.join(","); return opt; } bool Virtual_Machine::Start() { delete QEMU_Error_Win; QEMU_Error_Win = new Error_Log_Window(); // Check KVM if( (Current_Emulator_Devices.PSO_KVM || Current_Emulator_Devices.PSO_Enable_KVM ) && Settings.value("Disable_KVM_Module_Check", "no").toString() != "yes" ) { QProcess lsmod; lsmod.start( "lsmod" ); if( ! lsmod.waitForFinished(1000) ) { AQError( "bool Virtual_Machine::Start()", "lsmod not finished!" ); } else { QString all_mod = lsmod.readAll(); if( all_mod.isEmpty() ) { AQError( "bool Virtual_Machine::Start()", "all_mod is empty!" ); } else { bool kvm_ok = false; // Version Using - QRegExp kvm_intel_mod = QRegExp( "*kvm-intel*" ); kvm_intel_mod.setPatternSyntax( QRegExp::Wildcard ); QRegExp kvm_amd_mod = QRegExp( "*kvm-amd*" ); kvm_amd_mod.setPatternSyntax( QRegExp::Wildcard ); if( kvm_intel_mod.exactMatch(all_mod) ) kvm_ok = true; else if( kvm_amd_mod.exactMatch(all_mod) ) kvm_ok = true; // Version Using _ kvm_intel_mod = QRegExp( "*kvm_intel*" ); kvm_intel_mod.setPatternSyntax( QRegExp::Wildcard ); kvm_amd_mod = QRegExp( "*kvm_amd*" ); kvm_amd_mod.setPatternSyntax( QRegExp::Wildcard ); if( kvm_intel_mod.exactMatch(all_mod) ) kvm_ok = true; else if( kvm_amd_mod.exactMatch(all_mod) ) kvm_ok = true; if( ! kvm_ok ) { // Module not found... KVM compiled into kernel? QProcess zcat; zcat.start( "zcat", QStringList("/proc/config.gz") ); if( ! zcat.waitForFinished(1000) ) { AQError( "bool Virtual_Machine::Start()", "zcat not finished!" ); } else { QString all_config = zcat.readAll(); if( all_config.isEmpty() ) { AQError( "bool Virtual_Machine::Start()", "all_config is empty!" ); } else { QRegExp kvm_intel_conf = QRegExp( "*CONFIG_KVM_INTEL=y*" ); kvm_intel_conf.setPatternSyntax( QRegExp::Wildcard ); if( kvm_intel_conf.exactMatch(all_config) ) kvm_ok = true; else { QRegExp kvm_amd_conf = QRegExp( "*CONFIG_KVM_AMD=y*" ); kvm_amd_conf.setPatternSyntax( QRegExp::Wildcard ); if( kvm_amd_conf.exactMatch(all_config) ) kvm_ok = true; } } } } if( ! kvm_ok ) { int retVal = QMessageBox::question( NULL, tr("Error!"), tr("KVM Kernel Module Not Loaded!\n" "To load this Module, Enter in Terminal with root privileges: \"modprobe kvm-intel\". " "Or If Use AMD Processor: \"modprobe kvm-amd\".\nIgnore This Error?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll, QMessageBox::No ); if( retVal == QMessageBox::No ) { Start_Snapshot_Tag = ""; return false; } else if( retVal == QMessageBox::YesToAll ) { Settings.setValue( "Disable_KVM_Module_Check", "yes" ); } } else { AQDebug( "bool Virtual_Machine::Start()", "OK. KVM Kernel Module Loaded" ); } } } } // QEMU Audio Environment if( Settings.value("QEMU_AUDIO/Use_Default_Driver", "yes").toString() == "no" ) { QStringList tmp_env = QProcess::systemEnvironment(); tmp_env << "QEMU_AUDIO_DRV=" + Settings.value("QEMU_AUDIO/QEMU_AUDIO_DRV", "alsa").toString(); QEMU_Process->setEnvironment( tmp_env ); } // User Args Only if( Use_User_Emulator_Binary && Only_User_Args ) { QStringList tmp_list = this->Build_QEMU_Args(); if( tmp_list.count() < 1 ) { AQError( "bool Virtual_Machine::Start()", "Cannot Start! Args is Empty!" ); } else { QString bin_name = tmp_list.takeAt( 0 ); QEMU_Process->start( bin_name, tmp_list ); } } else { // Get bin path QMap bin_list = Current_Emulator.Get_Binary_Files(); QString find_name = Current_Emulator_Devices.System.QEMU_Name; QString bin_path = ""; for( QMap::const_iterator iter = bin_list.constBegin(); iter != bin_list.constEnd(); iter++ ) { if( iter.key() == find_name || (find_name == "qemu-system-x86" && iter.key() == "qemu")) // FIXME { bin_path = iter.value(); break; } } // Check path if( bin_path.isEmpty() ) { AQGraphic_Error( "bool Virtual_Machine::Start()", tr("Error!"), tr("Cannot start emulator! Binary path is empty!"), false ); Start_Snapshot_Tag = ""; return false; } if( ! QFile::exists(bin_path) ) { AQGraphic_Error( "bool Virtual_Machine::Start()", tr("Error!"), tr("Emulator binary not exists! Check path: %1").arg(bin_path), false ); Start_Snapshot_Tag = ""; return false; } // Add VM USB devices to used USB list if( USB_Ports.count() > 0 ) { foreach( VM_USB usb_dev, USB_Ports ) System_Info::Add_To_Used_USB_List( usb_dev ); } QEMU_Process->start( bin_path, this->Build_QEMU_Args() ); } // Do NOT Start CPU if( ! Start_CPU ) Set_State( VM::VMS_Pause ); // VNC Password if( VNC && VNC_Password ) { Execute_Emu_Ctl_Command( "change vnc password" ); } if( Load_Mode ) { connect( this, SIGNAL(Ready_StdOut(const QString&)), this, SLOT(Started_Booting(const QString&)) ); Send_Emulator_Command( "info vnc\n" ); } // Init Emulator Control Window if( Emu_Ctl->First_Start == false ) { delete Emu_Ctl; Emu_Ctl = new Emulator_Control_Window(); QObject::connect( Emu_Ctl, SIGNAL(Ready_Read_Command(QString)), this, SLOT(Execute_Emu_Ctl_Command(QString)) ); } Emu_Ctl->Use_Minimal_Size( true ); Emu_Ctl->Set_Current_VM( this ); Emu_Ctl->Init(); // Show vm loading window? if( Start_Snapshot_Tag.isEmpty() == false || State == VM::VMS_Saved ) { Show_VM_Load_Window(); } return true; } void Virtual_Machine::Pause() { switch( State ) { case VM::VMS_Pause: Send_Emulator_Command( "c\n" ); Set_State( VM::VMS_Running ); break; case VM::VMS_Running: Send_Emulator_Command( "stop\n" ); Set_State( VM::VMS_Pause ); break; default: AQDebug( "void Virtual_Machine::Pause()", "Default Section!" ); break; } } void Virtual_Machine::Stop() { if( State == VM::VMS_Saved ) Set_State( VM::VMS_Power_Off, true ); else Send_Emulator_Command( "quit\n" ); } void Virtual_Machine::Reset() { if( State == VM::VMS_Saved ) { Start_Snapshot_Tag = ""; Set_State( VM::VMS_Power_Off, true ); Start(); } else { Send_Emulator_Command( "system_reset\n" ); } } void Virtual_Machine::Save_VM_State() { Save_VM_State( "aqemu_save", true ); } void Virtual_Machine::Save_VM_State( const QString &tag, bool quit ) { Show_VM_Save_Window(); Quit_Before_Save = quit; if( Settings.value("Use_Screenshot_for_OS_Logo", "yes").toString() == "yes" ) { QString scrn_file = Settings.value( "VM_Directory", "~" ).toString() + Get_FS_Compatible_VM_Name( Machine_Name ); if( Take_Screenshot(scrn_file, 64, 64) ) Screenshot_Path = scrn_file; } Send_Emulator_Command( qPrintable("savevm " + tag + "\n") ); connect( this, SIGNAL(Ready_StdOut(const QString&)), this, SLOT(Suspend_Finished(const QString&)) ); } void Virtual_Machine::Load_VM_State( const QString &tag ) { Show_VM_Load_Window(); connect( this, SIGNAL(Ready_StdOut(const QString&)), this, SLOT(Resume_Finished(const QString&)) ); Send_Emulator_Command( qPrintable("loadvm " + tag + "\n") ); } bool Virtual_Machine::Start_Snapshot( const QString &tag ) { Start_Snapshot_Tag = tag; return Start(); } void Virtual_Machine::Delete_Snapshot( const QString &tag ) { Send_Emulator_Command( qPrintable("delvm " + tag + "\n") ); } const QString &Virtual_Machine::Get_UID() const { return UID; } void Virtual_Machine::Set_UID( const QString &uid ) { UID = uid; } void Virtual_Machine::Show_Emu_Ctl_Win() { Emu_Ctl->show(); Emu_Ctl->raise(); Emu_Ctl->activateWindow(); } void Virtual_Machine::Hide_Emu_Ctl_Win() { Emu_Ctl->Set_Show_Close_Warning( false ); Emu_Ctl->close(); } void Virtual_Machine::Update_Removable_Devices_List() { Removable_Devices_List.clear(); Update_Removable_Devices_Mode = true; Send_Emulator_Command( "info block\n" ); } const QString &Virtual_Machine::Get_Removable_Devices_List() const { return Removable_Devices_List; } void Virtual_Machine::Show_Error_Log_Window() { if ( ! QEMU_Error_Win ) QEMU_Error_Win = new Error_Log_Window(); QEMU_Error_Win->setWindowTitle( tr("QEMU Error Log") + " (" + Machine_Name + ")" ); QEMU_Error_Win->show(); } void Virtual_Machine::Show_QEMU_Error( const QString &err_str ) { if ( err_str.simplified().isEmpty() ) return; if ( ! QEMU_Error_Win ) QEMU_Error_Win = new Error_Log_Window(); QEMU_Error_Win->Add_to_Log( err_str ); if( Settings.value( "No_Show_Error_Log_Forever", "no" ).toString() == "yes" || QEMU_Error_Win->No_Show_Before_AQEMU_Restart() == true || QEMU_Error_Win->No_Show_Before_VM_Restart() == true || QEMU_Error_Win->No_Show_Deprecated_Options_Error() == true ) { AQDebug( "void Virtual_Machine::Show_QEMU_Error( const QString &err_str )", "Error Log Window Not Shown" ); return; } else { Show_Error_Log_Window(); } } void Virtual_Machine::Hide_QEMU_Error_Log() { if ( QEMU_Error_Win ) { QEMU_Error_Win->close(); } } void Virtual_Machine::Show_VM_Load_Window() { QDesktopWidget *des_widget = new QDesktopWidget(); QRect re = des_widget->screenGeometry( des_widget->primaryScreen() ); Load_VM_Window = new QWidget(); QLabel *load_label; Load_VM_Window->setWindowTitle( tr("Loading...") ); load_label = new QLabel( tr("Loading Virtual Machine. Please wait...") ); QHBoxLayout *h_layout = new QHBoxLayout(); h_layout->addWidget( load_label ); Load_VM_Window->setLayout( h_layout ); Load_VM_Window->move( re.height() / 2, re.width() / 2 ); Load_VM_Window->show(); } void Virtual_Machine::Hide_VM_Load_Window() { if( ! Dont_Reinit ) { AQDebug( "void Virtual_Machine::Hide_VM_Load_Window()", "emit Loading_Complete()" ); //emit Loading_Complete(); } if ( Load_VM_Window ) { Load_VM_Window->close(); delete Load_VM_Window; } } void Virtual_Machine::Show_VM_Save_Window() { QDesktopWidget *des_widget = new QDesktopWidget(); QRect re = des_widget->screenGeometry( des_widget->primaryScreen() ); //Load_VM_Window = new QWidget(); Save_VM_Window = new QWidget(); QLabel *save_label; Save_VM_Window->setWindowTitle( tr("Saving...") ); save_label = new QLabel( tr("Saving Virtual Machine. Please wait...") ); QHBoxLayout *h_layout = new QHBoxLayout(); h_layout->addWidget( save_label ); Save_VM_Window->setLayout( h_layout ); Save_VM_Window->move( re.height() / 2, re.width() / 2 ); Save_VM_Window->show(); } void Virtual_Machine::Hide_VM_Save_Window() { if ( Save_VM_Window ) { Save_VM_Window->close(); delete Save_VM_Window; } } bool Virtual_Machine::Take_Screenshot( const QString &file_name, int width, int height ) { if( ! (State == VM::VMS_Running || State == VM::VMS_Pause) ) { AQError( "bool Virtual_Machine::Take_Screenshot( const QString &file_name, int width, int height )", "VM Not Running, Cannot Create Screenshot!" ); return false; } Execute_Emu_Ctl_Command( "screendump \"" + file_name + "\"" ); #ifdef Q_OS_WIN32 Sleep( 100 ); #else QTest::qWait( 100 ); #endif QImage im = QImage(); bool load_ok = false; // Time for creating screenshot for( int wx = 0; wx < 10; ++wx ) { if( im.load(file_name) ) { load_ok = true; break; } #ifdef Q_OS_WIN32 Sleep( 100 ); #else QTest::qWait( 100 ); #endif } // Loading Complete? if( load_ok == false) { AQError( "bool Virtual_Machine::Take_Screenshot( const QString &file_name, int width, int height )", "Cannot Load Screenshot File!" ); return false; } // delete tmp file if( ! QFile::remove(file_name) ) { AQError( "bool Virtual_Machine::Take_Screenshot( const QString &file_name, int width, int height )", "Cannot Remove Temp Screenshot File!" ); return false; } // Default save format QString fmt = Settings.value( "Screenshot_Save_Format", "PNG" ).toString(); // OS Icon Mode? if( width > 0 && height > 0 ) { im = im.scaled( width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation ); fmt = "PNG"; // 64x64 Mode QImage im2 = QImage( width, height, QImage::Format_ARGB32 ); im2.fill( Qt::transparent ); QSize ms = im2.size() - im.size(); ms /= 2; QPainter myp; myp.begin( &im2 ); myp.drawImage( QPoint(ms.width(),ms.height()), im ); myp.end(); im = im2; } bool save_ok = false; if( fmt == "JPEG" ) save_ok = im.save( file_name, fmt.toLatin1(), Settings.value("Jpeg_Quality", 75).toInt() ); else save_ok = im.save( file_name, fmt.toLatin1() ); if( save_ok ) { return true; } else { AQError( "bool Virtual_Machine::Take_Screenshot( const QString &file_name, int width, int height )", "Cannot Save Image!" ); return false; } } VM::Machine_Accelerator Virtual_Machine::Get_Machine_Accelerator() const { return Machine_Accelerator; } void Virtual_Machine::Set_Machine_Accelerator( VM::Machine_Accelerator accel ) { Machine_Accelerator = accel; } const Emulator &Virtual_Machine::Get_Emulator() const { return Current_Emulator; } void Virtual_Machine::Set_Emulator( const Emulator &emul ) { Current_Emulator = emul; Update_Current_Emulator_Devices(); } void Virtual_Machine::Update_Current_Emulator_Devices() { // Apply Emulator Devices List if( Current_Emulator.Get_Force_Version() || Current_Emulator.Get_Check_Version() ) { switch( Current_Emulator.Get_Version() ) { case VM::QEMU_2_0: Current_Emulator_Devices = System_Info::Emulator_QEMU_2_0[ Computer_Type ]; break; /* case VM::KVM_2_0: Current_Emulator_Devices = System_Info::Emulator_KVM_2_0[ Computer_Type ]; break; */ //tobgle //FIXME? default: AQError( "void Update_Current_Emulator_Devices()", "Emulator Version Invalid!" ); break; } } else { Current_Emulator_Devices = Current_Emulator.Get_Devices()[ Computer_Type ]; } // Loading Info Complete? if( Current_Emulator_Devices.System.QEMU_Name.isEmpty() ) { AQError( "void Update_Current_Emulator_Devices()", "Cannot Load Info About This Emulator! AQEMU Doesn't Work!" ); } } const Available_Devices *Virtual_Machine::Get_Current_Emulator_Devices() const { if( Current_Emulator_Devices.System.QEMU_Name.isEmpty() ) { AQError( "const Virtual_Machine::Available_Devices *Get_Current_Emulator_Devices() const", "Cannot get valid devices!" ); return new Available_Devices(); } return &Current_Emulator_Devices; } QString Virtual_Machine::Get_Current_Emulator_Binary_Path( const QString &names ) const { QMap bin_list = Current_Emulator.Get_Binary_Files(); QStringList nl = names.split( " ", QString::SkipEmptyParts ); if( bin_list.count() <= 0 || nl.count() <= 0 ) { AQError( "QString Virtual_Machine::Get_Current_Emulator_Binary_Path( const QString &names ) const", "bin_list.count() <= 0 || nl.count() <= 0" ); return ""; } for( QMap::const_iterator iter = bin_list.constBegin(); iter != bin_list.constEnd(); iter++ ) { for( int fx = 0; fx < nl.count(); fx++ ) { if( iter.key() == nl[fx] ) return iter.value(); } } return ""; } VM::VM_State Virtual_Machine::Get_State() const { return State; } QString Virtual_Machine::Get_State_Text() const { switch (State) { case VM::VMS_Running: return tr("Running"); case VM::VMS_Power_Off: return tr("Power Off"); case VM::VMS_Pause: return tr("Pause"); case VM::VMS_Saved: return tr("Saved"); default: return tr("Error!"); } } void Virtual_Machine::Set_State( VM::VM_State s, bool real_poewer_off ) { if( State == VM::VMS_Saved && s == VM::VMS_Power_Off ) { if( ! real_poewer_off ) return; } Old_State = State; State = s; emit State_Changed( this, State ); } const QString &Virtual_Machine::Get_Machine_Name() const { return Machine_Name; } void Virtual_Machine::Set_Machine_Name( const QString &name ) { if( name.isEmpty() ) AQError( "void Virtual_Machine::Set_Machine_Name( const QString &name )", "File name is empty!" ); else Machine_Name = name; } const QString &Virtual_Machine::Get_Icon_Path() const { return Icon_Path; } void Virtual_Machine::Set_Icon_Path( const QString &file_name ) { if( file_name.isEmpty() ) AQError( "void Virtual_Machine::Set_Icon_Path( const QString &file_name )", "File name is empty!" ); else Icon_Path = file_name; } const QString &Virtual_Machine::Get_Screenshot_Path() const { return Screenshot_Path; } void Virtual_Machine::Set_Screenshot_Path( const QString &file_name ) { Screenshot_Path = file_name; } bool Virtual_Machine::Get_Remove_RAM_Size_Limitation() const { return Remove_RAM_Size_Limitation; } void Virtual_Machine::Set_Remove_RAM_Size_Limitation( bool on ) { Remove_RAM_Size_Limitation = on; } int Virtual_Machine::Get_Memory_Size() const { return Memory_Size; } void Virtual_Machine::Set_Memory_Size( int megs ) { if( megs > 0 ) Memory_Size = megs; else { AQError( "void Virtual_Machine::Set_Memory_Size( int megs )", "Memory size " + QString::number(megs) + " invalid!" ); } } const QString &Virtual_Machine::Get_Computer_Type() const { return Computer_Type; } void Virtual_Machine::Set_Computer_Type( const QString &type ) { Computer_Type = type; } const QString &Virtual_Machine::Get_Machine_Type() const { return Machine_Type; } void Virtual_Machine::Set_Machine_Type( const QString &type ) { Machine_Type = type; } const QString &Virtual_Machine::Get_CPU_Type() const { return CPU_Type; } void Virtual_Machine::Set_CPU_Type( const QString &type ) { CPU_Type = type; } VM::SMP_Options Virtual_Machine::Get_SMP() const { return SMP; } void Virtual_Machine::Set_SMP( const VM::SMP_Options &smp ) { SMP = smp; } int Virtual_Machine::Get_SMP_CPU_Count() const { return SMP.SMP_Count; } void Virtual_Machine::Set_SMP_CPU_Count( int count ) { SMP.SMP_Count = count; } const QString &Virtual_Machine::Get_Keyboard_Layout() const { return Keyboard_Layout; } void Virtual_Machine::Set_Keyboard_Layout( const QString &kl ) { Keyboard_Layout = kl; } VM::Sound_Cards Virtual_Machine::Get_Audio_Cards() const { return Audio_Card; } void Virtual_Machine::Set_Audio_Cards( VM::Sound_Cards card ) { Audio_Card = card; } const QString &Virtual_Machine::Get_Video_Card() const { return Video_Card; } void Virtual_Machine::Set_Video_Card( const QString &card ) { Video_Card = card; } VM::Acseleration_Mode Virtual_Machine::Get_KQEMU_Mode() const { return KQEMU_Mode; } void Virtual_Machine::Set_KQEMU_Mode( VM::Acseleration_Mode mode ) { KQEMU_Mode = mode; } const QString &Virtual_Machine::Get_Additional_Args() const { return Additional_Args; } void Virtual_Machine::Set_Additional_Args( const QString &aa ) { Additional_Args = aa; } bool Virtual_Machine::Get_Only_User_Args() const { return Only_User_Args; } void Virtual_Machine::Set_Only_User_Args( bool use ) { Only_User_Args = use; } bool Virtual_Machine::Get_Use_User_Emulator_Binary() const { return Use_User_Emulator_Binary; } void Virtual_Machine::Set_Use_User_Emulator_Binary( bool use ) { Use_User_Emulator_Binary = use; } const QList &Virtual_Machine::Get_Boot_Order_List() const { return Boot_Order_List; } void Virtual_Machine::Set_Boot_Order_List( QList &list ) { Boot_Order_List = list; } bool Virtual_Machine::Get_Show_Boot_Menu() const { return Show_Boot_Menu; } void Virtual_Machine::Set_Show_Boot_Menu( bool use ) { Show_Boot_Menu = use; } bool Virtual_Machine::Use_Fullscreen_Mode() const { return Fullscreen; } void Virtual_Machine::Use_Fullscreen_Mode( bool use ) { Fullscreen = use; } bool Virtual_Machine::Use_ACPI() const { return ACPI; } void Virtual_Machine::Use_ACPI( bool use ) { ACPI = use; } bool Virtual_Machine::Use_Local_Time() const { return Local_Time; } void Virtual_Machine::Use_Local_Time( bool use ) { Local_Time = use; } bool Virtual_Machine::Use_Snapshot_Mode() const { return Snapshot_Mode; } void Virtual_Machine::Use_Snapshot_Mode( bool use ) { Snapshot_Mode = use; } bool Virtual_Machine::Use_Win2K_Hack() const { return Win2K_Hack; } void Virtual_Machine::Use_Win2K_Hack( bool use ) { Win2K_Hack = use; } bool Virtual_Machine::Use_Start_CPU() const { return Start_CPU; } void Virtual_Machine::Use_Start_CPU( bool start ) { Start_CPU = start; } bool Virtual_Machine::Use_No_Reboot() const { return No_Reboot; } void Virtual_Machine::Use_No_Reboot( bool use ) { No_Reboot = use; } bool Virtual_Machine::Use_No_Shutdown() const { return No_Shutdown; } void Virtual_Machine::Use_No_Shutdown( bool use ) { No_Shutdown = use; } bool Virtual_Machine::Use_Check_FDD_Boot_Sector() const { return Check_FDD_Boot_Sector; } void Virtual_Machine::Use_Check_FDD_Boot_Sector( bool use ) { Check_FDD_Boot_Sector = use; } const VM_Storage_Device &Virtual_Machine::Get_FD0() const { return FD0; } void Virtual_Machine::Set_FD0( const VM_Storage_Device &floppy ) { FD0 = floppy; } const VM_Storage_Device &Virtual_Machine::Get_FD1() const { return FD1; } void Virtual_Machine::Set_FD1( const VM_Storage_Device &floppy ) { FD1 = floppy; } const VM_Storage_Device &Virtual_Machine::Get_CD_ROM() const { return CD_ROM; } void Virtual_Machine::Set_CD_ROM( const VM_Storage_Device &cdrom ) { CD_ROM = cdrom; } const VM_HDD &Virtual_Machine::Get_HDA() const { return HDA; } void Virtual_Machine::Set_HDA( const VM_HDD &hdd ) { HDA = hdd; } const VM_HDD &Virtual_Machine::Get_HDB() const { return HDB; } void Virtual_Machine::Set_HDB( const VM_HDD &hdd ) { HDB = hdd; } const VM_HDD &Virtual_Machine::Get_HDC() const { return HDC; } void Virtual_Machine::Set_HDC( const VM_HDD &hdd ) { HDC = hdd; } const VM_HDD &Virtual_Machine::Get_HDD() const { return HDD; } void Virtual_Machine::Set_HDD( const VM_HDD &hdd ) { HDD = hdd; } const QList &Virtual_Machine::Get_Snapshots() const { return Snapshots; } void Virtual_Machine::Set_Snapshots( const QList &list ) { Snapshots.clear(); for( int sx = 0; sx < list.count(); ++sx ) { Snapshots.append( VM_Snapshot(list[sx]) ); } } void Virtual_Machine::Add_Snapshot( const QString &tag, const QString &name, const QString &desc ) { VM_Snapshot tmp; tmp.Set_Tag( tag ); tmp.Set_Name( name ); tmp.Set_Description( desc ); Snapshots.append( tmp ); } void Virtual_Machine::Add_Snapshot( const VM_Snapshot &snapshot ) { Snapshots.append( VM_Snapshot(snapshot) ); } void Virtual_Machine::Set_Snapshot( int index, const VM_Snapshot &s ) { if( index >= 0 && index < Snapshots.count() ) { Snapshots[ index ] = VM_Snapshot( s ); } else { AQError( "void Virtual_Machine::Set_Snapshot( int index, const VM_Snapshot &s )", "Index == " + QString::number(index) ); } } const QList &Virtual_Machine::Get_Storage_Devices_List() const { return Storage_Devices; } const QList &Virtual_Machine::Get_Shared_Folders_List() const { return Shared_Folders; } void Virtual_Machine::Set_Storage_Devices_List( const QList &list ) { Storage_Devices.clear(); for( int ix = 0; ix < list.count(); ++ix ) { Storage_Devices.append( VM_Nativ_Storage_Device(list[ix]) ); } } void Virtual_Machine::Set_Shared_Folders_List( const QList &list ) { Shared_Folders.clear(); for( int ix = 0; ix < list.count(); ++ix ) { Shared_Folders.append( VM_Shared_Folder(list[ix]) ); } } const VM_Nativ_Storage_Device &Virtual_Machine::Get_Storage_Device( int index ) const { if( index < 0 || index > Storage_Devices.count() ) { // FIXME message VM_Nativ_Storage_Device *empty_dev = new VM_Nativ_Storage_Device(); return *empty_dev; } return Storage_Devices[ index ]; } void Virtual_Machine::Set_Storage_Device( int index, const VM_Nativ_Storage_Device &device ) { if( index < 0 || index > Storage_Devices.count() ) { // FIXME message return; } Storage_Devices[ index ] = device; } const QString &Virtual_Machine::Get_SMB_Directory() const { return SMB_Directory; } void Virtual_Machine::Set_SMB_Directory( const QString &dir ) { SMB_Directory = dir; } const QString &Virtual_Machine::Get_TFTP_Prefix() const { return TFTP_Prefix; } void Virtual_Machine::Set_TFTP_Prefix( const QString &p ) { TFTP_Prefix = p; } const QList &Virtual_Machine::Get_Network_Cards() const { return Network_Cards; } void Virtual_Machine::Set_Network_Cards( const QList &cards ) { Network_Cards = cards; } const QList &Virtual_Machine::Get_Network_Cards_Nativ() const { return Network_Cards_Nativ; } void Virtual_Machine::Set_Network_Cards_Nativ( const QList &cards ) { Network_Cards_Nativ = cards; } const VM_Net_Card &Virtual_Machine::Get_Network_Card( int index ) const { if( index >= 0 && index < Network_Cards.count() ) { return Network_Cards[ index ]; } else { AQError( "VM_Net_Card *Virtual_Machine::Get_Network_Card( int index ) const", "Invalid Index!" ); return *(new VM_Net_Card()); } } void Virtual_Machine::Set_VM_Network_Card( int index, const VM_Net_Card &nc ) { if( index >= 0 && index <= 8 && index < Network_Cards.count() ) { Network_Cards[ index ] = nc; } else { AQError( "void Virtual_Machine::Set_VM_Network_Card( int index, VM_Net_Card *nc )", "Invalid Index!" ); } } bool Virtual_Machine::Add_Network_Card( const VM_Net_Card &nc ) { if( Network_Cards.count() < 9 ) { Network_Cards.append( VM_Net_Card(nc) ); return true; } else { return false; } } bool Virtual_Machine::Delete_Network_Card( int ix ) { if( ix >= 0 && ix <= 8 ) { Network_Cards.removeAt( ix ); return true; } else { return false; } } void Virtual_Machine::Clear_Network_Cards_List() { Network_Cards.clear(); } int Virtual_Machine::Get_Network_Cards_Count() const { return Network_Cards.count(); } const VM_Redirection &Virtual_Machine::Get_Network_Redirection( int index ) const { if( index >= 0 && index < Network_Redirections.count() ) { return Network_Redirections[ index ]; } else { AQError( "VM_Redirection *Virtual_Machine::Get_Network_Redirection( int index ) const", "Invalid Index!" ); return *(new VM_Redirection()); } } void Virtual_Machine::Set_Network_Redirection( int index, const VM_Redirection &r ) { if( index >= 0 && index < Network_Redirections.count() ) { Network_Redirections[ index ] = r; } else { AQError( "void Virtual_Machine::Set_Network_Redirection( int index, VM_Redirection *r )", "Invalid Index!" ); } } void Virtual_Machine::Add_Network_Redirection( const VM_Redirection &r ) { Network_Redirections.append( VM_Redirection(r) ); } bool Virtual_Machine::Delete_Network_Redirection( int ix ) { if( ix >= 0 && ix < Network_Redirections.count() ) { Network_Redirections.removeAt( ix ); return true; } else { return false; } } int Virtual_Machine::Get_Network_Redirections_Count() const { return Network_Redirections.count(); } bool Virtual_Machine::Get_Use_Network() const { return Use_Network; } void Virtual_Machine::Set_Use_Network( bool use ) { Use_Network = use; } bool Virtual_Machine::Use_Nativ_Network() const { return Nativ_Network; } void Virtual_Machine::Use_Nativ_Network( bool use ) { Nativ_Network = use; } bool Virtual_Machine::Get_Use_Redirections() const { return Use_Redirections; } void Virtual_Machine::Set_Use_Redirections( bool r ) { Use_Redirections = r; } const QList &Virtual_Machine::Get_Serial_Ports() const { return Serial_Ports; } void Virtual_Machine::Set_Serial_Ports( const QList &list ) { Serial_Ports = list; } const QList &Virtual_Machine::Get_Parallel_Ports() const { return Parallel_Ports; } void Virtual_Machine::Set_Parallel_Ports( const QList &list ) { Parallel_Ports = list; } /* // FIXME WARNING! THIS FUNCTION INCOMPLETE QString Virtual_Machine::Get_USB_Bus_Address( const QString &id ) { // Find Device Name by vendor_id:device_id Send_Emulator_Command( "info usbhost\n" ); QTest::qSleep(200); QString info_usbhost_res = QEMU_Process->readAll(); if( info_usbhost_res.isEmpty() ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "info_usbhost_res.isEmpty()" ); return ""; } QStringList usbhost_dev_list = info_usbhost_res.split( "\n", QString::SkipEmptyParts ); AQWarning( "IW", "Data: " + info_usbhost_res ); AQWarning( "IW", "End" ); if( usbhost_dev_list.count() <= 0 ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "usbhost_dev_list.count() <= 0" ); return ""; } // Valid String is: "Class 00: USB device ab12:34cd, USB UPS" QRegExp usbhost_dev_reg = QRegExp( ".+([\\da-fA-F]{,4}:[\\da-fA-F]{,4}),\\s+(.+)" ); QString dev_name = ""; for( int ix = 0; ix < usbhost_dev_list.count(); ++ix ) { if( ! usbhost_dev_reg.exactMatch(usbhost_dev_list[ix]) ) { AQDebug( "CM1", usbhost_dev_list[ix] ); continue; } QStringList info_lines = usbhost_dev_reg.capturedTexts(); if( info_lines.count() <= 1 ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "info_lines.count() <= 1" ); return ""; } // info_lines[1] == ab12:34cd // info_lines[2] == USB UPS if( info_lines[1] == id ) { dev_name = info_lines[2]; break; } } if( dev_name.isEmpty() ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "dev_name.isEmpty()" ); return ""; } AQWarning( "id == " + id, "name == " + dev_name ); // Find Bus.Address by Device Name Send_Emulator_Command( "info usb\n" ); QTest::qSleep(200); QString info_usb_res = QEMU_Process->readAll(); if( info_usb_res.isEmpty() ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "info_usb_res is Empty" ); return ""; } QStringList usb_dev_list = info_usb_res.split( "\n", QString::SkipEmptyParts ); if( usb_dev_list.count() <= 0 ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "usb_dev_list.count() <= 0" ); return ""; } // Valid String is: "Device 0.0, Speed 1.5 Mb/s, Product USB UPS" QRegExp usb_dev_reg = QRegExp( "\\s*Device\\s+([\\d]+[.][\\d]+),\\s+Speed\\s+[\\d]+[.][\\d]+\\sMb/s,\\sProduct\\s+(.+)" ); for( int ix = 0; ix < usb_dev_list.count(); ++ix ) { if( ! usb_dev_reg.exactMatch(usb_dev_list[ix]) ) { AQDebug( "CM2", usb_dev_list[ix] ); continue; } QStringList info_lines = usb_dev_reg.capturedTexts(); if( info_lines.count() <= 1 ) { AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "info_lines.count() <= 1" ); return ""; } // info_lines[1] == 0.0 // info_lines[2] == USB UPS if( info_lines[2] == dev_name ) { AQDebug( "Found: ", info_lines[ 1 ] ); return info_lines[ 1 ]; // OK. This is Bus.Adr } } AQError( "QString Virtual_Machine::Get_USB_Bus_Address( const QString &id )", "Not Found!" ); return ""; } bool Virtual_Machine::Use_USB_Hub() const { return USB_Hub; } void Virtual_Machine::Use_USB_Hub( bool use ) { USB_Hub = use; } int Virtual_Machine::Get_USB_Ports_Count() const { return USB_Ports.count(); } const VM_USB &Virtual_Machine::Get_USB_Port( int index ) const { if( index >= 0 && index < USB_Ports.count() ) { return USB_Ports[ index ]; } else { AQError( "VM_USB *Virtual_Machine::Get_USB_Port( int index ) const", "Index Invalid!" ); return *(new VM_USB()); } } void Virtual_Machine::Set_USB_Port( int index, const VM_USB &u ) { if( index >= 0 && index < USB_Ports.count() ) { USB_Ports[ index ] = VM_USB( u ); } } */ void Virtual_Machine::Add_USB_Port( const VM_USB &u ) { USB_Ports.append( VM_USB(u) ); } bool Virtual_Machine::Delete_USB_Port( int index ) { if( index >= 0 && index < USB_Ports.count() ) { USB_Ports.removeAt( index ); return true; } else { return false; } } const QList &Virtual_Machine::Get_USB_Ports() const { return USB_Ports; } void Virtual_Machine::Set_USB_Ports( const QList &list ) { USB_Ports.clear(); for( int ix = 0; ix < list.count(); ++ix ) { USB_Ports.append( VM_USB(list[ix]) ); } } bool Virtual_Machine::Get_Use_Linux_Boot() const { return Linux_Boot; } void Virtual_Machine::Set_Use_Linux_Boot( bool use ) { Linux_Boot = use; } const QString &Virtual_Machine::Get_bzImage_Path() const { return bzImage_Path; } void Virtual_Machine::Set_bzImage_Path( const QString &path ) { bzImage_Path = path; } const QString &Virtual_Machine::Get_Initrd_Path() const { return Initrd_Path; } void Virtual_Machine::Set_Initrd_Path( const QString &path ) { Initrd_Path = path; } const QString &Virtual_Machine::Get_Kernel_ComLine() const { return Kernel_ComLine; } void Virtual_Machine::Set_Kernel_ComLine( const QString &cl ) { Kernel_ComLine = cl; } bool Virtual_Machine::Get_Use_ROM_File() const { return Use_ROM_File; } void Virtual_Machine::Set_Use_ROM_File( bool use ) { Use_ROM_File = use; } const QString &Virtual_Machine::Get_ROM_File() const { return ROM_File; } void Virtual_Machine::Set_ROM_File( const QString &path ) { ROM_File = path; } bool Virtual_Machine::Use_MTDBlock_File() const { return MTDBlock; } void Virtual_Machine::Use_MTDBlock_File( bool use ) { MTDBlock = use; } const QString &Virtual_Machine::Get_MTDBlock_File() const { return MTDBlock_File; } void Virtual_Machine::Set_MTDBlock_File( const QString &file ) { MTDBlock_File = file; } bool Virtual_Machine::Use_SecureDigital_File() const { return SecureDigital; } void Virtual_Machine::Use_SecureDigital_File( bool use ) { SecureDigital = use; } const QString &Virtual_Machine::Get_SecureDigital_File() const { return SecureDigital_File; } void Virtual_Machine::Set_SecureDigital_File( const QString &file ) { SecureDigital_File = file; } bool Virtual_Machine::Use_PFlash_File() const { return PFlash; } void Virtual_Machine::Use_PFlash_File( bool use ) { PFlash = use; } const QString &Virtual_Machine::Get_PFlash_File() const { return PFlash_File; } void Virtual_Machine::Set_PFlash_File( const QString &file ) { PFlash_File = file; } bool Virtual_Machine::Use_KVM() const { return Enable_KVM; } void Virtual_Machine::Use_KVM( bool use ) { Enable_KVM = use; } bool Virtual_Machine::Use_KVM_IRQChip() const { return KVM_IRQChip; } void Virtual_Machine::Use_KVM_IRQChip( bool use ) { KVM_IRQChip = use; } bool Virtual_Machine::Use_No_KVM_Pit() const { return No_KVM_Pit; } void Virtual_Machine::Use_No_KVM_Pit( bool use ) { No_KVM_Pit = use; } bool Virtual_Machine::Use_KVM_No_Pit_Reinjection() const { return KVM_No_Pit_Reinjection; } void Virtual_Machine::Use_KVM_No_Pit_Reinjection( bool use ) { KVM_No_Pit_Reinjection = use; } bool Virtual_Machine::Use_KVM_Nesting() const { return KVM_Nesting; } void Virtual_Machine::Use_KVM_Nesting( bool use ) { KVM_Nesting = use; } bool Virtual_Machine::Use_KVM_Shadow_Memory() const { return KVM_Shadow_Memory; } void Virtual_Machine::Use_KVM_Shadow_Memory( bool use ) { KVM_Shadow_Memory = use; } int Virtual_Machine::Get_KVM_Shadow_Memory_Size() const { return KVM_Shadow_Memory_Size; } void Virtual_Machine::Set_KVM_Shadow_Memory_Size( int size ) { KVM_Shadow_Memory_Size = size; } const VM_Init_Graphic_Mode &Virtual_Machine::Get_Init_Graphic_Mode() const { return Init_Graphic_Mode; } void Virtual_Machine::Set_Init_Graphic_Mode( const VM_Init_Graphic_Mode &mode ) { Init_Graphic_Mode = mode; } bool Virtual_Machine::Use_No_Frame() const { return No_Frame; } void Virtual_Machine::Use_No_Frame( bool use ) { No_Frame = use; } bool Virtual_Machine::Use_Alt_Grab() const { return Alt_Grab; } void Virtual_Machine::Use_Alt_Grab( bool use ) { Alt_Grab = use; } bool Virtual_Machine::Use_No_Quit() const { return No_Quit; } void Virtual_Machine::Use_No_Quit( bool use ) { No_Quit = use; } bool Virtual_Machine::Use_Portrait() const { return Portrait; } void Virtual_Machine::Use_Portrait( bool use ) { Portrait = use; } bool Virtual_Machine::Use_Show_Cursor() const { return Show_Cursor; } void Virtual_Machine::Use_Show_Cursor( bool use ) { Show_Cursor = use; } bool Virtual_Machine::Use_Curses() const { return Curses; } void Virtual_Machine::Use_Curses( bool use ) { Curses = use; } bool Virtual_Machine::Use_RTC_TD_Hack() const { return RTC_TD_Hack; } void Virtual_Machine::Use_RTC_TD_Hack( bool use ) { RTC_TD_Hack = use; } bool Virtual_Machine::Use_Start_Date() const { return Start_Date; } void Virtual_Machine::Use_Start_Date( bool use ) { Start_Date = use; } const QDateTime &Virtual_Machine::Get_Start_Date() const { return Start_DateTime; } void Virtual_Machine::Set_Start_Date( const QDateTime &dt ) { Start_DateTime = dt; } const VM_SPICE &Virtual_Machine::Get_SPICE() const { return SPICE; } void Virtual_Machine::Set_SPICE( const VM_SPICE &spice ) { SPICE = spice; } bool Virtual_Machine::Use_VNC() const { return VNC; } void Virtual_Machine::Use_VNC( bool use ) { VNC = use; } bool Virtual_Machine::Get_VNC_Socket_Mode() const { return VNC_Socket_Mode; } void Virtual_Machine::Set_VNC_Socket_Mode( bool use ) { VNC_Socket_Mode = use; } const QString &Virtual_Machine::Get_VNC_Unix_Socket_Path() const { return VNC_Unix_Socket_Path; } void Virtual_Machine::Set_VNC_Unix_Socket_Path( const QString &path ) { VNC_Unix_Socket_Path = path; } int Virtual_Machine::Get_VNC_Display_Number() const { return VNC_Display_Number; } void Virtual_Machine::Set_VNC_Display_Number( int num ) { VNC_Display_Number = num; } bool Virtual_Machine::Use_VNC_Password() const { return VNC_Password; } void Virtual_Machine::Use_VNC_Password( bool use ) { VNC_Password = use; } void Virtual_Machine::Set_VNC_Password( const QString &pas ) { Execute_Emu_Ctl_Command( pas ); } bool Virtual_Machine::Use_VNC_TLS() const { return VNC_TLS; } void Virtual_Machine::Use_VNC_TLS( bool use ) { VNC_TLS = use; } bool Virtual_Machine::Use_VNC_x509() const { return VNC_x509; } void Virtual_Machine::Use_VNC_x509( bool use ) { VNC_x509 = use; } const QString &Virtual_Machine::Get_VNC_x509_Folder_Path() const { return VNC_x509_Folder_Path; } void Virtual_Machine::Set_VNC_x509_Folder_Path( const QString &path ) { VNC_x509_Folder_Path = path; } bool Virtual_Machine::Use_VNC_x509verify() const { return VNC_x509verify; } void Virtual_Machine::Use_VNC_x509verify( bool use ) { VNC_x509verify = use; } const QString &Virtual_Machine::Get_VNC_x509verify_Folder_Path() const { return VNC_x509verify_Folder_Path; } void Virtual_Machine::Set_VNC_x509verify_Folder_Path( const QString &path ) { VNC_x509verify_Folder_Path = path; } int Virtual_Machine::Get_Embedded_Display_Port() const { return Embedded_Display_Port; } void Virtual_Machine::Set_Embedded_Display_Port( int port ) { Embedded_Display_Port = port; } void Virtual_Machine::Parse_StdOut() { QString convOutput = ""; #ifndef Q_OS_WIN32 if( Use_Monitor_TCP == false ) convOutput = QEMU_Process->readAllStandardOutput(); else #endif convOutput = Monitor_Socket->readAll(); // For whatever reason qemu doesn't write all errors to stderr, // which means we unfortunately need to filter output to stdout // for errors. This is extremely bad design by qemu. QRegularExpression re("Option .* not supported", QRegularExpression::CaseInsensitiveOption); if ( re.match(convOutput).hasMatch() ) { Show_QEMU_Error( convOutput ); } QStringList splitOutput = convOutput.split( "" ); QString cleanOutput = splitOutput.last().remove( QRegExp("\[[KD].") ); emit Clean_Console( cleanOutput ); emit Ready_StdOut( cleanOutput ); //Last_Output.append( convOutput ); //Output_Parts = Last_Output.split( "(qemu)" ); // Find devices list? if( Update_Removable_Devices_Mode ) { if( cleanOutput.contains("(qemu) ") ) { Update_Removable_Devices_Mode = false; Removable_Devices_List += cleanOutput; emit Ready_Removable_Devices_List(); } else { Removable_Devices_List += cleanOutput; } } } void Virtual_Machine::Parse_StdErr() { // FIXME in monitor tcp mode no possible get error strings QString convOutput = QEMU_Process->readAllStandardError(); emit Clean_Console( convOutput ); emit Ready_StdErr( convOutput ); //Last_Output.append( convOutput ); Show_QEMU_Error( convOutput ); /* FIXME QStringList splitOutput = convOutput.split( "" ); if( splitOutput.last() == splitOutput.first() ) { emit Clean_Console( convOutput.trimmed() ); emit Ready_StdErr( convOutput.simplified() ); Last_Output.append( convOutput.simplified() ); } else { if( ! splitOutput.last().isEmpty() ) { QString cleanOutput = splitOutput.last().remove( QRegExp("\[[KD].") ); emit Clean_Console( cleanOutput.trimmed() ); emit Ready_StdErr( cleanOutput.simplified() ); Last_Output.append( convOutput.simplified() ); } } Output_Parts = Last_Output.split( "(qemu)" );*/ } void Virtual_Machine::Send_Emulator_Command( const QString &text ) { #ifndef Q_OS_WIN32 if( Use_Monitor_TCP == false ) { QEMU_Process->write( qPrintable(text) ); } else #endif { if( Monitor_Socket->state() != QAbstractSocket::ConnectedState ) { AQError( "void Virtual_Machine::Send_Emulator_Command( const QString &text )", "Monitor socket not connected!" ); } else { Monitor_Socket->write( qPrintable(text) ); } } } void Virtual_Machine::QEMU_Started() { AQDebug( "void Virtual_Machine::QEMU_Started()", "QEMU Start" ); if( Start_CPU ) { Set_State( VM::VMS_Running ); } if( ! Load_Mode ) { AQDebug( "void Virtual_Machine::QEMU_Started()", "emit Loading_Complete()" ); emit Loading_Complete(); } if( ! Settings.value("Run_Before_QEMU", "").toString().isEmpty() ) { QProcess *before_proc = new QProcess(); before_proc->start( Settings.value("Run_Before_QEMU", "").toString() ); } // Connect monitor? #ifndef Q_OS_WIN32 if( Use_Monitor_TCP == true ) #endif { Monitor_Socket->connectToHost( Monitor_Hostname, Monitor_Port, QIODevice::ReadWrite ); } emit QEMU_Start(); } void Virtual_Machine::QEMU_Finished( int exitCode, QProcess::ExitStatus exitStatus ) { AQDebug( "void Virtual_Machine::QEMU_Finished( int exitCode, QProcess::ExitStatus exitStatus )" , "QEMU Finished" ); emit QEMU_End(); Start_Snapshot_Tag = ""; Set_State( VM::VMS_Power_Off ); if (exitStatus == QProcess::CrashExit) { AQError( "QEMU Crashed!", "QEMU Crashed!" ); } else if ( (exitCode != 0) ) { QString error = QEMU_Process->readAll(); AQError( "QEMU return value != 0", error ); Show_QEMU_Error( error ); } else { AQDebug( "void Virtual_Machine::QEMU_Finished( int exitCode, QProcess::ExitStatus exitStatus )", "QEMU Closed" ); } // Add VM USB devices to used USB list if( USB_Ports.count() > 0 ) { foreach( VM_USB usb_dev, USB_Ports ) System_Info::Delete_From_Used_USB_List( usb_dev ); } if( ! Settings.value("Run_After_QEMU", "").toString().isEmpty() ) { QProcess *after_proc = new QProcess(); after_proc->start( Settings.value("Run_After_QEMU", "").toString() ); } } void Virtual_Machine::Resume_Finished( const QString &returned_text ) { AQDebug( "void Virtual_Machine::Resume_Finished( const QString &returned_text )", QString("Data: \"%1\"").arg(returned_text) ); if( returned_text.contains("(qemu)") ) { disconnect( this, SIGNAL(Ready_StdOut(const QString&)), this, SLOT(Resume_Finished(const QString&)) ); Dont_Reinit = true; Hide_VM_Load_Window(); } // might need to reconnect the usb tablet here... } void Virtual_Machine::Suspend_Finished( const QString &returned_text ) { AQDebug( "void Virtual_Machine::Suspend_Finished( const QString &returned_text )", QString("Data: \"%1\"").arg(returned_text) ); if( returned_text.simplified() == "(qemu)" ) { disconnect( this, SIGNAL(Ready_StdOut(const QString&)), this,SLOT(Suspend_Finished(const QString&)) ); Hide_VM_Save_Window(); if( Quit_Before_Save ) { Send_Emulator_Command( "quit\n" ); Hide_Emu_Ctl_Win(); Set_State( VM::VMS_Saved ); } if( ! Save_VM() ) AQError( "void Virtual_Machine::Save_VM_State( const QString &tag )", "Saving Not Complete!" ); } else if( returned_text.contains("No block device can accept snapshots") ) { disconnect( this, SIGNAL(Ready_StdOut(const QString&)), this,SLOT(Suspend_Finished(const QString&)) ); Hide_VM_Save_Window(); AQGraphic_Warning( tr("Error!"), tr("You must add HDD image in QCOW2 format to save virtual machine!") ); } } void Virtual_Machine::Started_Booting( const QString &text ) { if( text.contains("VNC") || text.contains("Server") ) { disconnect( this, SIGNAL(Ready_StdOut(const QString&) ), this, SLOT(Started_Booting(const QString&)) ); AQDebug( "void Virtual_Machine::Started_Booting( const QString &text )", "emit Loading_Complete()" ); emit Loading_Complete(); Hide_VM_Load_Window(); } } void Virtual_Machine::Execute_Emu_Ctl_Command( const QString &com ) { Send_Emulator_Command( qPrintable(com + "\n") ); AQDebug( "void Virtual_Machine::Execute_Emu_Ctl_Command( const QString &com )", "Run: " + com ); } //=========================================================================== aqemu-0.9.2/src/VM.h000066400000000000000000000442561272330227200141270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VM_H #define VM_H #include #include #include #include #include "VM_Devices.h" #include "Error_Log_Window.h" #include "Create_Template_Window.h" #include "QDom.h" class Emulator_Control_Window; // Vitrual Machine class Virtual_Machine: public QObject { friend class MachineView; Q_OBJECT public: // Constructors... Virtual_Machine(); Virtual_Machine( const QString &name ); Virtual_Machine( const Virtual_Machine &vm ); ~Virtual_Machine(); void Shared_Constructor(); // oprators bool operator==( const Virtual_Machine &v1 ) const; bool operator!=( const Virtual_Machine &v1 ) const; Virtual_Machine &operator=( const Virtual_Machine &vm ); // Create, Read, Save VM XML Files const QString &Get_VM_XML_File_Path() const; void Set_VM_XML_File_Path( const QString &path ); bool Create_VM_File( const QString &file_name, bool template_mode ); bool Create_Template( const QString &vm_path, const QString &template_name, Create_Template_Window::Template_Options opts ); bool Load_VM( const QString &file_name ); bool Save_VM(); bool Save_VM( const QString &file_name ); QStringList Build_QEMU_Args(); // build all args for QEMU QStringList Build_QEMU_Args_For_Tab_Info(); QStringList Build_QEMU_Args_For_Script(); QStringList Build_Nativ_Device_Args( VM_Nativ_Storage_Device device, bool Build_QEMU_Args_for_Script_Mode ); QStringList Build_Shared_Folder_Args( VM_Shared_Folder folder, int id, bool Build_QEMU_Args_for_Script_Mode ); bool Start(); void Pause(); // qemu command stop void Stop(); // shutdown void Reset(); void Save_VM_State(); // Save default snapshot void Save_VM_State( const QString &tag, bool quit ); void Load_VM_State( const QString &tag ); bool Start_Snapshot( const QString &tag ); void Delete_Snapshot( const QString &tag ); const QString &Get_UID() const; void Set_UID( const QString &uid ); // Emu_Ctl void Show_Emu_Ctl_Win(); void Hide_Emu_Ctl_Win(); void Update_Removable_Devices_List(); const QString &Get_Removable_Devices_List() const; // Error Log Window void Show_Error_Log_Window(); // QEMU Log void Show_QEMU_Error( const QString &err_str ); void Hide_QEMU_Error_Log(); // Plase wait win void Show_VM_Load_Window(); void Hide_VM_Load_Window(); void Show_VM_Save_Window(); void Hide_VM_Save_Window(); // Screenshot bool Take_Screenshot( const QString &file_name, int width=-1, int height=-1 ); VM::Machine_Accelerator Get_Machine_Accelerator() const; void Set_Machine_Accelerator( VM::Machine_Accelerator accel ); const Emulator &Get_Emulator() const; void Set_Emulator( const Emulator &emul ); void Update_Current_Emulator_Devices(); const Available_Devices *Get_Current_Emulator_Devices() const; QString Get_Current_Emulator_Binary_Path( const QString &names ) const; QString Get_State_Text() const; VM::VM_State Get_State() const; void Set_State( VM::VM_State s, bool real_poewer_off = false ); const QString &Get_Icon_Path() const; void Set_Icon_Path( const QString &file_name ); const QString &Get_Screenshot_Path() const; void Set_Screenshot_Path( const QString &file_name ); const QString &Get_Machine_Name() const; void Set_Machine_Name( const QString &name ); const QString &Get_Computer_Type() const; void Set_Computer_Type( const QString &type ); const QString &Get_Machine_Type() const; void Set_Machine_Type( const QString &type ); const QString &Get_CPU_Type() const; void Set_CPU_Type( const QString &type ); VM::SMP_Options Get_SMP() const; void Set_SMP( const VM::SMP_Options &smp ); int Get_SMP_CPU_Count() const; void Set_SMP_CPU_Count( int count ); const QString &Get_Keyboard_Layout() const; void Set_Keyboard_Layout( const QString &kl ); const QList &Get_Boot_Order_List() const; void Set_Boot_Order_List( QList &list ); bool Get_Show_Boot_Menu() const; void Set_Show_Boot_Menu( bool use ); const QString &Get_Video_Card() const; void Set_Video_Card( const QString &card ); VM::Acseleration_Mode Get_KQEMU_Mode() const; void Set_KQEMU_Mode( VM::Acseleration_Mode mode ); VM::Sound_Cards Get_Audio_Cards() const; void Set_Audio_Cards( VM::Sound_Cards card ); int Get_Memory_Size() const; void Set_Memory_Size( int megs ); bool Get_Remove_RAM_Size_Limitation() const; void Set_Remove_RAM_Size_Limitation( bool on ); bool Use_Fullscreen_Mode() const; void Use_Fullscreen_Mode( bool use ); bool Use_Win2K_Hack() const; void Use_Win2K_Hack( bool use ); bool Use_Local_Time() const; void Use_Local_Time( bool use ); bool Use_Check_FDD_Boot_Sector() const; void Use_Check_FDD_Boot_Sector( bool use ); bool Use_ACPI() const; void Use_ACPI( bool use ); bool Use_Snapshot_Mode() const; void Use_Snapshot_Mode( bool use ); bool Use_Start_CPU() const; void Use_Start_CPU( bool start ); bool Use_No_Reboot() const; void Use_No_Reboot( bool use ); bool Use_No_Shutdown() const; void Use_No_Shutdown( bool use ); const VM_Storage_Device &Get_FD0() const; void Set_FD0( const VM_Storage_Device &floppy ); const VM_Storage_Device &Get_FD1() const; void Set_FD1( const VM_Storage_Device &floppy ); const VM_Storage_Device &Get_CD_ROM() const; void Set_CD_ROM( const VM_Storage_Device &cdrom ); const VM_HDD &Get_HDA() const; void Set_HDA( const VM_HDD &hdd ); const VM_HDD &Get_HDB() const; void Set_HDB( const VM_HDD &hdd ); const VM_HDD &Get_HDC() const; void Set_HDC( const VM_HDD &hdd ); const VM_HDD &Get_HDD() const; void Set_HDD( const VM_HDD &hdd ); const QList &Get_Snapshots() const; void Set_Snapshots( const QList &list ); void Add_Snapshot( const QString &tag, const QString &name, const QString &desc ); void Add_Snapshot( const VM_Snapshot &snapshot ); void Set_Snapshot( int index, const VM_Snapshot &s ); const QList &Get_Storage_Devices_List() const; void Set_Storage_Devices_List( const QList &list ); const VM_Nativ_Storage_Device &Get_Storage_Device( int index ) const; void Set_Storage_Device( int index, const VM_Nativ_Storage_Device &device ); const QList &Get_Shared_Folders_List() const; void Set_Shared_Folders_List( const QList &list ); bool Get_Use_Network() const; void Set_Use_Network( bool use ); bool Use_Nativ_Network() const; void Use_Nativ_Network( bool use ); bool Get_Use_Redirections() const; void Set_Use_Redirections( bool r ); const QString &Get_TFTP_Prefix() const; void Set_TFTP_Prefix( const QString &p ); const QString &Get_SMB_Directory() const; void Set_SMB_Directory( const QString &dir ); const QList &Get_Network_Cards() const; void Set_Network_Cards( const QList &cards ); const QList &Get_Network_Cards_Nativ() const; void Set_Network_Cards_Nativ( const QList &cards ); const VM_Net_Card &Get_Network_Card( int index ) const; void Set_VM_Network_Card( int index, const VM_Net_Card &nc ); bool Add_Network_Card( const VM_Net_Card &nc ); bool Delete_Network_Card( int ix ); void Clear_Network_Cards_List(); int Get_Network_Cards_Count() const; const VM_Redirection &Get_Network_Redirection( int index ) const; void Set_Network_Redirection( int index, const VM_Redirection &r ); void Add_Network_Redirection( const VM_Redirection &r ); bool Delete_Network_Redirection( int ix ); int Get_Network_Redirections_Count() const; const QList &Get_Serial_Ports() const; void Set_Serial_Ports( const QList &list ); const QList &Get_Parallel_Ports() const; void Set_Parallel_Ports( const QList &list ); void Add_USB_Port( const VM_USB &u ); bool Delete_USB_Port( int index ); const QList &Get_USB_Ports() const; void Set_USB_Ports( const QList &list ); bool Get_Use_Linux_Boot() const; void Set_Use_Linux_Boot( bool use ); const QString &Get_bzImage_Path() const; void Set_bzImage_Path( const QString &path ); const QString &Get_Initrd_Path() const; void Set_Initrd_Path( const QString &path ); const QString &Get_Kernel_ComLine() const; void Set_Kernel_ComLine( const QString &cl ); const QString &Get_Additional_Args() const; void Set_Additional_Args( const QString &aa ); bool Get_Only_User_Args() const; void Set_Only_User_Args( bool use ); bool Get_Use_User_Emulator_Binary() const; void Set_Use_User_Emulator_Binary( bool use ); bool Get_Use_ROM_File() const; void Set_Use_ROM_File( bool use ); const QString &Get_ROM_File() const; void Set_ROM_File( const QString &path ); bool Use_MTDBlock_File() const; void Use_MTDBlock_File( bool use ); const QString &Get_MTDBlock_File() const; void Set_MTDBlock_File( const QString &file ); bool Use_SecureDigital_File() const; void Use_SecureDigital_File( bool use ); const QString &Get_SecureDigital_File() const; void Set_SecureDigital_File( const QString &file ); bool Use_PFlash_File() const; void Use_PFlash_File( bool use ); const QString &Get_PFlash_File() const; void Set_PFlash_File( const QString &file ); bool Use_KVM() const; void Use_KVM( bool use ); bool Use_KVM_IRQChip() const; void Use_KVM_IRQChip( bool use ); bool Use_No_KVM_Pit() const; void Use_No_KVM_Pit( bool use ); bool Use_KVM_No_Pit_Reinjection() const; void Use_KVM_No_Pit_Reinjection( bool use ); bool Use_KVM_Nesting() const; void Use_KVM_Nesting( bool use ); bool Use_KVM_Shadow_Memory() const; void Use_KVM_Shadow_Memory( bool use ); int Get_KVM_Shadow_Memory_Size() const; void Set_KVM_Shadow_Memory_Size( int size ); const VM_Init_Graphic_Mode &Get_Init_Graphic_Mode() const; void Set_Init_Graphic_Mode( const VM_Init_Graphic_Mode &mode ); bool Use_No_Frame() const; void Use_No_Frame( bool use ); bool Use_Alt_Grab() const; void Use_Alt_Grab( bool use ); bool Use_No_Quit() const; void Use_No_Quit( bool use ); bool Use_Portrait() const; void Use_Portrait( bool use ); bool Use_Show_Cursor() const; void Use_Show_Cursor( bool use ); bool Use_Curses() const; void Use_Curses( bool use ); bool Use_RTC_TD_Hack() const; void Use_RTC_TD_Hack( bool use ); bool Use_Start_Date() const; void Use_Start_Date( bool use ); const QDateTime &Get_Start_Date() const; void Set_Start_Date( const QDateTime &dt ); const VM_SPICE &Get_SPICE() const; void Set_SPICE( const VM_SPICE &spice ); bool Use_VNC() const; void Use_VNC( bool use ); bool Get_VNC_Socket_Mode() const; void Set_VNC_Socket_Mode( bool use ); const QString &Get_VNC_Unix_Socket_Path() const; void Set_VNC_Unix_Socket_Path( const QString &path ); int Get_VNC_Display_Number() const; void Set_VNC_Display_Number( int num ); bool Use_VNC_Password() const; void Use_VNC_Password( bool use ); void Set_VNC_Password( const QString &pas ); bool Use_VNC_TLS() const; void Use_VNC_TLS( bool use ); bool Use_VNC_x509() const; void Use_VNC_x509( bool use ); const QString &Get_VNC_x509_Folder_Path() const; void Set_VNC_x509_Folder_Path( const QString &path ); bool Use_VNC_x509verify() const; void Use_VNC_x509verify( bool use ); const QString &Get_VNC_x509verify_Folder_Path() const; void Set_VNC_x509verify_Folder_Path( const QString &path ); int Get_Embedded_Display_Port() const; void Set_Embedded_Display_Port( int port ); // Window for control qemu/kvm Emulator_Control_Window *Emu_Ctl; signals: void State_Changed( Virtual_Machine *vm, VM::VM_State s ); void Ready_StdIn( const QString &text ); void Ready_StdOut( const QString &text ); void Ready_StdErr( const QString &text ); void QEMU_Start(); void Loading_Complete(); void QEMU_End(); void Clean_Console( const QString &text ); void Ready_Removable_Devices_List(); private slots: void Parse_StdErr(); void Parse_StdOut(); void Send_Emulator_Command( const QString &text ); void QEMU_Started(); void QEMU_Finished( int exitCode, QProcess::ExitStatus exitStatus ); void Resume_Finished( const QString &neturned_text ); void Suspend_Finished( const QString &neturned_text ); void Started_Booting( const QString &text ); // for Emulator_Control_Window void Execute_Emu_Ctl_Command( const QString &com ); VM_Nativ_Storage_Device Load_VM_Nativ_Storage_Device( const TXML2QDOM::QDomElement &Second_Element ) const; VM_Shared_Folder Load_VM_Shared_Folder( const TXML2QDOM::QDomElement &Second_Element ) const; void Save_VM_Nativ_Storage_Device( TXML2QDOM::QDomDocument &New_Dom_Document, TXML2QDOM::QDomElement &Dom_Element, const VM_Nativ_Storage_Device &device ) const; void Save_VM_Shared_Folder( TXML2QDOM::QDomDocument &New_Dom_Document, TXML2QDOM::QDomElement &Dom_Element, const VM_Shared_Folder &device ) const; private: QProcess *QEMU_Process; QTcpSocket *Monitor_Socket; // Used for "-monitor tcp" connection type bool Use_Monitor_TCP; // This value set in VM start time and no changes after QString Monitor_Hostname; unsigned int Monitor_Port; VM::VM_State State; // Saved, Running, etc... VM::VM_State Old_State; QString VM_XML_File_Path; // for load and save QString Start_Snapshot_Tag; bool Load_Mode; bool Dont_Reinit; bool Build_QEMU_Args_for_Tab_Info; bool Build_QEMU_Args_for_Script_Mode; QString UID; VM::Machine_Accelerator Machine_Accelerator; Emulator Current_Emulator; Available_Devices Current_Emulator_Devices; QString Snapshot_Name_String; QString Last_Output; QStringList Output_Parts; QString Icon_Path; // OS Logo Icon QString Screenshot_Path; // Screenshot in save mode QString Computer_Type; // PC, MAC, ARM... QString Machine_Name; // this machine name QString Machine_Type; // All QEMU Mach Types QString CPU_Type; // x86, ppc, sparc... VM::SMP_Options SMP; // All SMP Settings QString Keyboard_Layout; // language en, ru, jp... QList Boot_Order_List; // New boot order bool Show_Boot_Menu; // Enable interactive boot menu QString Video_Card; // std vga, cirus logic VM::Acseleration_Mode KQEMU_Mode; // acceleration mode VM::Sound_Cards Audio_Card; // sb16, es1370 bool Remove_RAM_Size_Limitation; // true - limitation off int Memory_Size; // RAM Size // General Tab Options bool Fullscreen; bool Win2K_Hack; bool Local_Time; bool Check_FDD_Boot_Sector; bool ACPI; bool Snapshot_Mode; bool Start_CPU; bool No_Reboot; bool No_Shutdown; // storage devices VM_Storage_Device FD0; // floppy 0 VM_Storage_Device FD1; // floppy 1 VM_Storage_Device CD_ROM; // cdrom device ide2 VM_HDD HDA; // ide0 VM_HDD HDB; // ide1 VM_HDD HDC; // ide2 if cdrom is enabled, hdc be disabled VM_HDD HDD; // ide3 QList Snapshots; // VM State Snapshots QList Storage_Devices; // For QEMU 0.8.2 Device Style // shared folders QList Shared_Folders; // Network bool Use_Network; bool Nativ_Network; bool Use_Redirections; // 1 or more net cards be avirable QList Network_Cards; // Network Cards. Max 8 QList Network_Cards_Nativ; // Nativ QEMU Network Cards. Max 8 QList Network_Redirections; // List Redirections QString TFTP_Prefix; // Buildin TFTP Server QString SMB_Directory; // SAMBA most be Installed on host! // Ports QList Serial_Ports; QList Parallel_Ports; QList USB_Ports; // Other page bool Linux_Boot; QString bzImage_Path; QString Initrd_Path; QString Kernel_ComLine; QString Additional_Args; // user arguments bool Only_User_Args; bool Use_User_Emulator_Binary; bool Use_ROM_File; QString ROM_File; // ROM File for EtherBoot // QEMU 0.9.1 Options bool MTDBlock; QString MTDBlock_File; bool SecureDigital; QString SecureDigital_File; bool PFlash; QString PFlash_File; bool Enable_KVM; bool KVM_IRQChip; bool No_KVM_Pit; bool KVM_No_Pit_Reinjection; bool KVM_Nesting; bool KVM_Shadow_Memory; int KVM_Shadow_Memory_Size; VM_Init_Graphic_Mode Init_Graphic_Mode; bool No_Frame; bool Alt_Grab; bool No_Quit; bool Portrait; bool Show_Cursor; bool Curses; bool RTC_TD_Hack; // DateTime bool Start_Date; QDateTime Start_DateTime; // SPICE VM_SPICE SPICE; // VNC bool VNC; bool VNC_Socket_Mode; QString VNC_Unix_Socket_Path; int VNC_Display_Number; bool VNC_Password; bool VNC_TLS; bool VNC_x509; QString VNC_x509_Folder_Path; bool VNC_x509verify; QString VNC_x509verify_Folder_Path; // VNC Port for Embedded Display int Embedded_Display_Port; // Additional Windows QWidget *Load_VM_Window; QWidget *Save_VM_Window; Error_Log_Window* QEMU_Error_Win; bool Quit_Before_Save; bool Update_Removable_Devices_Mode; QString Removable_Devices_List; // For Create Templates QString Template_Name; Create_Template_Window::Template_Options Template_Opts; QSettings Settings; }; #endif aqemu-0.9.2/src/VM_Devices.cpp000066400000000000000000003222451272330227200161210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer (Qt5 port) ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include #include #include #include #include "VM.h" #include "VM_Devices.h" #include "Utils.h" #include "HDD_Image_Info.h" #include "System_Info.h" using namespace TinyXML2QDomWrapper; // Available_Devices --------------------------------------------------------- Available_Devices::Available_Devices() { CPU_List << Device_Map( QObject::tr("Default"), "" ); Machine_List << Device_Map( QObject::tr("Default"), "" ); Network_Card_List << Device_Map( QObject::tr("Default"), "" ); Video_Card_List << Device_Map( QObject::tr("Default"), "" ); PSO_SMP_Count = 1; PSO_SMP_Cores = false; PSO_SMP_Threads = false; PSO_SMP_Sockets = false; PSO_SMP_MaxCPUs = false; PSO_Device = false; PSO_Device_USB_EHCI = false; PSO_Drive = false; PSO_Drive_File = false; PSO_Drive_If = false; PSO_Drive_Bus_Unit = false; PSO_Drive_Index = false; PSO_Drive_Media = false; PSO_Drive_Cyls_Heads_Secs_Trans = false; PSO_Drive_Snapshot = false; PSO_Drive_Cache = false; PSO_Drive_AIO = false; PSO_Drive_Format = false; PSO_Drive_Serial = false; PSO_Drive_ADDR = false; PSO_Drive_Boot = false; PSO_Boot_Order = false; PSO_Initial_Graphic_Mode = false; PSO_No_FB_Boot_Check = false; PSO_Win2K_Hack = false; PSO_Kernel_KQEMU = false; PSO_No_ACPI = false; PSO_KVM = false; PSO_RTC_TD_Hack = false; PSO_MTDBlock = false; PSO_SD = false; PSO_PFlash = false; PSO_Name = false; PSO_Curses = false; PSO_No_Frame = false; PSO_Alt_Grab = false; PSO_No_Quit = false; PSO_SDL = false; PSO_Portrait = false; PSO_No_Shutdown = false; PSO_Startdate = false; PSO_Show_Cursor = false; PSO_Bootp = false; PSO_Net_type_vde = false; PSO_Net_type_dump = false; PSO_Net_name = false; PSO_Net_addr = false; PSO_Net_vectors = false; PSO_Net_net = false; PSO_Net_host = false; PSO_Net_restrict = false; PSO_Net_dhcpstart = false; PSO_Net_dns = false; PSO_Net_tftp = false; PSO_Net_bootfile = false; PSO_Net_smb = false; PSO_Net_hostfwd = false; PSO_Net_guestfwd = false; PSO_Net_ifname = false; PSO_Net_script = false; PSO_Net_downscript = false; PSO_Net_sndbuf = false; PSO_Net_vnet_hdr = false; PSO_Net_vhost = false; PSO_Net_vhostfd = false; PSO_Net_listen = false; PSO_Net_connect = false; PSO_Net_mcast = false; PSO_Net_sock = false; PSO_Net_port = false; PSO_Net_group = false; PSO_Net_mode = false; PSO_Net_file = false; PSO_Net_len = false; PSO_Enable_KVM = false; PSO_No_KVM = false; PSO_No_KVM_IRQChip = false; PSO_No_KVM_Pit = false; PSO_No_KVM_Pit_Reinjection = false; PSO_Enable_Nesting = false; PSO_KVM_Shadow_Memory = false; PSO_TFTP = false; PSO_SMB = false; PSO_Std_VGA = false; PSO_SPICE = false; PSO_QXL = false; } //=========================================================================== // VM_Nativ_Storage_Device -------------------------------------------------- Emulator::Emulator() { Name = ""; Path = ""; Default = false; Check_Version = false; Check_Available_Options = false; Force_Version = false; Version = VM::Obsolete; Binary_Files = QMap(); Devices = QMap(); } Emulator::Emulator( const Emulator &emul ) { Name = emul.Get_Name(); Path = emul.Get_Path(); Default = emul.Get_Default(); Check_Version = emul.Get_Check_Version(); Check_Available_Options = emul.Get_Check_Available_Options(); Force_Version = emul.Get_Force_Version(); Version = emul.Get_Version(); Binary_Files = emul.Get_Binary_Files(); Devices = emul.Get_Devices(); } bool Emulator::operator==( const Emulator &emul ) const { if( Name == emul.Get_Name() && Path == emul.Get_Path() && Default == emul.Get_Default() && Check_Version == emul.Get_Check_Version() && Check_Available_Options == emul.Get_Check_Available_Options() && Force_Version == emul.Get_Force_Version() && Version == emul.Get_Version() && Binary_Files == emul.Get_Binary_Files() ) // compare devices? { return true; } else { return false; } } bool Emulator::operator!=( const Emulator &emul ) const { return ! ( operator==(emul) ); } bool Emulator::Load( const QString &path ) { // Load file QDomDocument doc; QFile inFile( path ); if( ! inFile.open(QIODevice::ReadOnly) ) { AQError( "bool Emulator::Load( const QString &path )", QString("Cannot open file \"%1\"!").arg(path) ); return false; } QString errorString = ""; int errorLine = 0, errorColumn = 0; if( ! doc.setContent(&inFile, true, &errorString, &errorLine, &errorColumn) ) { AQError( "bool Emulator::Load( const QString &path )", QString("Cannot set content form file \"%1\"!\n\nLine: %2\nColumn: %3\nString: %4" ) .arg(path).arg(errorLine).arg(errorColumn).arg(errorString) ); inFile.close(); return false; } inFile.close(); QDomElement rootElement = doc.documentElement(); if( rootElement.tagName() != "AQEMU_Emulator" ) { AQError( "bool Emulator::Load( const QString &path )", QString("File \"%1\" is not AQEMU emulator file!").arg(path) ); return false; } if( rootElement.attribute("version") == "0.8" ) { AQDebug( "bool Emulator::Load( const QString &path )", "Loading emulator file version 0.8" ); } else { AQWarning( "bool Emulator::Load( const QString &path )", QString("Emulator version %1 not defined!").arg(rootElement.attribute("version")) ); } // Create vairables QDomElement childElement = rootElement.firstChildElement( "Emulator" ); if( childElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Emulator\" element!" ); return false; } // Load Name = childElement.firstChildElement( "Name" ).text(); Default = childElement.firstChildElement( "Default" ).text() == "yes"; Path = childElement.firstChildElement( "Path" ).text(); Check_Version = childElement.firstChildElement( "Check_Version" ).text() == "yes"; Check_Available_Options = childElement.firstChildElement( "Check_Available_Options" ).text() == "yes"; Force_Version = childElement.firstChildElement( "Force_Version" ).text() == "yes"; Version = String_To_Emulator_Version( childElement.firstChildElement("Version").text() ); // Load emulators executable path's Binary_Files.clear(); childElement = childElement.firstChildElement( "Executable_Paths" ); if( childElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Executable_Paths\" element!" ); return false; } for( QDomNode node = childElement.firstChild(); node.isNull() == false; node = node.nextSibling() ) { QDomElement elem = node.toElement(); if( ! elem.isNull() ) Binary_Files[ elem.tagName() ] = elem.text(); } // Load devices QMapIterator iter( Binary_Files ); while( iter.hasNext() ) { iter.next(); childElement = rootElement.firstChildElement( "Emulator" ); childElement = childElement.firstChildElement( iter.key() ); if( childElement.isNull() ) { AQWarning( "bool Emulator::Load( const QString &path )", QString("No \"%1\" element!").arg(iter.key()) ); continue; } else { Available_Devices tmpDev; // System tmpDev.System.Caption = childElement.firstChildElement( "System_Caption" ).text(); tmpDev.System.QEMU_Name = childElement.firstChildElement( "System_QEMU_Name" ).text(); // CPUs tmpDev.CPU_List.clear(); QDomElement thirdElement = childElement.firstChildElement( "CPU_List" ); if( thirdElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"CPU_List\" element!" ); return false; } QDomNode node = thirdElement.firstChild(); Device_Map tmpDevMap; for( int ix = 1; node.isNull() == false; node = node.nextSibling(), ix++ ) { QDomElement elem = node.toElement(); if( ! elem.isNull() ) { if( ix % 2 != 0 ) tmpDevMap.Caption = elem.text(); else { tmpDevMap.QEMU_Name = elem.text(); tmpDev.CPU_List << tmpDevMap; } } } if( tmpDev.CPU_List.isEmpty() ) { AQError( "bool Emulator::Load( const QString &path )", "No values on \"CPU_List\" element! Add default CPU element." ); tmpDev.CPU_List << Device_Map( QObject::tr("Default"), "" ); } // Machines tmpDev.Machine_List.clear(); thirdElement = childElement.firstChildElement( "Machine_List" ); if( thirdElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Machine_List\" element!" ); return false; } node = thirdElement.firstChild(); for( int ix = 1; node.isNull() == false; node = node.nextSibling(), ix++ ) { QDomElement elem = node.toElement(); if( ! elem.isNull() ) { if( ix % 2 != 0 ) tmpDevMap.Caption = elem.text(); else { tmpDevMap.QEMU_Name = elem.text(); tmpDev.Machine_List << tmpDevMap; } } } if( tmpDev.Machine_List.isEmpty() ) { AQError( "bool Emulator::Load( const QString &path )", "No values on \"Machine_List\" element! Add default Machine element." ); tmpDev.Machine_List << Device_Map( QObject::tr("Default"), "" ); } // Network Cards tmpDev.Network_Card_List.clear(); thirdElement = childElement.firstChildElement( "Network_Card_List" ); if( thirdElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Network_Card_List\" element!" ); return false; } node = thirdElement.firstChild(); for( int ix = 1; node.isNull() == false; node = node.nextSibling(), ix++ ) { QDomElement elem = node.toElement(); if( ! elem.isNull() ) { if( ix % 2 != 0 ) tmpDevMap.Caption = elem.text(); else { tmpDevMap.QEMU_Name = elem.text(); tmpDev.Network_Card_List << tmpDevMap; } } } if( tmpDev.Network_Card_List.isEmpty() ) { AQError( "bool Emulator::Load( const QString &path )", "No values on \"Network_Card_List\" element! Add default Network Card element." ); tmpDev.Network_Card_List << Device_Map( QObject::tr("Default"), "" ); } // Audio Cards thirdElement = childElement.firstChildElement( "Audio_Card_List" ); if( thirdElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Audio_Card_List\" element!" ); return false; } tmpDev.Audio_Card_List.Audio_sb16 = (thirdElement.firstChildElement("sb16").text() == "yes"); tmpDev.Audio_Card_List.Audio_es1370 = (thirdElement.firstChildElement("es1370").text() == "yes"); tmpDev.Audio_Card_List.Audio_Adlib = (thirdElement.firstChildElement("Adlib").text() == "yes"); tmpDev.Audio_Card_List.Audio_PC_Speaker = (thirdElement.firstChildElement("PC_Speaker").text() == "yes"); tmpDev.Audio_Card_List.Audio_GUS = (thirdElement.firstChildElement("GUS").text() == "yes"); tmpDev.Audio_Card_List.Audio_AC97 = (thirdElement.firstChildElement("AC97").text() == "yes"); tmpDev.Audio_Card_List.Audio_HDA = (thirdElement.firstChildElement("HDA").text() == "yes"); tmpDev.Audio_Card_List.Audio_cs4231a = (thirdElement.firstChildElement("cs4231a").text() == "yes"); // Video Cards tmpDev.Video_Card_List.clear(); thirdElement = childElement.firstChildElement( "Video_Card_List" ); if( thirdElement.isNull() ) { AQError( "bool Emulator::Load( const QString &path )", "No \"Video_Card_List\" element!" ); return false; } node = thirdElement.firstChild(); for( int ix = 1; node.isNull() == false; node = node.nextSibling(), ix++ ) { QDomElement elem = node.toElement(); if( ! elem.isNull() ) { if( ix % 2 != 0 ) tmpDevMap.Caption = elem.text(); else { tmpDevMap.QEMU_Name = elem.text(); tmpDev.Video_Card_List << tmpDevMap; } } } if( tmpDev.Video_Card_List.isEmpty() ) { AQError( "bool Emulator::Load( const QString &path )", "No values on \"Video_Card_List\" element! Add default Video Card element." ); tmpDev.Video_Card_List << Device_Map( QObject::tr("Default"), "" ); } // Platform Specific Options bool ok = false; tmpDev.PSO_SMP_Count = childElement.firstChildElement( "SMP_Count" ).text().toUInt( &ok ); if( ! ok ) { AQWarning( "bool Emulator::Load( const QString &path )", "SMP_Count value not uint type! Use default value: 1" ); tmpDev.PSO_SMP_Count = 1; } tmpDev.PSO_SMP_Cores = (childElement.firstChildElement("SMP_Cores").text() == "yes" ); tmpDev.PSO_SMP_Threads = (childElement.firstChildElement("SMP_Threads").text() == "yes" ); tmpDev.PSO_SMP_Sockets = (childElement.firstChildElement("SMP_Sockets").text() == "yes" ); tmpDev.PSO_SMP_MaxCPUs = (childElement.firstChildElement("SMP_MaxCPUs").text() == "yes" ); tmpDev.PSO_Device = (childElement.firstChildElement("Device").text() == "yes" ); tmpDev.PSO_Device_USB_EHCI = (childElement.firstChildElement("Device_USB_EHCI").text() == "yes" ); tmpDev.PSO_Drive = (childElement.firstChildElement("Drive").text() == "yes" ); tmpDev.PSO_Drive_File = (childElement.firstChildElement("Drive_File").text() == "yes" ); tmpDev.PSO_Drive_If = (childElement.firstChildElement("Drive_If").text() == "yes" ); tmpDev.PSO_Drive_Bus_Unit = (childElement.firstChildElement("Drive_Bus_Unit").text() == "yes" ); tmpDev.PSO_Drive_Index = (childElement.firstChildElement("Drive_Index").text() == "yes" ); tmpDev.PSO_Drive_Media = (childElement.firstChildElement("Drive_Media").text() == "yes" ); tmpDev.PSO_Drive_Cyls_Heads_Secs_Trans = (childElement.firstChildElement("Drive_Cyls_Heads_Secs_Trans").text() == "yes" ); tmpDev.PSO_Drive_Snapshot = (childElement.firstChildElement("Drive_Snapshot").text() == "yes" ); tmpDev.PSO_Drive_Cache = (childElement.firstChildElement("Drive_Cache").text() == "yes" ); tmpDev.PSO_Drive_AIO = (childElement.firstChildElement("Drive_AIO").text() == "yes" ); tmpDev.PSO_Drive_Format = (childElement.firstChildElement("Drive_Format").text() == "yes" ); tmpDev.PSO_Drive_Serial = (childElement.firstChildElement("Drive_Serial").text() == "yes" ); tmpDev.PSO_Drive_ADDR = (childElement.firstChildElement("Drive_ADDR").text() == "yes" ); tmpDev.PSO_Drive_Boot = (childElement.firstChildElement("Drive_Boot").text() == "yes" ); tmpDev.PSO_Boot_Order = (childElement.firstChildElement("Boot_Order").text() == "yes" ); tmpDev.PSO_Initial_Graphic_Mode = (childElement.firstChildElement("Initial_Graphic_Mode").text() == "yes" ); tmpDev.PSO_No_FB_Boot_Check = (childElement.firstChildElement("No_FB_Boot_Check").text() == "yes" ); tmpDev.PSO_Win2K_Hack = (childElement.firstChildElement("Win2K_Hack").text() == "yes" ); tmpDev.PSO_Kernel_KQEMU = (childElement.firstChildElement("Kernel_KQEMU").text() == "yes" ); tmpDev.PSO_No_ACPI = (childElement.firstChildElement("No_ACPI").text() == "yes" ); tmpDev.PSO_KVM = (childElement.firstChildElement("KVM").text() == "yes" ); tmpDev.PSO_RTC_TD_Hack = (childElement.firstChildElement("RTC_TD_Hack").text() == "yes" ); tmpDev.PSO_MTDBlock = (childElement.firstChildElement("MTDBlock").text() == "yes" ); tmpDev.PSO_SD = (childElement.firstChildElement("SD").text() == "yes" ); tmpDev.PSO_PFlash = (childElement.firstChildElement("PFlash").text() == "yes" ); tmpDev.PSO_Name = (childElement.firstChildElement("Name").text() == "yes" ); tmpDev.PSO_Curses = (childElement.firstChildElement("Curses").text() == "yes" ); tmpDev.PSO_No_Frame = (childElement.firstChildElement("No_Frame").text() == "yes" ); tmpDev.PSO_Alt_Grab = (childElement.firstChildElement("Alt_Grab").text() == "yes" ); tmpDev.PSO_No_Quit = (childElement.firstChildElement("No_Quit").text() == "yes" ); tmpDev.PSO_SDL = (childElement.firstChildElement("SDL").text() == "yes" ); tmpDev.PSO_Portrait = (childElement.firstChildElement("Portrait").text() == "yes" ); tmpDev.PSO_No_Shutdown = (childElement.firstChildElement("No_Shutdown").text() == "yes" ); tmpDev.PSO_Startdate = (childElement.firstChildElement("Startdate").text() == "yes" ); tmpDev.PSO_Show_Cursor = (childElement.firstChildElement("Show_Cursor").text() == "yes" ); tmpDev.PSO_Bootp = (childElement.firstChildElement("Bootp").text() == "yes" ); tmpDev.PSO_Net_type_vde = (childElement.firstChildElement("Net_type_vde").text() == "yes" ); tmpDev.PSO_Net_type_dump = (childElement.firstChildElement("Net_type_dump").text() == "yes" ); tmpDev.PSO_Net_name = (childElement.firstChildElement("Net_name").text() == "yes" ); tmpDev.PSO_Net_addr = (childElement.firstChildElement("Net_addr").text() == "yes" ); tmpDev.PSO_Net_vectors = (childElement.firstChildElement("Net_vectors").text() == "yes" ); tmpDev.PSO_Net_net = (childElement.firstChildElement("Net_net").text() == "yes" ); tmpDev.PSO_Net_host = (childElement.firstChildElement("Net_host").text() == "yes" ); tmpDev.PSO_Net_restrict = (childElement.firstChildElement("Net_restrict").text() == "yes" ); tmpDev.PSO_Net_dhcpstart = (childElement.firstChildElement("Net_dhcpstart").text() == "yes" ); tmpDev.PSO_Net_dns = (childElement.firstChildElement("Net_dns").text() == "yes" ); tmpDev.PSO_Net_tftp = (childElement.firstChildElement("Net_tftp").text() == "yes" ); tmpDev.PSO_Net_bootfile = (childElement.firstChildElement("Net_bootfile").text() == "yes" ); tmpDev.PSO_Net_smb = (childElement.firstChildElement("Net_smb").text() == "yes" ); tmpDev.PSO_Net_hostfwd = (childElement.firstChildElement("Net_hostfwd").text() == "yes" ); tmpDev.PSO_Net_guestfwd = (childElement.firstChildElement("Net_guestfwd").text() == "yes" ); tmpDev.PSO_Net_ifname = (childElement.firstChildElement("Net_ifname").text() == "yes" ); tmpDev.PSO_Net_script = (childElement.firstChildElement("Net_script").text() == "yes" ); tmpDev.PSO_Net_downscript = (childElement.firstChildElement("Net_downscript").text() == "yes" ); tmpDev.PSO_Net_sndbuf = (childElement.firstChildElement("Net_sndbuf").text() == "yes" ); tmpDev.PSO_Net_vnet_hdr = (childElement.firstChildElement("Net_vnet_hdr").text() == "yes" ); tmpDev.PSO_Net_vhost = (childElement.firstChildElement("Net_vhost").text() == "yes" ); tmpDev.PSO_Net_vhostfd = (childElement.firstChildElement("Net_vhostfd").text() == "yes" ); tmpDev.PSO_Net_listen = (childElement.firstChildElement("Net_listen").text() == "yes" ); tmpDev.PSO_Net_connect = (childElement.firstChildElement("Net_connect").text() == "yes" ); tmpDev.PSO_Net_mcast = (childElement.firstChildElement("Net_mcast").text() == "yes" ); tmpDev.PSO_Net_sock = (childElement.firstChildElement("Net_sock").text() == "yes" ); tmpDev.PSO_Net_port = (childElement.firstChildElement("Net_port").text() == "yes" ); tmpDev.PSO_Net_group = (childElement.firstChildElement("Net_group").text() == "yes" ); tmpDev.PSO_Net_mode = (childElement.firstChildElement("Net_mode").text() == "yes" ); tmpDev.PSO_Net_file = (childElement.firstChildElement("Net_file").text() == "yes" ); tmpDev.PSO_Net_len = (childElement.firstChildElement("Net_len").text() == "yes" ); tmpDev.PSO_Enable_KVM = (childElement.firstChildElement("Enable_KVM").text() == "yes" ); tmpDev.PSO_No_KVM = (childElement.firstChildElement("No_KVM").text() == "yes" ); tmpDev.PSO_No_KVM_IRQChip = (childElement.firstChildElement("No_KVM_IRQChip").text() == "yes" ); tmpDev.PSO_No_KVM_Pit = (childElement.firstChildElement("No_KVM_Pit").text() == "yes" ); tmpDev.PSO_No_KVM_Pit_Reinjection = (childElement.firstChildElement("No_KVM_Pit_Reinjection").text() == "yes" ); tmpDev.PSO_Enable_Nesting = (childElement.firstChildElement("Enable_Nesting").text() == "yes" ); tmpDev.PSO_KVM_Shadow_Memory = (childElement.firstChildElement("KVM_Shadow_Memory").text() == "yes" ); tmpDev.PSO_SPICE = (childElement.firstChildElement("SPICE").text() == "yes" ); tmpDev.PSO_QXL = (childElement.firstChildElement("QXL").text() == "yes" ); tmpDev.PSO_TFTP = (childElement.firstChildElement("TFTP").text() == "yes" ); tmpDev.PSO_SMB = (childElement.firstChildElement("SMB").text() == "yes" ); tmpDev.PSO_Std_VGA = (childElement.firstChildElement("Std_VGA").text() == "yes" ); // Add devices Devices[ iter.key() ] = tmpDev; } } return true; } bool Emulator::Save() const { QString path = Get_Emulator_File_Path(); if( path.isEmpty() ) return false; // Document type QDomDocument domDocument( "AQEMU" ); domDocument.appendChild( domDocument.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"") ); // Document version QDomElement rootElement = domDocument.createElement( "AQEMU_Emulator" ); rootElement.setAttribute( "version", "0.8" ); domDocument.appendChild( rootElement ); // Emulator - general section QDomElement emulatorElement = domDocument.createElement( "Emulator" ); rootElement.appendChild( emulatorElement ); // Save emulator data QDomElement domElement; QDomText domText; // Name domElement = domDocument.createElement( "Name" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( Name ); domElement.appendChild( domText ); // Default domElement = domDocument.createElement( "Default" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( (Default ? "yes" : "no") ); domElement.appendChild( domText ); // Path domElement = domDocument.createElement( "Path" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( Path ); domElement.appendChild( domText ); // Check_Version domElement = domDocument.createElement( "Check_Version" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( (Check_Version ? "yes" : "no") ); domElement.appendChild( domText ); // Check_Available_Options domElement = domDocument.createElement( "Check_Available_Options" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( (Check_Available_Options ? "yes" : "no") ); domElement.appendChild( domText ); // Check_Available_Options domElement = domDocument.createElement( "Check_Available_Options" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( (Check_Available_Options ? "yes" : "no") ); domElement.appendChild( domText ); // Force_Version domElement = domDocument.createElement( "Force_Version" ); emulatorElement.appendChild( domElement ); domText = domDocument.createTextNode( (Force_Version ? "yes" : "no") ); domElement.appendChild( domText ); // Version domElement = domDocument.createElement( "Version" ); emulatorElement.appendChild( domElement ); QString emulatorVersion = Emulator_Version_To_String( Version ); if( emulatorVersion.isEmpty() ) { AQError( "bool Emulator::Save() const", "Emulator version invalid! Use version: Obsolete" ); domText = domDocument.createTextNode( "Obsolete" ); } else domText = domDocument.createTextNode( emulatorVersion ); domElement.appendChild( domText ); // Save emulators executable path's domElement = domDocument.createElement( "Executable_Paths" ); QMap::const_iterator binFilesIter = Binary_Files.constBegin(); while( binFilesIter != Binary_Files.constEnd() ) { QDomElement binElement = domDocument.createElement( binFilesIter.key() ); domText = domDocument.createTextNode( binFilesIter.value() ); binElement.appendChild( domText ); domElement.appendChild( binElement ); ++binFilesIter; } emulatorElement.appendChild( domElement ); // Save devices QMap::const_iterator devicesIter = Devices.constBegin(); while( devicesIter != Devices.constEnd() ) { const Available_Devices &tmpDev = devicesIter.value(); domElement = domDocument.createElement( devicesIter.key() ); QDomElement deviceElement; QDomElement thirdElement; // System deviceElement = domDocument.createElement( "System_Caption" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( tmpDev.System.Caption ); deviceElement.appendChild( domText ); deviceElement = domDocument.createElement( "System_QEMU_Name" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( tmpDev.System.QEMU_Name ); deviceElement.appendChild( domText ); // CPUs deviceElement = domDocument.createElement( "CPU_List" ); for( int ix = 0; ix < tmpDev.CPU_List.count(); ix++ ) { thirdElement = domDocument.createElement( QString("Caption%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.CPU_List[ix].Caption ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( QString("Name%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.CPU_List[ix].QEMU_Name ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); } domElement.appendChild( deviceElement ); // Machines deviceElement = domDocument.createElement( "Machine_List" ); for( int ix = 0; ix < tmpDev.Machine_List.count(); ix++ ) { thirdElement = domDocument.createElement( QString("Caption%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Machine_List[ix].Caption ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( QString("Name%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Machine_List[ix].QEMU_Name ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); } domElement.appendChild( deviceElement ); // Network Cards deviceElement = domDocument.createElement( "Network_Card_List" ); for( int ix = 0; ix < tmpDev.Network_Card_List.count(); ix++ ) { thirdElement = domDocument.createElement( QString("Caption%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Network_Card_List[ix].Caption ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( QString("Name%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Network_Card_List[ix].QEMU_Name ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); } domElement.appendChild( deviceElement ); // Audio Cards deviceElement = domDocument.createElement( "Audio_Card_List" ); thirdElement = domDocument.createElement( "sb16" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_sb16 ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "es1370" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_es1370 ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "Adlib" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_Adlib ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "PC_Speaker" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_PC_Speaker ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "GUS" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_GUS ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "AC97" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_AC97 ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "HDA" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_HDA ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( "cs4231a" ); domText = domDocument.createTextNode( (tmpDev.Audio_Card_List.Audio_cs4231a ? "yes" : "no") ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); domElement.appendChild( deviceElement ); // Video Cards deviceElement = domDocument.createElement( "Video_Card_List" ); for( int ix = 0; ix < tmpDev.Video_Card_List.count(); ix++ ) { thirdElement = domDocument.createElement( QString("Caption%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Video_Card_List[ix].Caption ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); thirdElement = domDocument.createElement( QString("Name%1").arg(ix) ); domText = domDocument.createTextNode( tmpDev.Video_Card_List[ix].QEMU_Name ); thirdElement.appendChild( domText ); deviceElement.appendChild( thirdElement ); } domElement.appendChild( deviceElement ); // Platform Specific Options // PSO_SMP_Count deviceElement = domDocument.createElement( "SMP_Count" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( QString::number(tmpDev.PSO_SMP_Count) ); deviceElement.appendChild( domText ); // PSO_SMP_Cores deviceElement = domDocument.createElement( "SMP_Cores" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SMP_Cores ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SMP_Threads deviceElement = domDocument.createElement( "SMP_Threads" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SMP_Threads ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SMP_Sockets deviceElement = domDocument.createElement( "SMP_Sockets" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SMP_Sockets ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SMP_MaxCPUs deviceElement = domDocument.createElement( "SMP_MaxCPUs" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SMP_MaxCPUs ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Device deviceElement = domDocument.createElement( "Device" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Device ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Device_USB_EHCI deviceElement = domDocument.createElement( "Device_USB_EHCI" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Device_USB_EHCI ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive deviceElement = domDocument.createElement( "Drive" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_File deviceElement = domDocument.createElement( "Drive_File" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_File ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_If deviceElement = domDocument.createElement( "Drive_If" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_If ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Bus_Unit deviceElement = domDocument.createElement( "Drive_Bus_Unit" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Bus_Unit ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Index deviceElement = domDocument.createElement( "Drive_Index" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Index ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Media deviceElement = domDocument.createElement( "Drive_Media" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Media ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Cyls_Heads_Secs_Trans deviceElement = domDocument.createElement( "Drive_Cyls_Heads_Secs_Trans" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Cyls_Heads_Secs_Trans ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Snapshot deviceElement = domDocument.createElement( "Drive_Snapshot" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Snapshot ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Cache deviceElement = domDocument.createElement( "Drive_Cache" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Cache ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_AIO deviceElement = domDocument.createElement( "Drive_AIO" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_AIO ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Format deviceElement = domDocument.createElement( "Drive_Format" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Format ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Serial deviceElement = domDocument.createElement( "Drive_Serial" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Serial ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_ADDR deviceElement = domDocument.createElement( "Drive_ADDR" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_ADDR ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Drive_Boot deviceElement = domDocument.createElement( "Drive_Boot" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Drive_Boot ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Boot_Order deviceElement = domDocument.createElement( "Boot_Order" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Boot_Order ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Initial_Graphic_Mode deviceElement = domDocument.createElement( "Initial_Graphic_Mode" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Initial_Graphic_Mode ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_FB_Boot_Check deviceElement = domDocument.createElement( "No_FB_Boot_Check" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_FB_Boot_Check ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Win2K_Hack deviceElement = domDocument.createElement( "Win2K_Hack" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Win2K_Hack ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Kernel_KQEMU deviceElement = domDocument.createElement( "Kernel_KQEMU" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Kernel_KQEMU ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_ACPI deviceElement = domDocument.createElement( "No_ACPI" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_ACPI ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_KVM deviceElement = domDocument.createElement( "KVM" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_KVM ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_RTC_TD_Hack deviceElement = domDocument.createElement( "RTC_TD_Hack" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_RTC_TD_Hack ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_MTDBlock deviceElement = domDocument.createElement( "MTDBlock" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_MTDBlock ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SD deviceElement = domDocument.createElement( "SD" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SD ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_PFlash deviceElement = domDocument.createElement( "PFlash" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_PFlash ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Name deviceElement = domDocument.createElement( "Name" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Name ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Curses deviceElement = domDocument.createElement( "Curses" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Curses ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_Frame deviceElement = domDocument.createElement( "No_Frame" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_Frame ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Alt_Grab deviceElement = domDocument.createElement( "Alt_Grab" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Alt_Grab ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_Quit deviceElement = domDocument.createElement( "No_Quit" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_Quit ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SDL deviceElement = domDocument.createElement( "SDL" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SDL ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Portrait deviceElement = domDocument.createElement( "Portrait" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Portrait ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_Shutdown deviceElement = domDocument.createElement( "No_Shutdown" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_Shutdown ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Startdate deviceElement = domDocument.createElement( "Startdate" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Startdate ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Show_Cursor deviceElement = domDocument.createElement( "Show_Cursor" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Show_Cursor ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Bootp deviceElement = domDocument.createElement( "Bootp" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Bootp ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_type_vde deviceElement = domDocument.createElement( "Net_type_vde" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_type_vde ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_type_dump deviceElement = domDocument.createElement( "Net_type_dump" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_type_dump ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_name deviceElement = domDocument.createElement( "Net_name" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_name ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_addr deviceElement = domDocument.createElement( "Net_addr" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_addr ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_vectors deviceElement = domDocument.createElement( "Net_vectors" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_vectors ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_net deviceElement = domDocument.createElement( "Net_net" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_net ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_host deviceElement = domDocument.createElement( "Net_host" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_host ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_restrict deviceElement = domDocument.createElement( "Net_restrict" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_restrict ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_dhcpstart deviceElement = domDocument.createElement( "Net_dhcpstart" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_dhcpstart ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_dns deviceElement = domDocument.createElement( "Net_dns" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_dns ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_tftp deviceElement = domDocument.createElement( "Net_tftp" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_tftp ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_bootfile deviceElement = domDocument.createElement( "Net_bootfile" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_bootfile ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_smb deviceElement = domDocument.createElement( "Net_smb" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_smb ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_hostfwd deviceElement = domDocument.createElement( "Net_hostfwd" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_hostfwd ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_guestfwd deviceElement = domDocument.createElement( "Net_guestfwd" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_guestfwd ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_ifname deviceElement = domDocument.createElement( "Net_ifname" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_ifname ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_script deviceElement = domDocument.createElement( "Net_script" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_script ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_downscript deviceElement = domDocument.createElement( "Net_downscript" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_downscript ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_sndbuf deviceElement = domDocument.createElement( "Net_sndbuf" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_sndbuf ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_vnet_hdr deviceElement = domDocument.createElement( "Net_vnet_hdr" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_vnet_hdr ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_vhost deviceElement = domDocument.createElement( "Net_vhost" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_vhost ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_Net_vhostfd deviceElement = domDocument.createElement( "Net_vhostfd" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_vhostfd ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_listen deviceElement = domDocument.createElement( "Net_listen" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_listen ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_connect deviceElement = domDocument.createElement( "Net_connect" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_connect ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_mcast deviceElement = domDocument.createElement( "Net_mcast" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_mcast ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_sock deviceElement = domDocument.createElement( "Net_sock" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_sock ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_port deviceElement = domDocument.createElement( "Net_port" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_port ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_group deviceElement = domDocument.createElement( "Net_group" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_group ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_mode deviceElement = domDocument.createElement( "Net_mode" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_mode ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_file deviceElement = domDocument.createElement( "Net_file" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_file ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Net_len deviceElement = domDocument.createElement( "Net_len" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Net_len ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Enable_KVM deviceElement = domDocument.createElement( "Enable_KVM" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Enable_KVM ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_KVM deviceElement = domDocument.createElement( "No_KVM" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_KVM ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_KVM_IRQChip deviceElement = domDocument.createElement( "No_KVM_IRQChip" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_KVM_IRQChip ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_KVM_Pit deviceElement = domDocument.createElement( "No_KVM_Pit" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_KVM_Pit ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_No_KVM_Pit_Reinjection deviceElement = domDocument.createElement( "No_KVM_Pit_Reinjection" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_No_KVM_Pit_Reinjection ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Enable_Nesting deviceElement = domDocument.createElement( "Enable_Nesting" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Enable_Nesting ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_KVM_Shadow_Memory deviceElement = domDocument.createElement( "KVM_Shadow_Memory" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_KVM_Shadow_Memory ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SPICE deviceElement = domDocument.createElement( "SPICE" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SPICE ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_QXL deviceElement = domDocument.createElement( "QXL" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_QXL ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_TFTP deviceElement = domDocument.createElement( "TFTP" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_TFTP ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_SMB deviceElement = domDocument.createElement( "SMB" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_SMB ? "yes" : "no") ); deviceElement.appendChild( domText ); // PSO_Std_VGA deviceElement = domDocument.createElement( "Std_VGA" ); domElement.appendChild( deviceElement ); domText = domDocument.createTextNode( (tmpDev.PSO_Std_VGA ? "yes" : "no") ); deviceElement.appendChild( domText ); emulatorElement.appendChild( domElement ); // Next ++devicesIter; } // Save to file QFile outFile( path ); if( ! outFile.open(QFile::WriteOnly | QFile::Truncate) ) { AQError( "bool Emulator::Save() const", QString("Cannot create emulator file \"%1\"").arg(path) ); return false; } QTextStream outStream( &outFile ); domDocument.save( outStream, 4 ); return true; } QString Emulator::Get_Emulator_File_Path() const { if( Name.isEmpty() ) { AQError( "QString Emulator::Get_Emulator_File_Path() const", "Name is empty" ); return ""; } QSettings settigs; QFileInfo info( settigs.fileName() ); QString aqemuSettingsFolder = info.absoluteDir().absolutePath(); if( ! QFile::exists(aqemuSettingsFolder) ) { AQError( "QString Emulator::Get_Emulator_File_Path() const", QString("Cannot get path for save emulator! Folder \"%1\" not exists!").arg(aqemuSettingsFolder) ); return ""; } // All ok. Return result return QDir::toNativeSeparators( aqemuSettingsFolder + (aqemuSettingsFolder.endsWith("/") || aqemuSettingsFolder.endsWith("\\") ? "" : "/") + Name + ".emulator" ); } /* void Emulator::Set_Type( VM::Emulator_Type type ) { Type = type; // FIXME if( Type != type ) { // bin names QStringList QEMU_Binary_Names; QEMU_Binary_Names << "qemu"; QEMU_Binary_Names << "qemu-system-x86_64"; QEMU_Binary_Names << "qemu-system-arm"; QEMU_Binary_Names << "qemu-system-cris"; QEMU_Binary_Names << "qemu-system-m68k"; QEMU_Binary_Names << "qemu-system-mips"; QEMU_Binary_Names << "qemu-system-mipsel"; QEMU_Binary_Names << "qemu-system-mips64"; QEMU_Binary_Names << "qemu-system-mips64el"; QEMU_Binary_Names << "qemu-system-ppc"; QEMU_Binary_Names << "qemu-system-ppc64"; QEMU_Binary_Names << "qemu-system-ppcemb"; QEMU_Binary_Names << "qemu-system-sh4"; QEMU_Binary_Names << "qemu-system-sh4eb"; QEMU_Binary_Names << "qemu-system-sparc"; QStringList KVM_Binary_Names; KVM_Binary_Names << "kvm"; if( type == VM::QEMU ) { Binary_Files.clear(); for( int ix = 0; ix < QEMU_Binary_Names.count(); ++ix ) Binary_Files[ QEMU_Binary_Names[ix] ] = ""; } else if( type == VM::KVM ) { Binary_Files.clear(); for( int ix = 0; ix < KVM_Binary_Names.count(); ++ix ) Binary_Files[ KVM_Binary_Names[ix] ] = ""; } else { AQError( "void Emulator::Set_Type( const QString &type )", "Type Incorrect! Use Default: QEMU" ); Binary_Files.clear(); for( int ix = 0; ix < QEMU_Binary_Names.count(); ++ix ) Binary_Files[ QEMU_Binary_Names[ix] ] = ""; } Type = type; } }*/ const QString &Emulator::Get_Name() const { return Name; } void Emulator::Set_Name( const QString &name ) { Name = name; } bool Emulator::Get_Default() const { return Default; } void Emulator::Set_Default( bool on ) { Default = on; } const QString &Emulator::Get_Path() const { return Path; } void Emulator::Set_Path( const QString &path ) { Path = path; } bool Emulator::Get_Check_Version() const { return Check_Version; } void Emulator::Set_Check_Version( bool check ) { Check_Version = check; } bool Emulator::Get_Check_Available_Options() const { return Check_Available_Options; } void Emulator::Set_Check_Available_Options( bool check ) { Check_Available_Options = check; } bool Emulator::Get_Force_Version() const { return Force_Version; } void Emulator::Set_Force_Version( bool on ) { Force_Version = on; } VM::Emulator_Version Emulator::Get_Version() const { return Version; } void Emulator::Set_Version( VM::Emulator_Version ver ) { Version = ver; } const QMap &Emulator::Get_Binary_Files() const { return Binary_Files; } void Emulator::Set_Binary_Files( const QMap &files ) { Binary_Files = files; } const QMap &Emulator::Get_Devices() const { if( Force_Version || Check_Version ) { switch( Version ) { case VM::QEMU_2_0: return System_Info::Emulator_QEMU_2_0; /*case VM::KVM_2_0: return System_Info::Emulator_KVM_2_0; */ //tobgle //FIXME? default: AQError( "const QMap &Emulator::Get_Devices() const", "Emulator Version Incorrect!" ); static QMap emptyMap; return emptyMap; } } else // Check Options or Save Options { return Devices; } } void Emulator::Set_Devices( const QMap &devices ) { Devices = devices; } //--------------------------------------------------------------------------- // VM_Nativ_Storage_Device -------------------------------------------------- VM_Nativ_Storage_Device::VM_Nativ_Storage_Device() { UFile_Path = false; File_Path = ""; UInterface = false; Interface = VM::DI_IDE; UBus_Unit = false; Bus = 0; Unit = 0; UIndex = false; Index = 0; UMedia = false; Media = VM::DM_Disk; Uhdachs = false; Cyls = 0; Heads = 0; Secs = 0; Trans = 0; USnapshot = false; Snapshot = false; UCache = false; Cache = "none"; UAIO = false; AIO = "threads"; UBoot = false; Boot = false; } VM_Nativ_Storage_Device::VM_Nativ_Storage_Device( const VM_Nativ_Storage_Device &sd ) { UFile_Path = sd.Use_File_Path(); File_Path = sd.Get_File_Path(); UInterface = sd.Use_Interface(); Interface = sd.Get_Interface(); UBus_Unit = sd.Use_Bus_Unit(); Bus = sd.Get_Bus(); Unit = sd.Get_Unit(); UIndex = sd.Use_Index(); Index = sd.Get_Index(); UMedia = sd.Use_Media(); Media = sd.Get_Media(); Uhdachs = sd.Use_hdachs(); Cyls = sd.Get_Cyls(); Heads = sd.Get_Heads(); Secs = sd.Get_Secs(); Trans = sd.Get_Trans(); USnapshot = sd.Use_Snapshot(); Snapshot = sd.Get_Snapshot(); UCache = sd.Use_Cache(); Cache = sd.Get_Cache(); UAIO = sd.Use_AIO(); AIO = sd.Get_AIO(); UBoot = sd.Use_Boot(); Boot = sd.Get_Boot(); } bool VM_Nativ_Storage_Device::Get_Nativ_Mode() const { if( UAIO ) return true; if( UBoot ) return true; if( UBus_Unit ) return true; if( UCache ) return true; if( UFile_Path ) return true; if( Uhdachs ) return true; if( UIndex ) return true; if( UInterface ) return true; if( UMedia ) return true; if( USnapshot ) return true; // Nativ device options not used return false; } QString VM_Nativ_Storage_Device::Get_QEMU_Device_Name() const { // FIXME Get_QEMU_Device_Name() return "ide0-hd1"; } bool VM_Nativ_Storage_Device::operator==( const VM_Nativ_Storage_Device &sd ) const { if( UFile_Path == sd.Use_File_Path() && File_Path == sd.Get_File_Path() && UInterface == sd.Use_Interface() && Interface == sd.Get_Interface() && UBus_Unit == sd.Use_Bus_Unit() && Bus == sd.Get_Bus() && Unit == sd.Get_Unit() && UIndex == sd.Use_Index() && Index == sd.Get_Index() && UMedia == sd.Use_Media() && Media == sd.Get_Media() && Uhdachs == sd.Use_hdachs() && Cyls == sd.Get_Cyls() && Heads == sd.Get_Heads() && Secs == sd.Get_Secs() && Trans == sd.Get_Trans() && USnapshot == sd.Use_Snapshot() && Snapshot == sd.Get_Snapshot() && UCache == sd.Use_Cache() && Cache == sd.Get_Cache() && UAIO == sd.Use_AIO() && AIO == sd.Get_AIO() && UBoot == sd.Use_Boot() && Boot == sd.Get_Boot() ) { return true; } else { return false; } } bool VM_Nativ_Storage_Device::operator!=( const VM_Nativ_Storage_Device &sd ) const { return ! ( operator==(sd) ); } bool VM_Nativ_Storage_Device::Use_File_Path() const { return UFile_Path; } void VM_Nativ_Storage_Device::Use_File_Path( bool use ) { UFile_Path = use; } const QString &VM_Nativ_Storage_Device::Get_File_Path() const { return File_Path; } void VM_Nativ_Storage_Device::Set_File_Path( const QString &path ) { File_Path = path; } bool VM_Nativ_Storage_Device::Use_Interface() const { return UInterface; } void VM_Nativ_Storage_Device::Use_Interface( bool use ) { UInterface = use; } VM::Device_Interface VM_Nativ_Storage_Device::Get_Interface() const { return Interface; } void VM_Nativ_Storage_Device::Set_Interface( VM::Device_Interface di ) { Interface = di; } bool VM_Nativ_Storage_Device::Use_Bus_Unit() const { return UBus_Unit; } void VM_Nativ_Storage_Device::Use_Bus_Unit( bool use ) { UBus_Unit = use; } int VM_Nativ_Storage_Device::Get_Bus() const { return Bus; } void VM_Nativ_Storage_Device::Set_Bus( int bus ) { Bus = bus; } int VM_Nativ_Storage_Device::Get_Unit() const { return Unit; } void VM_Nativ_Storage_Device::Set_Unit( int unit ) { Unit = unit; } bool VM_Nativ_Storage_Device::Use_Index() const { return UIndex; } void VM_Nativ_Storage_Device::Use_Index( bool use ) { UIndex = use; } int VM_Nativ_Storage_Device::Get_Index() const { return Index; } void VM_Nativ_Storage_Device::Set_Index( int index ) { Index = index; } bool VM_Nativ_Storage_Device::Use_Media() const { return UMedia; } void VM_Nativ_Storage_Device::Use_Media( bool use ) { UMedia = use; } VM::Device_Media VM_Nativ_Storage_Device::Get_Media() const { return Media; } void VM_Nativ_Storage_Device::Set_Media( VM::Device_Media media ) { Media = media; } bool VM_Nativ_Storage_Device::Use_hdachs() const { return Uhdachs; } void VM_Nativ_Storage_Device::Use_hdachs( bool use ) { Uhdachs = use; } unsigned long VM_Nativ_Storage_Device::Get_Cyls() const { return Cyls; } void VM_Nativ_Storage_Device::Set_Cyls( unsigned long cyls ) { Cyls = cyls; } unsigned long VM_Nativ_Storage_Device::Get_Heads() const { return Heads; } void VM_Nativ_Storage_Device::Set_Heads( unsigned long heads ) { Heads = heads; } unsigned long VM_Nativ_Storage_Device::Get_Secs() const { return Secs; } void VM_Nativ_Storage_Device::Set_Secs( unsigned long secs ) { Secs = secs; } unsigned long VM_Nativ_Storage_Device::Get_Trans() const { return Trans; } void VM_Nativ_Storage_Device::Set_Trans( unsigned long trans ) { Trans = trans; } bool VM_Nativ_Storage_Device::Use_Snapshot() const { return USnapshot; } void VM_Nativ_Storage_Device::Use_Snapshot( bool use ) { USnapshot = use; } bool VM_Nativ_Storage_Device::Get_Snapshot() const { return Snapshot; } void VM_Nativ_Storage_Device::Set_Snapshot( bool snapshot ) { Snapshot = snapshot; } bool VM_Nativ_Storage_Device::Use_Cache() const { return UCache; } void VM_Nativ_Storage_Device::Use_Cache( bool use ) { UCache = use; } const QString &VM_Nativ_Storage_Device::Get_Cache() const { return Cache; } void VM_Nativ_Storage_Device::Set_Cache( const QString &cache ) { Cache = cache; } bool VM_Nativ_Storage_Device::Use_AIO() const { return UAIO; } void VM_Nativ_Storage_Device::Use_AIO( bool use ) { UAIO = use; } const QString &VM_Nativ_Storage_Device::Get_AIO() const { return AIO; } void VM_Nativ_Storage_Device::Set_AIO( const QString &aio ) { AIO = aio; } bool VM_Nativ_Storage_Device::Use_Boot() const { return UBoot; } void VM_Nativ_Storage_Device::Use_Boot( bool use ) { UBoot = use; } bool VM_Nativ_Storage_Device::Get_Boot() const { return Boot; } void VM_Nativ_Storage_Device::Set_Boot( bool boot ) { Boot = boot; } //=========================================================================== // VM_Storage_Device Class -------------------------------------------------- VM_Storage_Device::VM_Storage_Device() { Enabled = false; File_Name = ""; Nativ_Device = VM_Nativ_Storage_Device(); } VM_Storage_Device::VM_Storage_Device( const VM_Storage_Device &device ) { Enabled = device.Get_Enabled(); File_Name = device.Get_File_Name(); Nativ_Device = device.Get_Nativ_Device(); } VM_Storage_Device::VM_Storage_Device( bool enabled, const QString &file_name ) { Enabled = enabled; File_Name = file_name; Nativ_Device = VM_Nativ_Storage_Device(); Nativ_Device.Set_File_Path( file_name ); } VM_Storage_Device::VM_Storage_Device( bool enabled, const QString &file_name, bool nativ_mode, const VM_Nativ_Storage_Device &device ) { Enabled = enabled; File_Name = file_name; Nativ_Device = VM_Nativ_Storage_Device( device ); Nativ_Device.Set_File_Path( file_name ); } bool VM_Storage_Device::operator==( const VM_Storage_Device &device ) const { if( Enabled == device.Get_Enabled() && File_Name == device.Get_File_Name() && Nativ_Device == device.Get_Nativ_Device() ) { return true; } else return false; } bool VM_Storage_Device::operator!=( const VM_Storage_Device &device ) const { return ! operator==( device ); } bool VM_Storage_Device::Get_Enabled() const { return Enabled; } void VM_Storage_Device::Set_Enabled( bool enabled ) { Enabled = enabled; } const QString &VM_Storage_Device::Get_File_Name() const { return File_Name; } void VM_Storage_Device::Set_File_Name( const QString &file_name ) { File_Name = file_name; Nativ_Device.Set_File_Path( file_name ); } bool VM_Storage_Device::Get_Nativ_Mode() const { return Nativ_Device.Get_Nativ_Mode(); } const VM_Nativ_Storage_Device &VM_Storage_Device::Get_Nativ_Device() const { return Nativ_Device; } void VM_Storage_Device::Set_Nativ_Device( const VM_Nativ_Storage_Device &device ) { Nativ_Device = device; } //=========================================================================== // VM_Shared_Folder Class -------------------------------------------------- VM_Shared_Folder::VM_Shared_Folder() { Enabled = false; Folder = ""; } VM_Shared_Folder::VM_Shared_Folder( const VM_Shared_Folder &device ) { Enabled = device.Get_Enabled(); Folder = device.Get_Folder(); } VM_Shared_Folder::VM_Shared_Folder( bool enabled, const QString &folder ) { Enabled = enabled; Folder = folder; } bool VM_Shared_Folder::operator==( const VM_Shared_Folder &folder ) const { if( Enabled == folder.Get_Enabled() && Folder == folder.Get_Folder() ) { return true; } else return false; } bool VM_Shared_Folder::operator!=( const VM_Shared_Folder &folder ) const { return ! operator==( folder ); } bool VM_Shared_Folder::Get_Enabled() const { return Enabled; } void VM_Shared_Folder::Set_Enabled( bool enabled ) { Enabled = enabled; } const QString &VM_Shared_Folder::Get_Folder() const { return Folder; } void VM_Shared_Folder::Set_Folder( const QString &folder ) { Folder = folder; } //=========================================================================== // VM_HDD Class ------------------------------------------------------------- VM_HDD::VM_HDD() : VM_Storage_Device() { Reset_Info(); } VM_HDD::VM_HDD( const VM_HDD &hd ) : VM_Storage_Device( hd ) { if( File_Name.isEmpty() ) Reset_Info(); } VM_HDD::VM_HDD( bool enabled, const QString &im_pach ) { Set_Enabled( enabled ); Set_File_Name( im_pach ); if( im_pach.isEmpty() ) Reset_Info(); } bool VM_HDD::operator==( const VM_HDD &v ) const { return VM_Storage_Device::operator==( v ); } bool VM_HDD::operator!=( const VM_HDD &v ) const { return ! ( operator==(v) ); } void VM_HDD::Set_File_Name( const QString &file_name ) { if( file_name.isEmpty() ) Reset_Info(); VM_Storage_Device::Set_File_Name( file_name ); } void VM_HDD::Set_Disk_Info( VM::Disk_Info info ) { Disk_Format = info.Disk_Format; Virtual_Size = info.Virtual_Size; Disk_Size = info.Disk_Size; Cluster_Size = info.Cluster_Size; } const QString &VM_HDD::Get_Image_Format() const { return Disk_Format; } const VM::Device_Size &VM_HDD::Get_Virtual_Size() const { return Virtual_Size; } const VM::Device_Size &VM_HDD::Get_Disk_Size() const { return Disk_Size; } int VM_HDD::Get_Cluster_Size() const { return Cluster_Size; } double VM_HDD::Get_Virtual_Size_in_GB() const { if( Virtual_Size.Size < 1 ) return 0.0; int div = 0; switch( Virtual_Size.Suffix ) { case VM::Size_Suf_Kb: div = 1048576; break; case VM::Size_Suf_Mb: div = 1024; break; case VM::Size_Suf_Gb: div = 1; break; default: AQError( "double VM_HDD::Get_Virtual_Size_in_GB() const", "Default Section!" ); return 0.0; } return Virtual_Size.Size / div; } QString VM_HDD::Get_Complete_Virtual_Size() const { return QString::number(Virtual_Size.Size) + Size_Suffix_to_String(Virtual_Size.Suffix); } QString VM_HDD::Get_Complete_Disk_Size() const { return QString::number(Disk_Size.Size) + Size_Suffix_to_String(Disk_Size.Suffix); } void VM_HDD::Set_Virtual_Size( const VM::Device_Size &size ) { Virtual_Size = size; } void VM_HDD::Set_Image_Format( const QString &format ) { Disk_Format = format; } QString VM_HDD::Size_Suffix_to_String( VM::Size_Suffix suf ) const { switch( suf ) { case VM::Size_Suf_Kb: return "K"; case VM::Size_Suf_Mb: return "M"; case VM::Size_Suf_Gb: return "G"; default: AQError( "QString VM_HDD::Size_Suffix_to_String( VM::Size_Suffix suf ) const", "Size Suffix Incorrect!" ); return ""; } } VM::Device_Size VM_HDD::String_to_Device_Size( const QString &size ) const { VM::Device_Size zero_size, hd_size; zero_size.Size = 0.0; zero_size.Suffix = VM::Size_Suf_Gb; if( size.isEmpty() ) { AQDebug( "VM::Device_Size VM_HDD::String_to_Device_Size( const QString &size ) const", "Size String is Empty..." ); return zero_size; } QRegExp RegInfo = QRegExp( "([\\d]+|[\\d]+[.,][\\d]+).*([KMG]+)" ); if( ! RegInfo.exactMatch(size) ) { AQError( "VM::Device_Size VM_HDD::String_to_Device_Size( const QString &size ) const", "Cannot Match RegExp!" ); return zero_size; } QStringList info_lines = RegInfo.capturedTexts(); bool ok = false; hd_size.Size = info_lines[1].toDouble( &ok ); if( ! ok ) { AQError( "VM::Device_Size VM_HDD::String_to_Device_Size( const QString &size ) const", "Cannot Convert String to Double!" ); return zero_size; } if( info_lines[2] == "K" ) hd_size.Suffix = VM::Size_Suf_Kb; else if( info_lines[2] == "M" ) hd_size.Suffix = VM::Size_Suf_Mb; else if( info_lines[2] == "G" ) hd_size.Suffix = VM::Size_Suf_Gb; else { AQError( "VM::Device_Size VM_HDD::String_to_Device_Size( const QString &size ) const", "HDD Size Suffix Not K,M,G!" ); return zero_size; } return hd_size; } void VM_HDD::Reset_Info() { File_Name = ""; Disk_Format = ""; VM::Device_Size zero_size; zero_size.Size = 0.0; zero_size.Suffix = VM::Size_Suf_Gb; Virtual_Size = zero_size; Disk_Size = zero_size; Cluster_Size = 0; } //=========================================================================== // VM_Snapshot -------------------------------------------------------------- VM_Snapshot::VM_Snapshot() { Tag = ""; ID = ""; Size = ""; Date = ""; VM_Clock = ""; Name = ""; Description = ""; } VM_Snapshot::VM_Snapshot( const VM_Snapshot &s ) { Tag = s.Get_Tag(); ID = s.Get_ID(); Size = s.Get_Size(); Date = s.Get_Date(); VM_Clock = s.Get_VM_Clock(); Name = s.Get_Name(); Description = s.Get_Description(); } bool VM_Snapshot::operator==( const VM_Snapshot &s ) const { if( Tag == s.Get_Tag() && ID == s.Get_ID() && Size == s.Get_Size() && Date == s.Get_Date() && VM_Clock == s.Get_VM_Clock() && Name == s.Get_Name() && Description == s.Get_Description() ) { return true; } else { return false; } } bool VM_Snapshot::operator!=( const VM_Snapshot &s ) const { return ! ( operator==(s) ); } const QString &VM_Snapshot::Get_Tag() const { return Tag; } void VM_Snapshot::Set_Tag( const QString &tag ) { Tag = tag; } const QString &VM_Snapshot::Get_ID() const { return ID; } void VM_Snapshot::Set_ID( const QString &id ) { ID = id; } const QString &VM_Snapshot::Get_Size() const { return Size; } void VM_Snapshot::Set_Size( const QString &size ) { Size = size; } const QString &VM_Snapshot::Get_Date() const { return Date; } void VM_Snapshot::Set_Date( const QString &date ) { Date = date; } const QString &VM_Snapshot::Get_VM_Clock() const { return VM_Clock; } void VM_Snapshot::Set_VM_Clock( const QString &vm_clock ) { VM_Clock = vm_clock; } const QString &VM_Snapshot::Get_Name() const { return Name; } void VM_Snapshot::Set_Name( const QString &name ) { Name = name; } const QString &VM_Snapshot::Get_Description() const { return Description; } void VM_Snapshot::Set_Description( const QString &desc ) { Description = desc; } //=========================================================================== // VM_Net_Card_Nativ -------------------------------------------------------- VM_Net_Card_Nativ::VM_Net_Card_Nativ() { Network_Mode = VM::Net_Mode_Nativ_NIC; Card_Model = ""; MAC = ""; VLAN = 0; Name = ""; Hostname = ""; PortDev = ""; File_Descriptor = 0; Interface_Name = ""; TUN_TAP_Script = ""; TUN_TAP_Down_Script = ""; Listen = ""; Connect = ""; MCast = ""; Sock = ""; Port = 0; Group = ""; Mode = ""; File = ""; Len = 0; Addr = ""; Vectors = 0; Net = ""; Host = ""; Restrict = false; DHCPstart = ""; DNS = ""; Tftp = ""; Bootfile = ""; HostFwd = ""; GuestFwd = ""; SMB = ""; SMBserver = ""; Sndbuf = 0; VNet_hdr = false; VHost = false; VHostFd = false; _Use_MAC = false; _Use_VLAN = false; _Use_Name = false; _Use_Hostname = false; _Use_File_Descriptor = false; _Use_Interface_Name = false; _Use_TUN_TAP_Script = false; _Use_TUN_TAP_Down_Script = false; _Use_Listen = false; _Use_Connect = false; _Use_MCast = false; _Use_Sock = false; _Use_Port = false; _Use_Group = false; _Use_Mode = false; _Use_File = false; _Use_Len = false; _Use_Addr = false; _Use_Vectors = false; _Use_Net = false; _Use_Host = false; _Use_Restrict = false; _Use_DHCPstart = false; _Use_DNS = false; _Use_Tftp = false; _Use_Bootfile = false; _Use_HostFwd = false; _Use_GuestFwd = false; _Use_SMB = false; _Use_SMBserver = false; _Use_Sndbuf = false; _Use_VNet_hdr = false; _Use_VHost = false; _Use_VHostFd = false; } VM_Net_Card_Nativ::VM_Net_Card_Nativ( const VM_Net_Card_Nativ &nc ) { Network_Mode = nc.Get_Network_Type(); Card_Model = nc.Get_Card_Model(); MAC = nc.Get_MAC_Address(); VLAN = nc.Get_VLAN(); Name = nc.Get_Name(); Hostname = nc.Get_Hostname(); PortDev = nc.Get_PortDev(); File_Descriptor = nc.Get_File_Descriptor(); Interface_Name = nc.Get_Interface_Name(); TUN_TAP_Script = nc.Get_TUN_TAP_Script(); TUN_TAP_Down_Script = nc.Get_TUN_TAP_Down_Script(); Listen = nc.Get_Listen(); Connect = nc.Get_Connect(); MCast = nc.Get_MCast(); Sock = nc.Get_Sock(); Port = nc.Get_Port(); Group = nc.Get_Group(); Mode = nc.Get_Mode(); File = nc.Get_File(); Len = nc.Get_Len(); Addr = nc.Get_Addr(); Vectors = nc.Get_Vectors(); Net = nc.Get_Net(); Host = nc.Get_Host(); Restrict = nc.Get_Restrict(); DHCPstart = nc.Get_DHCPstart(); DNS = nc.Get_DNS(); Tftp = nc.Get_Tftp(); Bootfile = nc.Get_Bootfile(); HostFwd = nc.Get_HostFwd(); GuestFwd = nc.Get_GuestFwd(); SMB = nc.Get_SMB(); SMBserver = nc.Get_SMBserver(); Sndbuf = nc.Get_Sndbuf(); VNet_hdr = nc.Get_VNet_hdr(); VHost = nc.Get_VHost(); VHostFd = nc.Get_VHostFd(); _Use_MAC = nc.Use_MAC_Address(); _Use_VLAN = nc.Use_VLAN(); _Use_Name = nc.Use_Name(); _Use_Hostname = nc.Use_Hostname(); _Use_File_Descriptor = nc.Use_File_Descriptor(); _Use_Interface_Name = nc.Use_Interface_Name(); _Use_TUN_TAP_Script = nc.Use_TUN_TAP_Script(); _Use_TUN_TAP_Down_Script = nc.Use_TUN_TAP_Down_Script(); _Use_Listen = nc.Use_Listen(); _Use_Connect = nc.Use_Connect(); _Use_MCast = nc.Use_MCast(); _Use_Sock = nc.Use_Sock(); _Use_Port = nc.Use_Port(); _Use_Group = nc.Use_Group(); _Use_Mode = nc.Use_Mode(); _Use_File = nc.Use_File(); _Use_Len = nc.Use_Len(); _Use_Addr = nc.Use_Addr(); _Use_Vectors = nc.Use_Vectors(); _Use_Net = nc.Use_Net(); _Use_Host = nc.Use_Host(); _Use_Restrict = nc.Use_Restrict(); _Use_DHCPstart = nc.Use_DHCPstart(); _Use_DNS = nc.Use_DNS(); _Use_Tftp = nc.Use_Tftp(); _Use_Bootfile = nc.Use_Bootfile(); _Use_HostFwd = nc.Use_HostFwd(); _Use_GuestFwd = nc.Use_GuestFwd(); _Use_SMB = nc.Use_SMB(); _Use_SMBserver = nc.Use_SMBserver(); _Use_Sndbuf = nc.Use_Sndbuf(); _Use_VNet_hdr = nc.Use_VNet_hdr(); _Use_VHost = nc.Use_VHost(); _Use_VHostFd = nc.Use_VHostFd(); } bool VM_Net_Card_Nativ::operator==( const VM_Net_Card_Nativ &nc ) const { if( Network_Mode == nc.Get_Network_Type() && Card_Model == nc.Get_Card_Model() && MAC == nc.Get_MAC_Address() && VLAN == nc.Get_VLAN() && Name == nc.Get_Name() && Hostname == nc.Get_Hostname() && PortDev == nc.Get_PortDev() && File_Descriptor == nc.Get_File_Descriptor() && Interface_Name == nc.Get_Interface_Name() && TUN_TAP_Script == nc.Get_TUN_TAP_Script() && TUN_TAP_Down_Script == nc.Get_TUN_TAP_Down_Script() && Listen == nc.Get_Listen() && Connect == nc.Get_Connect() && MCast == nc.Get_MCast() && Sock == nc.Get_Sock() && Port == nc.Get_Port() && Group == nc.Get_Group() && Mode == nc.Get_Mode() && File == nc.Get_File() && Len == nc.Get_Len() && Addr == nc.Get_Addr() && Vectors == nc.Get_Vectors() && Net == nc.Get_Net() && Host == nc.Get_Host() && Restrict == nc.Get_Restrict() && DHCPstart == nc.Get_DHCPstart() && DNS == nc.Get_DNS() && Tftp == nc.Get_Tftp() && Bootfile == nc.Get_Bootfile() && HostFwd == nc.Get_HostFwd() && GuestFwd == nc.Get_GuestFwd() && SMB == nc.Get_SMB() && SMBserver == nc.Get_SMBserver() && Sndbuf == nc.Get_Sndbuf() && VNet_hdr == nc.Get_VNet_hdr() && VHost == nc.Get_VHost() && VHostFd == nc.Get_VHostFd() && _Use_MAC == nc.Use_MAC_Address() && _Use_VLAN == nc.Use_VLAN() && _Use_Name == nc.Use_Name() && _Use_Hostname == nc.Use_Hostname() && _Use_File_Descriptor == nc.Use_File_Descriptor() && _Use_Interface_Name == nc.Use_Interface_Name() && _Use_TUN_TAP_Script == nc.Use_TUN_TAP_Script() && _Use_TUN_TAP_Down_Script == nc.Use_TUN_TAP_Down_Script() && _Use_Listen == nc.Use_Listen() && _Use_Connect == nc.Use_Connect() && _Use_MCast == nc.Use_MCast() && _Use_Sock == nc.Use_Sock() && _Use_Port == nc.Use_Port() && _Use_Group == nc.Use_Group() && _Use_Mode == nc.Use_Mode() && _Use_File == nc.Use_File() && _Use_Len == nc.Use_Len() && _Use_Addr == nc.Use_Addr() && _Use_Vectors == nc.Use_Vectors() && _Use_Net == nc.Use_Net() && _Use_Host == nc.Use_Host() && _Use_Restrict == nc.Use_Restrict() && _Use_DHCPstart == nc.Use_DHCPstart() && _Use_DNS == nc.Use_DNS() && _Use_Tftp == nc.Use_Tftp() && _Use_Bootfile == nc.Use_Bootfile() && _Use_HostFwd == nc.Use_HostFwd() && _Use_GuestFwd == nc.Use_GuestFwd() && _Use_SMB == nc.Use_SMB() && _Use_SMBserver == nc.Use_SMBserver() && _Use_Sndbuf == nc.Use_Sndbuf() && _Use_VNet_hdr == nc.Use_VNet_hdr() && _Use_VHost == nc.Use_VHost() && _Use_VHostFd == nc.Use_VHostFd() ) { return true; } else { return false; } } bool VM_Net_Card_Nativ::operator!=( const VM_Net_Card_Nativ &nc ) const { return ! operator ==( nc ); } QString VM_Net_Card_Nativ::Generate_MAC() const { VM_Net_Card tmp_card; tmp_card.Set_Card_Model( Card_Model ); return tmp_card.Generate_MAC(); } VM::Network_Mode_Nativ VM_Net_Card_Nativ::Get_Network_Type() const { return Network_Mode; } void VM_Net_Card_Nativ::Set_Network_Type( VM::Network_Mode_Nativ mode ) { Network_Mode = mode; } const QString &VM_Net_Card_Nativ::Get_Card_Model() const { return Card_Model; } void VM_Net_Card_Nativ::Set_Card_Model( const QString &m ) { Card_Model = m; } bool VM_Net_Card_Nativ::Use_MAC_Address() const { return _Use_MAC; } void VM_Net_Card_Nativ::Use_MAC_Address( bool use ) { _Use_MAC = use; } const QString &VM_Net_Card_Nativ::Get_MAC_Address() const { return MAC; } void VM_Net_Card_Nativ::Set_MAC_Address( const QString &ma ) { MAC = ma; } bool VM_Net_Card_Nativ::Use_VLAN() const { return _Use_VLAN; } void VM_Net_Card_Nativ::Use_VLAN( bool use ) { _Use_VLAN = use; } int VM_Net_Card_Nativ::Get_VLAN() const { return VLAN; } void VM_Net_Card_Nativ::Set_VLAN( int vl ) { VLAN = vl; } bool VM_Net_Card_Nativ::Use_Name() const { return _Use_Name; } void VM_Net_Card_Nativ::Use_Name( bool use ) { _Use_Name = use; } const QString &VM_Net_Card_Nativ::Get_Name() const { return Name; } void VM_Net_Card_Nativ::Set_Name( const QString &name ) { Name = name; } bool VM_Net_Card_Nativ::Use_Hostname() const { return _Use_Hostname; } void VM_Net_Card_Nativ::Use_Hostname( bool use ) { _Use_Hostname = use; } const QString &VM_Net_Card_Nativ::Get_Hostname() const { return Hostname; } void VM_Net_Card_Nativ::Set_Hostname( const QString &hostname ) { Hostname = hostname; } const QString &VM_Net_Card_Nativ::Get_PortDev() const { return PortDev; } void VM_Net_Card_Nativ::Set_PortDev( const QString &portDev ) { PortDev = portDev; } bool VM_Net_Card_Nativ::Use_File_Descriptor() const { return _Use_File_Descriptor; } void VM_Net_Card_Nativ::Use_File_Descriptor( bool use ) { _Use_File_Descriptor = use; } int VM_Net_Card_Nativ::Get_File_Descriptor() const { return File_Descriptor; } void VM_Net_Card_Nativ::Set_File_Descriptor( int f ) { File_Descriptor = f; } bool VM_Net_Card_Nativ::Use_Interface_Name() const { return _Use_Interface_Name; } void VM_Net_Card_Nativ::Use_Interface_Name( bool use ) { _Use_Interface_Name = use; } const QString &VM_Net_Card_Nativ::Get_Interface_Name() const { return Interface_Name; } void VM_Net_Card_Nativ::Set_Interface_Name( const QString &n ) { Interface_Name = n; } bool VM_Net_Card_Nativ::Use_TUN_TAP_Script() const { return _Use_TUN_TAP_Script; } void VM_Net_Card_Nativ::Use_TUN_TAP_Script( bool use ) { _Use_TUN_TAP_Script = use; } const QString &VM_Net_Card_Nativ::Get_TUN_TAP_Script() const { return TUN_TAP_Script; } void VM_Net_Card_Nativ::Set_TUN_TAP_Script( const QString &s ) { TUN_TAP_Script = s; } bool VM_Net_Card_Nativ::Use_TUN_TAP_Down_Script() const { return _Use_TUN_TAP_Down_Script; } void VM_Net_Card_Nativ::Use_TUN_TAP_Down_Script( bool use ) { _Use_TUN_TAP_Down_Script = use; } const QString &VM_Net_Card_Nativ::Get_TUN_TAP_Down_Script() const { return TUN_TAP_Down_Script; } void VM_Net_Card_Nativ::Set_TUN_TAP_Down_Script( const QString &s ) { TUN_TAP_Down_Script = s; } bool VM_Net_Card_Nativ::Use_Listen() const { return _Use_Listen; } void VM_Net_Card_Nativ::Use_Listen( bool use ) { _Use_Listen = use; } const QString &VM_Net_Card_Nativ::Get_Listen() const { return Listen; } void VM_Net_Card_Nativ::Set_Listen( const QString &listen ) { Listen = listen; } bool VM_Net_Card_Nativ::Use_Connect() const { return _Use_Connect; } void VM_Net_Card_Nativ::Use_Connect( bool use ) { _Use_Connect = use; } const QString &VM_Net_Card_Nativ::Get_Connect() const { return Connect; } void VM_Net_Card_Nativ::Set_Connect( const QString &con ) { Connect = con; } bool VM_Net_Card_Nativ::Use_MCast() const { return _Use_MCast; } void VM_Net_Card_Nativ::Use_MCast( bool use ) { _Use_MCast = use; } const QString &VM_Net_Card_Nativ::Get_MCast() const { return MCast; } void VM_Net_Card_Nativ::Set_MCast( const QString &mcast ) { MCast = mcast; } bool VM_Net_Card_Nativ::Use_Sock() const { return _Use_Sock; } void VM_Net_Card_Nativ::Use_Sock( bool use ) { _Use_Sock = use; } const QString &VM_Net_Card_Nativ::Get_Sock() const { return Sock; } void VM_Net_Card_Nativ::Set_Sock( const QString &sock ) { Sock = sock; } bool VM_Net_Card_Nativ::Use_Port() const { return _Use_Port; } void VM_Net_Card_Nativ::Use_Port( bool use ) { _Use_Port = use; } int VM_Net_Card_Nativ::Get_Port() const { return Port; } void VM_Net_Card_Nativ::Set_Port( int p ) { Port = p; } bool VM_Net_Card_Nativ::Use_Group() const { return _Use_Group; } void VM_Net_Card_Nativ::Use_Group( bool use ) { _Use_Group = use; } const QString &VM_Net_Card_Nativ::Get_Group() const { return Group; } void VM_Net_Card_Nativ::Set_Group( const QString &group ) { Group = group; } bool VM_Net_Card_Nativ::Use_Mode() const { return _Use_Mode; } void VM_Net_Card_Nativ::Use_Mode( bool use ) { _Use_Mode = use; } const QString &VM_Net_Card_Nativ::Get_Mode() const { return Mode; } void VM_Net_Card_Nativ::Set_Mode( const QString &mode ) { Mode = mode; } bool VM_Net_Card_Nativ::Use_File() const { return _Use_File; } void VM_Net_Card_Nativ::Use_File( bool use ) { _Use_File = use; } const QString &VM_Net_Card_Nativ::Get_File() const { return File; } void VM_Net_Card_Nativ::Set_File( const QString &file ) { File = file; } bool VM_Net_Card_Nativ::Use_Len() const { return _Use_Len; } void VM_Net_Card_Nativ::Use_Len( bool use ) { _Use_Len = use; } int VM_Net_Card_Nativ::Get_Len() const { return Len; } void VM_Net_Card_Nativ::Set_Len( int kb ) { Len = kb; } bool VM_Net_Card_Nativ::Use_Addr() const { return _Use_Addr; } void VM_Net_Card_Nativ::Use_Addr( bool use ) { _Use_Addr = use; } const QString &VM_Net_Card_Nativ::Get_Addr() const { return Addr; } void VM_Net_Card_Nativ::Set_Addr( const QString &addr ) { Addr = addr; } bool VM_Net_Card_Nativ::Use_Vectors() const { return _Use_Vectors; } void VM_Net_Card_Nativ::Use_Vectors( bool use ) { _Use_Vectors = use; } int VM_Net_Card_Nativ::Get_Vectors() const { return Vectors; } void VM_Net_Card_Nativ::Set_Vectors( int vectors ) { Vectors = vectors; } bool VM_Net_Card_Nativ::Use_Net() const { return _Use_Net; } void VM_Net_Card_Nativ::Use_Net( bool use ) { _Use_Net = use; } const QString &VM_Net_Card_Nativ::Get_Net() const { return Net; } void VM_Net_Card_Nativ::Set_Net( const QString &net ) { Net = net; } bool VM_Net_Card_Nativ::Use_Host() const { return _Use_Host; } void VM_Net_Card_Nativ::Use_Host( bool use ) { _Use_Host = use; } const QString &VM_Net_Card_Nativ::Get_Host() const { return Host; } void VM_Net_Card_Nativ::Set_Host( const QString &host ) { Host = host; } bool VM_Net_Card_Nativ::Use_Restrict() const { return _Use_Restrict; } void VM_Net_Card_Nativ::Use_Restrict( bool use ) { _Use_Restrict = use; } bool VM_Net_Card_Nativ::Get_Restrict() const { return Restrict; } void VM_Net_Card_Nativ::Set_Restrict( bool use ) { Restrict = use; } bool VM_Net_Card_Nativ::Use_DHCPstart() const { return _Use_DHCPstart; } void VM_Net_Card_Nativ::Use_DHCPstart( bool use ) { _Use_DHCPstart = use; } const QString &VM_Net_Card_Nativ::Get_DHCPstart() const { return DHCPstart; } void VM_Net_Card_Nativ::Set_DHCPstart( const QString &addr ) { DHCPstart = addr; } bool VM_Net_Card_Nativ::Use_DNS() const { return _Use_DNS; } void VM_Net_Card_Nativ::Use_DNS( bool use ) { _Use_DNS = use; } const QString &VM_Net_Card_Nativ::Get_DNS() const { return DNS; } void VM_Net_Card_Nativ::Set_DNS( const QString &addr ) { DNS = addr; } bool VM_Net_Card_Nativ::Use_Tftp() const { return _Use_Tftp; } void VM_Net_Card_Nativ::Use_Tftp( bool use ) { _Use_Tftp = use; } const QString &VM_Net_Card_Nativ::Get_Tftp() const { return Tftp; } void VM_Net_Card_Nativ::Set_Tftp( const QString &dir ) { Tftp = dir; } bool VM_Net_Card_Nativ::Use_Bootfile() const { return _Use_Bootfile; } void VM_Net_Card_Nativ::Use_Bootfile( bool use ) { _Use_Bootfile = use; } const QString &VM_Net_Card_Nativ::Get_Bootfile() const { return Bootfile; } void VM_Net_Card_Nativ::Set_Bootfile( const QString &file ) { Bootfile = file; } bool VM_Net_Card_Nativ::Use_HostFwd() const { return _Use_HostFwd; } void VM_Net_Card_Nativ::Use_HostFwd( bool use ) { _Use_HostFwd = use; } const QString &VM_Net_Card_Nativ::Get_HostFwd() const { return HostFwd; } void VM_Net_Card_Nativ::Set_HostFwd( const QString &rule ) { HostFwd = rule; } bool VM_Net_Card_Nativ::Use_GuestFwd() const { return _Use_GuestFwd; } void VM_Net_Card_Nativ::Use_GuestFwd( bool use ) { _Use_GuestFwd = use; } const QString &VM_Net_Card_Nativ::Get_GuestFwd() const { return GuestFwd; } void VM_Net_Card_Nativ::Set_GuestFwd( const QString &rule ) { GuestFwd = rule; } bool VM_Net_Card_Nativ::Use_SMB() const { return _Use_SMB; } void VM_Net_Card_Nativ::Use_SMB( bool use ) { _Use_SMB = use; } const QString &VM_Net_Card_Nativ::Get_SMB() const { return SMB; } void VM_Net_Card_Nativ::Set_SMB( const QString &dir ) { SMB = dir; } bool VM_Net_Card_Nativ::Use_SMBserver() const { return _Use_SMBserver; } void VM_Net_Card_Nativ::Use_SMBserver( bool use ) { _Use_SMBserver = use; } const QString &VM_Net_Card_Nativ::Get_SMBserver() const { return SMBserver; } void VM_Net_Card_Nativ::Set_SMBserver( const QString &addr ) { SMBserver = addr; } bool VM_Net_Card_Nativ::Use_Sndbuf() const { return _Use_Sndbuf; } void VM_Net_Card_Nativ::Use_Sndbuf( bool use ) { _Use_Sndbuf = use; } int VM_Net_Card_Nativ::Get_Sndbuf() const { return Sndbuf; } void VM_Net_Card_Nativ::Set_Sndbuf( int bytes ) { Sndbuf = bytes; } bool VM_Net_Card_Nativ::Use_VNet_hdr() const { return _Use_VNet_hdr; } void VM_Net_Card_Nativ::Use_VNet_hdr( bool use ) { _Use_VNet_hdr = use; } bool VM_Net_Card_Nativ::Get_VNet_hdr() const { return VNet_hdr; } void VM_Net_Card_Nativ::Set_VNet_hdr( bool use ) { VNet_hdr = use; } bool VM_Net_Card_Nativ::Use_VHost() const { return _Use_VHost; } void VM_Net_Card_Nativ::Use_VHost( bool use ) { _Use_VHost = use; } bool VM_Net_Card_Nativ::Get_VHost() const { return VHost; } void VM_Net_Card_Nativ::Set_VHost( bool use ) { VHost = use; } bool VM_Net_Card_Nativ::Use_VHostFd() const { return _Use_VHostFd; } void VM_Net_Card_Nativ::Use_VHostFd( bool use ) { _Use_VHostFd = use; } int VM_Net_Card_Nativ::Get_VHostFd() const { return VHostFd; } void VM_Net_Card_Nativ::Set_VHostFd( int port ) { VHostFd = port; } //=========================================================================== // VM_Net_Card -------------------------------------------------------------- VM_Net_Card::VM_Net_Card() { Card_Model = ""; Net_Mode = VM::Net_Mode_None; IP = ""; MAC = ""; Hostname = ""; Port = 0; VLAN = 0; Use_TUN_TAP_Script = true; TUN_TAP_Script = ""; Interface_Name = ""; File_Descriptor = 0; } VM_Net_Card::VM_Net_Card( const VM_Net_Card &nc ) { Card_Model = nc.Get_Card_Model(); Net_Mode = nc.Get_Net_Mode(); Hostname = nc.Get_Hostname(); IP = nc.Get_IP_Address(); MAC = nc.Get_MAC_Address(); Port = nc.Get_Port(); VLAN = nc.Get_VLAN(); Use_TUN_TAP_Script = nc.Get_Use_TUN_TAP_Script(); TUN_TAP_Script = nc.Get_TUN_TAP_Script(); Interface_Name = nc.Get_Interface_Name(); File_Descriptor = nc.Get_File_Descriptor(); } bool VM_Net_Card::operator==( const VM_Net_Card &nc ) const { if( Card_Model == nc.Get_Card_Model() && Net_Mode == nc.Get_Net_Mode() && Hostname == nc.Get_Hostname() && IP == nc.Get_IP_Address() && MAC == nc.Get_MAC_Address() && Port == nc.Get_Port() && VLAN == nc.Get_VLAN() && Use_TUN_TAP_Script == nc.Get_Use_TUN_TAP_Script() && TUN_TAP_Script == nc.Get_TUN_TAP_Script() && Interface_Name == nc.Get_Interface_Name() && File_Descriptor == nc.Get_File_Descriptor() ) { return true; } else { return false; } } bool VM_Net_Card::operator!=( const VM_Net_Card &nc ) const { return ! ( operator==(nc) ); } QString VM_Net_Card::Generate_MAC() const { QSettings settings; QString mode = settings.value( "MAC_Generation_Mode", "" ).toString(); QString nmac = QUuid::createUuid().toString(); // Random HEX for MAC if( mode == "Random" ) { nmac = nmac.mid( 25, 10 ); nmac.prepend( "00" ); // Two Zero First, For Valid MAC } else if( mode == "QEMU_Segment" ) { nmac = nmac.mid( 25, 6 ); nmac.prepend( "525400" ); // QEMU Segment } else // Default. Valid Card MAC { nmac = nmac.mid( 25, 6 ); // MAC Data Base QStringList novell_mac; novell_mac << "00001B" << "0000D8"; QStringList sun_mac; sun_mac << "00015D" << "0003BA" << "000782" << "00104F" << "0010E0"; QStringList amd_mac; amd_mac << "00001A" << "000C87"; QStringList smc_mac; smc_mac << "0004E2" << "000BC5" << "0013F7" << "00222D" << "0023C6"; QStringList motorola_mac; motorola_mac << "00080E" << "000A28" << "000B06" << "000CE5" << "000E5C"; QStringList intel_mac; intel_mac << "001111" << "0012F0" << "0013CE" << "0013E8" << "001676"; QString model = Get_Card_Model(); if( model == "ne2k_pci" || model == "ne2k_isa" ) { int rm = Get_Random( 0,1 ); if( rm >= 0 && rm < novell_mac.count() ) nmac.prepend( novell_mac[rm] ); } else if( model == "i82551" || model == "i82557b" || model == "i82559er" || model == "e1000" ) { int rm = Get_Random( 0,4 ); if( rm >= 0 && rm < intel_mac.count() ) nmac.prepend( intel_mac[rm] ); } else if( model == "pcnet" ) { int rm = Get_Random( 0,1 ); if( rm >= 0 ) nmac.prepend( amd_mac[rm] ); } else if( model == "rtl8139" ) { nmac.prepend( "00E04C" ); } else if( model == "smc91c111" ) { int rm = Get_Random( 0,4 ); if( rm >= 0 ) nmac.prepend( smc_mac[rm] ); } else if( model == "mcf_fec" ) { int rm = Get_Random( 0,4 ); if( rm >= 0 ) nmac.prepend( motorola_mac[rm] ); } else if( model == "lance" ) { int rm = Get_Random( 0,4 ); if( rm >= 0 ) nmac.prepend( sun_mac[rm] ); } else if( model == "fseth" ) { // FIXME qemu-system-cris nmac = QUuid::createUuid().toString(); // Random HEX for MAC nmac = nmac.mid( 25, 10 ); nmac.prepend( "00" ); // Two Zero First, For Valid MAC } else if( model == "xilinx-ethlite" ) { // FIXME qemu-system-microblaze nmac = QUuid::createUuid().toString(); // Random HEX for MAC nmac = nmac.mid( 25, 10 ); nmac.prepend( "00" ); // Two Zero First, For Valid MAC } else if( model == "" ) // Default 00 + Random { nmac = QUuid::createUuid().toString(); // Random HEX for MAC nmac = nmac.mid( 25, 10 ); nmac.prepend( "00" ); // Two Zero First, For Valid MAC } else { AQWarning( "QString VM_Net_Card::Generate_MAC() const", "Net Card Model Invalid!" ); } // MAC Found? if( nmac.count() != 12 ) { AQError( "QString VM_Net_Card::Generate_MAC() const", "Cannot Get MAC for This Card!" ); nmac = QUuid::createUuid().toString(); // Random HEX for MAC nmac = nmac.mid( 25, 6 ); nmac.prepend( "525400" ); // QEMU Segment } } // Adding separators : for( int nx = 2; nx < nmac.count(); nx+=3 ) { nmac = nmac.insert( nx, ":" ); } nmac = nmac.toLower(); return nmac; } const QString &VM_Net_Card::Get_Card_Model() const { return Card_Model; } void VM_Net_Card::Set_Card_Model( const QString &m ) { Card_Model = m; } VM::Network_Mode VM_Net_Card::Get_Net_Mode() const { return Net_Mode; } void VM_Net_Card::Set_Net_Mode( VM::Network_Mode mode ) { Net_Mode = mode; } const QString &VM_Net_Card::Get_Hostname() const { return Hostname; } void VM_Net_Card::Set_Hostname( const QString &hn ) { Hostname = hn; } const QString &VM_Net_Card::Get_IP_Address() const { return IP; } void VM_Net_Card::Set_IP_Address( const QString &ia ) { IP = ia; } const QString &VM_Net_Card::Get_MAC_Address() const { return MAC; } void VM_Net_Card::Set_MAC_Address( const QString &ma ) { MAC = ma; } int VM_Net_Card::Get_Port() const { return Port; } void VM_Net_Card::Set_Port( int p ) { Port = p; } int VM_Net_Card::Get_VLAN() const { return VLAN; } void VM_Net_Card::Set_VLAN( int vl ) { VLAN = vl; } bool VM_Net_Card::Get_Use_TUN_TAP_Script() const { return Use_TUN_TAP_Script; } void VM_Net_Card::Set_Use_TUN_TAP_Script( bool use ) { Use_TUN_TAP_Script = use; } const QString &VM_Net_Card::Get_TUN_TAP_Script() const { return TUN_TAP_Script; } void VM_Net_Card::Set_TUN_TAP_Script( const QString &s ) { TUN_TAP_Script = s; } const QString &VM_Net_Card::Get_Interface_Name() const { return Interface_Name; } void VM_Net_Card::Set_Interface_Name( const QString &n ) { Interface_Name = n; } int VM_Net_Card::Get_File_Descriptor() const { return File_Descriptor; } void VM_Net_Card::Set_File_Descriptor( int f ) { File_Descriptor = f; } //=========================================================================== // VM_Redirections Class ---------------------------------------------------- VM_Redirection::VM_Redirection() { Protocol = "NOT"; Host_Port = 1; Guest_IP = "0.0.0.0"; Guest_Port = 1; } VM_Redirection::VM_Redirection( const VM_Redirection &r ) { Protocol = r.Get_Protocol(); Host_Port = r.Get_Host_Port(); Guest_IP = r.Get_Guest_IP(); Guest_Port = r.Get_Guest_Port(); } bool VM_Redirection::operator==( const VM_Redirection &r ) const { if( Protocol == r.Get_Protocol() && Host_Port == r.Get_Host_Port() && Guest_IP == r.Get_Guest_IP() && Guest_Port == r.Get_Guest_Port() ) { return true; } else { return false; } } bool VM_Redirection::operator!=( const VM_Redirection &r ) const { return ! ( operator==(r) ); } const QString &VM_Redirection::Get_Protocol() const { return Protocol; } void VM_Redirection::Set_Protocol( const QString &p ) { Protocol = p; } int VM_Redirection::Get_Host_Port() const { return Host_Port; } void VM_Redirection::Set_Host_Port( int hp ) { Host_Port = hp; } const QString &VM_Redirection::Get_Guest_IP() const { return Guest_IP; } void VM_Redirection::Set_Guest_IP( const QString &ip ) { Guest_IP = ip; } int VM_Redirection::Get_Guest_Port() const { return Guest_Port; } void VM_Redirection::Set_Guest_Port( int p ) { Guest_Port = p; } //=========================================================================== // VM_Port ------------------------------------------------------------------ VM_Port::VM_Port() { Port_Redir = VM::PR_Default; Param_Line = ""; } VM_Port::VM_Port( const VM_Port &p ) { Port_Redir = p.Get_Port_Redirection(); Param_Line = p.Get_Parametrs_Line(); } bool VM_Port::operator==( const VM_Port &p ) const { if( Port_Redir == p.Get_Port_Redirection() && Param_Line == p.Get_Parametrs_Line() ) { return true; } else { return false; } } bool VM_Port::operator!=( const VM_Port &p ) const { return ! ( operator==(p) ); } VM::Port_Redirection VM_Port::Get_Port_Redirection() const { return Port_Redir; } void VM_Port::Set_Port_Redirection( VM::Port_Redirection pr ) { Port_Redir = pr; } const QString &VM_Port::Get_Parametrs_Line() const { return Param_Line; } void VM_Port::Set_Parametrs_Line( const QString &pl ) { Param_Line = pl; } //=========================================================================== // VM_USB Class ------------------------------------------------------------- VM_USB::VM_USB() { Use_Host_Device = true; Manufacturer_Name = ""; Product_Name = ""; Vendor_ID = ""; Product_ID = ""; Bus = ""; Addr = ""; DevPath = ""; Speed = "0"; Serial_Number = ""; USB_Keyboard = USB_Tablet = USB_WacomTablet = USB_Braille = false; USB_Mouse = true; } VM_USB::VM_USB( const VM_USB &u ) { Use_Host_Device = u.Get_Use_Host_Device(); Manufacturer_Name = u.Get_Manufacturer_Name(); Product_Name = u.Get_Product_Name(); Vendor_ID = u.Get_Vendor_ID(); Product_ID = u.Get_Product_ID(); Bus = u.Get_Bus(); Addr = u.Get_Addr(); DevPath = u.Get_DevPath(); Serial_Number = u.Get_Serial_Number(); Speed = u.Get_Speed(); u.Get_USB_QEMU_Devices( USB_Keyboard, USB_Mouse, USB_Tablet, USB_WacomTablet, USB_Braille ); } bool VM_USB::operator==( const VM_USB &u ) const { bool k, m, t, wt, b; k = m = t = wt = b = false; u.Get_USB_QEMU_Devices( k, m, t, wt, b ); if( Use_Host_Device == u.Get_Use_Host_Device() && Vendor_ID == u.Get_Vendor_ID() && Product_ID == u.Get_Product_ID() && Serial_Number == u.Get_Serial_Number() && USB_Keyboard == k && USB_Mouse == m && USB_Tablet == t && USB_WacomTablet == wt && USB_Braille == b ) { return true; } else return false; } bool VM_USB::operator!=( const VM_USB &u ) const { return ! ( operator==(u) ); } bool VM_USB::Get_Use_Host_Device() const { return Use_Host_Device; } void VM_USB::Set_Use_Host_Device( bool use ) { Use_Host_Device = use; } const QString &VM_USB::Get_Manufacturer_Name() const { return Manufacturer_Name; } void VM_USB::Set_Manufacturer_Name( const QString &name ) { Manufacturer_Name = name; } const QString &VM_USB::Get_Product_Name() const { return Product_Name; } void VM_USB::Set_Product_Name( const QString &name ) { Product_Name = name; } const QString &VM_USB::Get_Vendor_ID() const { return Vendor_ID; } void VM_USB::Set_Vendor_ID( const QString &dev ) { Vendor_ID = dev; } const QString &VM_USB::Get_Product_ID() const { return Product_ID; } void VM_USB::Set_Product_ID( const QString &dev ) { Product_ID = dev; } QString VM_USB::Get_ID_Line() const { return Vendor_ID + ":" + Product_ID; } void VM_USB::Set_ID_Line( const QString &line ) { QRegExp id_line = QRegExp( "([\\dabcdef]{4})[:]{1}([\\dabcdef]{4})" ); if( ! id_line.exactMatch(line) ) { AQError( "void VM_USB::Set_ID_Line( const QString &line )", "Cannot Match QRegExp!" ); return; } QStringList id_str = id_line.capturedTexts(); Vendor_ID = id_str[1]; Product_ID = id_str[2]; } QString VM_USB::Get_Bus() const { return Bus; } void VM_USB::Set_Bus( const QString &bus ) { Bus = bus; } QString VM_USB::Get_Addr() const { return Addr; } void VM_USB::Set_Addr( const QString &addr ) { Addr = addr; } QString VM_USB::Get_DevPath() const { return DevPath; } void VM_USB::Set_DevPath( const QString &devPath ) { DevPath = devPath; } QString VM_USB::Get_Serial_Number() const { return Serial_Number; } void VM_USB::Set_Serial_Number( const QString &serial ) { Serial_Number = serial; } QString VM_USB::Get_Speed() const { return Speed; } void VM_USB::Set_Speed( const QString &speed ) { Speed = speed; } void VM_USB::Get_USB_QEMU_Devices( bool &keyboard, bool &mouse, bool &tablet, bool &wacomTablet, bool &braille ) const { keyboard = USB_Keyboard; mouse = USB_Mouse; tablet = USB_Tablet; wacomTablet = USB_WacomTablet; braille = USB_Braille; } void VM_USB::Set_USB_QEMU_Devices( bool keyboard, bool mouse, bool tablet, bool wacomTablet, bool braille ) { USB_Keyboard = keyboard; USB_Mouse = mouse; USB_Tablet = tablet; USB_WacomTablet = wacomTablet; USB_Braille = braille; } //=========================================================================== // VM_Init_Graphic_Mode ----------------------------------------------------- VM_Init_Graphic_Mode::VM_Init_Graphic_Mode() { Enabled = false; Width = 800; Height = 600; Depth = 16; } VM_Init_Graphic_Mode::VM_Init_Graphic_Mode( const VM_Init_Graphic_Mode &mode ) { Enabled = mode.Get_Enabled(); Width = mode.Get_Width(); Height = mode.Get_Height(); Depth = mode.Get_Depth(); } bool VM_Init_Graphic_Mode::operator==( const VM_Init_Graphic_Mode &mode ) const { if( Enabled == mode.Get_Enabled() && Width == mode.Get_Width() && Height == mode.Get_Height() && Depth == mode.Get_Depth() ) { return true; } else { return false; } } bool VM_Init_Graphic_Mode::operator!=( const VM_Init_Graphic_Mode &mode ) const { return ! ( operator==(mode) ); } bool VM_Init_Graphic_Mode::Get_Enabled() const { return Enabled; } void VM_Init_Graphic_Mode::Set_Enabled( bool use ) { Enabled = use; } int VM_Init_Graphic_Mode::Get_Width() const { return Width; } void VM_Init_Graphic_Mode::Set_Width( int w ) { Width = w; } int VM_Init_Graphic_Mode::Get_Height() const { return Height; } void VM_Init_Graphic_Mode::Set_Height( int h ) { Height = h; } int VM_Init_Graphic_Mode::Get_Depth() const { return Depth; } void VM_Init_Graphic_Mode::Set_Depth( int d ) { Depth = d; } //=========================================================================== // VM_SPICE ----------------------------------------------------------------- VM_SPICE::VM_SPICE() { Enable_SPICE = false; GXL_Devices_Count = 1; RAM_Size = 64; Port = 5930; _Use_SPort = false; SPort = 1; _Use_Hostname = false; Hostname = ""; _Use_Image_Compression = false; Image_Compression = VM::SPICE_IC_Type_on; _Use_Video_Stream_Compression = true; _Use_Renderer = false; Renderer_List << VM::SPICE_Renderer_cairo << VM::SPICE_Renderer_oglpbuf << VM::SPICE_Renderer_oglpixmap; _Use_Playback_Compression = true; _Use_Password = false; Password = ""; } VM_SPICE::VM_SPICE( const VM_SPICE &vm_spice ) { Enable_SPICE = vm_spice.Use_SPICE(); GXL_Devices_Count = vm_spice.Get_GXL_Devices_Count(); RAM_Size = vm_spice.Get_RAM_Size(); Port = vm_spice.Get_Port(); _Use_SPort = vm_spice.Use_SPort(); SPort = vm_spice.Get_SPort(); _Use_Hostname = vm_spice.Use_Hostname(); Hostname = vm_spice.Get_Hostname(); _Use_Image_Compression = vm_spice.Use_Image_Compression(); Image_Compression = vm_spice.Get_Image_Compression(); _Use_Video_Stream_Compression = vm_spice.Use_Video_Stream_Compression(); _Use_Renderer = vm_spice.Use_Renderer(); Renderer_List = vm_spice.Get_Renderer_List(); _Use_Playback_Compression = vm_spice.Use_Playback_Compression(); _Use_Password = vm_spice.Use_Password(); Password = vm_spice.Get_Password(); } bool VM_SPICE::operator==( const VM_SPICE &vm_spice ) const { if( Enable_SPICE == vm_spice.Use_SPICE() && GXL_Devices_Count == vm_spice.Get_GXL_Devices_Count() && RAM_Size == vm_spice.Get_RAM_Size() && Port == vm_spice.Get_Port() && _Use_SPort == vm_spice.Use_SPort() && SPort == vm_spice.Get_SPort() && _Use_Hostname == vm_spice.Use_Hostname() && Hostname == vm_spice.Get_Hostname() && _Use_Image_Compression == vm_spice.Use_Image_Compression() && Image_Compression == vm_spice.Get_Image_Compression() && _Use_Video_Stream_Compression == vm_spice.Use_Video_Stream_Compression() && _Use_Renderer == vm_spice.Use_Renderer() && Renderer_List == vm_spice.Get_Renderer_List() && _Use_Playback_Compression == vm_spice.Use_Playback_Compression() && _Use_Password == vm_spice.Use_Password() && Password == vm_spice.Get_Password() ) { return true; } else { return false; } } bool VM_SPICE::Use_SPICE() const { return Enable_SPICE; } void VM_SPICE::Use_SPICE( bool use ) { Enable_SPICE = use; } bool VM_SPICE::operator!=( const VM_SPICE &vm_spice ) const { return ! ( operator==(vm_spice) ); } unsigned int VM_SPICE::Get_GXL_Devices_Count() const { return GXL_Devices_Count; } void VM_SPICE::Set_GXL_Devices_Count( unsigned int count ) { GXL_Devices_Count = count; } int VM_SPICE::Get_RAM_Size() const { return RAM_Size; } void VM_SPICE::Set_RAM_Size( int size ) { RAM_Size = size; } unsigned int VM_SPICE::Get_Port() const { return Port; } void VM_SPICE::Set_Port( unsigned int port ) { Port = port; } bool VM_SPICE::Use_SPort() const { return _Use_SPort; } void VM_SPICE::Use_SPort( bool use ) { _Use_SPort = use; } unsigned int VM_SPICE::Get_SPort() const { return SPort; } void VM_SPICE::Set_SPort( unsigned int sport ) { SPort = sport; } bool VM_SPICE::Use_Hostname() const { return _Use_Hostname; } void VM_SPICE::Use_Hostname( bool use ) { _Use_Hostname = use; } QString VM_SPICE::Get_Hostname() const { return Hostname; } void VM_SPICE::Set_Hostname( QString hostname ) { Hostname = hostname; } bool VM_SPICE::Use_Image_Compression() const { return _Use_Image_Compression; } void VM_SPICE::Use_Image_Compression( bool use ) { _Use_Image_Compression = use; } VM::SPICE_Image_Compression_Type VM_SPICE::Get_Image_Compression() const { return Image_Compression; } void VM_SPICE::Set_Image_Compression( VM::SPICE_Image_Compression_Type type ) { Image_Compression = type; } bool VM_SPICE::Use_Video_Stream_Compression() const { return _Use_Video_Stream_Compression; } void VM_SPICE::Use_Video_Stream_Compression( bool use ) { _Use_Video_Stream_Compression = use; } bool VM_SPICE::Use_Renderer() const { return _Use_Renderer; } void VM_SPICE::Use_Renderer( bool use ) { _Use_Renderer = use; } const QList &VM_SPICE::Get_Renderer_List() const { return Renderer_List; } void VM_SPICE::Set_Renderer_List( const QList &list ) { Renderer_List = list; } bool VM_SPICE::Use_Playback_Compression() const { return _Use_Playback_Compression; } void VM_SPICE::Use_Playback_Compression( bool use ) { _Use_Playback_Compression = use; } bool VM_SPICE::Use_Password() const { return _Use_Password; } void VM_SPICE::Use_Password( bool use ) { _Use_Password = use; } QString VM_SPICE::Get_Password() const { return Password; } void VM_SPICE::Set_Password( QString password ) { Password = password; } //=========================================================================== aqemu-0.9.2/src/VM_Devices.h000066400000000000000000000721531272330227200155660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VM_DEVICES_H #define VM_DEVICES_H #include #include #include #include #include #include class VM { public: // Emulator type enum Machine_Accelerator { KVM, XEN, TCG }; // Emulators Version enum Emulator_Version { Obsolete, QEMU_2_0, QEMU_2_1, QEMU_2_2, QEMU_2_3, QEMU_2_4, QEMU_2_5, QEMU_2_6 }; // Virtual Machine State enum VM_State { VMS_Running, VMS_Power_Off, VMS_Pause, VMS_Saved, VMS_In_Error }; static QString Accel_To_String(Machine_Accelerator accel) { switch(accel) { case KVM: return "kvm"; break; case XEN: return "xen"; break; case TCG: return "tcg"; break; default: return ""; } } static Machine_Accelerator String_To_Accel(QString accel) { if (accel.toLower() == "qemu") return VM::TCG; else if (accel.toLower() == "tcg") return VM::TCG; else if (accel.toLower() == "kvm") return VM::KVM; else if (accel.toLower() == "qemu-kvm") return VM::KVM; else if (accel.toLower() == "xen") return VM::XEN; else return VM::KVM; //default //FIXME? is this a good default? } // x86 audio cards ( one or more ) class Sound_Cards { public: bool Audio_sb16; bool Audio_es1370; bool Audio_Adlib; bool Audio_PC_Speaker; bool Audio_GUS; bool Audio_AC97; bool Audio_HDA; bool Audio_cs4231a; Sound_Cards() { Audio_sb16 = Audio_es1370 = Audio_Adlib = Audio_PC_Speaker = Audio_GUS = Audio_AC97 = Audio_HDA = Audio_cs4231a = false; } bool operator==( const Sound_Cards &v ) const { if( Audio_sb16 == v.Audio_sb16 && Audio_es1370 == v.Audio_es1370 && Audio_Adlib == v.Audio_Adlib && Audio_PC_Speaker == v.Audio_PC_Speaker && Audio_GUS == v.Audio_GUS && Audio_AC97 == v.Audio_AC97 && Audio_HDA == v.Audio_HDA && Audio_cs4231a == v.Audio_cs4231a ) { return true; } else { return false; } } bool operator!=( const Sound_Cards &v ) const { return ! operator==(v); } }; // KQEMU module mode enum Acseleration_Mode { KQEMU_Disabled, KQEMU_Enabled, KQEMU_Full, KQEMU_Default }; // SMP Settings class SMP_Options { public: unsigned short SMP_Count; unsigned short SMP_Cores; unsigned short SMP_Threads; unsigned short SMP_Sockets; unsigned short SMP_MaxCPUs; SMP_Options() { SMP_Count = 1; SMP_Cores = 0; SMP_Threads = 0; SMP_Sockets = 0; SMP_MaxCPUs = 0; } bool operator==( const SMP_Options &v ) const { if( SMP_Count == v.SMP_Count && SMP_Cores == v.SMP_Cores && SMP_Threads == v.SMP_Threads && SMP_Sockets == v.SMP_Sockets && SMP_MaxCPUs == v.SMP_MaxCPUs ) { return true; } else { return false; } } bool operator!=( const SMP_Options &v ) const { return ! operator==(v); } }; // Boot Priority enum Boot_Device { Boot_From_FDA, Boot_From_FDB, Boot_From_CDROM, Boot_From_HDD, Boot_From_Network1, Boot_From_Network2, Boot_From_Network3, Boot_From_Network4, Boot_None }; // Boot Order struct Boot_Order { bool Enabled; Boot_Device Type; }; // Kilobyte, Megabyte, Gigabyte enum Size_Suffix { Size_Suf_Kb, Size_Suf_Mb, Size_Suf_Gb }; // Size for Storage Devices struct Device_Size { double Size; Size_Suffix Suffix; }; // All HDD Image Disk Information struct Disk_Info { QString Image_File_Name, Disk_Format; VM::Device_Size Virtual_Size, Disk_Size; int Cluster_Size; }; // Storage Device Interfaces enum Device_Interface { DI_IDE, DI_SCSI, DI_SD, DI_MTD, DI_Floppy, DI_PFlash, DI_Virtio }; // Storage Device Media enum Device_Media { DM_Disk, DM_CD_ROM }; // Serial/Parallel Port Redirections enum Port_Redirection { PR_Default, PR_vc, PR_pty, PR_none, PR_null, PR_dev, PR_host_port, PR_file, PR_stdio, PR_pipe, PR_udp, PR_tcp, PR_telnet, PR_unix, PR_com, PR_msmouse, PR_mon, PR_braille }; // QEMU Network Modes enum Network_Mode { Net_Mode_None, Net_Mode_Usermode, Net_Mode_Tuntap, Net_Mode_Tuntapfd, Net_Mode_Tcplisten, Net_Mode_Tcpfd, Net_Mode_Tcpconnect, Net_Mode_Multicast, Net_Mode_Multicastfd, Net_Mode_Dummy }; // New Network Modes enum Network_Mode_Nativ { Net_Mode_Nativ_NIC, Net_Mode_Nativ_User, Net_Mode_Nativ_Chanel, Net_Mode_Nativ_TAP, Net_Mode_Nativ_Socket, Net_Mode_Nativ_MulticastSocket, Net_Mode_Nativ_VDE, Net_Mode_Nativ_Dump }; // Image Compression Type (Used in SPICE) enum SPICE_Image_Compression_Type { SPICE_IC_Type_on, SPICE_IC_Type_auto_glz, SPICE_IC_Type_auto_lz, SPICE_IC_Type_quic, SPICE_IC_Type_glz, SPICE_IC_Type_lz, SPICE_IC_Type_off }; // Renderer Type (Used in SPICE) enum SPICE_Renderer { SPICE_Renderer_oglpbuf, SPICE_Renderer_oglpixmap, SPICE_Renderer_cairo }; }; class Device_Map { public: Device_Map() { Caption = ""; QEMU_Name = ""; }; Device_Map( QString cp, QString nm ) : Caption(cp), QEMU_Name(nm) {}; QString Caption; QString QEMU_Name; }; class Available_Devices { public: // Constructor for init values Available_Devices(); // QEMU System Device_Map System; // QEMU CPUs QList CPU_List; // QEMU Machines QList Machine_List; // QEMU Network Cards QList Network_Card_List; // QEMU Audio Cards VM::Sound_Cards Audio_Card_List; // QEMU Video Cards QList Video_Card_List; // Platform Specific Options unsigned short PSO_SMP_Count; bool PSO_SMP_Cores; bool PSO_SMP_Threads; bool PSO_SMP_Sockets; bool PSO_SMP_MaxCPUs; bool PSO_Device; bool PSO_Device_USB_EHCI; bool PSO_Device_USB_XHCI; bool PSO_Drive; bool PSO_Drive_File; bool PSO_Drive_If; bool PSO_Drive_Bus_Unit; bool PSO_Drive_Index; bool PSO_Drive_Media; bool PSO_Drive_Cyls_Heads_Secs_Trans; bool PSO_Drive_Snapshot; bool PSO_Drive_Cache; bool PSO_Drive_AIO; bool PSO_Drive_Format; bool PSO_Drive_Serial; bool PSO_Drive_ADDR; bool PSO_Drive_Boot; bool PSO_Boot_Order; bool PSO_Initial_Graphic_Mode; bool PSO_No_FB_Boot_Check; bool PSO_Win2K_Hack; bool PSO_Kernel_KQEMU; bool PSO_No_ACPI; bool PSO_KVM; bool PSO_RTC_TD_Hack; bool PSO_MTDBlock; bool PSO_SD; bool PSO_PFlash; bool PSO_Name; bool PSO_Curses; bool PSO_No_Frame; bool PSO_Alt_Grab; bool PSO_No_Quit; bool PSO_SDL; bool PSO_Portrait; bool PSO_No_Shutdown; bool PSO_Startdate; bool PSO_Show_Cursor; bool PSO_Bootp; bool PSO_Net_type_vde; bool PSO_Net_type_dump; bool PSO_Net_name; bool PSO_Net_addr; bool PSO_Net_vectors; bool PSO_Net_net; bool PSO_Net_host; bool PSO_Net_restrict; bool PSO_Net_dhcpstart; bool PSO_Net_dns; bool PSO_Net_tftp; bool PSO_Net_bootfile; bool PSO_Net_smb; bool PSO_Net_hostfwd; bool PSO_Net_guestfwd; bool PSO_Net_ifname; bool PSO_Net_script; bool PSO_Net_downscript; bool PSO_Net_sndbuf; bool PSO_Net_vnet_hdr; bool PSO_Net_vhost; bool PSO_Net_vhostfd; bool PSO_Net_listen; bool PSO_Net_connect; bool PSO_Net_mcast; bool PSO_Net_sock; bool PSO_Net_port; bool PSO_Net_group; bool PSO_Net_mode; bool PSO_Net_file; bool PSO_Net_len; bool PSO_Enable_KVM; bool PSO_No_KVM; bool PSO_No_KVM_IRQChip; bool PSO_No_KVM_Pit; bool PSO_No_KVM_Pit_Reinjection; bool PSO_Enable_Nesting; bool PSO_KVM_Shadow_Memory; bool PSO_TFTP; bool PSO_SMB; bool PSO_Std_VGA; bool PSO_SPICE; bool PSO_QXL; }; class Emulator { public: Emulator(); Emulator( const Emulator &emul ); bool operator==( const Emulator &emul ) const; bool operator!=( const Emulator &emul ) const; bool Load( const QString &path ); bool Save() const; QString Get_Emulator_File_Path() const; const QString &Get_Name() const; void Set_Name( const QString &name ); bool Get_Default() const; void Set_Default( bool on ); const QString &Get_Path() const; void Set_Path( const QString &path ); bool Get_Check_Version() const; void Set_Check_Version( bool check ); bool Get_Check_Available_Options() const; void Set_Check_Available_Options( bool check ); bool Get_Force_Version() const; void Set_Force_Version( bool on ); VM::Emulator_Version Get_Version() const; void Set_Version( VM::Emulator_Version ver ); const QMap &Get_Binary_Files() const; void Set_Binary_Files( const QMap &files ); const QMap &Get_Devices() const; void Set_Devices( const QMap &devices ); private: QString Name; QString Path; bool Default; bool Check_Version; bool Check_Available_Options; bool Force_Version; VM::Emulator_Version Version; // KEY for next maps is emulator exeutable id (like qemu-system-arm) QMap Binary_Files; // VALUE is path to executable QMap Devices; // VALUE is Available_Devices class }; // Nativ Storage Device (QEMU >= 0.9.1 Device Style) class VM_Nativ_Storage_Device { public: VM_Nativ_Storage_Device(); VM_Nativ_Storage_Device( const VM_Nativ_Storage_Device &sd ); bool Get_Nativ_Mode() const; QString Get_QEMU_Device_Name() const; bool operator==( const VM_Nativ_Storage_Device &sd ) const; bool operator!=( const VM_Nativ_Storage_Device &sd ) const; bool Use_File_Path() const; void Use_File_Path( bool use ); const QString &Get_File_Path() const; void Set_File_Path( const QString &path ); bool Use_Interface() const; void Use_Interface( bool use ); VM::Device_Interface Get_Interface() const; void Set_Interface( VM::Device_Interface di ); bool Use_Bus_Unit() const; void Use_Bus_Unit( bool use ); int Get_Bus() const; void Set_Bus( int bus ); int Get_Unit() const; void Set_Unit( int unit ); bool Use_Index() const; void Use_Index( bool use ); int Get_Index() const; void Set_Index( int index ); bool Use_Media() const; void Use_Media( bool use ); VM::Device_Media Get_Media() const; void Set_Media( VM::Device_Media media ); bool Use_hdachs() const; void Use_hdachs( bool use ); unsigned long Get_Cyls() const; void Set_Cyls( unsigned long cyls ); unsigned long Get_Heads() const; void Set_Heads( unsigned long heads ); unsigned long Get_Secs() const; void Set_Secs( unsigned long secs ); unsigned long Get_Trans() const; void Set_Trans( unsigned long trans ); bool Use_Snapshot() const; void Use_Snapshot( bool use ); bool Get_Snapshot() const; void Set_Snapshot( bool use ); bool Use_Cache() const; void Use_Cache( bool use ); const QString &Get_Cache() const; void Set_Cache( const QString &cache ); bool Use_AIO() const; void Use_AIO( bool use ); const QString &Get_AIO() const; void Set_AIO( const QString &aio ); bool Use_Boot() const; void Use_Boot( bool use ); bool Get_Boot() const; void Set_Boot( bool use ); private: bool UFile_Path; QString File_Path; bool UInterface; VM::Device_Interface Interface; // ide, scsi, sd, mtd, floppy, pflash bool UBus_Unit; int Bus, Unit; // For SCSI bool UIndex; int Index; // For IDE, Floppy bool UMedia; VM::Device_Media Media; // disk or cdrom bool Uhdachs; unsigned long Cyls, Heads, Secs, Trans; // For -hdachs bool USnapshot; bool Snapshot; bool UCache; QString Cache; bool UAIO; QString AIO; bool UBoot; bool Boot; }; // Virtual Machine Storage Device (FDD, CD, HDD) class VM_Storage_Device { public: VM_Storage_Device(); VM_Storage_Device( const VM_Storage_Device &device ); VM_Storage_Device( bool enabled, const QString &file_name ); VM_Storage_Device( bool enabled, const QString &file_name, bool nativ_mode, const VM_Nativ_Storage_Device &device ); // FIXME test const VM_Nativ_Storage_Device &device IN OLD version without const bool operator==( const VM_Storage_Device &device ) const; bool operator!=( const VM_Storage_Device &device ) const; bool Get_Enabled() const; void Set_Enabled( bool enabled ); const QString &Get_File_Name() const; void Set_File_Name( const QString &file_name ); bool Get_Nativ_Mode() const; const VM_Nativ_Storage_Device &Get_Nativ_Device() const; void Set_Nativ_Device( const VM_Nativ_Storage_Device &device ); protected: bool Enabled; QString File_Name; VM_Nativ_Storage_Device Nativ_Device; }; // Virtual Machine Shared Folder (shared between host and guest) class VM_Shared_Folder { public: VM_Shared_Folder(); VM_Shared_Folder( const VM_Shared_Folder &device ); VM_Shared_Folder( bool enabled, const QString &folder ); bool operator==( const VM_Shared_Folder &device ) const; bool operator!=( const VM_Shared_Folder &device ) const; bool Get_Enabled() const; void Set_Enabled( bool enabled ); const QString &Get_Folder() const; void Set_Folder( const QString &folder ); protected: bool Enabled; QString Folder; }; // Virtual Machine Hard Drive Device class VM_HDD: public VM_Storage_Device { public: VM_HDD(); VM_HDD( const VM_HDD &hd ); VM_HDD( bool enabled, const QString &im_pach ); bool operator==( const VM_HDD &v ) const; bool operator!=( const VM_HDD &v ) const; void Set_File_Name( const QString &file_name ); void Set_Disk_Info( VM::Disk_Info info ); const QString &Get_Image_Format() const; const VM::Device_Size &Get_Virtual_Size() const; const VM::Device_Size &Get_Disk_Size() const; int Get_Cluster_Size() const; double Get_Virtual_Size_in_GB() const; QString Get_Complete_Virtual_Size() const; QString Get_Complete_Disk_Size() const; void Set_Virtual_Size( const VM::Device_Size &size ); void Set_Image_Format( const QString &format ); QString Size_Suffix_to_String( VM::Size_Suffix suf ) const; VM::Device_Size String_to_Device_Size( const QString &size ) const; private: void Reset_Info(); QString Disk_Format; VM::Device_Size Virtual_Size, Disk_Size; int Cluster_Size; }; // VM Snapshot class VM_Snapshot { public: VM_Snapshot(); VM_Snapshot( const VM_Snapshot &s ); bool operator==( const VM_Snapshot &s ) const; bool operator!=( const VM_Snapshot &s ) const; const QString &Get_Tag() const; void Set_Tag( const QString &tag ); const QString &Get_ID() const; void Set_ID( const QString &id ); const QString &Get_Size() const; void Set_Size( const QString &size ); const QString &Get_Date() const; void Set_Date( const QString &date ); const QString &Get_VM_Clock() const; void Set_VM_Clock( const QString &vm_clock ); const QString &Get_Name() const; void Set_Name( const QString &name ); const QString &Get_Description() const; void Set_Description( const QString &desc ); private: QString Tag; // Snapshot Name QString ID; QString Size; QString Date; QString VM_Clock; QString Name; // This name overwrite Tag in GUI QString Description; }; // Network Card class VM_Net_Card { public: VM_Net_Card(); VM_Net_Card( const VM_Net_Card &nc ); bool operator==( const VM_Net_Card &nc ) const; bool operator!=( const VM_Net_Card &nc ) const; QString Generate_MAC() const; const QString &Get_Card_Model() const; void Set_Card_Model( const QString &m ); VM::Network_Mode Get_Net_Mode() const; void Set_Net_Mode( VM::Network_Mode mode ); const QString &Get_Hostname() const; void Set_Hostname( const QString &hn ); const QString &Get_IP_Address() const; void Set_IP_Address( const QString &ia ); const QString &Get_MAC_Address() const; void Set_MAC_Address( const QString &ma ); int Get_Port() const; void Set_Port( int p ); int Get_VLAN() const; void Set_VLAN( int vl ); bool Get_Use_TUN_TAP_Script() const; void Set_Use_TUN_TAP_Script( bool use ); const QString &Get_TUN_TAP_Script() const; void Set_TUN_TAP_Script( const QString &s ); const QString &Get_Interface_Name() const; void Set_Interface_Name( const QString &n ); int Get_File_Descriptor() const; void Set_File_Descriptor( int f ); private: QString Card_Model; VM::Network_Mode Net_Mode; QString Hostname; QString IP; QString MAC; int Port; int VLAN; bool Use_TUN_TAP_Script; QString TUN_TAP_Script; QString Interface_Name; int File_Descriptor; }; // Network Card Nativ class VM_Net_Card_Nativ { public: VM_Net_Card_Nativ(); VM_Net_Card_Nativ( const VM_Net_Card_Nativ &nc ); bool operator==( const VM_Net_Card_Nativ &nc ) const; bool operator!=( const VM_Net_Card_Nativ &nc ) const; QString Generate_MAC() const; VM::Network_Mode_Nativ Get_Network_Type() const; void Set_Network_Type( VM::Network_Mode_Nativ mode ); const QString &Get_Card_Model() const; void Set_Card_Model( const QString &m ); bool Use_MAC_Address() const; void Use_MAC_Address( bool use ); const QString &Get_MAC_Address() const; void Set_MAC_Address( const QString &ma ); bool Use_VLAN() const; void Use_VLAN( bool use ); int Get_VLAN() const; void Set_VLAN( int vl ); bool Use_Name() const; void Use_Name( bool use ); const QString &Get_Name() const; void Set_Name( const QString &name ); bool Use_Hostname() const; void Use_Hostname( bool use ); const QString &Get_Hostname() const; void Set_Hostname( const QString &hostname ); const QString &Get_PortDev() const; void Set_PortDev( const QString &portDev ); bool Use_File_Descriptor() const; void Use_File_Descriptor( bool use ); int Get_File_Descriptor() const; void Set_File_Descriptor( int f ); bool Use_Interface_Name() const; void Use_Interface_Name( bool use ); const QString &Get_Interface_Name() const; void Set_Interface_Name( const QString &n ); bool Use_TUN_TAP_Script() const; void Use_TUN_TAP_Script( bool use ); const QString &Get_TUN_TAP_Script() const; void Set_TUN_TAP_Script( const QString &s ); bool Use_TUN_TAP_Down_Script() const; void Use_TUN_TAP_Down_Script( bool use ); const QString &Get_TUN_TAP_Down_Script() const; void Set_TUN_TAP_Down_Script( const QString &s ); bool Use_Listen() const; void Use_Listen( bool use ); const QString &Get_Listen() const; void Set_Listen( const QString &listen ); bool Use_Connect() const; void Use_Connect( bool use ); const QString &Get_Connect() const; void Set_Connect( const QString &con ); bool Use_MCast() const; void Use_MCast( bool use ); const QString &Get_MCast() const; void Set_MCast( const QString &mcast ); bool Use_Sock() const; void Use_Sock( bool use ); const QString &Get_Sock() const; void Set_Sock( const QString &sock ); bool Use_Port() const; void Use_Port( bool use ); int Get_Port() const; void Set_Port( int p ); bool Use_Group() const; void Use_Group( bool use ); const QString &Get_Group() const; void Set_Group( const QString &group ); bool Use_Mode() const; void Use_Mode( bool use ); const QString &Get_Mode() const; void Set_Mode( const QString &mode ); bool Use_File() const; void Use_File( bool use ); const QString &Get_File() const; void Set_File( const QString &file ); bool Use_Len() const; void Use_Len( bool use ); int Get_Len() const; void Set_Len( int kb ); bool Use_Addr() const; void Use_Addr( bool use ); const QString &Get_Addr() const; void Set_Addr( const QString &addr ); bool Use_Vectors() const; void Use_Vectors( bool use ); int Get_Vectors() const; void Set_Vectors( int vectors ); bool Use_Net() const; void Use_Net( bool use ); const QString &Get_Net() const; void Set_Net( const QString &net ); bool Use_Host() const; void Use_Host( bool use ); const QString &Get_Host() const; void Set_Host( const QString &host ); bool Use_Restrict() const; void Use_Restrict( bool use ); bool Get_Restrict() const; void Set_Restrict( bool use ); bool Use_DHCPstart() const; void Use_DHCPstart( bool use ); const QString &Get_DHCPstart() const; void Set_DHCPstart( const QString &addr ); bool Use_DNS() const; void Use_DNS( bool use ); const QString &Get_DNS() const; void Set_DNS( const QString &addr ); bool Use_Tftp() const; void Use_Tftp( bool use ); const QString &Get_Tftp() const; void Set_Tftp( const QString &dir ); bool Use_Bootfile() const; void Use_Bootfile( bool use ); const QString &Get_Bootfile() const; void Set_Bootfile( const QString &file ); bool Use_HostFwd() const; void Use_HostFwd( bool use ); const QString &Get_HostFwd() const; void Set_HostFwd( const QString &rule ); bool Use_GuestFwd() const; void Use_GuestFwd( bool use ); const QString &Get_GuestFwd() const; void Set_GuestFwd( const QString &rule ); bool Use_SMB() const; void Use_SMB( bool use ); const QString &Get_SMB() const; void Set_SMB( const QString &dir ); bool Use_SMBserver() const; void Use_SMBserver( bool use ); const QString &Get_SMBserver() const; void Set_SMBserver( const QString &addr ); bool Use_Sndbuf() const; void Use_Sndbuf( bool use ); int Get_Sndbuf() const; void Set_Sndbuf( int bytes ); bool Use_VNet_hdr() const; void Use_VNet_hdr( bool use ); bool Get_VNet_hdr() const; void Set_VNet_hdr( bool use ); bool Use_VHost() const; void Use_VHost( bool use ); bool Get_VHost() const; void Set_VHost( bool use ); bool Use_VHostFd() const; void Use_VHostFd( bool use ); int Get_VHostFd() const; void Set_VHostFd( int port ); private: VM::Network_Mode_Nativ Network_Mode; QString Card_Model; QString MAC; int VLAN; QString Name; QString Hostname; QString PortDev; int File_Descriptor; QString Interface_Name; QString TUN_TAP_Script; QString TUN_TAP_Down_Script; QString Listen; QString Connect; QString MCast; QString Sock; int Port; QString Group; QString Mode; QString File; int Len; QString Addr; int Vectors; QString Net; QString Host; bool Restrict; QString DHCPstart; QString DNS; QString Tftp; QString Bootfile; QString HostFwd; QString GuestFwd; QString SMB; QString SMBserver; int Sndbuf; bool VNet_hdr; bool VHost; int VHostFd; bool _Use_MAC, _Use_VLAN, _Use_Name, _Use_Hostname, _Use_File_Descriptor, _Use_Interface_Name, _Use_TUN_TAP_Script, _Use_TUN_TAP_Down_Script, _Use_Listen, _Use_Connect, _Use_MCast, _Use_Sock, _Use_Port, _Use_Group, _Use_Mode, _Use_File, _Use_Len, _Use_Addr, _Use_Vectors, _Use_Net, _Use_Host, _Use_Restrict, _Use_DHCPstart, _Use_DNS, _Use_Tftp, _Use_Bootfile, _Use_HostFwd, _Use_GuestFwd, _Use_SMB, _Use_SMBserver, _Use_Sndbuf, _Use_VNet_hdr, _Use_VHost, _Use_VHostFd; }; class VM_Redirection { public: VM_Redirection(); VM_Redirection( const VM_Redirection &r ); bool operator==( const VM_Redirection &r ) const; bool operator!=( const VM_Redirection &r ) const; const QString &Get_Protocol() const; void Set_Protocol( const QString &p ); int Get_Host_Port() const; void Set_Host_Port( int hp ); const QString &Get_Guest_IP() const; void Set_Guest_IP( const QString &ip ); int Get_Guest_Port() const; void Set_Guest_Port( int p ); private: QString Protocol; int Host_Port; QString Guest_IP; int Guest_Port; }; // Port (Serial or Parallel) class VM_Port { public: VM_Port(); VM_Port( const VM_Port &p ); bool operator==( const VM_Port &p ) const; bool operator!=( const VM_Port &p ) const; VM::Port_Redirection Get_Port_Redirection() const; void Set_Port_Redirection( VM::Port_Redirection pr ); const QString &Get_Parametrs_Line() const; void Set_Parametrs_Line( const QString &pl ); private: VM::Port_Redirection Port_Redir; QString Param_Line; }; // USB Port class VM_USB { public: VM_USB(); VM_USB( const VM_USB &u ); bool operator==( const VM_USB &u ) const; bool operator!=( const VM_USB &u ) const; bool Get_Use_Host_Device() const; void Set_Use_Host_Device( bool use ); const QString &Get_Manufacturer_Name() const; void Set_Manufacturer_Name( const QString &name ); const QString &Get_Product_Name() const; void Set_Product_Name( const QString &name ); const QString &Get_Vendor_ID() const; void Set_Vendor_ID( const QString &dev ); const QString &Get_Product_ID() const; void Set_Product_ID( const QString &dev ); QString Get_ID_Line() const; void Set_ID_Line( const QString &line ); QString Get_Bus() const; void Set_Bus( const QString &bus ); QString Get_Addr() const; void Set_Addr( const QString &addr ); QString Get_DevPath() const; void Set_DevPath( const QString &devPath ); QString Get_Serial_Number() const; void Set_Serial_Number( const QString &serial ); QString Get_Speed() const; void Set_Speed( const QString &speed ); void Get_USB_QEMU_Devices( bool &keyboard, bool &mouse, bool &tablet, bool &wacomTablet, bool &braille ) const; void Set_USB_QEMU_Devices( bool keyboard, bool mouse, bool tablet, bool wacomTablet, bool braille ); private: bool Use_Host_Device; QString Manufacturer_Name; QString Product_Name; QString Vendor_ID; QString Product_ID; QString Bus; QString Addr; QString DevPath; QString Serial_Number; QString Speed; bool USB_Keyboard, USB_Mouse, USB_Tablet, USB_WacomTablet, USB_Braille; }; // Initial Graphical Mode class VM_Init_Graphic_Mode { public: VM_Init_Graphic_Mode(); VM_Init_Graphic_Mode( const VM_Init_Graphic_Mode &mode ); bool operator==( const VM_Init_Graphic_Mode &mode ) const; bool operator!=( const VM_Init_Graphic_Mode &mode ) const; bool Get_Enabled() const; void Set_Enabled( bool use ); int Get_Width() const; void Set_Width( int w ); int Get_Height() const; void Set_Height( int h ); int Get_Depth() const; void Set_Depth( int d ); private: bool Enabled; int Width; int Height; int Depth; }; // SPICE class VM_SPICE { public: VM_SPICE(); VM_SPICE( const VM_SPICE &vm_spice ); bool operator==( const VM_SPICE &vm_spice ) const; bool operator!=( const VM_SPICE &vm_spice ) const; bool Use_SPICE() const; void Use_SPICE( bool use ); // qxl options unsigned int Get_GXL_Devices_Count() const; void Set_GXL_Devices_Count( unsigned int count ); int Get_RAM_Size() const; void Set_RAM_Size( int size ); // Basic options unsigned int Get_Port() const; void Set_Port( unsigned int port ); bool Use_SPort() const; void Use_SPort( bool use ); unsigned int Get_SPort() const; void Set_SPort( unsigned int sport ); bool Use_Hostname() const; void Use_Hostname( bool use ); QString Get_Hostname() const; void Set_Hostname( QString hostname ); // Image, video & audio options bool Use_Image_Compression() const; void Use_Image_Compression( bool use ); VM::SPICE_Image_Compression_Type Get_Image_Compression() const; void Set_Image_Compression( VM::SPICE_Image_Compression_Type type ); bool Use_Video_Stream_Compression() const; void Use_Video_Stream_Compression( bool use ); bool Use_Renderer() const; void Use_Renderer( bool use ); const QList &Get_Renderer_List() const; void Set_Renderer_List( const QList &list ); bool Use_Playback_Compression() const; void Use_Playback_Compression( bool use ); // Security options bool Use_Password() const; void Use_Password( bool use ); QString Get_Password() const; void Set_Password( QString password ); private: bool Enable_SPICE; unsigned int GXL_Devices_Count; int RAM_Size; unsigned int Port; bool _Use_SPort; unsigned int SPort; bool _Use_Hostname; QString Hostname; bool _Use_Image_Compression; VM::SPICE_Image_Compression_Type Image_Compression; bool _Use_Video_Stream_Compression; bool _Use_Renderer; QList Renderer_List; bool _Use_Playback_Compression; bool _Use_Password; QString Password; }; #endif aqemu-0.9.2/src/VM_Wizard_Window.cpp000066400000000000000000000573631272330227200173340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** COpyirght (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include #include #include #include "Utils.h" #include "VM_Wizard_Window.h" #include "System_Info.h" #include #include // FIXME this may be Linux only so far // if you're porting this to something else // this is a place where a lot of ifdefs may be needed QString Get_My_System_Architecture() { struct utsname name; uname(&name); return QString(name.machine); } VM_Wizard_Window::VM_Wizard_Window( QWidget *parent ) : QDialog(parent) { ui.setupUi( this ); ui.Label_Page->setBackgroundRole( QPalette::Base ); ui.Wizard_Pages->setCurrentIndex(0); New_VM = new Virtual_Machine(); // Loadind All Templates if( Load_OS_Templates() ) { // Find default template for( int ix = 0; ix < ui.CB_OS_Type->count(); ++ix ) { if( ui.CB_OS_Type->itemText(ix) == Settings.value("Default_VM_Template", "Linux 2.6").toString() ) ui.CB_OS_Type->setCurrentIndex( ix ); } } else { AQWarning( "void VM_Wizard_Window::on_Button_Next_clicked()", "No VM Templates Found!" ); } connect(ui.RB_Emulator_KVM, SIGNAL(toggled(bool)),this, SLOT(on_KVM_toggled(bool))); } void VM_Wizard_Window::on_KVM_toggled(bool toggled) { if ( toggled ) ui.toolBox_accelInfo->setCurrentIndex(1); else ui.toolBox_accelInfo->setCurrentIndex(0); } void VM_Wizard_Window::Set_VM_List( QList *list ) { VM_List = list; } void VM_Wizard_Window::on_Button_Back_clicked() { ui.Button_Next->setEnabled( true ); if( ui.Wizard_Mode_Page == ui.Wizard_Pages->currentWidget() ) { //ui.Wizard_Pages->setCurrentWidget( ui.Welcome_Page ); //ui.Label_Page->setText( tr("New Virtual Machine Wizard") ); } else if( ui.Template_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Wizard_Mode_Page ); ui.Label_Page->setText( tr("Wizard Mode") ); ui.Button_Back->setEnabled( false ); } else if( ui.Accelerator_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Template_Page ); ui.Label_Page->setText( tr("VM Hardware Template") ); } else if( ui.General_Settings_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Accelerator_Page ); ui.Label_Page->setText( tr("Accelerator") ); } else if( ui.Memory_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.General_Settings_Page ); ui.Label_Page->setText( tr("VM Name and CPU Type") ); ui.Label_Caption_CPU_Type->setVisible( true ); ui.Line_CPU_Type->setVisible( true ); ui.Label_CPU_Type->setVisible( true ); ui.CB_CPU_Type->setVisible( true ); } else if( ui.Typical_HDD_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.General_Settings_Page ); ui.Label_Page->setText( tr("Virtual Machine Name") ); ui.Label_Caption_CPU_Type->setVisible( false ); ui.Line_CPU_Type->setVisible( false ); ui.Label_CPU_Type->setVisible( false ); ui.CB_CPU_Type->setVisible( false ); } else if( ui.Custom_HDD_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Memory_Page ); ui.Label_Page->setText( tr("Memory") ); } else if( ui.Network_Page == ui.Wizard_Pages->currentWidget() ) { if( ui.RB_Typical->isChecked() ) // typical or custom mode { ui.Wizard_Pages->setCurrentWidget( ui.Typical_HDD_Page ); ui.Label_Page->setText( tr("Hard Disk Size") ); } else { ui.Wizard_Pages->setCurrentWidget( ui.Custom_HDD_Page ); ui.Label_Page->setText( tr("Virtual Hard Disk") ); } } else if( ui.Finish_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Network_Page ); ui.Label_Page->setText( tr("Network") ); ui.Button_Next->setText( tr("&Next") ); } else { // Default AQError( "void VM_Wizard_Window::on_Button_Back_clicked()", "Default Section!" ); } } void VM_Wizard_Window::on_Button_Next_clicked() { if( ui.Wizard_Mode_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Template_Page ); ui.Label_Page->setText( tr("Template For VM") ); on_RB_VM_Template_toggled( ui.RB_VM_Template->isChecked() ); Current_Emulator = Get_Default_Emulator(); // All Find Systems FIXME ^^^ All_Systems = Current_Emulator.Get_Devices(); if( All_Systems.isEmpty() ) { AQError( "void VM_Wizard_Window::on_Button_Next_clicked()", "Cannot get devices!" ); return; } // Comp types ui.CB_Computer_Type->clear(); ui.CB_Computer_Type->addItem( tr("None Selected") ); for( QMap::const_iterator it = All_Systems.constBegin(); it != All_Systems.constEnd(); it++ ) { ui.CB_Computer_Type->addItem( it.value().System.Caption ); } ui.Button_Next->setEnabled( true ); ui.Button_Back->setEnabled( true ); } else if( ui.Accelerator_Page == ui.Wizard_Pages->currentWidget() ) { applyTemplate(); ui.Wizard_Pages->setCurrentWidget( ui.General_Settings_Page ); } else if( ui.Template_Page == ui.Wizard_Pages->currentWidget() ) { Use_Accelerator_Page = true; ui.Wizard_Pages->setCurrentWidget( ui.Accelerator_Page ); //FIXME: arch shouldn't be hardcoded if ( ui.RB_Generate_VM->isChecked() && ui.CB_Computer_Type->currentText() != "IBM PC 64Bit") ui.RB_Emulator_QEMU->setChecked( true ); else ui.RB_Emulator_KVM->setChecked( true ); ui.Label_Page->setText( tr("Accelerator") ); } else if( ui.General_Settings_Page == ui.Wizard_Pages->currentWidget() ) { for( int vx = 0; vx < VM_List->count(); ++vx ) { if( VM_List->at(vx)->Get_Machine_Name() == ui.Edit_VM_Name->text() ) { AQGraphic_Warning( tr("Warning"), tr("This VM Name Does Already Exist!") ); return; } } if( ui.RB_Typical->isChecked() ) { ui.Wizard_Pages->setCurrentWidget( ui.Typical_HDD_Page ); ui.Label_Page->setText( tr("Hard Disk Size") ); } else { ui.Wizard_Pages->setCurrentWidget( ui.Memory_Page ); ui.Label_Page->setText( tr("Memory") ); } } else if( ui.Memory_Page == ui.Wizard_Pages->currentWidget() ) { on_CH_Remove_RAM_Size_Limitation_stateChanged( Qt::Unchecked ); // update max available RAM size ui.Wizard_Pages->setCurrentWidget( ui.Custom_HDD_Page ); ui.Label_Page->setText( tr("Virtual Hard Disk") ); } else if( ui.Typical_HDD_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Network_Page ); ui.Label_Page->setText( tr("Network") ); } else if( ui.Custom_HDD_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Network_Page ); ui.Label_Page->setText( tr("Network") ); } else if( ui.Network_Page == ui.Wizard_Pages->currentWidget() ) { ui.Wizard_Pages->setCurrentWidget( ui.Finish_Page ); ui.Button_Next->setText( tr("&Finish") ); ui.Label_Page->setText( tr("Finish!") ); } else if( ui.Finish_Page == ui.Wizard_Pages->currentWidget() ) { if( Create_New_VM() ) accept(); } else { AQError( "void VM_Wizard_Window::on_Button_Next_clicked()", "Default Section!" ); } } void VM_Wizard_Window::applyTemplate() { // Use Selected Template if( ui.RB_VM_Template->isChecked() ) { if( ! New_VM->Load_VM(OS_Templates_List[ui.CB_OS_Type->currentIndex()-1].filePath()) ) { AQGraphic_Error( "void VM_Wizard_Window::Create_New_VM()", tr("Error!"), tr("Cannot Create New VM from Template!") ); return; } } // Emulator New_VM->Set_Emulator( Current_Emulator ); // Find CPU List For This Template bool devices_found = false; if( ui.RB_Emulator_KVM->isChecked() ) { New_VM->Set_Machine_Accelerator(VM::KVM); New_VM->Set_Computer_Type( "qemu-system-x86_64" ); if( New_VM->Get_Audio_Cards().Audio_es1370 ) { VM::Sound_Cards tmp_audio = New_VM->Get_Audio_Cards(); tmp_audio.Audio_es1370 = false; tmp_audio.Audio_AC97 = true; New_VM->Set_Audio_Cards( tmp_audio ); } Current_Devices = &All_Systems[ New_VM->Get_Computer_Type() ]; devices_found = true; } else { New_VM->Set_Machine_Accelerator(VM::TCG); New_VM->Set_Computer_Type( "qemu-system-x86_64" ); Current_Devices = &All_Systems[ New_VM->Get_Computer_Type() ]; /*if( ! Current_Devices->System.QEMU_Name.isEmpty() )*/ devices_found = true; } // Use Selected Template if( ui.RB_VM_Template->isChecked() ) { // Name ui.Edit_VM_Name->setText( New_VM->Get_Machine_Name() ); // Memory ui.Memory_Size->setValue( New_VM->Get_Memory_Size() ); // HDA double hda_size = New_VM->Get_HDA().Get_Virtual_Size_in_GB(); if( hda_size != 0.0 ) ui.SB_HDD_Size->setValue( hda_size ); else ui.SB_HDD_Size->setValue( 10.0 ); // Network ui.RB_User_Mode_Network->setChecked( New_VM->Get_Use_Network() ); // Find CPU List For This Template Current_Devices = &All_Systems[ New_VM->Get_Computer_Type() ]; if( ! Current_Devices->System.QEMU_Name.isEmpty() ) devices_found = true; } else // Create New VM in Date Mode { By_Year(); // Find CPU List For This Template QString compCaption = ui.CB_Computer_Type->currentText(); for( QMap::const_iterator it = All_Systems.constBegin(); it != All_Systems.constEnd(); it++ ) { if( it.value().System.Caption == compCaption ) { Current_Devices = &it.value(); /*if( ! Current_Devices->System.QEMU_Name.isEmpty() )*/ devices_found = true; } } } if( ! devices_found ) { AQGraphic_Error( "void VM_Wizard_Window::applyTemplate()", tr("Error!"), tr("Cannot Find Emulator System ID!") ); } else { // Add CPU's ui.CB_CPU_Type->clear(); for( int cx = 0; cx < Current_Devices->CPU_List.count(); ++cx ) ui.CB_CPU_Type->addItem( Current_Devices->CPU_List[cx].Caption ); } // Typical or custom mode Typical_Or_Custom(); } void VM_Wizard_Window::Typical_Or_Custom() { if( ui.RB_Typical->isChecked() ) { ui.Label_Page->setText( tr("Virtual Machine Name") ); on_Edit_VM_Name_textEdited( ui.Edit_VM_Name->text() ); ui.Label_Caption_CPU_Type->setVisible( false ); ui.Line_CPU_Type->setVisible( false ); ui.Label_CPU_Type->setVisible( false ); ui.CB_CPU_Type->setVisible( false ); } else { ui.Label_Page->setText( tr("VM Name and CPU Type") ); on_Edit_VM_Name_textEdited( ui.Edit_VM_Name->text() ); ui.Label_Caption_CPU_Type->setVisible( true ); ui.Line_CPU_Type->setVisible( true ); ui.Label_CPU_Type->setVisible( true ); ui.CB_CPU_Type->setVisible( true ); } } void VM_Wizard_Window::By_Year() { // Select Memory Size, and HDD Size switch( ui.CB_Relese_Date->currentIndex() ) { case 0: AQError( "void VM_Wizard_Window::Create_New_VM()", "Relese Date Not Selected!" ); ui.Memory_Size->setValue( 512 ); break; case 1: // 1985-1990 ui.Memory_Size->setValue( 16 ); ui.SB_HDD_Size->setValue( 1.0 ); break; case 2: // 1990-1995 ui.Memory_Size->setValue( 64 ); ui.SB_HDD_Size->setValue( 2.0 ); break; case 3: // 1995-2000 ui.Memory_Size->setValue( 256 ); ui.SB_HDD_Size->setValue( 10.0 ); break; case 4: // 2000-2005 ui.Memory_Size->setValue( 512 ); ui.SB_HDD_Size->setValue( 20.0 ); break; case 5: // 2005-2010 ui.Memory_Size->setValue( 1024 ); ui.SB_HDD_Size->setValue( 40.0 ); break; default: AQError( "void VM_Wizard_Window::Create_New_VM()", "Relese Date Default Section!" ); ui.Memory_Size->setValue( 512 ); break; } } bool VM_Wizard_Window::Load_OS_Templates() { QList tmp_list = Get_Templates_List(); for( int ax = 0; ax < tmp_list.count(); ++ax ) { OS_Templates_List.append( QFileInfo(tmp_list[ax]) ); } for( int ix = 0; ix < OS_Templates_List.count(); ++ix ) { ui.CB_OS_Type->addItem( OS_Templates_List[ix].completeBaseName() ); } // no items found if( ui.CB_OS_Type->count() < 2 ) return false; else return true; } bool VM_Wizard_Window::Create_New_VM() { // Icon QString icon_path = Find_OS_Icon( ui.Edit_VM_Name->text() ); if( icon_path.isEmpty() ) { AQWarning( "void VM_Wizard_Window::Create_New_VM()", "Icon for new VM not Found!" ); New_VM->Set_Icon_Path( ":/other.png" ); } else { New_VM->Set_Icon_Path( icon_path ); } // Name New_VM->Set_Machine_Name( ui.Edit_VM_Name->text() ); // Create path valid string QString VM_File_Name = Get_FS_Compatible_VM_Name( ui.Edit_VM_Name->text() ); // Set Computer Type? if( ui.RB_Generate_VM->isChecked() ) { New_VM->Set_Computer_Type( Current_Devices->System.QEMU_Name ); } // RAM New_VM->Set_Memory_Size( ui.Memory_Size->value() ); // Wizard Mode if( ui.RB_Typical->isChecked() ) { // Hard Disk VM::Device_Size hd_size; hd_size.Size = ui.SB_HDD_Size->value(); hd_size.Suffix = VM::Size_Suf_Gb; QString hd_path = Settings.value( "VM_Directory", "~" ).toString() + VM_File_Name; Create_New_HDD_Image( hd_path + "_HDA.img", hd_size ); New_VM->Set_HDA( VM_HDD(true, hd_path + "_HDA.img") ); // Other HDD's if( New_VM->Get_HDB().Get_Enabled() ) { Create_New_HDD_Image( hd_path + "_HDB.img", New_VM->Get_HDB().Get_Virtual_Size() ); New_VM->Set_HDB( VM_HDD(true, hd_path + "_HDB.img") ); } if( New_VM->Get_HDC().Get_Enabled() ) { Create_New_HDD_Image( hd_path + "_HDC.img", New_VM->Get_HDC().Get_Virtual_Size() ); New_VM->Set_HDC( VM_HDD(true, hd_path + "_HDC.img") ); } if( New_VM->Get_HDD().Get_Enabled() ) { Create_New_HDD_Image( hd_path + "_HDD.img", New_VM->Get_HDD().Get_Virtual_Size() ); New_VM->Set_HDD( VM_HDD(true, hd_path + "_HDD.img") ); } } else { bool devices_found = false; // CPU Type if( ui.RB_VM_Template->isChecked() ) { Current_Devices = &All_Systems[ New_VM->Get_Computer_Type() ]; if( ! Current_Devices->System.QEMU_Name.isEmpty() ) devices_found = true; } else { // Find QEMU System Name in CB_Computer_Type if( ui.RB_Emulator_KVM->isChecked() ) { Current_Devices = &All_Systems[ "qemu-system-x86_64" ]; if( ! Current_Devices->System.QEMU_Name.isEmpty() ) devices_found = true; } else // QEMU { for( QMap::const_iterator it = All_Systems.constBegin(); it != All_Systems.constEnd(); it++ ) { if( it.value().System.Caption == ui.CB_Computer_Type->currentText() ) { Current_Devices = &it.value(); devices_found = true; break; } } } } if( ! devices_found ) { AQGraphic_Error( "bool VM_Wizard_Window::Create_New_VM()", tr("Error!"), tr("Cannot Find QEMU System ID!") ); return false; } New_VM->Set_CPU_Type( Current_Devices->CPU_List[ui.CB_CPU_Type->currentIndex()].QEMU_Name ); // Hard Disk if( ! ui.Edit_HDA_File_Name->text().isEmpty() ) New_VM->Set_HDA( VM_HDD(true, ui.Edit_HDA_File_Name->text()) ); else New_VM->Set_HDA( VM_HDD(false, "") ); } // Network if( ui.RB_User_Mode_Network->isChecked() ) { if( New_VM->Get_Network_Cards_Count() == 0 ) { New_VM->Set_Use_Network( true ); VM_Net_Card net_card; net_card.Set_Net_Mode( VM::Net_Mode_Usermode ); New_VM->Add_Network_Card( net_card ); } } else if( ui.RB_No_Network->isChecked() ) { New_VM->Set_Use_Network( false ); for( int rx = 0; rx < New_VM->Get_Network_Cards_Count(); ++rx ) { New_VM->Delete_Network_Card( 0 ); } } // Set Emulator Name (version) to Default ("") Emulator tmp_emul = New_VM->Get_Emulator(); tmp_emul.Set_Name( "" ); New_VM->Set_Emulator( tmp_emul ); // Create New VM XML File New_VM->Create_VM_File( Settings.value("VM_Directory", "~").toString() + VM_File_Name + ".aqemu", false ); return true; } QString VM_Wizard_Window::Find_OS_Icon( const QString os_name ) { if( os_name.isEmpty() ) { AQError( "QString VM_Wizard_Window::Find_OS_Icon( const QString os_name )", "os_name is Empty!" ); return ""; } // Find all os icons QDir icons_dir( QDir::toNativeSeparators(Settings.value("AQEMU_Data_Folder","").toString() + "/os_icons/") ); QFileInfoList all_os_icons = icons_dir.entryInfoList( QStringList("*.png"), QDir::Files, QDir::Unsorted ); QRegExp rex; rex.setPatternSyntax( QRegExp::Wildcard ); rex.setCaseSensitivity( Qt::CaseInsensitive ); for( int i = 0; i < all_os_icons.count(); i++ ) { rex.setPattern( "*" + all_os_icons[i].baseName() + "*" ); if( rex.exactMatch(os_name) ) { return all_os_icons[ i ].absoluteFilePath(); } } // select os family... // Linux rex.setPattern( "*linux*" ); if( rex.exactMatch(os_name) ) return ":/default_linux.png"; // Windows rex.setPattern( "*windows*" ); if( rex.exactMatch(os_name) ) return ":/default_windows.png"; return ":/other.png"; } void VM_Wizard_Window::on_RB_VM_Template_toggled( bool on ) { if( on ) { if( ui.CB_OS_Type->currentIndex() == 0 ) ui.Button_Next->setEnabled( false ); else ui.Button_Next->setEnabled( true ); } } void VM_Wizard_Window::on_RB_Generate_VM_toggled( bool on ) { if( on ) { if( ui.CB_Computer_Type->currentIndex() == 0 || ui.CB_Relese_Date->currentIndex() == 0 ) ui.Button_Next->setEnabled( false ); else ui.Button_Next->setEnabled( true ); } } void VM_Wizard_Window::on_CB_OS_Type_currentIndexChanged( int index ) { if( index == 0 ) ui.Button_Next->setEnabled( false ); else ui.Button_Next->setEnabled( true ); } void VM_Wizard_Window::on_CB_Computer_Type_currentIndexChanged( int index ) { if( index == 0 ) { ui.Button_Next->setEnabled( false ); } else { if( ui.CB_Relese_Date->currentIndex() != 0 ) ui.Button_Next->setEnabled( true ); } } void VM_Wizard_Window::on_CB_Relese_Date_currentIndexChanged( int index ) { if( index == 0 ) { ui.Button_Next->setEnabled( false ); } else { if( ui.CB_Computer_Type->currentIndex() != 0 ) ui.Button_Next->setEnabled( true ); } } void VM_Wizard_Window::on_Memory_Size_valueChanged( int value ) { int cursorPos = ui.CB_RAM_Size->lineEdit()->cursorPosition(); if( value % 1024 == 0 ) ui.CB_RAM_Size->setEditText( QString("%1 GB").arg(value / 1024) ); else ui.CB_RAM_Size->setEditText( QString("%1 MB").arg(value) ); ui.CB_RAM_Size->lineEdit()->setCursorPosition( cursorPos ); } void VM_Wizard_Window::on_CB_RAM_Size_editTextChanged( const QString &text ) { if( text.isEmpty() ) return; QRegExp rx( "\\s*([\\d]+)\\s*(MB|GB|M|G|)\\s*" ); // like: 512MB or 512 if( ! rx.exactMatch(text.toUpper()) ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to memory size!").arg(text) ); return; } QStringList ramStrings = rx.capturedTexts(); if( ramStrings.count() != 3 ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to memory size!").arg(text) ); return; } bool ok = false; int value = ramStrings[1].toInt( &ok, 10 ); if( ! ok ) { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to integer!").arg(ramStrings[1]) ); return; } if( ramStrings[2] == "MB" || ramStrings[2] == "M" ); // Size in megabytes else if( ramStrings[2] == "GB" || ramStrings[2] == "G" ) value *= 1024; else { AQGraphic_Warning( tr("Error"), tr("Cannot convert \"%1\" to size suffix! Valid suffixes: MB, GB").arg(ramStrings[2]) ); return; } if( value <= 0 ) { AQGraphic_Warning( tr("Error"), tr("Memory size < 0! Valid size is 1 or more") ); return; } on_TB_Update_Available_RAM_Size_clicked(); if( (value > ui.Memory_Size->maximum()) && (ui.CH_Remove_RAM_Size_Limitation->isChecked() == false) ) { AQGraphic_Warning( tr("Error"), tr("Your memory size %1 MB > %2 MB - all free RAM on this system!\n" "To setup this value, check \"Remove limitation on maximum amount of memory\".") .arg(value).arg(ui.Memory_Size->maximum()) ); on_Memory_Size_valueChanged( ui.Memory_Size->value() ); // Set valid size return; } // All OK. Set memory size ui.Memory_Size->setValue( value ); } void VM_Wizard_Window::on_CH_Remove_RAM_Size_Limitation_stateChanged( int state ) { if( state == Qt::Checked ) { ui.Memory_Size->setMaximum( 32768 ); ui.Label_Available_Free_Memory->setText( "32 GB" ); Update_RAM_Size_ComboBox( 32768 ); } else { int allRAM = 0, freeRAM = 0; System_Info::Get_Free_Memory_Size( allRAM, freeRAM ); if( allRAM < ui.Memory_Size->value() ) AQGraphic_Warning( tr("Error"), tr("Current memory size bigger than all existing host memory!\nUsing maximum available size.") ); ui.Memory_Size->setMaximum( allRAM ); ui.Label_Available_Free_Memory->setText( QString("%1 MB").arg(allRAM) ); Update_RAM_Size_ComboBox( allRAM ); } } void VM_Wizard_Window::on_TB_Update_Available_RAM_Size_clicked() { int allRAM = 0, freeRAM = 0; System_Info::Get_Free_Memory_Size( allRAM, freeRAM ); ui.TB_Update_Available_RAM_Size->setText( tr("Free memory: %1 MB").arg(freeRAM) ); if( ! ui.CH_Remove_RAM_Size_Limitation->isChecked() ) { ui.Memory_Size->setMaximum( allRAM ); Update_RAM_Size_ComboBox( allRAM ); } } void VM_Wizard_Window::Update_RAM_Size_ComboBox( int freeRAM ) { static int oldRamSize = 0; if( freeRAM == oldRamSize ) return; else oldRamSize = freeRAM; QStringList ramSizes; ramSizes << "32 MB" << "64 MB" << "128 MB" << "256 MB" << "512 MB" << "1 GB" << "2 GB" << "3 GB" << "4 GB" << "8 GB" << "16 GB" << "32 GB"; int maxRamIndex = 0; if( freeRAM >= 32768 ) maxRamIndex = 12; else if( freeRAM >= 16384 ) maxRamIndex = 11; else if( freeRAM >= 8192 ) maxRamIndex = 10; else if( freeRAM >= 4096 ) maxRamIndex = 9; else if( freeRAM >= 3072 ) maxRamIndex = 8; else if( freeRAM >= 2048 ) maxRamIndex = 7; else if( freeRAM >= 1024 ) maxRamIndex = 6; else if( freeRAM >= 512 ) maxRamIndex = 5; else if( freeRAM >= 256 ) maxRamIndex = 4; else if( freeRAM >= 128 ) maxRamIndex = 3; else if( freeRAM >= 64 ) maxRamIndex = 2; else if( freeRAM >= 32 ) maxRamIndex = 1; else { AQGraphic_Warning( tr("Error"), tr("Free memory on this system is lower than 32 MB!") ); return; } if( maxRamIndex > ramSizes.count() ) { AQError( "void VM_Wizard_Window::Update_RAM_Size_ComboBox( int freeRAM )", "maxRamIndex > ramSizes.count()" ); return; } QString oldText = ui.CB_RAM_Size->currentText(); ui.CB_RAM_Size->clear(); for( int ix = 0; ix < maxRamIndex; ix++ ) ui.CB_RAM_Size->addItem( ramSizes[ix] ); ui.CB_RAM_Size->setEditText( oldText ); } void VM_Wizard_Window::on_Edit_VM_Name_textEdited( const QString &text ) { if( ui.Edit_VM_Name->text().isEmpty() ) ui.Button_Next->setEnabled( false ); else ui.Button_Next->setEnabled( true ); } void VM_Wizard_Window::on_Button_New_HDD_clicked() { Create_HDD_Image_Window Create_HDD_Win( this ); Create_HDD_Win.Set_Image_Size( ui.SB_HDD_Size->value() ); // Set Initial HDA Size if( Create_HDD_Win.exec() == QDialog::Accepted ) ui.Edit_HDA_File_Name->setText( Create_HDD_Win.Get_Image_File_Name() ); } void VM_Wizard_Window::on_Button_Existing_clicked() { QString hddPath = QFileDialog::getOpenFileName( this, tr("Select HDD Image"), Get_Last_Dir_Path(ui.Edit_HDA_File_Name->text()), tr("All Files (*)") ); if( ! hddPath.isEmpty() ) ui.Edit_HDA_File_Name->setText( QDir::toNativeSeparators(hddPath) ); } aqemu-0.9.2/src/VM_Wizard_Window.h000066400000000000000000000051661272330227200167730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** Copyright (C) 2016 Tobias Gläßer ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VM_WIZARD_WINDOW_H #define VM_WIZARD_WINDOW_H #include #include #include "VM.h" #include "ui_VM_Wizard_Window.h" #include "Create_HDD_Image_Window.h" class VM_Wizard_Window: public QDialog { Q_OBJECT public: VM_Wizard_Window( QWidget *parent = 0 ); void Set_VM_List( QList *list ); Virtual_Machine *New_VM; private slots: void on_KVM_toggled(bool toggled); bool Load_OS_Templates(); bool Create_New_VM(); QString Find_OS_Icon( const QString os_name ); void on_Button_Back_clicked(); void on_Button_Next_clicked(); void on_RB_VM_Template_toggled( bool on ); void on_RB_Generate_VM_toggled( bool on ); void on_CB_OS_Type_currentIndexChanged( int index ); void on_CB_Computer_Type_currentIndexChanged( int index ); void on_CB_Relese_Date_currentIndexChanged( int index ); // Memory void on_Memory_Size_valueChanged( int value ); void on_CB_RAM_Size_editTextChanged( const QString &text ); void on_CH_Remove_RAM_Size_Limitation_stateChanged ( int state ); void on_TB_Update_Available_RAM_Size_clicked(); void Update_RAM_Size_ComboBox( int freeRAM ); void on_Edit_VM_Name_textEdited( const QString &text ); void on_Button_New_HDD_clicked(); void on_Button_Existing_clicked(); private: void applyTemplate(); void By_Year(); void Typical_Or_Custom(); QSettings Settings; Ui::VM_Wizard_Window ui; QFileInfoList OS_Templates_List; QList *VM_List; Emulator Current_Emulator; const Available_Devices* Current_Devices; QMap All_Systems; bool Use_Accelerator_Page; }; #endif aqemu-0.9.2/src/VM_Wizard_Window.ui000066400000000000000000001402241272330227200171540ustar00rootroot00000000000000 Andrey Rijov VM_Wizard_Window 0 0 618 482 New Virtual Machine Wizard :/add.png:/add.png 9 9 9 9 6 6 0 0 0 0 Qt::Horizontal 211 20 false &Back :/previous.png:/previous.png &Next :/next.png:/next.png true Qt::Horizontal QSizePolicy::Fixed 7 20 &Cancel :/cancel.png:/cancel.png 0 0 0 38 12 50 false true QFrame::StyledPanel QFrame::Plain Wizard Mode Qt::Horizontal 3 Select AQEMU Configuration Mode Qt::Vertical QSizePolicy::Fixed 20 5 &Typical true 0 0 Create a virtua&l machine with the most common devices and configuration options. true RB_Typical Qt::Vertical QSizePolicy::Fixed 20 10 C&ustom 0 0 Create a virtual machine with additional confi&guration options. true RB_Custom Qt::Vertical 411 21 Please Select VM Hardware Template 6 0 0 0 0 0 0 &Template true Qt::Horizontal 0 0 OS T&ype: CB_Computer_Type 1024 None Selected Qt::Vertical QSizePolicy::Fixed 20 5 6 0 0 0 0 0 0 &Generate VM Qt::Horizontal false 0 0 Comp&uter Type: CB_Computer_Type false None Selected false 0 0 Re&lease Date: CB_Relese_Date false None Selected 1985-1990 1990-1995 1995-2000 2000-2005 2005-2010 Qt::Vertical 20 20 0 0 VM Name: Qt::Horizontal Enter a name for the new virtual machine. The name of the virtual machine usually indicates its software and hardware configuration. true Qt::TextSelectableByMouse Qt::Vertical QSizePolicy::Fixed 20 5 0 0 CPU Type: Qt::Horizontal 0 0 Select a CPU type for your new virtual machine: true 0 0 140 0 -1 Qt::Vertical 20 31 0 0 16777215 200 1 TCG (for Tiny Code Generator) 0 0 QFrame::NoFrame QFrame::Plain <html><head/><body><p>... transforms target insns (the processor being emulated) into host insns (the processor executing QEMU itself).</p><p align="center"><span style=" font-size:8pt;">Source: </span><a href="http://wiki.qemu.org/Documentation/TCG"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">wiki.qemu.org</span></a></p></body></html> true KVM (for Kernel-based Virtual Machine) QFrame::NoFrame QFrame::Plain <html><head/><body><p>... is a full virtualization solution for Linux on x86 hardware containing virtualization extensions (Intel VT or AMD-V).</p><p align="center"><span style=" font-size:8pt;">Source: </span><a href="http://www.linux-kvm.org/page/Main_Page"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">linux-kvm.org</span></a></p></body></html> true 0 0 Select a Machine Accelerator &KVM (Recommended) true TCG (Choose this if the &guest or host isn't x86) Select the amount of base memory (RAM) in megabytes for virtual machine allocating. true Qt::TextSelectableByMouse 0 0 2 6144 4 8 128 Qt::Horizontal QSlider::TicksAbove 128 0 0 1 MB Qt::Horizontal 13 20 0 0 Update free memory information Free memory: 768 MB :/update.png:/update.png Qt::ToolButtonTextBesideIcon true Qt::Horizontal 17 20 2048 MB Qt::Horizontal QSizePolicy::Fixed 5 40 0 0 100 0 true 4 11 32 MB 64 MB 128 MB 256 MB 512 MB 1 GB 2 GB 3 GB 4 GB 8 GB 16 GB 32 GB Qt::Vertical 20 13 Remove limitation on maximum amount of memory Qt::Vertical 20 191 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select a hard disk image to be used as a boot hard disk of the virtual machine. You can either create a new hard disk using the <span style=" font-weight:600;">New</span> button or select an existing hard disk image by pressing the <span style=" font-weight:600;">Existing</span> button.</p></body></html> true Qt::TextSelectableByMouse Qt::Vertical QSizePolicy::Fixed 20 10 0 0 Boot Hard Disk (Primary Master) Qt::Horizontal N&ew... :/add.png:/add.png E&xisting... :/open-file.png:/open-file.png Qt::Horizontal 238 20 Qt::Vertical 20 20 Select network type to use on your new virtual machine. Qt::Vertical QSizePolicy::Fixed 20 13 &User Mode Network Connection (Uses the user mode network stack) true No Ne&twork (No net cards installed on VM) Qt::Vertical 411 21 9 9 9 9 6 Qt::Vertical 20 40 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Nimbus Sans L'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct press the <span style=" font-weight:600;">Finish</span> button. Once you press it, a new virtual machine will be created. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note that you can alter these and all other setting of the created virtual machine at any time.</p></body></html> true Qt::TextSelectableByMouse Enter your new virtual machine hard disk capacity. Qt::Vertical QSizePolicy::Fixed 20 5 Disk Size in GB (Gigabytes): 1 0.100000000000000 500.000000000000000 10.000000000000000 Qt::Vertical 411 21 Button_Back Button_Next Button_Cancel RB_Typical RB_Custom RB_VM_Template CB_OS_Type RB_Generate_VM CB_Computer_Type CB_Relese_Date Edit_VM_Name CB_CPU_Type Edit_HDA_File_Name Button_New_HDD Button_Existing RB_User_Mode_Network RB_No_Network SB_HDD_Size Button_Cancel clicked() VM_Wizard_Window reject() 436 364 460 370 RB_VM_Template toggled(bool) Label_OS_Type setEnabled(bool) 65 95 52 126 RB_VM_Template toggled(bool) CB_OS_Type setEnabled(bool) 81 93 237 137 RB_Generate_VM toggled(bool) Label_Computer_Type setEnabled(bool) 81 160 104 214 RB_Generate_VM toggled(bool) CB_Computer_Type setEnabled(bool) 114 183 276 214 RB_Generate_VM toggled(bool) Label_Relese_Date setEnabled(bool) 43 183 42 244 RB_Generate_VM toggled(bool) CB_Relese_Date setEnabled(bool) 58 183 308 244 aqemu-0.9.2/src/VNC_Password_Window.cpp000066400000000000000000000031241272330227200177640ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #include "Utils.h" #include "VNC_Password_Window.h" VNC_Password_Window::VNC_Password_Window( QWidget *parent ) : QDialog( parent ) { ui.setupUi( this ); } QString VNC_Password_Window::Get_Password() const { return ui.Edit_Password->text(); } void VNC_Password_Window::done(int r) { if ( r == QDialog::Accepted ) { if( ui.Edit_Password->text().isEmpty() ) { AQGraphic_Warning( tr("Warning"), tr("Password is Empty!") ); return; } if( ui.Edit_Password->text() != ui.Edit_Confirm_Password->text() ) { AQGraphic_Warning( tr("Warning"), tr("Password Not Confirmed!") ); return; } } QDialog::done(r); } aqemu-0.9.2/src/VNC_Password_Window.h000066400000000000000000000023711272330227200174340ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2008-2010 Andrey Rijov ** ** This file is part of AQEMU. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, ** Boston, MA 02110-1301, USA. ** ****************************************************************************/ #ifndef VNC_PASSWORD_WINDOW_H #define VNC_PASSWORD_WINDOW_H #include "ui_VNC_Password_Window.h" class VNC_Password_Window: public QDialog { Q_OBJECT public: VNC_Password_Window( QWidget *parent = 0 ); QString Get_Password() const; private slots: void done(int); private: Ui::VNC_Password_Window ui; }; #endif aqemu-0.9.2/src/VNC_Password_Window.ui000066400000000000000000000064231272330227200176240ustar00rootroot00000000000000 VNC_Password_Window 0 0 274 194 VNC Password :/exec.png:/exec.png 9 9 9 9 6 Password: 8 QLineEdit::Password 8 QLineEdit::Password Confirm: Qt::Horizontal 40 20 QDialogButtonBox::Cancel|QDialogButtonBox::Ok Dialog_Button_Box QDialogButtonBox
Dialog_Button_Box.h
buttonBox accepted() VNC_Password_Window accept() 170 168 136 96 buttonBox rejected() VNC_Password_Window reject() 170 168 136 96
aqemu-0.9.2/src/docopt/000077500000000000000000000000001272330227200147115ustar00rootroot00000000000000aqemu-0.9.2/src/docopt/LICENSE-MIT000066400000000000000000000020761272330227200163520ustar00rootroot00000000000000Copyright (c) 2012 Vladimir Keleshev, Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. aqemu-0.9.2/src/docopt/docopt.cpp000066400000000000000000000711661272330227200167200ustar00rootroot00000000000000// // docopt.cpp // docopt // // Created by Jared Grubb on 2013-11-03. // Copyright (c) 2013 Jared Grubb. All rights reserved. // #include "docopt.h" #include "docopt_util.h" #include "docopt_private.h" #include "docopt_value.h" #include #include #include #include #include #include #include #include #include using namespace docopt; DocoptExitHelp::DocoptExitHelp() : std::runtime_error("Docopt --help argument encountered") {} DocoptExitVersion::DocoptExitVersion() : std::runtime_error("Docopt --version argument encountered") {} const char* value::kindAsString(Kind kind) { switch (kind) { case Kind::Empty: return "empty"; case Kind::Bool: return "bool"; case Kind::Long: return "long"; case Kind::String: return "string"; case Kind::StringList: return "string-list"; } return "unknown"; } void value::throwIfNotKind(Kind expected) const { if (kind == expected) return; std::string error = "Illegal cast to "; error += kindAsString(expected); error += "; type is actually "; error += kindAsString(kind); throw std::runtime_error(std::move(error)); } std::ostream& docopt::operator<<(std::ostream& os, value const& val) { if (val.isBool()) { bool b = val.asBool(); os << (b ? "true" : "false"); } else if (val.isLong()) { long v = val.asLong(); os << v; } else if (val.isString()) { std::string const& str = val.asString(); os << '"' << str << '"'; } else if (val.isStringList()) { auto const& list = val.asStringList(); os << "["; bool first = true; for(auto const& el : list) { if (first) { first = false; } else { os << ", "; } os << '"' << el << '"'; } os << "]"; } else { os << "null"; } return os; } #pragma mark - #pragma mark Pattern types std::vector Pattern::leaves() { std::vector ret; collect_leaves(ret); return ret; } bool Required::match(PatternList& left, std::vector>& collected) const { auto l = left; auto c = collected; for(auto const& pattern : fChildren) { bool ret = pattern->match(l, c); if (!ret) { // leave (left, collected) untouched return false; } } left = std::move(l); collected = std::move(c); return true; } bool LeafPattern::match(PatternList& left, std::vector>& collected) const { auto match = single_match(left); if (!match.second) { return false; } left.erase(left.begin()+static_cast(match.first)); auto same_name = std::find_if(collected.begin(), collected.end(), [&](std::shared_ptr const& p) { return p->name()==name(); }); if (getValue().isLong()) { long val = 1; if (same_name == collected.end()) { collected.push_back(match.second); match.second->setValue(value{val}); } else if ((**same_name).getValue().isLong()) { val += (**same_name).getValue().asLong(); (**same_name).setValue(value{val}); } else { (**same_name).setValue(value{val}); } } else if (getValue().isStringList()) { std::vector val; if (match.second->getValue().isString()) { val.push_back(match.second->getValue().asString()); } else if (match.second->getValue().isStringList()) { val = match.second->getValue().asStringList(); } else { /// cant be!? } if (same_name == collected.end()) { collected.push_back(match.second); match.second->setValue(value{val}); } else if ((**same_name).getValue().isStringList()) { std::vector const& list = (**same_name).getValue().asStringList(); val.insert(val.begin(), list.begin(), list.end()); (**same_name).setValue(value{val}); } else { (**same_name).setValue(value{val}); } } else { collected.push_back(match.second); } return true; } Option Option::parse(std::string const& option_description) { std::string shortOption, longOption; int argcount = 0; value val { false }; auto double_space = option_description.find(" "); auto options_end = option_description.end(); if (double_space != std::string::npos) { options_end = option_description.begin() + static_cast(double_space); } static const std::regex pattern {"(-{1,2})?(.*?)([,= ]|$)"}; for(std::sregex_iterator i {option_description.begin(), options_end, pattern, std::regex_constants::match_not_null}, e{}; i != e; ++i) { std::smatch const& match = *i; if (match[1].matched) { // [1] is optional. if (match[1].length()==1) { shortOption = "-" + match[2].str(); } else { longOption = "--" + match[2].str(); } } else if (match[2].length() > 0) { // [2] always matches. std::string m = match[2]; argcount = 1; } else { // delimeter } if (match[3].length() == 0) { // [3] always matches. // Hit end of string. For some reason 'match_not_null' will let us match empty // at the end, and then we'll spin in an infinite loop. So, if we hit an empty // match, we know we must be at the end. break; } } if (argcount) { std::smatch match; if (std::regex_search(options_end, option_description.end(), match, std::regex{"\\[default: (.*)\\]", std::regex::icase})) { val = match[1].str(); } } return {std::move(shortOption), std::move(longOption), argcount, std::move(val)}; } bool OneOrMore::match(PatternList& left, std::vector>& collected) const { assert(fChildren.size() == 1); auto l = left; auto c = collected; bool matched = true; size_t times = 0; decltype(l) l_; bool firstLoop = true; while (matched) { // could it be that something didn't match but changed l or c? matched = fChildren[0]->match(l, c); if (matched) ++times; if (firstLoop) { firstLoop = false; } else if (l == l_) { break; } l_ = l; } if (times == 0) { return false; } left = std::move(l); collected = std::move(c); return true; } bool Either::match(PatternList& left, std::vector>& collected) const { using Outcome = std::pair>>; std::vector outcomes; for(auto const& pattern : fChildren) { // need a copy so we apply the same one for every iteration auto l = left; auto c = collected; bool matched = pattern->match(l, c); if (matched) { outcomes.emplace_back(std::move(l), std::move(c)); } } auto min = std::min_element(outcomes.begin(), outcomes.end(), [](Outcome const& o1, Outcome const& o2) { return o1.first.size() < o2.first.size(); }); if (min == outcomes.end()) { // (left, collected) unchanged return false; } std::tie(left, collected) = std::move(*min); return true; } std::pair> Argument::single_match(PatternList const& left) const { std::pair> ret {}; for(size_t i = 0, size = left.size(); i < size; ++i) { auto arg = dynamic_cast(left[i].get()); if (arg) { ret.first = i; ret.second = std::make_shared(name(), arg->getValue()); break; } } return ret; } std::pair> Command::single_match(PatternList const& left) const { std::pair> ret {}; for(size_t i = 0, size = left.size(); i < size; ++i) { auto arg = dynamic_cast(left[i].get()); if (arg) { if (name() == arg->getValue()) { ret.first = i; ret.second = std::make_shared(name(), value{true}); } break; } } return ret; } std::pair> Option::single_match(PatternList const& left) const { std::pair> ret {}; for(size_t i = 0, size = left.size(); i < size; ++i) { auto leaf = std::dynamic_pointer_cast(left[i]); if (leaf && name() == leaf->name()) { ret.first = i; ret.second = leaf; break; } } return ret; } #pragma mark - #pragma mark Parsing stuff static std::vector transform(PatternList pattern); void BranchPattern::fix_repeating_arguments() { std::vector either = transform(children()); for(auto const& group : either) { // use multiset to help identify duplicate entries std::unordered_multiset, PatternHasher> group_set {group.begin(), group.end()}; for(auto const& e : group_set) { if (group_set.count(e) == 1) continue; LeafPattern* leaf = dynamic_cast(e.get()); if (!leaf) continue; bool ensureList = false; bool ensureInt = false; if (dynamic_cast(leaf)) { ensureInt = true; } else if (dynamic_cast(leaf)) { ensureList = true; } else if (Option* o = dynamic_cast(leaf)) { if (o->argCount()) { ensureList = true; } else { ensureInt = true; } } if (ensureList) { std::vector newValue; if (leaf->getValue().isString()) { newValue = split(leaf->getValue().asString()); } if (!leaf->getValue().isStringList()) { leaf->setValue(value{newValue}); } } else if (ensureInt) { leaf->setValue(value{0}); } } } } static std::vector transform(PatternList pattern) { std::vector result; std::vector groups; groups.emplace_back(std::move(pattern)); while(!groups.empty()) { // pop off the first element auto children = std::move(groups[0]); groups.erase(groups.begin()); // find the first branch node in the list auto child_iter = std::find_if(children.begin(), children.end(), [](std::shared_ptr const& p) { return dynamic_cast(p.get()); }); // no branch nodes left : expansion is complete for this grouping if (child_iter == children.end()) { result.emplace_back(std::move(children)); continue; } // pop the child from the list auto child = std::move(*child_iter); children.erase(child_iter); // expand the branch in the appropriate way if (Either* either = dynamic_cast(child.get())) { // "[e] + children" for each child 'e' in Either for(auto const& eitherChild : either->children()) { PatternList group = { eitherChild }; group.insert(group.end(), children.begin(), children.end()); groups.emplace_back(std::move(group)); } } else if (OneOrMore* oneOrMore = dynamic_cast(child.get())) { // child.children * 2 + children auto const& subchildren = oneOrMore->children(); PatternList group = subchildren; group.insert(group.end(), subchildren.begin(), subchildren.end()); group.insert(group.end(), children.begin(), children.end()); groups.emplace_back(std::move(group)); } else { // Required, Optional, OptionsShortcut BranchPattern* branch = dynamic_cast(child.get()); // child.children + children PatternList group = branch->children(); group.insert(group.end(), children.begin(), children.end()); groups.emplace_back(std::move(group)); } } return result; } class Tokens { public: Tokens(std::vector tokens, bool isParsingArgv = true) : fTokens(std::move(tokens)), fIsParsingArgv(isParsingArgv) {} explicit operator bool() const { return fIndex < fTokens.size(); } static Tokens from_pattern(std::string const& source) { static const std::regex re_separators { "(?:\\s*)" // any spaces (non-matching subgroup) "(" "[\\[\\]\\(\\)\\|]" // one character of brackets or parens or pipe character "|" "\\.\\.\\." // elipsis ")" }; static const std::regex re_strings { "(?:\\s*)" // any spaces (non-matching subgroup) "(" "\\S*<.*?>" // strings, but make sure to keep "< >" strings together "|" "[^<>\\s]+" // string without <> ")" }; // We do two stages of regex matching. The '[]()' and '...' are strong delimeters // and need to be split out anywhere they occur (even at the end of a token). We // first split on those, and then parse the stuff between them to find the string // tokens. This is a little harder than the python version, since they have regex.split // and we dont have anything like that. std::vector tokens; std::for_each(std::sregex_iterator{ source.begin(), source.end(), re_separators }, std::sregex_iterator{}, [&](std::smatch const& match) { // handle anything before the separator (this is the "stuff" between the delimeters) if (match.prefix().matched) { std::for_each(std::sregex_iterator{match.prefix().first, match.prefix().second, re_strings}, std::sregex_iterator{}, [&](std::smatch const& m) { tokens.push_back(m[1].str()); }); } // handle the delimter token itself if (match[1].matched) { tokens.push_back(match[1].str()); } }); return Tokens(tokens, false); } std::string const& current() const { if (*this) return fTokens[fIndex]; static std::string const empty; return empty; } std::string the_rest() const { if (!*this) return {}; return join(fTokens.begin()+static_cast(fIndex), fTokens.end(), " "); } std::string pop() { return std::move(fTokens.at(fIndex++)); } bool isParsingArgv() const { return fIsParsingArgv; } struct OptionError : std::runtime_error { using runtime_error::runtime_error; }; private: std::vector fTokens; size_t fIndex = 0; bool fIsParsingArgv; }; // Get all instances of 'T' from the pattern template std::vector flat_filter(Pattern& pattern) { std::vector flattened = pattern.flat([](Pattern const* p) -> bool { return dynamic_cast(p) != nullptr; }); // now, we're guaranteed to have T*'s, so just use static_cast std::vector ret; std::transform(flattened.begin(), flattened.end(), std::back_inserter(ret), [](Pattern* p) { return static_cast(p); }); return ret; } static std::vector parse_section(std::string const& name, std::string const& source) { // ECMAScript regex only has "?=" for a non-matching lookahead. In order to make sure we always have // a newline to anchor our matching, we have to avoid matching the final newline of each grouping. // Therefore, our regex is adjusted from the docopt Python one to use ?= to match the newlines before // the following lines, rather than after. std::regex const re_section_pattern { "(?:^|\\n)" // anchored at a linebreak (or start of string) "(" "[^\\n]*" + name + "[^\\n]*(?=\\n?)" // a line that contains the name "(?:\\n[ \\t].*?(?=\\n|$))*" // followed by any number of lines that are indented ")", std::regex::icase }; std::vector ret; std::for_each(std::sregex_iterator(source.begin(), source.end(), re_section_pattern), std::sregex_iterator(), [&](std::smatch const& match) { ret.push_back(trim(match[1].str())); }); return ret; } static bool is_argument_spec(std::string const& token) { if (token.empty()) return false; if (token[0]=='<' && token[token.size()-1]=='>') return true; if (std::all_of(token.begin(), token.end(), &::isupper)) return true; return false; } template std::vector longOptions(I iter, I end) { std::vector ret; std::transform(iter, end, std::back_inserter(ret), [](typename I::reference opt) { return opt->longOption(); }); return ret; } static PatternList parse_long(Tokens& tokens, std::vector