summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BCT/BCT.sln14
-rw-r--r--BCT/BytecodeTranslator/BytecodeTranslator.csproj4
-rw-r--r--BCT/BytecodeTranslator/Program.cs9
-rw-r--r--BCT/BytecodeTranslator/Sink.cs9
-rw-r--r--BCT/PhoneControlsExtractor/PhoneControlsExtractor.py20
-rw-r--r--BCT/RegressionTests/TranslationTest/UnitTest0.cs2
-rw-r--r--BCT/TranslationPlugins/PhoneControlsPlugin.cs205
-rw-r--r--BCT/TranslationPlugins/Properties/AssemblyInfo.cs36
-rw-r--r--BCT/TranslationPlugins/TranslationPlugin.cs10
-rw-r--r--BCT/TranslationPlugins/TranslationPlugins.csproj55
10 files changed, 350 insertions, 14 deletions
diff --git a/BCT/BCT.sln b/BCT/BCT.sln
index c822a0bb..308706e2 100644
--- a/BCT/BCT.sln
+++ b/BCT/BCT.sln
@@ -42,6 +42,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContractExtractor", "..\..\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Contracts", "..\..\CCICodePlex\Ast\Metadata\Sources\Microsoft.Contracts\Microsoft.Contracts.csproj", "{B114E5FF-F2A2-4BE7-8AF1-936FC87030F0}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TranslationPlugins", "TranslationPlugins\TranslationPlugins.csproj", "{8C242D42-9714-440F-884D-F64F09E78C7B}"
+EndProject
Global
GlobalSection(TestCaseManagementSettings) = postSolution
CategoryFile = BCT.vsmdi
@@ -247,6 +249,18 @@ Global
{B114E5FF-F2A2-4BE7-8AF1-936FC87030F0}.NightlyRelease|Any CPU.Build.0 = Release|Any CPU
{B114E5FF-F2A2-4BE7-8AF1-936FC87030F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B114E5FF-F2A2-4BE7-8AF1-936FC87030F0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.CompilerOnly|Any CPU.ActiveCfg = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.CompilerOnly|Any CPU.Build.0 = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.FastpathSim|Any CPU.ActiveCfg = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.FastpathSim|Any CPU.Build.0 = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.NightlyDebug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.NightlyDebug|Any CPU.Build.0 = Debug|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.NightlyRelease|Any CPU.ActiveCfg = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.NightlyRelease|Any CPU.Build.0 = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C242D42-9714-440F-884D-F64F09E78C7B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/BCT/BytecodeTranslator/BytecodeTranslator.csproj b/BCT/BytecodeTranslator/BytecodeTranslator.csproj
index e4575480..51729cce 100644
--- a/BCT/BytecodeTranslator/BytecodeTranslator.csproj
+++ b/BCT/BytecodeTranslator/BytecodeTranslator.csproj
@@ -179,6 +179,10 @@
<Project>{319E150C-8F33-49E7-81CA-30F02F9BA90A}</Project>
<Name>MutableCodeModel</Name>
</ProjectReference>
+ <ProjectReference Include="..\TranslationPlugins\TranslationPlugins.csproj">
+ <Project>{8C242D42-9714-440F-884D-F64F09E78C7B}</Project>
+ <Name>TranslationPlugins</Name>
+ </ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
diff --git a/BCT/BytecodeTranslator/Program.cs b/BCT/BytecodeTranslator/Program.cs
index cb0836f2..b6812a61 100644
--- a/BCT/BytecodeTranslator/Program.cs
+++ b/BCT/BytecodeTranslator/Program.cs
@@ -41,6 +41,9 @@ namespace BytecodeTranslator {
[OptionDescription("Stub assembly", ShortForm = "s")]
public List<string>/*?*/ stub = null;
+ [OptionDescription("Phone translation controls configuration")]
+ public string phoneControls = null;
+
}
public class BCT {
@@ -91,7 +94,7 @@ namespace BytecodeTranslator {
return 1;
}
- result = TranslateAssembly(assemblyNames, heap, options.libpaths, options.wholeProgram, options.stub);
+ result = TranslateAssembly(assemblyNames, heap, options.libpaths, options.wholeProgram, options.stub, options.phoneControls);
} catch (Exception e) { // swallow everything and just return an error code
Console.WriteLine("The byte-code translator failed: {0}", e.Message);
@@ -101,7 +104,7 @@ namespace BytecodeTranslator {
return result;
}
- public static int TranslateAssembly(List<string> assemblyNames, HeapFactory heapFactory, List<string>/*?*/ libPaths, bool wholeProgram, List<string>/*?*/ stubAssemblies) {
+ public static int TranslateAssembly(List<string> assemblyNames, HeapFactory heapFactory, List<string>/*?*/ libPaths, bool wholeProgram, List<string>/*?*/ stubAssemblies, string phoneControlsConfigFile) {
Contract.Requires(assemblyNames != null);
Contract.Requires(heapFactory != null);
@@ -177,7 +180,7 @@ namespace BytecodeTranslator {
else
traverserFactory = new CLRSemantics();
- var sink = new Sink(host, traverserFactory, heapFactory);
+ var sink = new Sink(host, traverserFactory, heapFactory, phoneControlsConfigFile);
TranslationHelper.tmpVarCounter = 0;
MetadataTraverser translator = traverserFactory.MakeMetadataTraverser(sink, contractExtractors, pdbReaders);
diff --git a/BCT/BytecodeTranslator/Sink.cs b/BCT/BytecodeTranslator/Sink.cs
index 1f57e07d..4633831d 100644
--- a/BCT/BytecodeTranslator/Sink.cs
+++ b/BCT/BytecodeTranslator/Sink.cs
@@ -22,11 +22,20 @@ namespace BytecodeTranslator {
public class Sink {
+ private TranslationPlugins.PhoneControlsPlugin phonePlugin;
+
public TraverserFactory Factory {
get { return this.factory; }
}
readonly TraverserFactory factory;
+ public Sink(IContractAwareHost host, TraverserFactory factory, HeapFactory heapFactory, string phoneControlsConfigFile)
+ : this(host, factory, heapFactory) {
+ // TODO I'm loading the config file here, it would be best to create the sink and then register callback plugins from outside
+
+ phonePlugin = new TranslationPlugins.PhoneControlsPlugin(phoneControlsConfigFile);
+ }
+
public Sink(IContractAwareHost host, TraverserFactory factory, HeapFactory heapFactory) {
Contract.Requires(host != null);
Contract.Requires(factory != null);
diff --git a/BCT/PhoneControlsExtractor/PhoneControlsExtractor.py b/BCT/PhoneControlsExtractor/PhoneControlsExtractor.py
index 4686e574..46f5aaf7 100644
--- a/BCT/PhoneControlsExtractor/PhoneControlsExtractor.py
+++ b/BCT/PhoneControlsExtractor/PhoneControlsExtractor.py
@@ -53,7 +53,7 @@ def getControlNodes(xmlNode):
return controlNodes
-def addControlToMap(parentPage, controlNode):
+def addControlToMap(pageXAML, parentPage, controlNode):
pageControls=[]
newControl={}
try:
@@ -77,32 +77,33 @@ def addControlToMap(parentPage, controlNode):
newControl["Click"] = controlNode.getAttribute("Click")
newControl["Checked"] = controlNode.getAttribute("Checked")
newControl["Unchecked"] = controlNode.getAttribute("Unchecked")
+ newControl["XAML"]= pageXAML
pageControls.append(newControl)
staticControlsMap[parentPage]= pageControls
-def extractPhoneControlsFromPage(pageFile):
+def extractPhoneControlsFromPage(pageXAML):
# maybe it is not a page file
+ pageFile= open(pageXAML, "r")
if not isPageFile(pageFile):
return
-
pageFileXML= minidom.parse(pageFile)
+ pageFile.close()
removeBlankElements(pageFileXML)
controls= getControlNodes(pageFileXML)
for control in controls:
ownerPage=""
parent= control
while not parent == None:
- a=""
if parent.localName == "PhoneApplicationPage":
ownerPage= parent.getAttribute("x:Class")
parent= parent.parentNode
- addControlToMap(ownerPage, control)
+ addControlToMap(pageXAML, ownerPage, control)
def outputPhoneControls(outputFileName):
outputFile= open(outputFileName, "w")
# Output format is one line per
- # <pageClassName>,<controlClassName>,<controlName (as in field name)>,<IsEnabledValue>,<VisibilityValue>,<ClickValue>,<CheckedValue>,<UncheckedValue>#
+ # <pageClassName>,<page.xaml file>,<controlClassName>,<controlName (as in field name)>,<IsEnabledValue>,<VisibilityValue>,<ClickValue>,<CheckedValue>,<UncheckedValue>
for page in staticControlsMap.keys():
for control in staticControlsMap[page]:
isEnabled= control["IsEnabled"]
@@ -110,7 +111,8 @@ def outputPhoneControls(outputFileName):
click= control["Click"]
checked= control["Checked"]
unchecked= control["Unchecked"]
- outputFile.write(page + "," + control["Type"] + "," + control["Name"] + "," + isEnabled + "," + visibility + "," + click + "," + checked + "," + unchecked + "#\n")
+ pageXAML= control["XAML"]
+ outputFile.write(page + "," + os.path.basename(pageXAML) + "," + control["Type"] + "," + control["Name"] + "," + isEnabled + "," + visibility + "," + click + "," + checked + "," + unchecked + "\n")
outputFile.close()
@@ -118,9 +120,7 @@ def extractPhoneControls(sourceDir):
fileList= [os.path.normcase(fileName) for fileName in os.listdir(sourceDir)]
fileList= [os.path.join(sourceDir, fileName) for fileName in fileList if os.path.splitext(fileName)[1] == ".xaml"]
for fileName in fileList:
- pageFile= open(fileName, "r")
- extractPhoneControlsFromPage(pageFile)
- pageFile.close()
+ extractPhoneControlsFromPage(fileName)
# TODO dump controls into a config file that can be passed to BCT
diff --git a/BCT/RegressionTests/TranslationTest/UnitTest0.cs b/BCT/RegressionTests/TranslationTest/UnitTest0.cs
index 99b6e680..94fdcba8 100644
--- a/BCT/RegressionTests/TranslationTest/UnitTest0.cs
+++ b/BCT/RegressionTests/TranslationTest/UnitTest0.cs
@@ -61,7 +61,7 @@ namespace TranslationTest {
#endregion
private string ExecuteTest(string assemblyName, HeapFactory heapFactory) {
- BCT.TranslateAssembly(new List<string>{assemblyName}, heapFactory, null, false, null);
+ BCT.TranslateAssembly(new List<string>{assemblyName}, heapFactory, null, false, null, null);
var fileName = Path.ChangeExtension(assemblyName, "bpl");
var s = File.ReadAllText(fileName);
return s;
diff --git a/BCT/TranslationPlugins/PhoneControlsPlugin.cs b/BCT/TranslationPlugins/PhoneControlsPlugin.cs
new file mode 100644
index 00000000..d63b6489
--- /dev/null
+++ b/BCT/TranslationPlugins/PhoneControlsPlugin.cs
@@ -0,0 +1,205 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+
+namespace TranslationPlugins {
+ public enum Visibility { Visible, Collapsed };
+
+ public enum Event { Click, Checked, Unchecked };
+
+ public class HandlerSignature {
+ public static string[] getParameterTypesForHandler(Event controlEvent) {
+ switch (controlEvent) {
+ case Event.Checked:
+ case Event.Unchecked:
+ case Event.Click:
+ return new string[] { "object", "System.WindowsRoutedventArgs" };
+ default:
+ throw new NotImplementedException("Handlers for event: " + controlEvent + " not supported yet");
+ }
+ }
+ // TODO it would be nice to be dynamic on handler names and parameters
+ // TODO for now you just have to know the handler signature for each event at load time, and for now we only handle a handful of default control events
+ public string Name;
+ public string[] ParameterTypes;
+ }
+
+ class ControlInfoStructure {
+ public string Name;
+ public string ClassName;
+ public bool IsEnabled;
+ public Visibility Visible;
+ private IDictionary<Event, IList<HandlerSignature>> handlers;
+
+ public ControlInfoStructure() {
+ handlers = new Dictionary<Event, IList<HandlerSignature>>();
+ }
+
+ public void setHandler(Event p, string handler) {
+ IList<HandlerSignature> eventHandlers;
+ try {
+ eventHandlers = handlers[p];
+ } catch (KeyNotFoundException) {
+ eventHandlers= new List<HandlerSignature>();
+ }
+
+ HandlerSignature newHandler= new HandlerSignature();
+ newHandler.Name= handler;
+ newHandler.ParameterTypes= HandlerSignature.getParameterTypesForHandler(p);
+ eventHandlers.Add(newHandler);
+ }
+
+ public IList<HandlerSignature> getHandlers(Event p) {
+ try {
+ return handlers[p];
+ } catch (KeyNotFoundException) {
+ return new List<HandlerSignature>();
+ }
+ }
+ }
+
+ class PageStructure {
+ public PageStructure() {
+ controlsInfo = new Dictionary<string, ControlInfoStructure>();
+ }
+
+ public string PageClassName;
+ public string PageXAML;
+
+ private IDictionary<string, ControlInfoStructure> controlsInfo;
+ public ControlInfoStructure getControlInfo(string controlName) {
+ try {
+ return controlsInfo[controlName];
+ } catch (KeyNotFoundException) {
+ return null;
+ }
+ }
+
+ public void setControlInfo(string controlName, ControlInfoStructure controlInfo) {
+ controlsInfo[controlName] = controlInfo;
+ }
+ }
+
+ public class PhoneControlsPlugin : TranslationPlugin {
+ // TODO this will probably need a complete rewrite once it is event based, and make it more push than pull
+ // TODO but it doesn't make sense right now to make it BCT or CCI aware
+ private static int CONFIG_LINE_FIELDS= 9;
+ private static int PAGE_CLASS_FIELD= 0;
+ private static int PAGE_XAML_FIELD= 1;
+ private static int CONTROL_CLASS_FIELD= 2;
+ private static int CONTROL_NAME_FIELD= 3;
+ private static int ENABLED_FIELD= 4;
+ private static int VISIBILITY_FIELD= 5;
+ private static int CLICK_HANDLER_FIELD= 6;
+ private static int CHECKED_HANDLER_FIELD= 7;
+ private static int UNCHECKED_HANDLER_FIELD = 8;
+
+ private IDictionary<string, PageStructure> pageStructureInfo;
+
+ public PhoneControlsPlugin(string configFile) {
+ pageStructureInfo = new Dictionary<string, PageStructure>();
+ StreamReader fileStream = null;
+ try {
+ fileStream = new StreamReader(configFile);
+ } catch (Exception e) {
+ if (e is DirectoryNotFoundException || e is FileNotFoundException || e is IOException) {
+ // TODO log, I don't want to terminate BCT because of this
+ } else if (e is ArgumentException || e is ArgumentNullException) {
+ // TODO log, I don't want to terminate BCT because of this
+ } else {
+ throw;
+ }
+ }
+
+ LoadControlStructure(fileStream);
+
+ if (fileStream != null)
+ fileStream.Close();
+ }
+
+ private void LoadControlStructure(StreamReader configStream) {
+ // TODO it would be nice to have some kind of dynamic definition of config format
+ // TODO for now remember that config format is CSV
+ // TODO each line is <pageClassName>,<pageXAMLPath>,<controlClassName>,<controlName>,<IsEnabledValue>,<VisibilityValue>,<ClickValue>,<CheckedValue>,<UncheckedValue>
+ // TODO check PhoneControlsExtractor.py
+
+ // TODO the page.xaml value is saved with no directory information: if two pages exist with same name but different directories it will treat them as the same
+ // TODO I'm not handling this for now, and I won't be handling relative/absolute URI either for now
+
+ try {
+ string pageClass, pageXAML, controlClass, controlName, enabled, visibility, clickHandler, checkedHandler, uncheckedHandler;
+ string configLine = configStream.ReadLine();
+ string[] inputLine;
+ PageStructure pageStr;
+ ControlInfoStructure controlInfoStr;
+
+ while (configLine != null) {
+ inputLine = configLine.Split(',');
+
+ if (inputLine.Length != CONFIG_LINE_FIELDS)
+ throw new ArgumentException("Config input line contains wrong number of fields: " + inputLine.Length + ", expected " + CONFIG_LINE_FIELDS);
+
+ pageClass = inputLine[PAGE_CLASS_FIELD];
+ pageXAML = inputLine[PAGE_XAML_FIELD];
+ controlClass = inputLine[CONTROL_CLASS_FIELD];
+ controlName = inputLine[CONTROL_NAME_FIELD];
+ enabled = inputLine[ENABLED_FIELD];
+ visibility = inputLine[VISIBILITY_FIELD];
+ clickHandler = inputLine[CLICK_HANDLER_FIELD];
+ checkedHandler = inputLine[CHECKED_HANDLER_FIELD];
+ uncheckedHandler = inputLine[UNCHECKED_HANDLER_FIELD];
+
+ try {
+ pageStr = pageStructureInfo[pageClass];
+ } catch (KeyNotFoundException) {
+ pageStr = new PageStructure();
+ pageStr.PageClassName = pageClass;
+ pageStr.PageXAML = pageXAML;
+ }
+
+ controlInfoStr= pageStr.getControlInfo(controlName);
+ if (controlInfoStr == null) {
+ controlInfoStr = new ControlInfoStructure();
+ controlInfoStr.Name = controlName;
+ controlInfoStr.ClassName = controlClass;
+ }
+ controlInfoStr.IsEnabled = Boolean.Parse(enabled);
+ controlInfoStr.Visible = visibility == "Collapsed" ? Visibility.Collapsed : Visibility.Visible;
+ controlInfoStr.setHandler(Event.Click, clickHandler);
+ controlInfoStr.setHandler(Event.Checked, checkedHandler);
+ controlInfoStr.setHandler(Event.Unchecked, uncheckedHandler);
+
+ pageStr.setControlInfo(controlName, controlInfoStr);
+ configLine = configStream.ReadLine();
+
+ }
+ } catch (Exception) {
+ // TODO log, I don't want to terminate BCT because of this
+ }
+ }
+
+ public void getControlsForPage(string pageClass) {
+ }
+
+ public string getXAMLForPage(string pageClass) {
+ return pageStructureInfo[pageClass].PageXAML;
+ }
+
+ public bool getIsEnabled(string pageClass, string controlName) {
+ return pageStructureInfo[pageClass].getControlInfo(controlName).IsEnabled;
+ }
+
+ public Visibility getVisibility(string pageClass, string controlName) {
+ return pageStructureInfo[pageClass].getControlInfo(controlName).Visible;
+ }
+
+ public IList<HandlerSignature> getHandlers(string pageClass, string controlName, string eventName) {
+ if (eventName != "Checked" && eventName != "Unchecked" && eventName != "Click")
+ throw new NotImplementedException("Event " + eventName + " is not translated or defined for control " + controlName + " in page " + pageClass);
+
+ return pageStructureInfo[pageClass].getControlInfo(controlName).getHandlers((Event) Event.Parse(typeof(Event), eventName));
+ }
+ }
+}
diff --git a/BCT/TranslationPlugins/Properties/AssemblyInfo.cs b/BCT/TranslationPlugins/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..8158eb08
--- /dev/null
+++ b/BCT/TranslationPlugins/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("TranslationPlugins")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("TranslationPlugins")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c26f68f2-14fb-4a47-8707-b7de569865cc")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/BCT/TranslationPlugins/TranslationPlugin.cs b/BCT/TranslationPlugins/TranslationPlugin.cs
new file mode 100644
index 00000000..e8907a09
--- /dev/null
+++ b/BCT/TranslationPlugins/TranslationPlugin.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace TranslationPlugins {
+ public class TranslationPlugin {
+ // TODO ideally these should really work as plugins, possibly registering as callbacks to some BCT events.
+ }
+}
diff --git a/BCT/TranslationPlugins/TranslationPlugins.csproj b/BCT/TranslationPlugins/TranslationPlugins.csproj
new file mode 100644
index 00000000..9a27e949
--- /dev/null
+++ b/BCT/TranslationPlugins/TranslationPlugins.csproj
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{8C242D42-9714-440F-884D-F64F09E78C7B}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>TranslationPlugins</RootNamespace>
+ <AssemblyName>TranslationPlugins</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="PhoneControlsPlugin.cs" />
+ <Compile Include="TranslationPlugin.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file