# HG changeset patch # User unc0rr # Date 1411850944 -14400 # Node ID 7c25297720f15ca5a577b95bbfe569428664f19d # Parent 727a154cf784cf966bfd2c86c36b647aaf829c00 More refactoring: move PoC preview getting code into flib diff -r 727a154cf784 -r 7c25297720f1 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sun Sep 28 00:18:01 2014 +0400 +++ b/hedgewars/CMakeLists.txt Sun Sep 28 00:49:04 2014 +0400 @@ -99,9 +99,10 @@ uGearsHandlersMess.pas uGearsUtils.pas uTeams.pas - + uFLIPC.pas uFLTypes.pas + uFLGameConfig.pas #these interact with everything, so compile last uScript.pas diff -r 727a154cf784 -r 7c25297720f1 hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Sun Sep 28 00:18:01 2014 +0400 +++ b/hedgewars/hwLibrary.pas Sun Sep 28 00:49:04 2014 +0400 @@ -146,8 +146,7 @@ RunEngine, runQuickGame, getPreview, - registerPreviewCallback, - ipcToEngine, + registerGUIMessagesCallback, flibInit, flibFree, LoadLocaleWrapper, diff -r 727a154cf784 -r 7c25297720f1 hedgewars/uFLGameConfig.pas --- a/hedgewars/uFLGameConfig.pas Sun Sep 28 00:18:01 2014 +0400 +++ b/hedgewars/uFLGameConfig.pas Sun Sep 28 00:49:04 2014 +0400 @@ -1,12 +1,18 @@ unit uFLGameConfig; - interface +uses uFLTypes; procedure resetGameConfig; cdecl; export; procedure runQuickGame; cdecl; export; procedure getPreview; cdecl; export; +procedure registerGUIMessagesCallback(p: pointer; f: TGUICallback); cdecl; export; + implementation +uses uFLIPC, hwengine; + +var guiCallbackPointer: pointer; + guiCallbackFunction: TGUICallback; const MAXCONFIGS = 5; @@ -54,9 +60,9 @@ for i:= 0 to Pred(MAXARGS) do begin if arguments[i][0] = #255 then - arguments[i][255] = #0 + arguments[i][255]:= #0 else - arguments[i][byte(arguments[i][0]) + 1] = #0; + arguments[i][byte(arguments[i][0]) + 1]:= #0; argv[i]:= @arguments[i][1] end; @@ -81,9 +87,26 @@ arguments[1]:= '--internal'; arguments[2]:= '--landpreview'; argumentsNumber:= 3; + + queueExecution; + + ipcToEngine('eseed ' + seed); + ipcToEngine('e$mapgen 0'); + ipcToEngine('!'); end; +end; - queueExecution +procedure engineMessageCallback(p: pointer; msg: PChar; len: Longword); +begin + if len = 128 * 256 then guiCallbackFunction(guiCallbackPointer, mtPreview, msg, len) +end; + +procedure registerGUIMessagesCallback(p: pointer; f: TGUICallback); cdecl; export; +begin + guiCallbackPointer:= p; + guiCallbackFunction:= f; + + registerIPCCallback(nil, @engineMessageCallback) end; end. diff -r 727a154cf784 -r 7c25297720f1 hedgewars/uFLIPC.pas --- a/hedgewars/uFLIPC.pas Sun Sep 28 00:18:01 2014 +0400 +++ b/hedgewars/uFLIPC.pas Sun Sep 28 00:49:04 2014 +0400 @@ -9,7 +9,7 @@ procedure initIPC; procedure freeIPC; -procedure ipcToEngine(p: PChar; len: byte); cdecl; export; +procedure ipcToEngine(s: shortstring); //function ipcReadFromEngine: shortstring; //function ipcCheckFromEngine: boolean; @@ -18,7 +18,7 @@ function ipcReadFromFrontend: shortstring; function ipcCheckFromFrontend: boolean; -procedure registerPreviewCallback(p: pointer; f: TIPCCallback); cdecl; export; +procedure registerIPCCallback(p: pointer; f: TIPCCallback); implementation @@ -69,12 +69,10 @@ SDL_UnlockMutex(mut) end; -procedure ipcToEngine(p: PChar; len: byte); cdecl; export; +procedure ipcToEngine(s: shortstring); var msg: TIPCMessage; begin - writeln(stderr, len); - Move(p^, msg.str[1], len); - msg.str[0]:= char(len); + msg.str:= s; msg.buf:= nil; ipcSend(msg, msgEngine, mutEngine, condEngine) end; @@ -133,7 +131,7 @@ until false end; -procedure registerPreviewCallback(p: pointer; f: TIPCCallback); cdecl; export; +procedure registerIPCCallback(p: pointer; f: TIPCCallback); begin callbackPointer:= p; callbackFunction:= f; diff -r 727a154cf784 -r 7c25297720f1 hedgewars/uFLTypes.pas --- a/hedgewars/uFLTypes.pas Sun Sep 28 00:18:01 2014 +0400 +++ b/hedgewars/uFLTypes.pas Sun Sep 28 00:49:04 2014 +0400 @@ -1,12 +1,16 @@ unit uFLTypes; interface -type TIPCMessage = record +type + TMessageType = (mtPreview); + + TIPCMessage = record str: shortstring; len: Longword; buf: Pointer end; TIPCCallback = procedure (p: pointer; msg: PChar; len: Longword); + TGUICallback = procedure (p: pointer; msgType: TMessageType; msg: PChar; len: Longword); implementation diff -r 727a154cf784 -r 7c25297720f1 qmlFrontend/flib.h --- a/qmlFrontend/flib.h Sun Sep 28 00:18:01 2014 +0400 +++ b/qmlFrontend/flib.h Sun Sep 28 00:49:04 2014 +0400 @@ -7,6 +7,10 @@ extern "C" { #endif +enum MessageType { + MSG_PREVIEW +}; + typedef union string255_ { struct { @@ -19,9 +23,9 @@ } string255; typedef void RunEngine_t(int argc, const char ** argv); -typedef void registerPreviewCallback_t(void * context, void (*)(void * context, const char * msg, uint32_t len)); -typedef void ipcToEngine_t(const char * msg, uint8_t len); +typedef void registerGUIMessagesCallback_t(void * context, void (*)(void * context, MessageType mt, const char * msg, uint32_t len)); typedef void flibInit_t(const char * localPrefix, const char * userPrefix); +typedef void getPreview_t(); typedef void flibFree_t(); #ifdef __cplusplus diff -r 727a154cf784 -r 7c25297720f1 qmlFrontend/hwengine.cpp --- a/qmlFrontend/hwengine.cpp Sun Sep 28 00:18:01 2014 +0400 +++ b/qmlFrontend/hwengine.cpp Sun Sep 28 00:49:04 2014 +0400 @@ -8,9 +8,9 @@ #include "previewimageprovider.h" extern "C" { - RunEngine_t *RunEngine; - registerPreviewCallback_t *registerPreviewCallback; - ipcToEngine_t *ipcToEngine; + RunEngine_t *flibRunEngine; + registerGUIMessagesCallback_t *flibRegisterGUIMessagesCallback; + getPreview_t *flibGetPreview; flibInit_t *flibInit; flibFree_t *flibFree; } @@ -24,14 +24,14 @@ if(!hwlib.load()) qWarning() << "Engine library not found" << hwlib.errorString(); - RunEngine = (RunEngine_t*) hwlib.resolve("RunEngine"); - registerPreviewCallback = (registerPreviewCallback_t*) hwlib.resolve("registerIPCCallback"); - ipcToEngine = (ipcToEngine_t*) hwlib.resolve("ipcToEngine"); + flibRunEngine = (RunEngine_t*) hwlib.resolve("RunEngine"); + flibRegisterGUIMessagesCallback = (registerGUIMessagesCallback_t*) hwlib.resolve("registerGUIMessagesCallback"); + flibGetPreview = (getPreview_t*) hwlib.resolve("getPreview"); flibInit = (flibInit_t*) hwlib.resolve("flibInit"); flibFree = (flibFree_t*) hwlib.resolve("flibFree"); flibInit(".", "~/.hedgewars"); - registerPreviewCallback(this, &enginePreviewCallback); + flibRegisterGUIMessagesCallback(this, &guiMessagesCallback); } HWEngine::~HWEngine() @@ -39,23 +39,10 @@ flibFree(); } -void HWEngine::run() +void HWEngine::getPreview() { - m_argsList.clear(); - m_argsList << ""; - m_argsList << "--internal"; - m_argsList << "--landpreview"; - - m_args.resize(m_argsList.size()); - for(int i = m_argsList.size() - 1; i >=0; --i) - m_args[i] = m_argsList[i].constData(); - - m_seed = QUuid::createUuid().toString(); - - RunEngine(m_args.size(), m_args.data()); - sendIPC("eseed " + m_seed.toLatin1()); - sendIPC("e$mapgen 0"); - sendIPC("!"); + //m_seed = QUuid::createUuid().toString(); + flibGetPreview(); } static QObject *hwengine_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) @@ -72,15 +59,8 @@ qmlRegisterSingletonType("Hedgewars.Engine", 1, 0, "HWEngine", hwengine_singletontype_provider); } -void HWEngine::sendIPC(const QByteArray & b) -{ - quint8 len = b.size() > 255 ? 255 : b.size(); - qDebug() << "sendIPC: len = " << len; - ipcToEngine(b.constData(), len); -} - -void HWEngine::enginePreviewCallback(void *context, const char * msg, quint32 len) +void HWEngine::guiMessagesCallback(void *context, MessageType mt, const char * msg, uint32_t len) { HWEngine * obj = (HWEngine *)context; QByteArray b = QByteArray::fromRawData(msg, len); diff -r 727a154cf784 -r 7c25297720f1 qmlFrontend/hwengine.h --- a/qmlFrontend/hwengine.h Sun Sep 28 00:18:01 2014 +0400 +++ b/qmlFrontend/hwengine.h Sun Sep 28 00:49:04 2014 +0400 @@ -18,7 +18,7 @@ ~HWEngine(); static void exposeToQML(); - Q_INVOKABLE void run(); + Q_INVOKABLE void getPreview(); Q_INVOKABLE QString currentSeed(); signals: @@ -27,13 +27,10 @@ public slots: private: - QList m_argsList; - QVector m_args; QQmlEngine * m_engine; QString m_seed; - static void enginePreviewCallback(void *context, const char * msg, quint32 len); - void sendIPC(const QByteArray &b); + static void guiMessagesCallback(void * context, MessageType mt, const char * msg, uint32_t len); private slots: void engineMessageHandler(const QByteArray &msg); diff -r 727a154cf784 -r 7c25297720f1 qmlFrontend/qml/qmlFrontend/GameConfig.qml --- a/qmlFrontend/qml/qmlFrontend/GameConfig.qml Sun Sep 28 00:18:01 2014 +0400 +++ b/qmlFrontend/qml/qmlFrontend/GameConfig.qml Sun Sep 28 00:49:04 2014 +0400 @@ -10,7 +10,7 @@ height: 150 onClicked: { - HWEngine.run() + HWEngine.getPreview() } Connections {