diff options
| author | Thomas Tanner <trtanner@btinternet.com> | 2015-11-01 18:27:34 +0000 |
|---|---|---|
| committer | Thomas Tanner <trtanner@btinternet.com> | 2015-11-01 18:27:34 +0000 |
| commit | 184cff8a7731c83f049dedb0f8e20d91c36e77a3 (patch) | |
| tree | c20a2b3e0994ba613314d7ddce14aba08ffd9801 /src/gameinfoimpl.cpp | |
| parent | dfdf80417e6b4a6b1a353810ba473aa70e0c9abd (diff) | |
Add support for version dependency checks
Diffstat (limited to 'src/gameinfoimpl.cpp')
| -rw-r--r-- | src/gameinfoimpl.cpp | 51 |
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());
+}
|
