xref: /minix3/external/bsd/bind/dist/bin/win32/BINDInstall/VersionInfo.cpp (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1 // VersionInfo.cpp: implementation of the CVersionInfo class.
2 //
3 //////////////////////////////////////////////////////////////////////
4 
5 #include "stdafx.h"
6 #include "bindinstall.h"
7 #include "VersionInfo.h"
8 #include <winver.h>
9 
10 #ifdef _DEBUG
11 #undef THIS_FILE
12 static char THIS_FILE[]=__FILE__;
13 #define new DEBUG_NEW
14 #endif
15 
16 //////////////////////////////////////////////////////////////////////
17 // Construction/Destruction
18 //////////////////////////////////////////////////////////////////////
19 
CVersionInfo(CString filename)20 CVersionInfo::CVersionInfo(CString filename)
21 {
22 	HANDLE hFile;
23 	WIN32_FIND_DATA fd;
24 	memset(&fd, 0, sizeof(WIN32_FIND_DATA));
25 
26 	m_status = ERROR_SUCCESS;
27 	m_isValid = FALSE;
28 	m_filename = filename;
29 
30 	// See if the given file exists
31 	hFile = FindFirstFile(filename, &fd);
32 	if(hFile == INVALID_HANDLE_VALUE)
33 	{
34 		m_status = ERROR_FILE_NOT_FOUND;
35 		m_versionInfo = NULL;
36 		return;
37 	}
38 	FindClose(hFile);
39 
40 	// Extract the file info
41 	DWORD handle;
42 	DWORD viSize = GetFileVersionInfoSize((LPTSTR)(LPCTSTR)filename, &handle);
43 	m_versionInfo = NULL;
44 
45 	if(viSize == 0)
46 	{
47 		m_status = GetLastError();
48 	}
49 	else
50 	{
51 		m_versionInfo = new char[viSize];
52 
53 		// Get the block of version info from the file
54 		if(!GetFileVersionInfo((LPTSTR)(LPCTSTR)filename, handle, viSize, m_versionInfo))
55 		{
56 			if(m_versionInfo)
57 			{
58 				delete [] m_versionInfo;
59 				m_versionInfo = NULL;
60 			}
61 			return;
62 		}
63 
64 		// Now extract the sub block we are interested in
65 		UINT versionLen = 0;
66 		LPVOID viBlob = NULL;
67 		if(!VerQueryValue(m_versionInfo, "\\", &viBlob, &versionLen))
68 		{
69 			if(m_versionInfo)
70 			{
71 				delete [] m_versionInfo;
72 				m_versionInfo = NULL;
73 			}
74 			return;
75 		}
76 
77 		// And finally the version info is ours
78 		m_fixedInfo = (VS_FIXEDFILEINFO *)viBlob;
79 
80 		UINT blobLen = 0;
81 
82 		// If we got here, all is good
83 	}
84 	m_isValid = TRUE;
85 }
86 
~CVersionInfo()87 CVersionInfo::~CVersionInfo()
88 {
89 	m_fixedInfo = NULL;
90 	if(m_versionInfo)
91 	{
92 		delete [] m_versionInfo;
93 		m_versionInfo = NULL;
94 	}
95 }
96 
GetFileVersionString()97 CString CVersionInfo::GetFileVersionString()
98 {
99 	return(QueryStringValue("FileVersion"));
100 }
101 
GetProductVersionString()102 CString CVersionInfo::GetProductVersionString()
103 {
104 	return(QueryStringValue("ProductVersion"));
105 }
106 
GetComments()107 CString CVersionInfo::GetComments()
108 {
109 	return(QueryStringValue("Comments"));
110 }
111 
GetFileDescription()112 CString CVersionInfo::GetFileDescription()
113 {
114 	return(QueryStringValue("FileDescription"));
115 }
116 
GetInternalName()117 CString CVersionInfo::GetInternalName()
118 {
119 	return(QueryStringValue("InternalName"));
120 }
121 
GetLegalCopyright()122 CString CVersionInfo::GetLegalCopyright()
123 {
124 	return(QueryStringValue("LegalCopyright"));
125 }
126 
GetLegalTrademarks()127 CString CVersionInfo::GetLegalTrademarks()
128 {
129 	return(QueryStringValue("LegalTrademarks"));
130 }
131 
GetOriginalFileName()132 CString CVersionInfo::GetOriginalFileName()
133 {
134 	return(QueryStringValue("OriginalFilename"));
135 }
136 
GetProductName()137 CString CVersionInfo::GetProductName()
138 {
139 	return(QueryStringValue("ProductName"));
140 }
141 
GetSpecialBuildString()142 CString CVersionInfo::GetSpecialBuildString()
143 {
144 	return(QueryStringValue("SpecialBuild"));
145 }
146 
GetPrivateBuildString()147 CString CVersionInfo::GetPrivateBuildString()
148 {
149 	return(QueryStringValue("PrivateBuild"));
150 }
151 
GetCompanyName()152 CString CVersionInfo::GetCompanyName()
153 {
154 	return(QueryStringValue("CompanyName"));
155 }
156 
157 #ifdef NOTUSED
CopyFileCheckVersion(CVersionInfo & originalFile)158 BOOL CVersionInfo::CopyFileCheckVersion(CVersionInfo &originalFile)
159 {
160 	_int64 myVer = GetFileVersion();
161 	_int64 origVer = originalFile.GetFileVersion();
162 
163 	if(origVer > myVer)
164 	{
165 		CString msg;
166 		msg.Format(IDS_EXISTING_NEWER, m_filename);
167 		DWORD query = AfxMessageBox(msg, MB_YESNO);
168 		if(query == IDNO)
169 			return(TRUE);
170 	}
171 
172 	return(CopyFileNoVersion(originalFile));
173 }
174 #endif
175 
CopyFileNoVersion(CVersionInfo & originalFile)176 BOOL CVersionInfo::CopyFileNoVersion(CVersionInfo &originalFile)
177 {
178 	int x = 7;
179 	return(CopyFile(originalFile.GetFilename(), m_filename, FALSE));
180 }
181 
182 
GetFileVersion()183 _int64 CVersionInfo::GetFileVersion()
184 {
185 	_int64 ver = 0;
186 
187 	if(m_versionInfo)
188 	{
189 		ver = m_fixedInfo->dwFileVersionMS;
190 		ver <<= 32;
191 		ver += m_fixedInfo->dwFileVersionLS;
192 	}
193 	return(ver);
194 }
195 
GetProductVersion()196 _int64 CVersionInfo::GetProductVersion()
197 {
198 	_int64 ver = 0;
199 
200 	if(m_versionInfo)
201 	{
202 		ver = m_fixedInfo->dwProductVersionMS;
203 		ver <<= 32;
204 		ver += m_fixedInfo->dwProductVersionLS;
205 	}
206 	return(ver);
207 }
208 
GetFileDate()209 _int64 CVersionInfo::GetFileDate()
210 {
211 	_int64 fDate = 0;
212 
213 	if(m_versionInfo)
214 	{
215 		fDate = m_fixedInfo->dwFileDateMS;
216 		fDate <<= 32;
217 		fDate += m_fixedInfo->dwFileDateLS;
218 	}
219 	return(fDate);
220 }
221 
GetFileFlagMask()222 DWORD CVersionInfo::GetFileFlagMask()
223 {
224 	if(m_versionInfo)
225 	{
226 		return(m_fixedInfo->dwFileFlagsMask);
227 	}
228 	return(0);
229 }
230 
GetFileFlags()231 DWORD CVersionInfo::GetFileFlags()
232 {
233 	if(m_versionInfo)
234 	{
235 		return(m_fixedInfo->dwFileFlags);
236 	}
237 	return(0);
238 }
239 
GetFileOS()240 DWORD CVersionInfo::GetFileOS()
241 {
242 	if(m_versionInfo)
243 	{
244 		return(m_fixedInfo->dwFileOS);
245 	}
246 	return(VOS_UNKNOWN);
247 }
248 
GetFileType()249 DWORD CVersionInfo::GetFileType()
250 {
251 	if(m_versionInfo)
252 	{
253 		return(m_fixedInfo->dwFileType);
254 	}
255 	return(VFT_UNKNOWN);
256 }
257 
GetFileSubType()258 DWORD CVersionInfo::GetFileSubType()
259 {
260 	if(m_versionInfo)
261 	{
262 		return(m_fixedInfo->dwFileSubtype);
263 	}
264 	return(VFT2_UNKNOWN);
265 }
266 
QueryStringValue(CString value)267 CString CVersionInfo::QueryStringValue(CString value)
268 {
269 	UINT blobLen = 0;
270 	LPVOID viBlob = NULL;
271 
272 	if(m_versionInfo)
273 	{
274 		char queryString[256];
275 
276 		// This code page value is for American English.  If you change the resources to be other than that
277 		// You probably should change this to match it.
278 		DWORD codePage = 0x040904B0;
279 
280 		sprintf(queryString, "\\StringFileInfo\\%08X\\%s", codePage, value);
281 
282 		if(VerQueryValue(m_versionInfo, queryString, &viBlob, &blobLen))
283 			return((char *)viBlob);
284 	}
285 	return("Not Available");
286 }
287