From 7d0316628232e8c3b55348930e92005186e62a3a Mon Sep 17 00:00:00 2001 From: Manuel Dobusch Date: Tue, 3 Nov 2015 15:26:47 +0100 Subject: [PATCH] logic: VS plugin fixes Fixed some vs plugin issues and added plugin project to repo --- .gitignore | 2 + bin/test/data/log/test_log.txt | 308 ++++++++++++++++++ .../vs/vs2012/CoatiPlugin/CoatiPlugin.sln | 20 ++ .../vs/vs2012/CoatiPlugin/CoatiPlugin.v11.suo | Bin 0 -> 94208 bytes .../CoatiPlugin/CoatiPlugin.csproj | 181 ++++++++++ .../CoatiPlugin/CoatiPlugin.csproj.user | 13 + .../CoatiPlugin/CoatiPlugin/CoatiPlugin.vsct | 103 ++++++ .../CoatiPlugin/CoatiPluginPackage.cs | 123 +++++++ .../CoatiPlugin/CoatiPlugin/FileUtility.cs | 71 ++++ .../CoatiPlugin/GlobalSuppressions.cs | 11 + .../vs2012/CoatiPlugin/CoatiPlugin/Guids.cs | 14 + .../vs/vs2012/CoatiPlugin/CoatiPlugin/Key.snk | Bin 0 -> 596 bytes .../CoatiPlugin/NetworkProtocolUtility.cs | 132 ++++++++ .../CoatiPlugin/CoatiPlugin/NetworkUtility.cs | 221 +++++++++++++ .../CoatiPlugin/CoatiPlugin/PkgCmdID.cs | 11 + .../CoatiPlugin/Properties/AssemblyInfo.cs | 36 ++ .../CoatiPlugin/Resources.Designer.cs | 63 ++++ .../CoatiPlugin/CoatiPlugin/Resources.resx | 129 ++++++++ .../CoatiPlugin/Resources/favicon_16x16.png | Bin 0 -> 3273 bytes .../CoatiPlugin/CoatiPlugin/VSPackage.resx | 137 ++++++++ .../vs2012/CoatiPlugin/CoatiPlugin/coati.ico | Bin 0 -> 74802 bytes .../CoatiPlugin/source.extension.vsixmanifest | 19 ++ src/test/CxxParserTestSuite.h | 1 + src/test/NetworkProtocolHelperTestSuite.h | 16 +- 24 files changed, 1606 insertions(+), 5 deletions(-) create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.sln create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin.v11.suo create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.csproj.user create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPlugin.vsct create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/CoatiPluginPackage.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/FileUtility.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/GlobalSuppressions.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Guids.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Key.snk create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkProtocolUtility.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/NetworkUtility.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/PkgCmdID.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Properties/AssemblyInfo.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.Designer.cs create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources.resx create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/Resources/favicon_16x16.png create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/VSPackage.resx create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/coati.ico create mode 100644 ide_plugins/vs/vs2012/CoatiPlugin/CoatiPlugin/source.extension.vsixmanifest 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 0000000000000000000000000000000000000000..b8347eb693609f134fff4c8f70bc676212f35822 GIT binary patch literal 94208 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b0f11bb0b18e6ae828a0dc89cf951f19366bc7ee GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096c@50?e>4@Y+A!}x3r;9u02hK??(!!?l z%130X;qm?a2v9|e>cK#g1?Ze$;feJijti&$MD+csRYm+GuL=S42Mh>&J1a1y%}8I= zvWt_ykqlbYa5X!y6l1KMe)Zb`XsH=KtmeP35KPbj&>|ha)lvM>5l1j#&E54VliN9iht2 z8P4XKvX{N3iTe3}Gvo~AH~}xin+IO*fI&JyU8{F+nHB!4ToFX)%Rxq zcpREwG)_MWJ&;Z?B`xmso|ycrQA@hvS6CYXBiNLTksyzxu^A0z*;q(58}=dXC#ce>sAep%))aO=cJ7Yg{! zbg}R!^HbeLG&khw~1FAMV;WEatU_wA~HEbe0$`%Da4At z`KNYaxl$&)10G?H`x?dM$m!jIvDJBHOICZ_4jN>);R`5|99y*N*4Q iF@olL3qhbs{5Qaq$o9Vyo%255MS$$o?Gg?FT5*L(;w3r& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..71ad3bac75e33abab9dbbef43aef3abfb4dbd62f GIT binary patch literal 3273 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 Hu0mjf&;$zJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..90ce2937aa6fad8c40be8b3404dd65b9ff01b5ce GIT binary patch literal 74802 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 E14Euj)&Kwi literal 0 HcmV?d00001 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