diff options
Diffstat (limited to 'ftnoir_protocol_wine')
-rw-r--r-- | ftnoir_protocol_wine/ftnoir-wrapper-wine-main.cxx | 61 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir-wrapper-wine-posix.cxx | 9 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir-wrapper-wine-windows.cxx | 7 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir_protocol_wine.cpp | 115 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir_protocol_wine.h | 99 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp | 71 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp | 57 | ||||
-rw-r--r-- | ftnoir_protocol_wine/ftnoir_winecontrols.ui | 167 | ||||
-rw-r--r-- | ftnoir_protocol_wine/fttypes.h | 68 | ||||
-rw-r--r-- | ftnoir_protocol_wine/images/wine.png | bin | 0 -> 376 bytes | |||
-rw-r--r-- | ftnoir_protocol_wine/wine-protocol.qrc | 5 |
11 files changed, 659 insertions, 0 deletions
diff --git a/ftnoir_protocol_wine/ftnoir-wrapper-wine-main.cxx b/ftnoir_protocol_wine/ftnoir-wrapper-wine-main.cxx new file mode 100644 index 00000000..b64b8254 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir-wrapper-wine-main.cxx @@ -0,0 +1,61 @@ +#include <errno.h> +#include <stdio.h> +#include "ftnoir_protocol_wine/fttypes.h" +class ShmPosix { +public: + ShmPosix(const char *shmName, const char *mutexName, int mapSize); + ~ShmPosix(); + void lock(); + void unlock(); + void* mem; +private: + int fd, size; +}; + +class ShmWine { +public: + ShmWine(const char *shmName, const char *mutexName, int mapSize); + ~ShmWine(); + void lock(); + void unlock(); + void* mem; +private: + void *hMutex, *hMapFile; +}; +#include <windows.h> + +int main(void) +{ + ShmPosix lck_posix(WINE_SHM_NAME, WINE_MTX_NAME, sizeof(WineSHM)); + ShmWine lck_wine("FT_SharedMem", "FT_Mutext", sizeof(TFreeTrackData)); + if(lck_posix.mem == (void*)-1) { + printf("Can't open posix map: %d\n", errno); + return 1; + } + if(lck_wine.mem == NULL) { + printf("Can't open Wine map\n"); + return 1; + } + WineSHM* shm_posix = (WineSHM*) lck_posix.mem; + TFreeTrackData* shm_wine = (TFreeTrackData*) lck_wine.mem; + while (!shm_posix->stop) { + (void) Sleep(10); + lck_posix.lock(); + if (shm_posix->stop) { + lck_posix.unlock(); + break; + } + lck_wine.lock(); + shm_wine->Yaw = shm_posix->rx; + shm_wine->Pitch = shm_posix->ry; + shm_wine->Roll = shm_posix->rz; + shm_wine->X = shm_posix->tx; + shm_wine->Y = shm_posix->ty; + shm_wine->Z = shm_posix->tz; + shm_wine->DataID = 1; + shm_wine->CamWidth = 2; + shm_wine->CamHeight = 3; + lck_wine.unlock(); + lck_posix.unlock(); + } +} diff --git a/ftnoir_protocol_wine/ftnoir-wrapper-wine-posix.cxx b/ftnoir_protocol_wine/ftnoir-wrapper-wine-posix.cxx new file mode 100644 index 00000000..c88dd332 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir-wrapper-wine-posix.cxx @@ -0,0 +1,9 @@ +#ifdef _WIN32 +#undef _WIN32 +#endif +#ifdef __WIN32 +#undef __WIN32 +#endif +#define PortableLockedShm ShmPosix +#include "compat/compat.h" +#include "compat/compat.cpp" diff --git a/ftnoir_protocol_wine/ftnoir-wrapper-wine-windows.cxx b/ftnoir_protocol_wine/ftnoir-wrapper-wine-windows.cxx new file mode 100644 index 00000000..f1345263 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir-wrapper-wine-windows.cxx @@ -0,0 +1,7 @@ +#ifndef __WIN32 +#define __WIN32 +#endif +#define PortableLockedShm ShmWine +#include "fttypes.h" +#include "compat/compat.h" +#include "compat/compat.cpp" diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine.cpp b/ftnoir_protocol_wine/ftnoir_protocol_wine.cpp new file mode 100644 index 00000000..bc1e862a --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine.cpp @@ -0,0 +1,115 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of the some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* 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 3 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, see <http://www.gnu.org/licenses/>. * +* * +* FTServer FTServer is the Class, that communicates headpose-data * +* to games, using the FreeTrackClient.dll. * +********************************************************************************/ +/* + Modifications (last one on top): + 20110401 - WVR: Moved protocol to a DLL, convenient for installation etc. + 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame + is called from run() of Tracker.cpp + 20100601 - WVR: Added Mutex-bit in run(). Thought it wasn't so important (still do...). + 20100523 - WVR: Implemented the Freetrack-protocol just like Freetrack does. Earlier + FaceTrackNoIR only worked with an adapted DLL, with a putdata function. + Now it works direcly in shared memory! +*/ +#include "ftnoir_protocol_wine.h" +#include "facetracknoir/global-settings.h" +#include "fttypes.h" + +#include <string.h> +#include <sys/mman.h> +#include <sys/stat.h> /* For mode constants */ +#include <fcntl.h> /* For O_* constants */ + +/** constructor **/ +FTNoIR_Protocol::FTNoIR_Protocol() : lck_shm(WINE_SHM_NAME, WINE_MTX_NAME, sizeof(WineSHM)), shm(NULL) +{ + if (lck_shm.mem != (void*) -1) { + shm = (WineSHM*) lck_shm.mem; + memset(shm, 0, sizeof(*shm)); + } +} + +/** destructor **/ +FTNoIR_Protocol::~FTNoIR_Protocol() +{ + if (shm) { + shm->stop = true; + wrapper.waitForFinished(2000); + } + wrapper.kill(); + shm_unlink("/" WINE_SHM_NAME); +} + +void FTNoIR_Protocol::Initialize() +{ + wrapper.start("wine", QStringList() << (QCoreApplication::applicationDirPath() + "/ftnoir-wrapper-wine.exe.so")); +} + +void FTNoIR_Protocol::sendHeadposeToGame( THeadPoseData *headpose, THeadPoseData *rawheadpose ) { + if (shm) + { + lck_shm.lock(); + shm->rx = headpose->yaw / 57.295781; + shm->ry = headpose->pitch / 57.295781; + shm->rz = headpose->roll / 57.295781; + shm->tx = headpose->x * 10; + shm->ty = headpose->y * 10; + shm->tz = headpose->z * 10; + lck_shm.unlock(); + } +} + +// +// Check if the Client DLL exists and load it (to test it), if so. +// Returns 'true' if all seems OK. +// +bool FTNoIR_Protocol::checkServerInstallationOK() +{ + return lck_shm.mem != (void*)-1; +} + +// +// Return a name, if present the name from the Game, that is connected... +// +void FTNoIR_Protocol::getNameFromGame( char *dest ) +{ + sprintf(dest, "Wine glue"); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Protocol object. + +// Export both decorated and undecorated names. +// GetProtocol - Undecorated name, which can be easily used with GetProcAddress +// Win32 API function. +// _GetProtocol@0 - Common name decoration for __stdcall functions in C language. +//#pragma comment(linker, "/export:GetProtocol=_GetProtocol@0") + +extern "C" FTNOIR_PROTOCOL_BASE_EXPORT void* CALLING_CONVENTION GetConstructor() +{ + return (IProtocol*) new FTNoIR_Protocol; +} diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine.h b/ftnoir_protocol_wine/ftnoir_protocol_wine.h new file mode 100644 index 00000000..efc23cd6 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine.h @@ -0,0 +1,99 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* 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 3 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, see <http://www.gnu.org/licenses/>. * +* * +* FTServer FTServer is the Class, that communicates headpose-data * +* to games, using the FreeTrackClient.dll. * +********************************************************************************/ +#pragma once +#ifndef INCLUDED_FTSERVER_H +#define INCLUDED_FTSERVER_H + +#include "ftnoir_protocol_base/ftnoir_protocol_base.h" +#include "ui_ftnoir_winecontrols.h" +#include "fttypes.h" +#include <QMessageBox> +#include <QSettings> +#include <QLibrary> +#include <QProcess> +#include <QDebug> +#include <QFile> +#include "facetracknoir/global-settings.h" +#include "compat/compat.h" + +class FTNoIR_Protocol : public IProtocol +{ +public: + FTNoIR_Protocol(); + ~FTNoIR_Protocol(); + + void Initialize(); + + bool checkServerInstallationOK(); + void sendHeadposeToGame( THeadPoseData *headpose, THeadPoseData *rawheadpose ); + void getNameFromGame( char *dest ); // Take care dest can handle up to 100 chars... + +private: + PortableLockedShm lck_shm; + WineSHM* shm; + QProcess wrapper; +}; + +// Widget that has controls for FTNoIR protocol client-settings. +class FTControls: public QWidget, public IProtocolDialog +{ + Q_OBJECT +public: + + FTControls(); + void showEvent ( QShowEvent * event ) {show();} + void Initialize(QWidget *parent) {show();} + void registerProtocol(IProtocol *protocol) {} + void unRegisterProtocol() {} + +private: + Ui::UICFTControls ui; + +private slots: + void doOK(); + void doCancel(); +}; + +//******************************************************************************************************* +// FaceTrackNoIR Protocol DLL. Functions used to get general info on the Protocol +//******************************************************************************************************* +class FTNoIR_ProtocolDll : public Metadata +{ +public: + FTNoIR_ProtocolDll(); + ~FTNoIR_ProtocolDll(); + + void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("Wine"); } + void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("Wine"); } + void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("Wine glue wrapper"); } + + void getIcon(QIcon *icon) { *icon = QIcon(":/images/wine.png"); } +}; + + +#endif//INCLUDED_FTSERVER_H +//END diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp b/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp new file mode 100644 index 00000000..4021a8e5 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine_dialog.cpp @@ -0,0 +1,71 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2012 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* 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 3 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, see <http://www.gnu.org/licenses/>. * +* * +********************************************************************************/ +/* + Modifications (last one on top): + 20120830 - WVR: The Dialog class was used to get general info on the DLL. This + had a big disadvantage: the complete dialog was loaded, just to get + some data and then it was deleted again (without ever showing the dialog). + The ProtocolDll class solves this. + The functions to get the name(s) and icon were removed from the two other classes. +*/ +#include "ftnoir_protocol_wine.h" +#include <QDebug> +#include "facetracknoir/global-settings.h" + +//******************************************************************************************************* +// FaceTrackNoIR Client Settings-dialog. +//******************************************************************************************************* + +// +// Constructor for server-settings-dialog +// +FTControls::FTControls() : QWidget() +{ + ui.setupUi( this ); + connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); + connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); +} + +// +// Destructor for server-dialog + +// +// OK clicked on server-dialog +// +void FTControls::doOK() { + this->close(); +} + +// +// Cancel clicked on server-dialog +// +void FTControls::doCancel() { + this->close(); +} + +extern "C" FTNOIR_PROTOCOL_BASE_EXPORT void* CALLING_CONVENTION GetDialog( ) +{ + return (IProtocolDialog*) new FTControls; +} diff --git a/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp b/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp new file mode 100644 index 00000000..1e9298b0 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir_protocol_wine_dll.cpp @@ -0,0 +1,57 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2012 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* 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 3 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, see <http://www.gnu.org/licenses/>. * +* * +********************************************************************************/ +/* + Modifications (last one on top): + 20120830 - WVR: The Dialog class was used to get general info on the DLL. This + had a big disadvantage: the complete dialog was loaded, just to get + some data and then it was deleted again (without ever showing the dialog). + The ProtocolDll class solves this. + The functions to get the name(s) and icon were removed from the two other classes. +*/ +#include "ftnoir_protocol_wine.h" +#include <QDebug> +#include "facetracknoir/global-settings.h" + +FTNoIR_ProtocolDll::FTNoIR_ProtocolDll() { +} + +FTNoIR_ProtocolDll::~FTNoIR_ProtocolDll() +{ + +} + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Protocol object. + +// Export both decorated and undecorated names. +// GetProtocolDll - Undecorated name, which can be easily used with GetProcAddress +// Win32 API function. +// _GetProtocolDll@0 - Common name decoration for __stdcall functions in C language. +//#pragma comment(linker, "/export:GetProtocolDll=_GetProtocolDll@0") + +extern "C" FTNOIR_PROTOCOL_BASE_EXPORT Metadata* CALLING_CONVENTION GetMetadata() +{ + return new FTNoIR_ProtocolDll; +} diff --git a/ftnoir_protocol_wine/ftnoir_winecontrols.ui b/ftnoir_protocol_wine/ftnoir_winecontrols.ui new file mode 100644 index 00000000..71e99d88 --- /dev/null +++ b/ftnoir_protocol_wine/ftnoir_winecontrols.ui @@ -0,0 +1,167 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>UICFTControls</class> + <widget class="QWidget" name="UICFTControls"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>411</width> + <height>112</height> + </rect> + </property> + <property name="windowTitle"> + <string>FreeTrack settings FaceTrackNoIR</string> + </property> + <property name="windowIcon"> + <iconset> + <normaloff>images/freetrack.png</normaloff>images/freetrack.png</iconset> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <layout class="QVBoxLayout" name="_vertical_layout"> + <item> + <layout class="QHBoxLayout"> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>There are no settings necessary for the Wine protocol.</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="QPushButton" name="btnOK"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>OK</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btnCancel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>10</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> + <slots> + <slot>startEngineClicked()</slot> + <slot>stopEngineClicked()</slot> + <slot>cameraSettingsClicked()</slot> + </slots> +</ui> diff --git a/ftnoir_protocol_wine/fttypes.h b/ftnoir_protocol_wine/fttypes.h new file mode 100644 index 00000000..73cbae0e --- /dev/null +++ b/ftnoir_protocol_wine/fttypes.h @@ -0,0 +1,68 @@ +/******************************************************************************** +* FTTypes FTTypes contains th specific type definitions for the * +* FreeTrack protocol. * +* It was loosely translated from FTTypes.pas * +* which was created by the FreeTrack-team. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Testing and Research) * +* * +* Homepage <http://www.free-track.net> * +* * +* 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 3 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, see <http://www.gnu.org/licenses/>. * +* * +* We would like to extend our grattitude to the creators of SweetSpotter, * +* which has become the basis of this program: "Great work guys!" * +********************************************************************************/ +#ifndef INCLUDED_FTTYPES_H +#define INCLUDED_FTTYPES_H + +#define WINE_SHM_NAME "facetracknoir-wine-shm" +#define WINE_MTX_NAME "facetracknoir-wine-mtx" + +struct WineSHM { + float rx, ry, rz, tx, ty, tz; + bool stop; +}; + +struct TFreeTrackData { + int DataID; + int CamWidth; + int CamHeight; + // virtual pose + float Yaw; // positive yaw to the left + float Pitch; // positive pitch up + float Roll; // positive roll to the left + float X; + float Y; + float Z; + // raw pose with no smoothing, sensitivity, response curve etc. + float RawYaw; + float RawPitch; + float RawRoll; + float RawX; + float RawY; + float RawZ; + // raw points, sorted by Y, origin top left corner + float X1; + float Y1; + float X2; + float Y2; + float X3; + float Y3; + float X4; + float Y4; +}; + +#endif//INCLUDED_FTTYPES_H diff --git a/ftnoir_protocol_wine/images/wine.png b/ftnoir_protocol_wine/images/wine.png Binary files differnew file mode 100644 index 00000000..bcf3a012 --- /dev/null +++ b/ftnoir_protocol_wine/images/wine.png diff --git a/ftnoir_protocol_wine/wine-protocol.qrc b/ftnoir_protocol_wine/wine-protocol.qrc new file mode 100644 index 00000000..af81caea --- /dev/null +++ b/ftnoir_protocol_wine/wine-protocol.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>images/wine.png</file> + </qresource> +</RCC> |