CMake/Source/cmVisualStudioWCEPlatformParser.cxx
Patrick Gansterer 6fe4fcba78 VS: Add parser for WCE.VCPlatform.config to read WinCE platforms
Parse the WCE.VCPlatform.config file, which contains the installed
WindowsCE SDKs in XML format, and add possibility to generate
Visual Studio generators for them.
2012-11-27 08:31:17 -05:00

140 lines
3.4 KiB
C++

/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2012 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmVisualStudioWCEPlatformParser.h"
#include "cmGlobalVisualStudioGenerator.h"
#include "cmXMLParser.h"
int cmVisualStudioWCEPlatformParser::ParseVersion(const char* version)
{
std::string vskey = cmGlobalVisualStudioGenerator::GetRegistryBase(version);
vskey += "\\Setup\\VS;ProductDir";
std::string vsInstallPath;
if(!cmSystemTools::ReadRegistryValue(vskey.c_str(), vsInstallPath))
{
return 0;
}
cmSystemTools::ConvertToUnixSlashes(vsInstallPath);
const std::string configFilename =
vsInstallPath + "/VC/vcpackages/WCE.VCPlatform.config";
return this->ParseFile(configFilename.c_str());
}
std::string cmVisualStudioWCEPlatformParser::GetOSVersion() const
{
if (this->OSMinorVersion.empty())
{
return OSMajorVersion;
}
return OSMajorVersion + "." + OSMinorVersion;
}
const char* cmVisualStudioWCEPlatformParser::GetArchitectureFamily() const
{
std::map<std::string, std::string>::const_iterator it =
this->Macros.find("ARCHFAM");
if (it != this->Macros.end())
{
return it->second.c_str();
}
return 0;
}
void cmVisualStudioWCEPlatformParser::StartElement(const char* name,
const char** attributes)
{
if(this->FoundRequiredName)
{
return;
}
this->CharacterData = "";
if(strcmp(name, "PlatformData") == 0)
{
this->PlatformName = "";
this->OSMajorVersion = "";
this->OSMinorVersion = "";
this->Macros.clear();
}
if(strcmp(name, "Macro") == 0)
{
std::string macroName;
std::string macroValue;
for(const char** attr = attributes; *attr; attr += 2)
{
if(strcmp(attr[0], "Name") == 0)
{
macroName = attr[1];
}
else if(strcmp(attr[0], "Value") == 0)
{
macroValue = attr[1];
}
}
if(!macroName.empty())
{
this->Macros[macroName] = macroValue;
}
}
}
void cmVisualStudioWCEPlatformParser::EndElement(const char* name)
{
if(!this->RequiredName)
{
if(strcmp(name, "PlatformName") == 0)
{
this->AvailablePlatforms.push_back(this->CharacterData);
}
return;
}
if(this->FoundRequiredName)
{
return;
}
if(strcmp(name, "PlatformName") == 0)
{
this->PlatformName = this->CharacterData;
}
else if(strcmp(name, "OSMajorVersion") == 0)
{
this->OSMajorVersion = this->CharacterData;
}
else if(strcmp(name, "OSMinorVersion") == 0)
{
this->OSMinorVersion = this->CharacterData;
}
else if(strcmp(name, "Platform") == 0)
{
if(this->PlatformName == this->RequiredName)
{
this->FoundRequiredName = true;
}
}
}
void cmVisualStudioWCEPlatformParser::CharacterDataHandler(const char* data,
int length)
{
this->CharacterData.append(data, length);
}