/*******************************************************************************
FILE: version.cpp

*******************************************************************************/

#include "stdafx.h"
#include "version.h"

CVersionInfo::CVersionInfo(LPCSTR szFileToVersion /* = NULL*/, 
                                                   LPCSTR szLanguage /* = "0409"*/,
                                                   LPCSTR szCodepage /* = "04e4"*/)
{
        m_lpstrVffInfo = NULL;
        m_strFileName = szFileToVersion;
        m_strLanguage = szLanguage;
        m_strCodepage = szCodepage;
        m_strCompanyName = _T("");
        m_strFileDescription  = _T("");
        m_strFileVersion = _T(""); 
        m_strInternalName = _T(""); 
        m_strLegalCopyright = _T(""); 
        m_strOriginalFilename = _T(""); 
        m_strProductName = _T(""); 
        m_strProductVersion = _T(""); 
        m_strComments = _T("");
        m_strSpecialBuild = _T("");
        m_strPrivateBuild = _T("");
        m_bQueryDone=FALSE;
}

CString CVersionInfo::GetFileVersion()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strFileVersion;
}

CString CVersionInfo::GetPrivateBuild()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strPrivateBuild;
}

CString CVersionInfo::GetSpecialBuild()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strSpecialBuild;
}

CString CVersionInfo::GetCompanyName()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strCompanyName;
}

CString CVersionInfo::GetFileDescription()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strFileDescription;
}

CString CVersionInfo::GetInternalName()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strInternalName;
}

CString CVersionInfo::GetLegalCopyright()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strLegalCopyright;
}

CString CVersionInfo::GetOriginalFilename()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strOriginalFilename;
}

CString CVersionInfo::GetProductVersion()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strProductVersion;
}

CString CVersionInfo::GetComments()
{
        if (!m_bQueryDone)
                GetVersionInfo();
        return m_strComments;
}

void CVersionInfo::GetVersionInfo()
{
        DWORD   dwVerInfoSize;          // Size of version information block
        DWORD   dwVerHnd=0;                     // An 'ignored' parameter, always '0'
        char szFileName[MAX_PATH];

        m_bQueryDone=TRUE;
        if (m_strFileName.IsEmpty())
                GetModuleFileName(NULL, szFileName, MAX_PATH);
        else
                lstrcpy(szFileName, m_strFileName);
        
        dwVerInfoSize = GetFileVersionInfoSize(szFileName, &dwVerHnd);
        if (dwVerInfoSize) {
                HANDLE  hMem;
                hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
                m_lpstrVffInfo  = (char *)GlobalLock(hMem);
                GetFileVersionInfo(szFileName, dwVerHnd, dwVerInfoSize, m_lpstrVffInfo);
                QueryValue("CompanyName", m_strCompanyName);
                QueryValue("FileDescription", m_strFileDescription);
                QueryValue("FileVersion", m_strFileVersion); 
                QueryValue("InternalName", m_strInternalName); 
                QueryValue("LegalCopyright", m_strLegalCopyright); 
                QueryValue("OriginalFilename", m_strOriginalFilename); 
                QueryValue("ProductName", m_strProductName); 
                QueryValue("ProductVersion", m_strProductVersion); 
                QueryValue("Comments", m_strComments);
                QueryValue("SpecialBuild", m_strSpecialBuild);
                QueryValue("PrivateBuild", m_strPrivateBuild);
                GlobalUnlock(hMem);
                GlobalFree(hMem);
        }
}

void CVersionInfo::QueryValue(LPCSTR szId, CString& s)
{
        ASSERT(m_lpstrVffInfo != NULL);
        LPSTR   lpVersion;                      // String pointer to 'version' text
        UINT    uVersionLen;
        BOOL    bRetCode;

        char szSelector[256];   
        wsprintf(szSelector,"\\StringFileInfo\\%s%s\\%s",
                        m_strLanguage, m_strCodepage, szId);
        bRetCode = VerQueryValue((LPVOID)m_lpstrVffInfo,
                TEXT(szSelector),
                (LPVOID *)&lpVersion,
                &uVersionLen);
        
        if(bRetCode)
                s = lpVersion;
        else
                s.Empty();
}



/*******************************************************************************
       END OF FILE
*******************************************************************************/