code_app/tools/hgsetver/hgsetver.cpp

223 lines
4.9 KiB
C++

// hgsetver.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <Windows.h>
#include <string>
static bool isLeap(int year)
{
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
return true;
return false;
}
static int getDays(int year, int month)
{
if (2 == month)
{
if (isLeap(year))
return 29;
else
return 28;
}
if (4 == month || 6 == month || 9 == month || 11 == month)
{
return 30;
}
return 31;
}
static int getPatchVersion()
{
SYSTEMTIME st;
GetLocalTime(&st);
int year = st.wYear;
int day = st.wDay;
int month = st.wMonth;
int ret = year % 100;
ret *= 1000;
for (int i = 1; i < month; ++i)
{
ret += getDays(year, i);
}
ret += day;
return ret;
}
int main(int argc, char* argv[])
{
std::string brandFile;
std::string resourceFile;
std::string oemName = "OEM_HUAGAO";
std::string cpu = "x86";
for (int i = 1; i < argc; i++)
{
char* z = argv[i];
if (z == strstr(z, "-brandFile="))
brandFile = z + strlen("-brandFile=");
else if (z == strstr(z, "-resourceFile="))
resourceFile = z + strlen("-resourceFile=");
else if (z == strstr(z, "-oemName="))
oemName = z + strlen("-oemName=");
else if (z == strstr(z, "-cpu="))
cpu = z + strlen("-cpu=");
}
printf("brandFile:%s\n", brandFile.c_str());
printf("resourceFile:%s\n", resourceFile.c_str());
printf("oemName:%s\n", oemName.c_str());
printf("cpu:%s\n", cpu.c_str());
if (brandFile.empty() || resourceFile.empty())
{
return -1;
}
int mainVersion = 0;
int subVersion = 0;
int buildVersion = 0;
int patchVersion = 0;
FILE* fp = fopen(brandFile.c_str(), "r");
if (fp != NULL)
{
while (feof(fp) == 0)
{
char lineContent[2048] = { 0 };
if (NULL == fgets(lineContent, 2048, fp))
{
continue;
}
if (0 == mainVersion)
{
char* p = strstr(lineContent, "VERSION_MAIN");
if (NULL != p)
{
p += strlen("VERSION_MAIN");
while (isspace(*p))
++p;
mainVersion = atoi(p);
}
}
if (0 == subVersion)
{
char *p = strstr(lineContent, "VERSION_SUB");
if (NULL != p)
{
p += strlen("VERSION_SUB");
while (isspace(*p))
++p;
subVersion = atoi(p);
}
}
if (0 != mainVersion && 0 != subVersion)
{
break;
}
}
fclose(fp);
}
if (oemName == "OEM_LISICHENG")
buildVersion = 14;
else if (oemName == "OEM_HANWANG")
buildVersion = 16;
else if (oemName == "OEM_CANGTIAN")
buildVersion = 18;
else if (oemName == "OEM_ZHONGJING")
buildVersion = 20;
else if (oemName == "OEM_ZIGUANG")
buildVersion = 22;
else if (oemName == "OEM_DELI")
buildVersion = 24;
else if (oemName == "OEM_NEUTRAL")
buildVersion = 26;
else
buildVersion = 10;
buildVersion = buildVersion * 10;
if (cpu == "x64")
buildVersion += 1;
else
buildVersion += 0;
buildVersion *= 100;
patchVersion = getPatchVersion();
char version1[32] = { 0 };
sprintf(version1, "%d.%d.%d.%d", mainVersion, subVersion, buildVersion, patchVersion);
char version2[32] = { 0 };
sprintf(version2, "%d,%d,%d,%d", mainVersion, subVersion, buildVersion, patchVersion);
std::string resourceData;
fp = fopen(resourceFile.c_str(), "r");
if (NULL != fp)
{
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* buf = new char[size + 1];
fread(buf, 1, size, fp);
buf[size] = 0;
resourceData = buf;
delete [] buf;
fclose(fp);
}
if (resourceData.empty())
{
return 0;
}
size_t offset = 0;
while (1)
{
size_t pos = resourceData.find("0,0,0,0", offset);
if (std::string::npos == pos)
{
break;
}
resourceData.replace(pos, strlen("0,0,0,0"), version2);
offset = pos + strlen(version2);
}
offset = 0;
while (1)
{
size_t pos = resourceData.find("0.0.0.0", offset);
if (std::string::npos == pos)
{
break;
}
resourceData.replace(pos, strlen("0.0.0.0"), version1);
offset = pos + strlen(version1);
}
fp = fopen(resourceFile.c_str(), "w");
if (NULL != fp)
{
fwrite(&resourceData[0], 1, resourceData.size(), fp);
fclose(fp);
}
return 0;
}