summaryrefslogtreecommitdiff
path: root/src/gameinfoimpl.cpp
diff options
context:
space:
mode:
authorThomas Tanner <trtanner@btinternet.com>2015-11-01 18:27:34 +0000
committerThomas Tanner <trtanner@btinternet.com>2015-11-01 18:27:34 +0000
commit184cff8a7731c83f049dedb0f8e20d91c36e77a3 (patch)
treec20a2b3e0994ba613314d7ddce14aba08ffd9801 /src/gameinfoimpl.cpp
parentdfdf80417e6b4a6b1a353810ba473aa70e0c9abd (diff)
Add support for version dependency checks
Diffstat (limited to 'src/gameinfoimpl.cpp')
-rw-r--r--src/gameinfoimpl.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/src/gameinfoimpl.cpp b/src/gameinfoimpl.cpp
index 025ce4e6..979e6c8d 100644
--- a/src/gameinfoimpl.cpp
+++ b/src/gameinfoimpl.cpp
@@ -18,8 +18,10 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "gameinfoimpl.h"
-#include <gameinfo.h>
+#include "gameinfo.h"
#include <utility.h>
+
+#include <QDebug>
#include <QDir>
@@ -52,3 +54,50 @@ QString GameInfoImpl::binaryName() const
{
return ToQString(GameInfo::instance().getBinaryName());
}
+
+namespace {
+
+QString GetAppVersion(std::wstring const &app_name)
+{
+ DWORD handle;
+ DWORD info_len = ::GetFileVersionInfoSizeW(app_name.c_str(), &handle);
+ if (info_len == 0) {
+ qDebug("GetFileVersionInfoSizeW Error %d", ::GetLastError());
+ throw std::runtime_error("Failed to get version info");
+ }
+
+ std::vector<char> buff(info_len);
+ if( ! ::GetFileVersionInfoW(app_name.c_str(), handle, info_len, buff.data())) {
+ qDebug("GetFileVersionInfoW Error %d", ::GetLastError());
+ throw std::runtime_error("Failed to get version info");
+ }
+
+ VS_FIXEDFILEINFO *pFileInfo;
+ UINT buf_len;
+ if ( ! ::VerQueryValueW(buff.data(), L"\\", reinterpret_cast<LPVOID *>(&pFileInfo), &buf_len)) {
+ qDebug("VerQueryValueW Error %d", ::GetLastError());
+ throw std::runtime_error("Failed to get version info");
+ }
+ return QString("%1.%2.%3.%4").arg(HIWORD(pFileInfo->dwFileVersionMS))
+ .arg(LOWORD(pFileInfo->dwFileVersionMS))
+ .arg(HIWORD(pFileInfo->dwFileVersionLS))
+ .arg(LOWORD(pFileInfo->dwFileVersionLS));
+}
+
+}
+
+QString GameInfoImpl::version() const
+{
+ std::wstring dir = GameInfo::instance().getGameDirectory();
+ std::wstring exec = GameInfo::instance().getBinaryName();
+ std::wstring target = L"\\\\?\\" + dir + L"\\" + exec;
+ return GetAppVersion(target.c_str());
+}
+
+QString GameInfoImpl::extenderVersion() const
+{
+ std::wstring dir = GameInfo::instance().getGameDirectory();
+ std::wstring exec = GameInfo::instance().getExtenderName();
+ std::wstring target = L"\\\\?\\" + dir + L"\\" + exec;
+ return GetAppVersion(target.c_str());
+}