// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:meta/meta.dart'; import 'package:xml/xml.dart' as xml; import '../base/file_system.dart'; /// A utility class for interacting with Visual Studio project files (e.g., /// .vcxproj). class VisualStudioProject { /// Creates a project object from the project file at [file]. VisualStudioProject(this.file, { @required FileSystem fileSystem, }): _fileSystem = fileSystem { try { content = xml.parse(file.readAsStringSync()); } on xml.XmlParserException { // Silently continue; formatUnderstood will return false. } } final FileSystem _fileSystem; /// The file corresponding to this object. final File file; /// The content of the project file. xml.XmlDocument content; /// Whether or not the project file was correctly parsed. /// /// If false, this could indicate that the project file is damaged, or that /// it's an unsupported project type. bool get formatUnderstood => content != null; String _guid; /// Returns the ProjectGuid for the project, or null if it's not present. String get guid { return _guid ??= _findGuid(); } String _findGuid() { if (!formatUnderstood) { return null; } try { final String guidValue = content.findAllElements('ProjectGuid').single.text.trim(); // Remove the enclosing {} from the value. return guidValue.substring(1, guidValue.length - 1); } on StateError { // If there is not exactly one ProjectGuid, return null. return null; } } String _name; /// Returns the ProjectName for the project. /// /// If not explicitly set in the project, uses the basename of the project /// file. String get name { return _name ??= _findName(); } String _findName() { if (!formatUnderstood) { return null; } try { return content.findAllElements('ProjectName').first.text.trim(); } on StateError { // If there is no name, fall back to filename. return _fileSystem.path.basenameWithoutExtension(file.path); } } }