diff --git a/.gitignore b/.gitignore
index 6fba84f0..c88172d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,5 @@
.DS_Store
.idea
+bin
+obj
diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt
index 049f19e2..1038dbc4 100644
--- a/bin/test/data/log/test_log.txt
+++ b/bin/test/data/log/test_log.txt
@@ -1,4 +1,5 @@
ConfigManager.cpp WARNING: value path/to/nowhere is not present in config.
+<<<<<<< HEAD
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
@@ -151,6 +152,313 @@ ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path i
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+=======
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
+Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
+>>>>>>> updated protocol helper test suite
ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config.
Token.cpp ERROR: Location Id was not referenced by this Token.
Edge.cpp ERROR: Edge type_of can't go from Node undefined to Node undefined
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.sln b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.sln
new file mode 100644
index 00000000..d49e21df
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoatiPlugin", "CoatiPlugin\CoatiPlugin.csproj", "{A585A530-E120-4C74-934E-D57ED12A7DA9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A585A530-E120-4C74-934E-D57ED12A7DA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A585A530-E120-4C74-934E-D57ED12A7DA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A585A530-E120-4C74-934E-D57ED12A7DA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A585A530-E120-4C74-934E-D57ED12A7DA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.v11.suo b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.v11.suo
new file mode 100644
index 00000000..b8347eb6
Binary files /dev/null and b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.v11.suo differ
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj
new file mode 100644
index 00000000..f5f65bce
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj
@@ -0,0 +1,181 @@
+
+
+
+ 11.0
+ 11.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+
+
+
+ Debug
+ AnyCPU
+ 2.0
+ {A585A530-E120-4C74-934E-D57ED12A7DA9}
+ {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ SnowForest.CoatiPlugin
+ CoatiPlugin
+ True
+ Key.snk
+ v4.5
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ true
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}
+ 8
+ 0
+ 0
+ primary
+ False
+ False
+
+
+ {26AD1324-4B7C-44BC-84F8-B86AED45729F}
+ 10
+ 0
+ 0
+ primary
+ False
+ False
+
+
+ {1A31287A-4D7D-413E-8E32-3B374931BD89}
+ 8
+ 0
+ 0
+ primary
+ False
+ False
+
+
+ {2CE2370E-D744-4936-A090-3FFFE667B0E1}
+ 9
+ 0
+ 0
+ primary
+ False
+ False
+
+
+ {1CBA492E-7263-47BB-87FE-639000619B15}
+ 8
+ 0
+ 0
+ primary
+ False
+ False
+
+
+ {00020430-0000-0000-C000-000000000046}
+ 2
+ 0
+ 0
+ primary
+ False
+ False
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ true
+ VSPackage
+ Designer
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+ Menus.ctmenu
+ Designer
+
+
+
+
+
+
+
+ Always
+ true
+
+
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj.user b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj.user
new file mode 100644
index 00000000..a3001f8a
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj.user
@@ -0,0 +1,13 @@
+
+
+
+ Program
+ C:\Program Files %28x86%29\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
+ /rootsuffix Exp
+
+
+ Program
+ C:\Program Files %28x86%29\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
+ /rootsuffix Exp
+
+
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.vsct b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.vsct
new file mode 100644
index 00000000..0fc3968a
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.vsct
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPluginPackage.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPluginPackage.cs
new file mode 100644
index 00000000..c964f628
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPluginPackage.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Diagnostics;
+using System.Globalization;
+using System.Runtime.InteropServices;
+using System.ComponentModel.Design;
+using Microsoft.Win32;
+using Microsoft.VisualStudio;
+using Microsoft.VisualStudio.Shell.Interop;
+using Microsoft.VisualStudio.OLE.Interop;
+using Microsoft.VisualStudio.Shell;
+
+using System.Net.Sockets;
+using System.Net;
+using System.Text;
+using System.Threading;
+
+using EnvDTE;
+using EnvDTE80;
+
+namespace SnowForest.CoatiPlugin
+{
+ [PackageRegistration(UseManagedResourcesOnly = true)]
+ [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
+ [ProvideMenuResource("Menus.ctmenu", 1)]
+ [Guid(GuidList.guidCoatiPluginPkgString)]
+ [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.NoSolution)]
+
+ public sealed class CoatiPluginPackage : Package
+ {
+ System.Threading.Thread _serverThread = null;
+
+ public CoatiPluginPackage()
+ {}
+
+ protected override void Initialize()
+ {
+ base.Initialize();
+
+ AsynchronousSocketListener server = new AsynchronousSocketListener();
+ AsynchronousSocketListener._onReadCallback = new AsynchronousSocketListener.OnReadCallback(OnNetworkReadCallback);
+ AsynchronousSocketListener._onErrorCallback = new AsynchronousSocketListener.OnReadCallback(OnNetworkErrorCallback);
+ _serverThread = new System.Threading.Thread(server.DoWork);
+ _serverThread.Start();
+
+ AsynchronousClient._onErrorCallback = new AsynchronousSocketListener.OnReadCallback(OnNetworkErrorCallback);
+
+ FileUtility._errorCallback = new FileUtility.ErrorCallback(OnFileUtilityError);
+
+ OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
+ if ( null != mcs )
+ {
+ CommandID setActiveTokenCommandID = new CommandID(GuidList.guidCoatiPluginCmdSet, (int)PkgCmdIDList.cmdidCoatiSetActiveToken);
+ MenuCommand menuItemSetActiveToken = new MenuCommand(MenuItemCallback, setActiveTokenCommandID);
+ mcs.AddCommand(menuItemSetActiveToken);
+ }
+ }
+
+ private void MenuItemCallback(object sender, EventArgs e)
+ {
+ MenuCommand menuCommand = sender as MenuCommand;
+
+ DTE dte = (DTE)GetService(typeof(DTE));
+
+ if (menuCommand != null)
+ {
+ if (menuCommand.CommandID.ID == (int)PkgCmdIDList.cmdidCoatiSetActiveToken)
+ {
+ string fileName = FileUtility.GetActiveDocumentName(dte);
+ string filePath = FileUtility.GetActiveDocumentPath(dte);
+
+ int lineNumber = FileUtility.GetActiveLineNumber(dte);
+ int columnNumber = FileUtility.GetActiveColumnNumber(dte);
+
+ string message = NetworkProtocolUtility.createOutMessage(filePath + fileName, lineNumber, columnNumber);
+
+ AsynchronousClient.Send(message);
+ }
+ }
+ }
+
+ private void OnNetworkReadCallback(string message)
+ {
+ NetworkProtocolUtility.CursorPosition cursorPosition = NetworkProtocolUtility.parseInMessage(message);
+ if (cursorPosition.Valid)
+ {
+ DTE dte = (DTE)GetService(typeof(DTE));
+ if (FileUtility.OpenSourceFile(dte, cursorPosition.FilePath))
+ {
+ FileUtility.GoToLine(dte, cursorPosition.LineNumber, cursorPosition.ColumnNumber);
+ }
+ }
+ }
+
+ private void OnNetworkErrorCallback(string message)
+ {
+ DisplayMessage("Coati Network Error", message);
+ }
+
+ private void OnFileUtilityError(string message)
+ {
+ DisplayMessage("Coati File Error", message);
+ }
+
+ private void DisplayMessage(string title, string message)
+ {
+ IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));
+ Guid clsid = Guid.Empty;
+ int result;
+ Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(
+ 0,
+ ref clsid,
+ title,
+ message,
+ string.Empty,
+ 0,
+ OLEMSGBUTTON.OLEMSGBUTTON_OK,
+ OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,
+ OLEMSGICON.OLEMSGICON_INFO,
+ 0, // false
+ out result));
+ }
+ }
+}
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/FileUtility.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/FileUtility.cs
new file mode 100644
index 00000000..d7735d65
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/FileUtility.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using EnvDTE;
+
+namespace SnowForest.CoatiPlugin
+{
+ class FileUtility
+ {
+ public delegate void ErrorCallback(string message);
+
+ public static ErrorCallback _errorCallback = null;
+
+ /**
+ * Returns true when file was found, false otherwise
+ */
+ public static bool OpenSourceFile(DTE dte, string fileName)
+ {
+ try
+ {
+ dte.ItemOperations.OpenFile(fileName);
+ return true;
+ }
+ catch (Exception e)
+ {
+ if (_errorCallback != null)
+ {
+ _errorCallback("Failed to open file at " + fileName);
+ }
+ return false;
+ }
+ }
+
+ public static void GoToLine(DTE dte, int lineNumber, int columnNumber)
+ {
+ try
+ {
+ ((EnvDTE.TextSelection)dte.ActiveDocument.Selection).MoveToLineAndOffset(lineNumber, columnNumber);
+ }
+ catch (Exception e)
+ {
+ if (_errorCallback != null)
+ {
+ _errorCallback("Failed to set cursor to position [" + lineNumber.ToString() + "," + columnNumber.ToString() + "]");
+ }
+ }
+ }
+
+ public static string GetActiveDocumentName(DTE dte)
+ {
+ return dte.ActiveDocument.Name;
+ }
+
+ public static string GetActiveDocumentPath(DTE dte)
+ {
+ return dte.ActiveDocument.Path;
+ }
+
+ public static int GetActiveLineNumber(DTE dte)
+ {
+ return ((EnvDTE.TextSelection)dte.ActiveDocument.Selection).ActivePoint.Line;
+ }
+
+ public static int GetActiveColumnNumber(DTE dte)
+ {
+ return ((EnvDTE.TextSelection)dte.ActiveDocument.Selection).ActivePoint.LineCharOffset;
+ }
+ }
+}
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/GlobalSuppressions.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/GlobalSuppressions.cs
new file mode 100644
index 00000000..a893f9d2
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/GlobalSuppressions.cs
@@ -0,0 +1,11 @@
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project. Project-level
+// suppressions either have no target or are given a specific target
+// and scoped to a namespace, type, member, etc.
+//
+// To add a suppression to this file, right-click the message in the
+// Error List, point to "Suppress Message(s)", and click "In Project
+// Suppression File". You do not need to add suppressions to this
+// file manually.
+
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1017:MarkAssembliesWithComVisible")]
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Guids.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Guids.cs
new file mode 100644
index 00000000..0ab44894
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Guids.cs
@@ -0,0 +1,14 @@
+// Guids.cs
+// MUST match guids.h
+using System;
+
+namespace SnowForest.CoatiPlugin
+{
+ static class GuidList
+ {
+ public const string guidCoatiPluginPkgString = "acf15780-03b5-440e-a41e-db79b7043fc2";
+ public const string guidCoatiPluginCmdSetString = "0efb005b-715c-4a62-8a9b-1e5a870e6c34";
+
+ public static readonly Guid guidCoatiPluginCmdSet = new Guid(guidCoatiPluginCmdSetString);
+ };
+}
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Key.snk b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Key.snk
new file mode 100644
index 00000000..b0f11bb0
Binary files /dev/null and b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Key.snk differ
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkProtocolUtility.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkProtocolUtility.cs
new file mode 100644
index 00000000..97fcd656
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkProtocolUtility.cs
@@ -0,0 +1,132 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SnowForest.CoatiPlugin
+{
+ class NetworkProtocolUtility
+ {
+ private static string s_divider = ">>";
+ private static string s_setActiveTokenPrefix = "setActiveToken";
+ private static string s_moveCursorPrefix = "moveCursor";
+ private static string s_endOfMessageToken = "";
+
+ public class CursorPosition
+ {
+ private string _filePath = "";
+ private int _lineNumber = 0;
+ private int _columnNumber = 0;
+ private bool _valid = false;
+
+ public string FilePath
+ {
+ get { return _filePath; }
+ set { _filePath = value; }
+ }
+
+ public int LineNumber
+ {
+ get { return _lineNumber; }
+ set { _lineNumber = value; }
+ }
+
+ public int ColumnNumber
+ {
+ get { return _columnNumber; }
+ set { _columnNumber = value; }
+ }
+
+ public bool Valid
+ {
+ get { return _valid; }
+ set { _valid = value; }
+ }
+ }
+
+ public static string createOutMessage(string filePath, int lineNumber, int columnNumber)
+ {
+ string message = s_setActiveTokenPrefix;
+
+ message += s_divider;
+
+ message += filePath;
+
+ message += s_divider;
+
+ message += lineNumber.ToString();
+
+ message += s_divider;
+
+ message += columnNumber.ToString();
+
+ message += s_endOfMessageToken;
+
+ return message;
+ }
+
+ /**
+ * TODO: debug
+ */
+ public static CursorPosition parseInMessage(string message)
+ {
+ CursorPosition result = new CursorPosition();
+
+ // remove eof token right away
+ if(message.IndexOf(s_endOfMessageToken) > -1)
+ {
+ message = message.Substring(0, message.IndexOf(s_endOfMessageToken));
+ }
+
+ int pos = message.IndexOf(s_moveCursorPrefix);
+
+ if (pos < 0)
+ {
+ return result;
+ }
+
+ message = message.Substring(pos + s_moveCursorPrefix.Length + s_divider.Length);
+
+ pos = message.IndexOf(s_divider);
+
+ if (pos < 0)
+ {
+ return result;
+ }
+
+ string filePath = message.Substring(0, pos);
+ result.FilePath = filePath;
+
+ message = message.Substring(pos+2);
+
+ pos = message.IndexOf(s_divider);
+
+ if (pos < 0)
+ {
+ return result;
+ }
+
+ string sLineNumber = message.Substring(0, pos);
+ int lineNumber = 0;
+ bool valid = int.TryParse(sLineNumber, out lineNumber);
+ if (valid)
+ {
+ result.LineNumber = lineNumber;
+ }
+
+ message = message.Substring(pos+2);
+
+ string sColumnNumber = message;
+ int columnNumber = 0;
+ valid = int.TryParse(sColumnNumber, out columnNumber);
+ if (valid)
+ {
+ result.ColumnNumber = columnNumber;
+ result.Valid = true;
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkUtility.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkUtility.cs
new file mode 100644
index 00000000..965bfaf8
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkUtility.cs
@@ -0,0 +1,221 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+using System.Net.Sockets;
+using System.Net;
+
+namespace SnowForest.CoatiPlugin
+{
+ public class StateObject
+ {
+ public Socket _workSocket = null;
+ public const int _bufferSize = 1024;
+ public byte[] _buffer = new byte[_bufferSize];
+ public StringBuilder _stringBuilder = new StringBuilder();
+ }
+
+ public class AsynchronousSocketListener
+ {
+ public static ManualResetEvent _allDone = new ManualResetEvent(false);
+
+ public delegate void OnReadCallback(string message);
+
+ public static OnReadCallback _onReadCallback = null;
+ public static OnReadCallback _onErrorCallback = null;
+
+ private static string _endOfMessageToken = "";
+
+ public AsynchronousSocketListener()
+ {
+ }
+
+ public void DoWork()
+ {
+ StartListening();
+ }
+
+ public static void StartListening()
+ {
+ const int port = 6666;
+ const string ipAddressString = "127.0.0.1";
+
+ byte[] bytes = new Byte[1024];
+
+ IPAddress ipAddress = IPAddress.Parse(ipAddressString);
+ IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
+
+ Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+
+ try
+ {
+ listener.Bind(localEndPoint);
+ listener.Listen(100);
+
+ while (true)
+ {
+ _allDone.Reset();
+
+ listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
+ _allDone.WaitOne();
+ }
+ }
+ catch (Exception e)
+ {
+ //if(_onErrorCallback != null)
+ //{
+ // _onErrorCallback(e.ToString());
+ //}
+ }
+ }
+
+ public static void AcceptCallback(IAsyncResult ar)
+ {
+ _allDone.Set();
+
+ Socket listener = (Socket)ar.AsyncState;
+ Socket handler = listener.EndAccept(ar);
+
+ StateObject state = new StateObject();
+ state._workSocket = handler;
+ handler.BeginReceive(state._buffer, 0, StateObject._bufferSize, 0, new AsyncCallback(ReadCallback), state);
+ }
+
+ public static void ReadCallback(IAsyncResult ar)
+ {
+ String content = String.Empty;
+
+ StateObject state = (StateObject)ar.AsyncState;
+ Socket handler = state._workSocket;
+
+ int bytesRead = handler.EndReceive(ar);
+
+ if (bytesRead > 0)
+ {
+ state._stringBuilder.Append(Encoding.ASCII.GetString(state._buffer, 0, bytesRead));
+
+ content = state._stringBuilder.ToString();
+ if (content.IndexOf(_endOfMessageToken) > -1)
+ {
+ if (_onReadCallback != null)
+ {
+ _onReadCallback(content);
+ }
+ }
+ else
+ {
+ handler.BeginReceive(state._buffer, 0, StateObject._bufferSize, 0, new AsyncCallback(ReadCallback), state);
+ }
+ }
+ }
+
+ private static void Send(Socket handler, String data)
+ {
+ byte[] byteData = Encoding.ASCII.GetBytes(data);
+ handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
+ }
+
+ private static void SendCallback(IAsyncResult ar)
+ {
+ try
+ {
+ Socket handler = (Socket)ar.AsyncState;
+
+ int bytesSent = handler.EndSend(ar);
+ Console.WriteLine("Sent {0} bytes to client.", bytesSent);
+ }
+ catch (Exception e)
+ {
+ if (_onErrorCallback != null)
+ {
+ _onErrorCallback(e.ToString());
+ }
+ }
+ }
+ }
+
+ public class AsynchronousClient
+ {
+ private const int _port = 6667;
+
+ private static ManualResetEvent connectDone = new ManualResetEvent(false);
+ private static ManualResetEvent sendDone = new ManualResetEvent(false);
+
+ private static String response = String.Empty;
+
+ public static AsynchronousSocketListener.OnReadCallback _onErrorCallback = null;
+
+ public static void Send(string message)
+ {
+ IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
+ IPEndPoint remoteEP = new IPEndPoint(ipAddress, _port);
+
+ Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+
+ IAsyncResult ar = client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
+ if (!connectDone.WaitOne(1000))
+ {
+ client.EndConnect(ar);
+ }
+
+ Send(client, message);
+ sendDone.WaitOne();
+
+ client.Shutdown(SocketShutdown.Both);
+ client.Close();
+ }
+
+ private static void ConnectCallback(IAsyncResult ar)
+ {
+ try
+ {
+ Socket client = (Socket)ar.AsyncState;
+
+ if (client.Connected == false)
+ {
+ return;
+ }
+
+ client.EndConnect(ar);
+
+ connectDone.Set();
+ }
+ catch (Exception e)
+ {
+ if (_onErrorCallback != null)
+ {
+ _onErrorCallback(e.ToString());
+ }
+ }
+ }
+
+ private static void Send(Socket client, String data)
+ {
+ byte[] byteData = Encoding.ASCII.GetBytes(data);
+
+ client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client);
+ }
+
+ private static void SendCallback(IAsyncResult ar)
+ {
+ try
+ {
+ Socket client = (Socket)ar.AsyncState;
+
+ int bytesSent = client.EndSend(ar);
+
+ sendDone.Set();
+ }
+ catch (Exception e)
+ {
+ if (_onErrorCallback != null)
+ {
+ _onErrorCallback(e.ToString());
+ }
+ }
+ }
+ }
+}
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/PkgCmdID.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/PkgCmdID.cs
new file mode 100644
index 00000000..be6bc196
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/PkgCmdID.cs
@@ -0,0 +1,11 @@
+// PkgCmdID.cs
+// MUST match PkgCmdID.h
+using System;
+
+namespace SnowForest.CoatiPlugin
+{
+ static class PkgCmdIDList
+ {
+ public const uint cmdidCoatiSetActiveToken = 0x104;
+ };
+}
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Properties/AssemblyInfo.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..5a8f5737
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Reflection;
+using System.Resources;
+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("CoatiPlugin")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Coati Software")]
+[assembly: AssemblyProduct("CoatiPlugin")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+[assembly: CLSCompliant(false)]
+[assembly: NeutralResourcesLanguage("en-US")]
+
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+
+
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.Designer.cs b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.Designer.cs
new file mode 100644
index 00000000..15676794
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace SnowForest.CoatiPlugin {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SnowForest.CoatiPlugin.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.resx b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.resx
new file mode 100644
index 00000000..891c592b
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.resx
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources/favicon_16x16.png b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources/favicon_16x16.png
new file mode 100644
index 00000000..71ad3bac
Binary files /dev/null and b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources/favicon_16x16.png differ
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/VSPackage.resx b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/VSPackage.resx
new file mode 100644
index 00000000..ea75abb8
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/VSPackage.resx
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ CoatiPlugin
+
+
+ Coati plugin test
+
+
\ No newline at end of file
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/coati.ico b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/coati.ico
new file mode 100644
index 00000000..90ce2937
Binary files /dev/null and b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/coati.ico differ
diff --git a/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/source.extension.vsixmanifest b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/source.extension.vsixmanifest
new file mode 100644
index 00000000..7403e635
--- /dev/null
+++ b/ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/source.extension.vsixmanifest
@@ -0,0 +1,19 @@
+
+
+
+
+ CoatiPlugin
+ This package allows Coati to communicate with Visual Studio and vice versa.
+ coati.ico
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h
index 22a06c9b..3435dc19 100644
--- a/src/test/CxxParserTestSuite.h
+++ b/src/test/CxxParserTestSuite.h
@@ -1951,6 +1951,7 @@ public:
"{\n"
"};\n"
);
+
TS_ASSERT_EQUALS(client->classes.size(), 2);
TS_ASSERT_EQUALS(client->classes[0], "A <1:1 <2:7 2:7> 4:1>");
TS_ASSERT_EQUALS(client->classes[1], "A <5:1 <6:7 6:7> 8:1>");
diff --git a/src/test/NetworkProtocolHelperTestSuite.h b/src/test/NetworkProtocolHelperTestSuite.h
index b1bd66bf..eba00c9a 100644
--- a/src/test/NetworkProtocolHelperTestSuite.h
+++ b/src/test/NetworkProtocolHelperTestSuite.h
@@ -10,53 +10,59 @@ public:
std::string type = "setActiveToken";
std::string divider = ">>";
std::string filePath = "C:\\Users\\Manuel\\imporant\\file\\location\\fileName.cpp";
+ std::string endOfMessageToken = "";
int row = 1;
int column = 2;
// valid message
std::stringstream message;
- message << type << divider << filePath << divider << row << divider << column;
+ message << type << divider << filePath << divider << row << divider << column << endOfMessageToken;
NetworkProtocolHelper::NetworkMessage networkMessage = NetworkProtocolHelper::parseMessage(message.str());
TS_ASSERT_EQUALS(networkMessage.fileLocation, filePath);
TS_ASSERT_EQUALS(networkMessage.row, row);
TS_ASSERT_EQUALS(networkMessage.column, column);
+ TS_ASSERT_EQUALS(networkMessage.valid, true);
// invalid type
message.str("");
- message << "foo" << divider << filePath << divider << row << divider << column;
+ message << "foo" << divider << filePath << divider << row << divider << column << endOfMessageToken;
networkMessage = NetworkProtocolHelper::parseMessage(message.str());
TS_ASSERT_EQUALS(networkMessage.fileLocation, "");
TS_ASSERT_EQUALS(networkMessage.row, 0);
TS_ASSERT_EQUALS(networkMessage.column, 0);
+ TS_ASSERT_EQUALS(networkMessage.valid, false);
// missing divider
message.str("");
- message << type << divider << filePath << row << divider << column;
+ message << type << divider << filePath << row << divider << column << endOfMessageToken;
networkMessage = NetworkProtocolHelper::parseMessage(message.str());
TS_ASSERT_EQUALS(networkMessage.fileLocation, "");
TS_ASSERT_EQUALS(networkMessage.row, 0);
TS_ASSERT_EQUALS(networkMessage.column, 0);
+ TS_ASSERT_EQUALS(networkMessage.valid, false);
// invalid row
message.str("");
- message << type << divider << filePath << divider << "potato" << divider << column;
+ message << type << divider << filePath << divider << "potato" << divider << column << endOfMessageToken;
networkMessage = NetworkProtocolHelper::parseMessage(message.str());
TS_ASSERT_EQUALS(networkMessage.fileLocation, "");
TS_ASSERT_EQUALS(networkMessage.row, 0);
TS_ASSERT_EQUALS(networkMessage.column, 0);
+ TS_ASSERT_EQUALS(networkMessage.valid, false);
// invalid column
message.str("");
- message << type << divider << filePath << divider << row << divider << "laz0r";
+ message << type << divider << filePath << divider << row << divider << "laz0r" << endOfMessageToken;
networkMessage = NetworkProtocolHelper::parseMessage(message.str());
TS_ASSERT_EQUALS(networkMessage.fileLocation, "");
TS_ASSERT_EQUALS(networkMessage.row, 0);
TS_ASSERT_EQUALS(networkMessage.column, 0);
+ TS_ASSERT_EQUALS(networkMessage.valid, false);
}
};
\ No newline at end of file