From 9898ffb91f4795f5a3c889aabc70a4c7c6133b94 Mon Sep 17 00:00:00 2001 From: Jeff Kaminski Date: Thu, 7 Sep 2017 13:39:44 -0400 Subject: [PATCH 001/100] Updates to all README files for new locations in Bluemix. --- README.md | 44 +++++++++---------- Scripts/Services/Conversation/v1/README.md | 2 +- Scripts/Services/Discovery/v1/README.md | 4 +- .../Services/DocumentConversion/v1/README.md | 2 +- .../Services/LanguageTranslation/v2/README.md | 4 +- .../Services/LanguageTranslator/v2/README.md | 4 +- .../NaturalLanguageClassifier/v2/README.md | 2 +- .../NaturalLanguageUnderstanding/v1/README.md | 8 ++-- .../Services/PersonalityInsights/v3/README.md | 6 +-- Scripts/Services/RetrieveAndRank/v1/README.md | 5 +-- Scripts/Services/SpeechToText/v1/README.md | 2 +- Scripts/Services/TextToSpeech/v1/README.md | 10 ++--- Scripts/Services/ToneAnalyzer/v3/README.md | 2 +- .../Services/TradeoffAnalytics/v1/README.md | 2 +- .../Services/VisualRecognition/v3/README.md | 6 +-- 15 files changed, 51 insertions(+), 52 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 Scripts/Services/Conversation/v1/README.md mode change 100644 => 100755 Scripts/Services/Discovery/v1/README.md mode change 100644 => 100755 Scripts/Services/DocumentConversion/v1/README.md mode change 100644 => 100755 Scripts/Services/LanguageTranslation/v2/README.md mode change 100644 => 100755 Scripts/Services/LanguageTranslator/v2/README.md mode change 100644 => 100755 Scripts/Services/NaturalLanguageClassifier/v2/README.md mode change 100644 => 100755 Scripts/Services/NaturalLanguageUnderstanding/v1/README.md mode change 100644 => 100755 Scripts/Services/PersonalityInsights/v3/README.md mode change 100644 => 100755 Scripts/Services/RetrieveAndRank/v1/README.md mode change 100644 => 100755 Scripts/Services/SpeechToText/v1/README.md mode change 100644 => 100755 Scripts/Services/TextToSpeech/v1/README.md mode change 100644 => 100755 Scripts/Services/ToneAnalyzer/v3/README.md mode change 100644 => 100755 Scripts/Services/TradeoffAnalytics/v1/README.md mode change 100644 => 100755 Scripts/Services/VisualRecognition/v3/README.md diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 3f25096be..71bba4322 --- a/README.md +++ b/README.md @@ -161,33 +161,33 @@ See [CONTRIBUTING.md](.github/CONTRIBUTING.md). [bluemix_registration]: http://bluemix.net/registration [get_unity]: https://unity3d.com/get-unity -[speech_to_text]: http://www.ibm.com/watson/developercloud/doc/speech-to-text/ -[text_to_speech]: http://www.ibm.com/watson/developercloud/doc/text-to-speech/ -[language_translator]: http://www.ibm.com/watson/developercloud/doc/language-translator/index.html -[dialog]: https://console.bluemix.net/docs/services/conversation/index.html#about -[natural_language_classifier]: http://www.ibm.com/watson/developercloud/doc/natural-language-classifier/index.html +[speech_to_text]: https://console.bluemix.net/docs/services/speech-to-text/index.html +[text_to_speech]: https://console.bluemix.net/docs/services/text-to-speech/index.html +[language_translator]: https://console.bluemix.net/docs/services/language-translator/index.html +[dialog]: https://console.bluemix.net/docs/services/dialog/index.html +[natural_language_classifier]: https://console.bluemix.net/docs/services/natural-language-classifier/natural-language-classifier-overview.html [alchemy_language]: http://www.alchemyapi.com/products/alchemylanguage [alchemyData_news]: http://www.ibm.com/watson/developercloud/alchemy-data-news.html [sentiment_analysis]: http://www.alchemyapi.com/products/alchemylanguage/sentiment-analysis -[tone_analyzer]: http://www.ibm.com/watson/developercloud/doc/tone-analyzer/ -[tradeoff_analytics]: http://www.ibm.com/watson/developercloud/doc/tradeoff-analytics/ -[conversation]:https://console.bluemix.net/docs/services/conversation/index.html#about -[visual_recognition]: http://www.ibm.com/watson/developercloud/visual-recognition/api/v3/ -[personality_insights]: http://www.ibm.com/watson/developercloud/personality-insights/api/v2/ +[tone_analyzer]: https://console.bluemix.net/docs/services/tone-analyzer/index.html +[tradeoff_analytics]: https://console.bluemix.net/docs/services/tradeoff-analytics/index.html +[conversation]: https://console.bluemix.net/docs/services/conversation/index.html +[visual_recognition]: https://console.bluemix.net/docs/services/visual-recognition/index.html +[personality_insights]: https://console.bluemix.net/docs/services/personality-insights/index.html [conversation_tooling]: https://www.ibmwatsonconversation.com -[retrieve_and_rank]: http://www.ibm.com/watson/developercloud/retrieve-and-rank/api/v1/ -[discovery]: http://www.ibm.com/watson/developercloud/discovery/api/v1/ -[document_conversion]: http://www.ibm.com/watson/developercloud/document-conversion/api/v1/ -[expressive_ssml]: http://www.ibm.com/watson/developercloud/doc/text-to-speech/http.shtml#expressive -[ssml]: http://www.ibm.com/watson/developercloud/doc/text-to-speech/SSML.shtml -[discovery-query]: http://www.ibm.com/watson/developercloud/doc/discovery/using.shtml +[retrieve_and_rank]: https://console.bluemix.net/docs/services/retrieve-and-rank/index.html +[discovery]: https://console.bluemix.net/docs/services/discovery/index.html +[document_conversion]: https://console.bluemix.net/docs/services/document-conversion/index.html +[expressive_ssml]: https://console.bluemix.net/docs/services/text-to-speech/http.html#expressive +[ssml]: https://console.bluemix.net/docs/services/text-to-speech/SSML.html +[discovery-query]: https://console.bluemix.net/docs/services/discovery/using.html [natural_language_understanding]: https://www.ibm.com/watson/developercloud/natural-language-understanding.html -[nlu_models]: https://www.ibm.com/watson/developercloud/doc/natural-language-understanding/customizing.html -[nlu_entities]: https://www.ibm.com/watson/developercloud/natural-language-understanding/api/v1/#entities -[nlu_relations]: https://www.ibm.com/watson/developercloud/natural-language-understanding/api/v1/#relations +[nlu_models]: https://console.bluemix.net/docs/services/natural-language-understanding/customizing.html +[nlu_entities]: https://console.bluemix.net/docs/services/natural-language-understanding/entity-types.html +[nlu_relations]: https://console.bluemix.net/docs/services/natural-language-understanding/relations.html -[dialog_service]: http://www.ibm.com/watson/developercloud/doc/dialog/ -[dialog_migration]: https://console.bluemix.net/docs/services/conversation/index.html#about -[conversation_service]: https://console.bluemix.net/docs/services/conversation/index.html#about +[dialog_service]: https://console.bluemix.net/docs/services/dialog/index.html +[dialog_migration]: https://console.bluemix.net/docs/services/conversation/index.html +[conversation_service]: https://console.bluemix.net/docs/services/conversation/index.html [documentation]: https://watson-developer-cloud.github.io/unity-sdk/ diff --git a/Scripts/Services/Conversation/v1/README.md b/Scripts/Services/Conversation/v1/README.md old mode 100644 new mode 100755 index 737a49115..f36138aa9 --- a/Scripts/Services/Conversation/v1/README.md +++ b/Scripts/Services/Conversation/v1/README.md @@ -103,4 +103,4 @@ private void OnMessage1(object resp, string data) } ``` -[conversation]:https://www.ibm.com/watson/developercloud/doc/conversation/index.html +[conversation]: https://console.bluemix.net/docs/services/conversation/index.html diff --git a/Scripts/Services/Discovery/v1/README.md b/Scripts/Services/Discovery/v1/README.md old mode 100644 new mode 100755 index c5a7cdf67..5b0dcb04c --- a/Scripts/Services/Discovery/v1/README.md +++ b/Scripts/Services/Discovery/v1/README.md @@ -405,5 +405,5 @@ private void OnQuery(QueryResponse resp, string data) ``` [discovery]: https://www.ibm.com/watson/developercloud/discovery.html -[discovery-sizing]: https://www.ibm.com/watson/developercloud/discovery.html#pricing-block -[discovery-query]: https://www.ibm.com/watson/developercloud/doc/discovery/using.html +[discovery-sizing]: https://www.ibm.com/watson/developercloud/discovery.html +[discovery-query]: https://console.bluemix.net/docs/services/discovery/using.html diff --git a/Scripts/Services/DocumentConversion/v1/README.md b/Scripts/Services/DocumentConversion/v1/README.md old mode 100644 new mode 100755 index e8f11a6d8..e4316b9d4 --- a/Scripts/Services/DocumentConversion/v1/README.md +++ b/Scripts/Services/DocumentConversion/v1/README.md @@ -34,4 +34,4 @@ private void OnConvertDocument(ConvertedDocument documentConversionResponse, str } ``` -[document_conversion]: https://www.ibm.com/watson/developercloud/document-conversion.html +[document_conversion]: https://www.ibm.com/watson/services/document-conversion/ diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md old mode 100644 new mode 100755 index 6747991f9..3b38ef81c --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -47,7 +47,7 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslation.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslation", "Failed to create model."); + Log.Debug("TestLanguageTranslation", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string customData) @@ -154,4 +154,4 @@ private void OnGetLanguages(Languages languages, string customData) -[language_Translation]: https://www.ibm.com/watson/developercloud/language-translator.html +[language_Translation]: https://www.ibm.com/watson/services/language-translator/ diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md old mode 100644 new mode 100755 index 586a458fe..eb1d0432a --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -47,7 +47,7 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslator.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("TestLanguageTranslator", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string customData) @@ -154,4 +154,4 @@ private void OnGetLanguages(Languages languages, string customData) -[language_translator]: https://www.ibm.com/watson/developercloud/language-translator.html +[language_translator]: https://www.ibm.com/watson/services/language-translator/ diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/README.md b/Scripts/Services/NaturalLanguageClassifier/v2/README.md old mode 100644 new mode 100755 index 3c02334c7..b54258a12 --- a/Scripts/Services/NaturalLanguageClassifier/v2/README.md +++ b/Scripts/Services/NaturalLanguageClassifier/v2/README.md @@ -105,4 +105,4 @@ private void OnDeleteTrainedClassifier(bool success, string data) ``` -[natural_language_classifier]: https://www.ibm.com/watson/developercloud/nl-classifier.html +[natural_language_classifier]: https://www.ibm.com/watson/services/natural-language-classifier/ diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md old mode 100644 new mode 100755 index 4f1486758..d8a5fc0be --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -69,7 +69,7 @@ private void OnDeleteModel(bool success, string customData) } ``` -[natural_language_understanding]: https://www.ibm.com/watson/developercloud/doc/natural-language-understanding/index.html -[custom_models]: https://www.ibm.com/watson/developercloud/doc/natural-language-understanding/customizing.html -[entities]: https://www.ibm.com/watson/developercloud/natural-language-understanding/api/v1/#entities -[relations]: https://www.ibm.com/watson/developercloud/natural-language-understanding/api/v1/#relations +[natural_language_understanding]: https://console.bluemix.net/docs/services/natural-language-understanding/index.html +[custom_models]: https://console.bluemix.net/docs/services/natural-language-understanding/customizing.html +[entities]: https://console.bluemix.net/docs/services/natural-language-understanding/entity-types.html +[relations]: https://console.bluemix.net/docs/services/natural-language-understanding/relations.html diff --git a/Scripts/Services/PersonalityInsights/v3/README.md b/Scripts/Services/PersonalityInsights/v3/README.md old mode 100644 new mode 100755 index b17d75d88..c86db1fc2 --- a/Scripts/Services/PersonalityInsights/v3/README.md +++ b/Scripts/Services/PersonalityInsights/v3/README.md @@ -37,6 +37,6 @@ private void OnGetProfile(Profile profile, string data) } ``` -[personality-insights]: https://www.ibm.com/watson/developercloud/personality-insights.html -[personality-models]: https://www.ibm.com/watson/developercloud/doc/personality-insights/models.html -[consumption-preferences]:https://www.ibm.com/watson/developercloud/doc/personality-insights/preferences.html +[personality-insights]: https://www.ibm.com/watson/services/personality-insights/ +[personality-models]: https://console.bluemix.net/docs/services/personality-insights/models.html +[consumption-preferences]: https://console.bluemix.net/docs/services/personality-insights/preferences.html diff --git a/Scripts/Services/RetrieveAndRank/v1/README.md b/Scripts/Services/RetrieveAndRank/v1/README.md old mode 100644 new mode 100755 index 23572e97f..0d7167937 --- a/Scripts/Services/RetrieveAndRank/v1/README.md +++ b/Scripts/Services/RetrieveAndRank/v1/README.md @@ -337,6 +337,5 @@ private void OnGetRanker(RankerStatusPayload resp, string data) Log.Debug("ExampleRetrieveAndRank", "GetRanker results: {0}", data.ToString()); } ``` -[personality-insights]: https://www.ibm.com/watson/developercloud/personality-insights.html -[personality-models]: https://www.ibm.com/watson/developercloud/doc/personality-insights/models.html -[consumption-preferences]:https://www.ibm.com/watson/developercloud/doc/personality-insights/preferences.html +[retrieve-and-rank-service]: https://www.ibm.com/watson/services/retrieve-and-rank/ +[retrieve-and-rank-documentation]: https://console.bluemix.net/docs/services/retrieve-and-rank/index.html diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md old mode 100644 new mode 100755 index 1136ea9e8..4354f1cc3 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -476,4 +476,4 @@ private void HandleDeleteCustomWord(bool success, string customData) } ``` -[speech-to-text]: https://www.ibm.com/watson/developercloud/doc/speech-to-text/index.html +[speech-to-text]: https://console.bluemix.net/docs/services/speech-to-text/index.html diff --git a/Scripts/Services/TextToSpeech/v1/README.md b/Scripts/Services/TextToSpeech/v1/README.md old mode 100644 new mode 100755 index 6e600901a..136ad7f4b --- a/Scripts/Services/TextToSpeech/v1/README.md +++ b/Scripts/Services/TextToSpeech/v1/README.md @@ -361,8 +361,8 @@ private void OnDeleteCustomizationWords(bool success, string customData) } ``` -[text-to-speech]: https://www.ibm.com/watson/developercloud/doc/text-to-speech/index.html -[using-ssml]: https://www.ibm.com/watson/developercloud/doc/text-to-speech/SSML.html -[using-sprs]: https://www.ibm.com/watson/developercloud/doc/text-to-speech/SPRs.html -[understanding-customization]: https://www.ibm.com/watson/developercloud/doc/text-to-speech/custom-intro.html -[using-customization]: https://www.ibm.com/watson/developercloud/doc/text-to-speech/custom-using.html +[text-to-speech]: https://console.bluemix.net/docs/services/text-to-speech/index.html +[using-ssml]: https://console.bluemix.net/docs/services/text-to-speech/SSML.html +[using-sprs]: https://console.bluemix.net/docs/services/text-to-speech/SPRs.html +[understanding-customization]: https://console.bluemix.net/docs/services/text-to-speech/custom-intro.html +[using-customization]: https://console.bluemix.net/docs/services/text-to-speech/custom-using.html diff --git a/Scripts/Services/ToneAnalyzer/v3/README.md b/Scripts/Services/ToneAnalyzer/v3/README.md old mode 100644 new mode 100755 index f4e56e6c3..08246ad69 --- a/Scripts/Services/ToneAnalyzer/v3/README.md +++ b/Scripts/Services/ToneAnalyzer/v3/README.md @@ -34,4 +34,4 @@ private void OnGetToneAnalyze(ToneAnalyzerResponse resp, string data) } ``` -[tone-analyzer]: https://www.ibm.com/watson/developercloud/doc/tone-analyzer/index.html +[tone-analyzer]: https://console.bluemix.net/docs/services/tone-analyzer/index.html diff --git a/Scripts/Services/TradeoffAnalytics/v1/README.md b/Scripts/Services/TradeoffAnalytics/v1/README.md old mode 100644 new mode 100755 index e0a59561a..8ffd8d3c1 --- a/Scripts/Services/TradeoffAnalytics/v1/README.md +++ b/Scripts/Services/TradeoffAnalytics/v1/README.md @@ -115,4 +115,4 @@ public class TestDataValue : IBM.Watson.DeveloperCloud.Services.TradeoffAnalytic } ``` -[tradeoff_analytics]: http://www.ibm.com/watson/developercloud/doc/tradeoff-analytics/ +[tradeoff_analytics]: https://console.bluemix.net/docs/services/tradeoff-analytics/index.html diff --git a/Scripts/Services/VisualRecognition/v3/README.md b/Scripts/Services/VisualRecognition/v3/README.md old mode 100644 new mode 100755 index 866ce7668..33c3bccd6 --- a/Scripts/Services/VisualRecognition/v3/README.md +++ b/Scripts/Services/VisualRecognition/v3/README.md @@ -314,6 +314,6 @@ private void OnFindSimilar(SimilarImagesConfig images, string customData) ``` [visual-recognition]: https://www.ibm.com/watson/developercloud/visual-recognition/api/v3/ -[structure-of-the-training-data]: https://www.ibm.com/watson/developercloud/doc/visual-recognition/customizing.html#structure -[guidelines-for-good-training]: https://www.ibm.com/watson/developercloud/doc/visual-recognition/customizing.html#guidelines-for-good-training -[updating-custom-classifiers]: https://www.ibm.com/watson/developercloud/doc/visual-recognition/customizing.html#updating-custom-classifiers +[structure-of-the-training-data]: https://console.bluemix.net/docs/services/visual-recognition/customizing.html#structure +[guidelines-for-good-training]: https://console.bluemix.net/docs/services/visual-recognition/customizing.html#guidelines-for-good-training +[updating-custom-classifiers]: https://console.bluemix.net/docs/services/visual-recognition/customizing.html#updating-custom-classifiers From f9ed94f88ff31bacbd15c900e402fa82fac2505d Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Mon, 25 Sep 2017 16:42:51 -0500 Subject: [PATCH 002/100] sending silent audioclip to keep socket open --- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9b762e173..93b70ea69 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -530,6 +530,7 @@ private void SendStart() start["word_alternatives_threshold"] = WordAlternativesThreshold; start["keywords_threshold"] = KeywordsThreshold; start["keywords"] = Keywords; + start["inactivity_timeout "] = -1; _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); _lastStartSent = DateTime.Now; @@ -567,6 +568,8 @@ private IEnumerator KeepAlive() Log.Debug("SpeechToText", "Sending keep alive."); #endif _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(nop))); + AudioClip clip = AudioClip.Create("silence", 44100, 1, 44100, false); + _listenSocket.Send(new WSConnector.BinaryMessage(WaveFile.CreateWAV(clip))); _lastKeepAlive = DateTime.Now; } } From 2ea272e5c8e1068dde96f28e63cf687420285c33 Mon Sep 17 00:00:00 2001 From: kimberlysiva Date: Thu, 12 Oct 2017 14:24:04 -0400 Subject: [PATCH 003/100] move WebSocketSharp to a dll and exclude on WSA --- .gitignore | 1 + Plugins/websocket-sharp.dll | Bin 0 -> 252416 bytes Plugins/websocket-sharp.dll.meta | 124 + ThirdParty/WebSocketSharp.meta | 9 - ThirdParty/WebSocketSharp/AssemblyInfo.cs | 26 - .../WebSocketSharp/AssemblyInfo.cs.meta | 12 - ThirdParty/WebSocketSharp/ByteOrder.cs | 47 - ThirdParty/WebSocketSharp/ByteOrder.cs.meta | 12 - ThirdParty/WebSocketSharp/CloseEventArgs.cs | 142 - .../WebSocketSharp/CloseEventArgs.cs.meta | 12 - ThirdParty/WebSocketSharp/CloseStatusCode.cs | 120 - .../WebSocketSharp/CloseStatusCode.cs.meta | 12 - .../WebSocketSharp/CompressionMethod.cs | 53 - .../WebSocketSharp/CompressionMethod.cs.meta | 12 - ThirdParty/WebSocketSharp/ErrorEventArgs.cs | 109 - .../WebSocketSharp/ErrorEventArgs.cs.meta | 12 - ThirdParty/WebSocketSharp/Ext.cs | 2043 ---------- ThirdParty/WebSocketSharp/Ext.cs.meta | 12 - ThirdParty/WebSocketSharp/Fin.cs | 51 - ThirdParty/WebSocketSharp/Fin.cs.meta | 12 - ThirdParty/WebSocketSharp/HttpBase.cs | 208 - ThirdParty/WebSocketSharp/HttpBase.cs.meta | 12 - ThirdParty/WebSocketSharp/HttpRequest.cs | 223 -- ThirdParty/WebSocketSharp/HttpRequest.cs.meta | 12 - ThirdParty/WebSocketSharp/HttpResponse.cs | 210 - .../WebSocketSharp/HttpResponse.cs.meta | 12 - ThirdParty/WebSocketSharp/LogData.cs | 149 - ThirdParty/WebSocketSharp/LogData.cs.meta | 12 - ThirdParty/WebSocketSharp/LogLevel.cs | 63 - ThirdParty/WebSocketSharp/LogLevel.cs.meta | 12 - ThirdParty/WebSocketSharp/Logger.cs | 330 -- ThirdParty/WebSocketSharp/Logger.cs.meta | 12 - ThirdParty/WebSocketSharp/Mask.cs | 51 - ThirdParty/WebSocketSharp/Mask.cs.meta | 12 - ThirdParty/WebSocketSharp/MessageEventArgs.cs | 180 - .../WebSocketSharp/MessageEventArgs.cs.meta | 12 - ThirdParty/WebSocketSharp/Net.meta | 9 - .../WebSocketSharp/Net/AuthenticationBase.cs | 151 - .../Net/AuthenticationBase.cs.meta | 12 - .../Net/AuthenticationChallenge.cs | 146 - .../Net/AuthenticationChallenge.cs.meta | 12 - .../Net/AuthenticationResponse.cs | 323 -- .../Net/AuthenticationResponse.cs.meta | 12 - .../Net/AuthenticationSchemes.cs | 66 - .../Net/AuthenticationSchemes.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/Chunk.cs | 91 - ThirdParty/WebSocketSharp/Net/Chunk.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/ChunkStream.cs | 360 -- .../WebSocketSharp/Net/ChunkStream.cs.meta | 12 - .../Net/ChunkedRequestStream.cs | 211 - .../Net/ChunkedRequestStream.cs.meta | 12 - .../Net/ClientSslConfiguration.cs | 291 -- .../Net/ClientSslConfiguration.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/Cookie.cs | 822 ---- ThirdParty/WebSocketSharp/Net/Cookie.cs.meta | 12 - .../WebSocketSharp/Net/CookieCollection.cs | 598 --- .../Net/CookieCollection.cs.meta | 12 - .../WebSocketSharp/Net/CookieException.cs | 144 - .../Net/CookieException.cs.meta | 12 - .../WebSocketSharp/Net/EndPointListener.cs | 515 --- .../Net/EndPointListener.cs.meta | 12 - .../WebSocketSharp/Net/EndPointManager.cs | 228 -- .../Net/EndPointManager.cs.meta | 12 - .../WebSocketSharp/Net/HttpBasicIdentity.cs | 82 - .../Net/HttpBasicIdentity.cs.meta | 12 - .../WebSocketSharp/Net/HttpConnection.cs | 574 --- .../WebSocketSharp/Net/HttpConnection.cs.meta | 12 - .../WebSocketSharp/Net/HttpDigestIdentity.cs | 187 - .../Net/HttpDigestIdentity.cs.meta | 12 - .../WebSocketSharp/Net/HttpHeaderInfo.cs | 114 - .../WebSocketSharp/Net/HttpHeaderInfo.cs.meta | 12 - .../WebSocketSharp/Net/HttpHeaderType.cs | 44 - .../WebSocketSharp/Net/HttpHeaderType.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/HttpListener.cs | 836 ---- .../WebSocketSharp/Net/HttpListener.cs.meta | 12 - .../Net/HttpListenerAsyncResult.cs | 198 - .../Net/HttpListenerAsyncResult.cs.meta | 12 - .../WebSocketSharp/Net/HttpListenerContext.cs | 256 -- .../Net/HttpListenerContext.cs.meta | 12 - .../Net/HttpListenerException.cs | 127 - .../Net/HttpListenerException.cs.meta | 12 - .../WebSocketSharp/Net/HttpListenerPrefix.cs | 228 -- .../Net/HttpListenerPrefix.cs.meta | 12 - .../Net/HttpListenerPrefixCollection.cs | 278 -- .../Net/HttpListenerPrefixCollection.cs.meta | 12 - .../WebSocketSharp/Net/HttpListenerRequest.cs | 718 ---- .../Net/HttpListenerRequest.cs.meta | 12 - .../Net/HttpListenerResponse.cs | 846 ----- .../Net/HttpListenerResponse.cs.meta | 12 - .../WebSocketSharp/Net/HttpRequestHeader.cs | 233 -- .../Net/HttpRequestHeader.cs.meta | 12 - .../WebSocketSharp/Net/HttpResponseHeader.cs | 189 - .../Net/HttpResponseHeader.cs.meta | 12 - .../WebSocketSharp/Net/HttpStatusCode.cs | 359 -- .../WebSocketSharp/Net/HttpStatusCode.cs.meta | 12 - .../Net/HttpStreamAsyncResult.cs | 184 - .../Net/HttpStreamAsyncResult.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/HttpUtility.cs | 1264 ------ .../WebSocketSharp/Net/HttpUtility.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/HttpVersion.cs | 73 - .../WebSocketSharp/Net/HttpVersion.cs.meta | 12 - .../WebSocketSharp/Net/InputChunkState.cs | 52 - .../Net/InputChunkState.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/InputState.cs | 49 - .../WebSocketSharp/Net/InputState.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/LineState.cs | 50 - .../WebSocketSharp/Net/LineState.cs.meta | 12 - .../WebSocketSharp/Net/NetworkCredential.cs | 209 - .../Net/NetworkCredential.cs.meta | 12 - .../Net/QueryStringCollection.cs | 68 - .../Net/QueryStringCollection.cs.meta | 12 - .../WebSocketSharp/Net/ReadBufferState.cs | 124 - .../Net/ReadBufferState.cs.meta | 12 - .../WebSocketSharp/Net/RequestStream.cs | 267 -- .../WebSocketSharp/Net/RequestStream.cs.meta | 12 - .../WebSocketSharp/Net/ResponseStream.cs | 325 -- .../WebSocketSharp/Net/ResponseStream.cs.meta | 12 - .../Net/ServerSslConfiguration.cs | 245 -- .../Net/ServerSslConfiguration.cs.meta | 12 - .../WebSocketSharp/Net/WebHeaderCollection.cs | 1460 ------- .../Net/WebHeaderCollection.cs.meta | 12 - ThirdParty/WebSocketSharp/Net/WebSockets.meta | 9 - .../HttpListenerWebSocketContext.cs | 332 -- .../HttpListenerWebSocketContext.cs.meta | 12 - .../WebSockets/TcpListenerWebSocketContext.cs | 444 --- .../TcpListenerWebSocketContext.cs.meta | 12 - .../Net/WebSockets/WebSocketContext.cs | 208 - .../Net/WebSockets/WebSocketContext.cs.meta | 12 - ThirdParty/WebSocketSharp/Opcode.cs | 68 - ThirdParty/WebSocketSharp/Opcode.cs.meta | 12 - ThirdParty/WebSocketSharp/PayloadData.cs | 234 -- ThirdParty/WebSocketSharp/PayloadData.cs.meta | 12 - ThirdParty/WebSocketSharp/Rsv.cs | 51 - ThirdParty/WebSocketSharp/Rsv.cs.meta | 12 - ThirdParty/WebSocketSharp/Server.meta | 9 - .../Server/HttpRequestEventArgs.cs | 255 -- .../Server/HttpRequestEventArgs.cs.meta | 12 - .../WebSocketSharp/Server/HttpServer.cs | 1659 -------- .../WebSocketSharp/Server/HttpServer.cs.meta | 12 - .../Server/IWebSocketSession.cs | 84 - .../Server/IWebSocketSession.cs.meta | 12 - .../WebSocketSharp/Server/ServerState.cs | 40 - .../WebSocketSharp/Server/ServerState.cs.meta | 12 - .../Server/WebSocketBehavior.cs | 597 --- .../Server/WebSocketBehavior.cs.meta | 12 - .../WebSocketSharp/Server/WebSocketServer.cs | 1510 -------- .../Server/WebSocketServer.cs.meta | 12 - .../Server/WebSocketServiceHost.cs | 262 -- .../Server/WebSocketServiceHost.cs.meta | 12 - .../Server/WebSocketServiceHost`1.cs | 102 - .../Server/WebSocketServiceHost`1.cs.meta | 12 - .../Server/WebSocketServiceManager.cs | 1009 ----- .../Server/WebSocketServiceManager.cs.meta | 12 - .../Server/WebSocketSessionManager.cs | 870 ----- .../Server/WebSocketSessionManager.cs.meta | 12 - ThirdParty/WebSocketSharp/WebSocket.cs | 3380 ----------------- ThirdParty/WebSocketSharp/WebSocket.cs.meta | 12 - .../WebSocketSharp/WebSocketException.cs | 109 - .../WebSocketSharp/WebSocketException.cs.meta | 12 - ThirdParty/WebSocketSharp/WebSocketFrame.cs | 797 ---- .../WebSocketSharp/WebSocketFrame.cs.meta | 12 - ThirdParty/WebSocketSharp/WebSocketState.cs | 65 - .../WebSocketSharp/WebSocketState.cs.meta | 12 - ThirdParty/WebSocketSharp/doc.meta | 9 - ThirdParty/WebSocketSharp/doc/.gitignore | 4 - ThirdParty/WebSocketSharp/doc/doc.sh | 31 - ThirdParty/WebSocketSharp/doc/doc.sh.meta | 8 - ThirdParty/WebSocketSharp/websocket-sharp.snk | Bin 596 -> 0 bytes .../WebSocketSharp/websocket-sharp.snk.meta | 8 - 169 files changed, 125 insertions(+), 30698 deletions(-) create mode 100644 Plugins/websocket-sharp.dll create mode 100644 Plugins/websocket-sharp.dll.meta delete mode 100644 ThirdParty/WebSocketSharp.meta delete mode 100644 ThirdParty/WebSocketSharp/AssemblyInfo.cs delete mode 100644 ThirdParty/WebSocketSharp/AssemblyInfo.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/ByteOrder.cs delete mode 100644 ThirdParty/WebSocketSharp/ByteOrder.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/CloseEventArgs.cs delete mode 100644 ThirdParty/WebSocketSharp/CloseEventArgs.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/CloseStatusCode.cs delete mode 100644 ThirdParty/WebSocketSharp/CloseStatusCode.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/CompressionMethod.cs delete mode 100644 ThirdParty/WebSocketSharp/CompressionMethod.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/ErrorEventArgs.cs delete mode 100644 ThirdParty/WebSocketSharp/ErrorEventArgs.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Ext.cs delete mode 100644 ThirdParty/WebSocketSharp/Ext.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Fin.cs delete mode 100644 ThirdParty/WebSocketSharp/Fin.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/HttpBase.cs delete mode 100644 ThirdParty/WebSocketSharp/HttpBase.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/HttpRequest.cs delete mode 100644 ThirdParty/WebSocketSharp/HttpRequest.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/HttpResponse.cs delete mode 100644 ThirdParty/WebSocketSharp/HttpResponse.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/LogData.cs delete mode 100644 ThirdParty/WebSocketSharp/LogData.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/LogLevel.cs delete mode 100644 ThirdParty/WebSocketSharp/LogLevel.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Logger.cs delete mode 100644 ThirdParty/WebSocketSharp/Logger.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Mask.cs delete mode 100644 ThirdParty/WebSocketSharp/Mask.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/MessageEventArgs.cs delete mode 100644 ThirdParty/WebSocketSharp/MessageEventArgs.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/Chunk.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/Chunk.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ChunkStream.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ChunkStream.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/Cookie.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/Cookie.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/CookieCollection.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/CookieCollection.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/CookieException.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/CookieException.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/EndPointListener.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/EndPointListener.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/EndPointManager.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/EndPointManager.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpConnection.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpConnection.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListener.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListener.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerException.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerException.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpUtility.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpUtility.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpVersion.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/HttpVersion.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/InputChunkState.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/InputChunkState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/InputState.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/InputState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/LineState.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/LineState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/NetworkCredential.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/NetworkCredential.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ReadBufferState.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ReadBufferState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/RequestStream.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/RequestStream.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ResponseStream.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ResponseStream.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs delete mode 100644 ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Opcode.cs delete mode 100644 ThirdParty/WebSocketSharp/Opcode.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/PayloadData.cs delete mode 100644 ThirdParty/WebSocketSharp/PayloadData.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Rsv.cs delete mode 100644 ThirdParty/WebSocketSharp/Rsv.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/HttpServer.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/HttpServer.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/ServerState.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/ServerState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServer.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServer.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs delete mode 100644 ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/WebSocket.cs delete mode 100644 ThirdParty/WebSocketSharp/WebSocket.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/WebSocketException.cs delete mode 100644 ThirdParty/WebSocketSharp/WebSocketException.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/WebSocketFrame.cs delete mode 100644 ThirdParty/WebSocketSharp/WebSocketFrame.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/WebSocketState.cs delete mode 100644 ThirdParty/WebSocketSharp/WebSocketState.cs.meta delete mode 100644 ThirdParty/WebSocketSharp/doc.meta delete mode 100644 ThirdParty/WebSocketSharp/doc/.gitignore delete mode 100644 ThirdParty/WebSocketSharp/doc/doc.sh delete mode 100644 ThirdParty/WebSocketSharp/doc/doc.sh.meta delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.snk delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.snk.meta diff --git a/.gitignore b/.gitignore index d61164584..f0243e5d2 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ Resources.meta Scenes.meta Scripts.meta ThirdParty.meta +Plugins.meta Prefabs.meta Examples.meta Docs.meta diff --git a/Plugins/websocket-sharp.dll b/Plugins/websocket-sharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..b6928de4a25b1f0228ad67dfaaf20a3cf07941b2 GIT binary patch literal 252416 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

;&5v~ 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

A`~=gA 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�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

-ct-hF@}|b4i)XJhcq;%oW5jPaTgse4uf%s^)L4 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�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 literal 0 HcmV?d00001 diff --git a/Plugins/websocket-sharp.dll.meta b/Plugins/websocket-sharp.dll.meta new file mode 100644 index 000000000..06ce25bb7 --- /dev/null +++ b/Plugins/websocket-sharp.dll.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: 8b5738139c45c4847a0cfecae2702428 +timeCreated: 1507825172 +licenseType: Free +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + '': Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude Win: 0 + Exclude Win64: 0 + Exclude WindowsStoreApps: 1 + data: + first: + Any: + second: + enabled: 1 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + data: + first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + data: + first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + data: + first: + Standalone: Linux + second: + enabled: 1 + settings: + CPU: x86 + data: + first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + data: + first: + Standalone: LinuxUniversal + second: + enabled: 1 + settings: {} + data: + first: + Standalone: OSXIntel + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXIntel64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + data: + first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + data: + first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: + SDK: AnySDK + ScriptingBackend: AnyScriptingBackend + userData: + assetBundleName: + assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp.meta b/ThirdParty/WebSocketSharp.meta deleted file mode 100644 index d2586fe8b..000000000 --- a/ThirdParty/WebSocketSharp.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 2d0474a62bedacf43b2e5e4a82cb1067 -folderAsset: yes -timeCreated: 1443712074 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/AssemblyInfo.cs b/ThirdParty/WebSocketSharp/AssemblyInfo.cs deleted file mode 100644 index c85deaa45..000000000 --- a/ThirdParty/WebSocketSharp/AssemblyInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("websocket-sharp")] -[assembly: AssemblyDescription("A C# implementation of the WebSocket protocol client and server")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("websocket-sharp.dll")] -[assembly: AssemblyCopyright("sta.blockhead")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("1.0.2.*")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] diff --git a/ThirdParty/WebSocketSharp/AssemblyInfo.cs.meta b/ThirdParty/WebSocketSharp/AssemblyInfo.cs.meta deleted file mode 100644 index 42f7cc719..000000000 --- a/ThirdParty/WebSocketSharp/AssemblyInfo.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 61c699babd0c04654b19d258855b0cf3 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/ByteOrder.cs b/ThirdParty/WebSocketSharp/ByteOrder.cs deleted file mode 100644 index 317f462ea..000000000 --- a/ThirdParty/WebSocketSharp/ByteOrder.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region License -/* - * ByteOrder.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - ///

- /// Specifies the byte order. - /// - public enum ByteOrder - { - /// - /// Specifies Little-endian. - /// - Little, - /// - /// Specifies Big-endian. - /// - Big - } -} diff --git a/ThirdParty/WebSocketSharp/ByteOrder.cs.meta b/ThirdParty/WebSocketSharp/ByteOrder.cs.meta deleted file mode 100644 index 9d86add6d..000000000 --- a/ThirdParty/WebSocketSharp/ByteOrder.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: f11d995f61434a4469a5ccfb7844c4b8 -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/CloseEventArgs.cs b/ThirdParty/WebSocketSharp/CloseEventArgs.cs deleted file mode 100644 index c665ccde9..000000000 --- a/ThirdParty/WebSocketSharp/CloseEventArgs.cs +++ /dev/null @@ -1,142 +0,0 @@ -#region License -/* - * CloseEventArgs.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Represents the event data for the event. - /// - /// - /// - /// That event occurs when the WebSocket connection has been closed. - /// - /// - /// If you would like to get the reason for the close, you should access - /// the or property. - /// - /// - public class CloseEventArgs : EventArgs - { - #region Private Fields - - private bool _clean; - private PayloadData _payloadData; - - #endregion - - #region Internal Constructors - - internal CloseEventArgs () - { - _payloadData = PayloadData.Empty; - } - - internal CloseEventArgs (ushort code) - : this (code, null) - { - } - - internal CloseEventArgs (CloseStatusCode code) - : this ((ushort) code, null) - { - } - - internal CloseEventArgs (PayloadData payloadData) - { - _payloadData = payloadData; - } - - internal CloseEventArgs (ushort code, string reason) - { - _payloadData = new PayloadData (code, reason); - } - - internal CloseEventArgs (CloseStatusCode code, string reason) - : this ((ushort) code, reason) - { - } - - #endregion - - #region Internal Properties - - internal PayloadData PayloadData { - get { - return _payloadData; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the status code for the close. - /// - /// - /// A that represents the status code for the close if any. - /// - public ushort Code { - get { - return _payloadData.Code; - } - } - - /// - /// Gets the reason for the close. - /// - /// - /// A that represents the reason for the close if any. - /// - public string Reason { - get { - return _payloadData.Reason ?? String.Empty; - } - } - - /// - /// Gets a value indicating whether the connection has been closed cleanly. - /// - /// - /// true if the connection has been closed cleanly; otherwise, false. - /// - public bool WasClean { - get { - return _clean; - } - - internal set { - _clean = value; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/CloseEventArgs.cs.meta b/ThirdParty/WebSocketSharp/CloseEventArgs.cs.meta deleted file mode 100644 index 996c0b2fe..000000000 --- a/ThirdParty/WebSocketSharp/CloseEventArgs.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: af5ecdafab3ebaf488ab17cd168de09b -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/CloseStatusCode.cs b/ThirdParty/WebSocketSharp/CloseStatusCode.cs deleted file mode 100644 index 81f3317a4..000000000 --- a/ThirdParty/WebSocketSharp/CloseStatusCode.cs +++ /dev/null @@ -1,120 +0,0 @@ -#region License -/* - * CloseStatusCode.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates the status code for the WebSocket connection close. - /// - /// - /// - /// The values of this enumeration are defined in - /// - /// Section 7.4 of RFC 6455. - /// - /// - /// "Reserved value" cannot be sent as a status code in - /// closing handshake by an endpoint. - /// - /// - public enum CloseStatusCode : ushort - { - /// - /// Equivalent to close status 1000. Indicates normal close. - /// - Normal = 1000, - /// - /// Equivalent to close status 1001. Indicates that an endpoint is - /// going away. - /// - Away = 1001, - /// - /// Equivalent to close status 1002. Indicates that an endpoint is - /// terminating the connection due to a protocol error. - /// - ProtocolError = 1002, - /// - /// Equivalent to close status 1003. Indicates that an endpoint is - /// terminating the connection because it has received a type of - /// data that it cannot accept. - /// - UnsupportedData = 1003, - /// - /// Equivalent to close status 1004. Still undefined. A Reserved value. - /// - Undefined = 1004, - /// - /// Equivalent to close status 1005. Indicates that no status code was - /// actually present. A Reserved value. - /// - NoStatus = 1005, - /// - /// Equivalent to close status 1006. Indicates that the connection was - /// closed abnormally. A Reserved value. - /// - Abnormal = 1006, - /// - /// Equivalent to close status 1007. Indicates that an endpoint is - /// terminating the connection because it has received a message that - /// contains data that is not consistent with the type of the message. - /// - InvalidData = 1007, - /// - /// Equivalent to close status 1008. Indicates that an endpoint is - /// terminating the connection because it has received a message that - /// violates its policy. - /// - PolicyViolation = 1008, - /// - /// Equivalent to close status 1009. Indicates that an endpoint is - /// terminating the connection because it has received a message that - /// is too big to process. - /// - TooBig = 1009, - /// - /// Equivalent to close status 1010. Indicates that a client is - /// terminating the connection because it has expected the server to - /// negotiate one or more extension, but the server did not return - /// them in the handshake response. - /// - MandatoryExtension = 1010, - /// - /// Equivalent to close status 1011. Indicates that a server is - /// terminating the connection because it has encountered an unexpected - /// condition that prevented it from fulfilling the request. - /// - ServerError = 1011, - /// - /// Equivalent to close status 1015. Indicates that the connection was - /// closed due to a failure to perform a TLS handshake. A Reserved value. - /// - TlsHandshakeFailure = 1015 - } -} diff --git a/ThirdParty/WebSocketSharp/CloseStatusCode.cs.meta b/ThirdParty/WebSocketSharp/CloseStatusCode.cs.meta deleted file mode 100644 index 2af0c9fd7..000000000 --- a/ThirdParty/WebSocketSharp/CloseStatusCode.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c50531448a0a57b4a91264b57b199032 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/CompressionMethod.cs b/ThirdParty/WebSocketSharp/CompressionMethod.cs deleted file mode 100644 index e7f4bcc00..000000000 --- a/ThirdParty/WebSocketSharp/CompressionMethod.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region License -/* - * CompressionMethod.cs - * - * The MIT License - * - * Copyright (c) 2013-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Specifies the compression method used to compress a message on - /// the WebSocket connection. - /// - /// - /// The compression methods that can be used are defined in - /// - /// Compression Extensions for WebSocket. - /// - public enum CompressionMethod : byte - { - /// - /// Specifies non compression. - /// - None, - /// - /// Specifies DEFLATE. - /// - Deflate - } -} diff --git a/ThirdParty/WebSocketSharp/CompressionMethod.cs.meta b/ThirdParty/WebSocketSharp/CompressionMethod.cs.meta deleted file mode 100644 index 2e14cb3cd..000000000 --- a/ThirdParty/WebSocketSharp/CompressionMethod.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: db5ae1d189de0ce4cbe6c4f38e82ef93 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/ErrorEventArgs.cs b/ThirdParty/WebSocketSharp/ErrorEventArgs.cs deleted file mode 100644 index 41502ab08..000000000 --- a/ThirdParty/WebSocketSharp/ErrorEventArgs.cs +++ /dev/null @@ -1,109 +0,0 @@ -#region License -/* - * ErrorEventArgs.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Frank Razenberg - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Represents the event data for the event. - /// - /// - /// - /// That event occurs when the gets an error. - /// - /// - /// If you would like to get the error message, you should access - /// the property. - /// - /// - /// And if the error is due to an exception, you can get it by accessing - /// the property. - /// - /// - public class ErrorEventArgs : EventArgs - { - #region Private Fields - - private Exception _exception; - private string _message; - - #endregion - - #region Internal Constructors - - internal ErrorEventArgs (string message) - : this (message, null) - { - } - - internal ErrorEventArgs (string message, Exception exception) - { - _message = message; - _exception = exception; - } - - #endregion - - #region Public Properties - - /// - /// Gets the exception that caused the error. - /// - /// - /// An instance that represents the cause of - /// the error if it is due to an exception; otherwise, . - /// - public Exception Exception { - get { - return _exception; - } - } - - /// - /// Gets the error message. - /// - /// - /// A that represents the error message. - /// - public string Message { - get { - return _message; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/ErrorEventArgs.cs.meta b/ThirdParty/WebSocketSharp/ErrorEventArgs.cs.meta deleted file mode 100644 index db533e83d..000000000 --- a/ThirdParty/WebSocketSharp/ErrorEventArgs.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: f6c2f24b4bbb3574db74edc46880404f -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Ext.cs b/ThirdParty/WebSocketSharp/Ext.cs deleted file mode 100644 index 8026fbf9d..000000000 --- a/ThirdParty/WebSocketSharp/Ext.cs +++ /dev/null @@ -1,2043 +0,0 @@ -#region License -/* - * Ext.cs - * - * Some parts of this code are derived from Mono (http://www.mono-project.com): - * - GetStatusDescription is derived from HttpListenerResponse.cs (System.Net) - * - IsPredefinedScheme is derived from Uri.cs (System) - * - MaybeUri is derived from Uri.cs (System) - * - * The MIT License - * - * Copyright (c) 2001 Garrett Rooney - * Copyright (c) 2003 Ian MacLean - * Copyright (c) 2003 Ben Maurer - * Copyright (c) 2003, 2005, 2009 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2009 Stephane Delcroix - * Copyright (c) 2010-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - * - Nikola Kovacevic - * - Chris Swiedler - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.IO.Compression; -using System.Net.Sockets; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using WebSocketSharp.Net; -using WebSocketSharp.Net.WebSockets; -using WebSocketSharp.Server; - -namespace WebSocketSharp -{ - /// - /// Provides a set of static methods for websocket-sharp. - /// - public static class Ext - { - #region Private Fields - - private static readonly byte[] _last = new byte[] { 0x00 }; - private static readonly int _retry = 5; - private const string _tspecials = "()<>@,;:\\\"/[]?={} \t"; - - #endregion - - #region Private Methods - - private static byte[] compress (this byte[] data) - { - if (data.LongLength == 0) - //return new byte[] { 0x00, 0x00, 0x00, 0xff, 0xff }; - return data; - - using (var input = new MemoryStream (data)) - return input.compressToArray (); - } - - private static MemoryStream compress (this Stream stream) - { - var output = new MemoryStream (); - if (stream.Length == 0) - return output; - - stream.Position = 0; - using (var ds = new DeflateStream (output, CompressionMode.Compress, true)) { - stream.CopyTo (ds, 1024); - ds.Close (); // BFINAL set to 1. - output.Write (_last, 0, 1); - output.Position = 0; - - return output; - } - } - - private static byte[] compressToArray (this Stream stream) - { - using (var output = stream.compress ()) { - output.Close (); - return output.ToArray (); - } - } - - private static byte[] decompress (this byte[] data) - { - if (data.LongLength == 0) - return data; - - using (var input = new MemoryStream (data)) - return input.decompressToArray (); - } - - private static MemoryStream decompress (this Stream stream) - { - var output = new MemoryStream (); - if (stream.Length == 0) - return output; - - stream.Position = 0; - using (var ds = new DeflateStream (stream, CompressionMode.Decompress, true)) { - ds.CopyTo (output, 1024); - output.Position = 0; - - return output; - } - } - - private static byte[] decompressToArray (this Stream stream) - { - using (var output = stream.decompress ()) { - output.Close (); - return output.ToArray (); - } - } - - private static void times (this ulong n, Action action) - { - for (ulong i = 0; i < n; i++) - action (); - } - - #endregion - - #region Internal Methods - - internal static byte[] Append (this ushort code, string reason) - { - var ret = code.InternalToByteArray (ByteOrder.Big); - if (reason != null && reason.Length > 0) { - var buff = new List (ret); - buff.AddRange (Encoding.UTF8.GetBytes (reason)); - ret = buff.ToArray (); - } - - return ret; - } - - internal static string CheckIfAvailable ( - this ServerState state, bool ready, bool start, bool shutting) - { - return (!ready && (state == ServerState.Ready || state == ServerState.Stop)) || - (!start && state == ServerState.Start) || - (!shutting && state == ServerState.ShuttingDown) - ? "This operation isn't available in: " + state.ToString ().ToLower () - : null; - } - - internal static string CheckIfAvailable ( - this WebSocketState state, bool connecting, bool open, bool closing, bool closed) - { - return (!connecting && state == WebSocketState.Connecting) || - (!open && state == WebSocketState.Open) || - (!closing && state == WebSocketState.Closing) || - (!closed && state == WebSocketState.Closed) - ? "This operation isn't available in: " + state.ToString ().ToLower () - : null; - } - - internal static string CheckIfValidProtocols (this string[] protocols) - { - return protocols.Contains ( - protocol => protocol == null || protocol.Length == 0 || !protocol.IsToken ()) - ? "Contains an invalid value." - : protocols.ContainsTwice () - ? "Contains a value twice." - : null; - } - - internal static string CheckIfValidSessionID (this string id) - { - return id == null || id.Length == 0 ? "'id' is null or empty." : null; - } - - internal static bool CheckWaitTime (this TimeSpan time, out string message) - { - message = null; - - if (time <= TimeSpan.Zero) { - message = "Zero or less."; - return false; - } - - return true; - } - - internal static void Close (this HttpListenerResponse response, HttpStatusCode code) - { - response.StatusCode = (int) code; - response.OutputStream.Close (); - } - - internal static void CloseWithAuthChallenge ( - this HttpListenerResponse response, string challenge) - { - response.Headers.InternalSet ("WWW-Authenticate", challenge, true); - response.Close (HttpStatusCode.Unauthorized); - } - - internal static byte[] Compress (this byte[] data, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? data.compress () - : data; - } - - internal static Stream Compress (this Stream stream, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? stream.compress () - : stream; - } - - internal static byte[] CompressToArray (this Stream stream, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? stream.compressToArray () - : stream.ToByteArray (); - } - - internal static bool Contains (this IEnumerable source, Func condition) - { - foreach (T elm in source) - if (condition (elm)) - return true; - - return false; - } - - internal static bool ContainsTwice (this string[] values) - { - var len = values.Length; - - Func contains = null; - contains = idx => { - if (idx < len - 1) { - for (var i = idx + 1; i < len; i++) - if (values[i] == values[idx]) - return true; - - return contains (++idx); - } - - return false; - }; - - return contains (0); - } - - internal static T[] Copy (this T[] source, int length) - { - var dest = new T[length]; - Array.Copy (source, 0, dest, 0, length); - - return dest; - } - - internal static T[] Copy (this T[] source, long length) - { - var dest = new T[length]; - Array.Copy (source, 0, dest, 0, length); - - return dest; - } - - internal static void CopyTo (this Stream source, Stream destination, int bufferLength) - { - var buff = new byte[bufferLength]; - var nread = 0; - while ((nread = source.Read (buff, 0, bufferLength)) > 0) - destination.Write (buff, 0, nread); - } - - internal static void CopyToAsync ( - this Stream source, - Stream destination, - int bufferLength, - Action completed, - Action error) - { - var buff = new byte[bufferLength]; - - AsyncCallback callback = null; - callback = ar => { - try { - var nread = source.EndRead (ar); - if (nread <= 0) { - if (completed != null) - completed (); - - return; - } - - destination.Write (buff, 0, nread); - source.BeginRead (buff, 0, bufferLength, callback, null); - } - catch (Exception ex) { - if (error != null) - error (ex); - } - }; - - try { - source.BeginRead (buff, 0, bufferLength, callback, null); - } - catch (Exception ex) { - if (error != null) - error (ex); - } - } - - internal static byte[] Decompress (this byte[] data, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? data.decompress () - : data; - } - - internal static Stream Decompress (this Stream stream, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? stream.decompress () - : stream; - } - - internal static byte[] DecompressToArray (this Stream stream, CompressionMethod method) - { - return method == CompressionMethod.Deflate - ? stream.decompressToArray () - : stream.ToByteArray (); - } - - /// - /// Determines whether the specified equals the specified , - /// and invokes the specified Action<int> delegate at the same time. - /// - /// - /// true if equals ; - /// otherwise, false. - /// - /// - /// An to compare. - /// - /// - /// A to compare. - /// - /// - /// An Action<int> delegate that references the method(s) called - /// at the same time as comparing. An parameter to pass to - /// the method(s) is . - /// - internal static bool EqualsWith (this int value, char c, Action action) - { - action (value); - return value == c - 0; - } - - /// - /// Gets the absolute path from the specified . - /// - /// - /// A that represents the absolute path if it's successfully found; - /// otherwise, . - /// - /// - /// A that represents the URI to get the absolute path from. - /// - internal static string GetAbsolutePath (this Uri uri) - { - if (uri.IsAbsoluteUri) - return uri.AbsolutePath; - - var original = uri.OriginalString; - if (original[0] != '/') - return null; - - var idx = original.IndexOfAny (new[] { '?', '#' }); - return idx > 0 ? original.Substring (0, idx) : original; - } - - internal static string GetDnsSafeHost (this Uri uri, bool bracketIPv6) - { - return bracketIPv6 && uri.HostNameType == UriHostNameType.IPv6 - ? uri.Host - : uri.DnsSafeHost; - } - - internal static string GetMessage (this CloseStatusCode code) - { - return code == CloseStatusCode.ProtocolError - ? "A WebSocket protocol error has occurred." - : code == CloseStatusCode.UnsupportedData - ? "Unsupported data has been received." - : code == CloseStatusCode.Abnormal - ? "An exception has occurred." - : code == CloseStatusCode.InvalidData - ? "Invalid data has been received." - : code == CloseStatusCode.PolicyViolation - ? "A policy violation has occurred." - : code == CloseStatusCode.TooBig - ? "A too big message has been received." - : code == CloseStatusCode.MandatoryExtension - ? "WebSocket client didn't receive expected extension(s)." - : code == CloseStatusCode.ServerError - ? "WebSocket server got an internal error." - : code == CloseStatusCode.TlsHandshakeFailure - ? "An error has occurred during a TLS handshake." - : String.Empty; - } - - /// - /// Gets the name from the specified that contains a pair of name and - /// value separated by a separator character. - /// - /// - /// A that represents the name if any; otherwise, null. - /// - /// - /// A that contains a pair of name and value separated by - /// a separator character. - /// - /// - /// A that represents the separator character. - /// - internal static string GetName (this string nameAndValue, char separator) - { - var idx = nameAndValue.IndexOf (separator); - return idx > 0 ? nameAndValue.Substring (0, idx).Trim () : null; - } - - /// - /// Gets the value from the specified that contains a pair of name and - /// value separated by a separator character. - /// - /// - /// A that represents the value if any; otherwise, null. - /// - /// - /// A that contains a pair of name and value separated by - /// a separator character. - /// - /// - /// A that represents the separator character. - /// - internal static string GetValue (this string nameAndValue, char separator) - { - var idx = nameAndValue.IndexOf (separator); - return idx > -1 && idx < nameAndValue.Length - 1 - ? nameAndValue.Substring (idx + 1).Trim () - : null; - } - - internal static string GetValue (this string nameAndValue, char separator, bool unquote) - { - var idx = nameAndValue.IndexOf (separator); - if (idx < 0 || idx == nameAndValue.Length - 1) - return null; - - var val = nameAndValue.Substring (idx + 1).Trim (); - return unquote ? val.Unquote () : val; - } - - internal static TcpListenerWebSocketContext GetWebSocketContext ( - this TcpClient tcpClient, - string protocol, - bool secure, - ServerSslConfiguration sslConfig, - Logger logger) - { - return new TcpListenerWebSocketContext (tcpClient, protocol, secure, sslConfig, logger); - } - - internal static byte[] InternalToByteArray (this ushort value, ByteOrder order) - { - var bytes = BitConverter.GetBytes (value); - if (!order.IsHostOrder ()) - Array.Reverse (bytes); - - return bytes; - } - - internal static byte[] InternalToByteArray (this ulong value, ByteOrder order) - { - var bytes = BitConverter.GetBytes (value); - if (!order.IsHostOrder ()) - Array.Reverse (bytes); - - return bytes; - } - - internal static bool IsCompressionExtension (this string value, CompressionMethod method) - { - return value.StartsWith (method.ToExtensionString ()); - } - - internal static bool IsControl (this byte opcode) - { - return opcode > 0x7 && opcode < 0x10; - } - - internal static bool IsControl (this Opcode opcode) - { - return opcode >= Opcode.Close; - } - - internal static bool IsData (this byte opcode) - { - return opcode == 0x1 || opcode == 0x2; - } - - internal static bool IsData (this Opcode opcode) - { - return opcode == Opcode.Text || opcode == Opcode.Binary; - } - - internal static bool IsPortNumber (this int value) - { - return value > 0 && value < 65536; - } - - internal static bool IsReserved (this ushort code) - { - return code == 1004 - || code == 1005 - || code == 1006 - || code == 1015; - } - - internal static bool IsReserved (this CloseStatusCode code) - { - return code == CloseStatusCode.Undefined - || code == CloseStatusCode.NoStatus - || code == CloseStatusCode.Abnormal - || code == CloseStatusCode.TlsHandshakeFailure; - } - - internal static bool IsSupported (this byte opcode) - { - return Enum.IsDefined (typeof (Opcode), opcode); - } - - internal static bool IsText (this string value) - { - var len = value.Length; - for (var i = 0; i < len; i++) { - var c = value[i]; - if (c < 0x20 && !"\r\n\t".Contains (c)) - return false; - - if (c == 0x7f) - return false; - - if (c == '\n' && ++i < len) { - c = value[i]; - if (!" \t".Contains (c)) - return false; - } - } - - return true; - } - - internal static bool IsToken (this string value) - { - foreach (var c in value) - if (c < 0x20 || c >= 0x7f || _tspecials.Contains (c)) - return false; - - return true; - } - - internal static string Quote (this string value) - { - return String.Format ("\"{0}\"", value.Replace ("\"", "\\\"")); - } - - internal static byte[] ReadBytes (this Stream stream, int length) - { - var buff = new byte[length]; - var offset = 0; - try { - var nread = 0; - while (length > 0) { - nread = stream.Read (buff, offset, length); - if (nread == 0) - break; - - offset += nread; - length -= nread; - } - } - catch { - } - - return buff.SubArray (0, offset); - } - - internal static byte[] ReadBytes (this Stream stream, long length, int bufferLength) - { - using (var dest = new MemoryStream ()) { - try { - var buff = new byte[bufferLength]; - var nread = 0; - while (length > 0) { - if (length < bufferLength) - bufferLength = (int) length; - - nread = stream.Read (buff, 0, bufferLength); - if (nread == 0) - break; - - dest.Write (buff, 0, nread); - length -= nread; - } - } - catch { - } - - dest.Close (); - return dest.ToArray (); - } - } - - internal static void ReadBytesAsync ( - this Stream stream, int length, Action completed, Action error - ) - { - var buff = new byte[length]; - var offset = 0; - var retry = 0; - - AsyncCallback callback = null; - callback = - ar => { - try { - var nread = stream.EndRead (ar); - if (nread == 0 && retry < _retry) { - retry++; - stream.BeginRead (buff, offset, length, callback, null); - - return; - } - - if (nread == 0 || nread == length) { - if (completed != null) - completed (buff.SubArray (0, offset + nread)); - - return; - } - - retry = 0; - - offset += nread; - length -= nread; - - stream.BeginRead (buff, offset, length, callback, null); - } - catch (Exception ex) { - if (error != null) - error (ex); - } - }; - - try { - stream.BeginRead (buff, offset, length, callback, null); - } - catch (Exception ex) { - if (error != null) - error (ex); - } - } - - internal static void ReadBytesAsync ( - this Stream stream, - long length, - int bufferLength, - Action completed, - Action error - ) - { - var dest = new MemoryStream (); - var buff = new byte[bufferLength]; - var retry = 0; - - Action read = null; - read = - len => { - if (len < bufferLength) - bufferLength = (int) len; - - stream.BeginRead ( - buff, - 0, - bufferLength, - ar => { - try { - var nread = stream.EndRead (ar); - if (nread > 0) - dest.Write (buff, 0, nread); - - if (nread == 0 && retry < _retry) { - retry++; - read (len); - - return; - } - - if (nread == 0 || nread == len) { - if (completed != null) { - dest.Close (); - completed (dest.ToArray ()); - } - - dest.Dispose (); - return; - } - - retry = 0; - read (len - nread); - } - catch (Exception ex) { - dest.Dispose (); - if (error != null) - error (ex); - } - }, - null - ); - }; - - try { - read (length); - } - catch (Exception ex) { - dest.Dispose (); - if (error != null) - error (ex); - } - } - - internal static string RemovePrefix (this string value, params string[] prefixes) - { - var idx = 0; - foreach (var prefix in prefixes) { - if (value.StartsWith (prefix)) { - idx = prefix.Length; - break; - } - } - - return idx > 0 ? value.Substring (idx) : value; - } - - internal static T[] Reverse (this T[] array) - { - var len = array.Length; - var reverse = new T[len]; - - var end = len - 1; - for (var i = 0; i <= end; i++) - reverse[i] = array[end - i]; - - return reverse; - } - - internal static IEnumerable SplitHeaderValue ( - this string value, params char[] separators) - { - var len = value.Length; - var seps = new string (separators); - - var buff = new StringBuilder (32); - var escaped = false; - var quoted = false; - - for (var i = 0; i < len; i++) { - var c = value[i]; - if (c == '"') { - if (escaped) - escaped = !escaped; - else - quoted = !quoted; - } - else if (c == '\\') { - if (i < len - 1 && value[i + 1] == '"') - escaped = true; - } - else if (seps.Contains (c)) { - if (!quoted) { - yield return buff.ToString (); - buff.Length = 0; - - continue; - } - } - else { - } - - buff.Append (c); - } - - if (buff.Length > 0) - yield return buff.ToString (); - } - - internal static byte[] ToByteArray (this Stream stream) - { - using (var output = new MemoryStream ()) { - stream.Position = 0; - stream.CopyTo (output, 1024); - output.Close (); - - return output.ToArray (); - } - } - - internal static CompressionMethod ToCompressionMethod (this string value) - { - foreach (CompressionMethod method in Enum.GetValues (typeof (CompressionMethod))) - if (method.ToExtensionString () == value) - return method; - - return CompressionMethod.None; - } - - internal static string ToExtensionString ( - this CompressionMethod method, params string[] parameters) - { - if (method == CompressionMethod.None) - return String.Empty; - - var m = String.Format ("permessage-{0}", method.ToString ().ToLower ()); - if (parameters == null || parameters.Length == 0) - return m; - - return String.Format ("{0}; {1}", m, parameters.ToString ("; ")); - } - - internal static System.Net.IPAddress ToIPAddress (this string value) - { - if (value == null || value.Length == 0) - return null; - - System.Net.IPAddress addr; - if (System.Net.IPAddress.TryParse (value, out addr)) - return addr; - - try { - var addrs = System.Net.Dns.GetHostAddresses (value); - return addrs[0]; - } - catch { - return null; - } - } - - internal static List ToList (this IEnumerable source) - { - return new List (source); - } - - internal static string ToString ( - this System.Net.IPAddress address, bool bracketIPv6 - ) - { - return bracketIPv6 && address.AddressFamily == AddressFamily.InterNetworkV6 - ? String.Format ("[{0}]", address.ToString ()) - : address.ToString (); - } - - internal static ushort ToUInt16 (this byte[] source, ByteOrder sourceOrder) - { - return BitConverter.ToUInt16 (source.ToHostOrder (sourceOrder), 0); - } - - internal static ulong ToUInt64 (this byte[] source, ByteOrder sourceOrder) - { - return BitConverter.ToUInt64 (source.ToHostOrder (sourceOrder), 0); - } - - internal static string TrimSlashFromEnd (this string value) - { - var ret = value.TrimEnd ('/'); - return ret.Length > 0 ? ret : "/"; - } - - internal static string TrimSlashOrBackslashFromEnd (this string value) - { - var ret = value.TrimEnd ('/', '\\'); - return ret.Length > 0 ? ret : value[0].ToString (); - } - - /// - /// Tries to create a new for WebSocket with - /// the specified . - /// - /// - /// true if the was successfully created; - /// otherwise, false. - /// - /// - /// A that represents a WebSocket URL to try. - /// - /// - /// When this method returns, a that - /// represents the WebSocket URL or - /// if is invalid. - /// - /// - /// When this method returns, a that - /// represents an error message or - /// if is valid. - /// - internal static bool TryCreateWebSocketUri ( - this string uriString, out Uri result, out string message - ) - { - result = null; - message = null; - - var uri = uriString.ToUri (); - if (uri == null) { - message = "An invalid URI string."; - return false; - } - - if (!uri.IsAbsoluteUri) { - message = "A relative URI."; - return false; - } - - var schm = uri.Scheme; - if (!(schm == "ws" || schm == "wss")) { - message = "The scheme part is not 'ws' or 'wss'."; - return false; - } - - var port = uri.Port; - if (port == 0) { - message = "The port part is zero."; - return false; - } - - if (uri.Fragment.Length > 0) { - message = "It includes the fragment component."; - return false; - } - - result = port != -1 - ? uri - : new Uri ( - String.Format ( - "{0}://{1}:{2}{3}", - schm, - uri.Host, - schm == "ws" ? 80 : 443, - uri.PathAndQuery - ) - ); - - return true; - } - - internal static bool TryGetUTF8DecodedString (this byte[] bytes, out string s) - { - s = null; - - try { - s = Encoding.UTF8.GetString (bytes); - } - catch { - return false; - } - - return true; - } - - internal static bool TryGetUTF8EncodedBytes (this string s, out byte[] bytes) - { - bytes = null; - - try { - bytes = Encoding.UTF8.GetBytes (s); - } - catch { - return false; - } - - return true; - } - - internal static bool TryOpenRead ( - this FileInfo fileInfo, out FileStream fileStream - ) - { - fileStream = null; - - try { - fileStream = fileInfo.OpenRead (); - } - catch { - return false; - } - - return true; - } - - internal static string Unquote (this string value) - { - var start = value.IndexOf ('"'); - if (start < 0) - return value; - - var end = value.LastIndexOf ('"'); - var len = end - start - 1; - - return len < 0 - ? value - : len == 0 - ? String.Empty - : value.Substring (start + 1, len).Replace ("\\\"", "\""); - } - - internal static string UTF8Decode (this byte[] bytes) - { - try { - return Encoding.UTF8.GetString (bytes); - } - catch { - return null; - } - } - - internal static byte[] UTF8Encode (this string s) - { - return Encoding.UTF8.GetBytes (s); - } - - internal static void WriteBytes (this Stream stream, byte[] bytes, int bufferLength) - { - using (var input = new MemoryStream (bytes)) - input.CopyTo (stream, bufferLength); - } - - internal static void WriteBytesAsync ( - this Stream stream, byte[] bytes, int bufferLength, Action completed, Action error) - { - var input = new MemoryStream (bytes); - input.CopyToAsync ( - stream, - bufferLength, - () => { - if (completed != null) - completed (); - - input.Dispose (); - }, - ex => { - input.Dispose (); - if (error != null) - error (ex); - }); - } - - #endregion - - #region Public Methods - - /// - /// Determines whether the specified contains any of characters in - /// the specified array of . - /// - /// - /// true if contains any of ; - /// otherwise, false. - /// - /// - /// A to test. - /// - /// - /// An array of that contains characters to find. - /// - public static bool Contains (this string value, params char[] chars) - { - return chars == null || chars.Length == 0 - ? true - : value == null || value.Length == 0 - ? false - : value.IndexOfAny (chars) > -1; - } - - /// - /// Determines whether the specified contains - /// the entry with the specified . - /// - /// - /// true if contains the entry with - /// ; otherwise, false. - /// - /// - /// A to test. - /// - /// - /// A that represents the key of the entry to find. - /// - public static bool Contains (this NameValueCollection collection, string name) - { - return collection != null && collection.Count > 0 ? collection[name] != null : false; - } - - /// - /// Determines whether the specified contains the entry with - /// the specified both and . - /// - /// - /// true if contains the entry with both - /// and ; otherwise, false. - /// - /// - /// A to test. - /// - /// - /// A that represents the key of the entry to find. - /// - /// - /// A that represents the value of the entry to find. - /// - public static bool Contains (this NameValueCollection collection, string name, string value) - { - if (collection == null || collection.Count == 0) - return false; - - var vals = collection[name]; - if (vals == null) - return false; - - foreach (var val in vals.Split (',')) - if (val.Trim ().Equals (value, StringComparison.OrdinalIgnoreCase)) - return true; - - return false; - } - - /// - /// Emits the specified delegate if it isn't . - /// - /// - /// A to emit. - /// - /// - /// An from which emits this . - /// - /// - /// A that contains no event data. - /// - public static void Emit (this EventHandler eventHandler, object sender, EventArgs e) - { - if (eventHandler != null) - eventHandler (sender, e); - } - - /// - /// Emits the specified EventHandler<TEventArgs> delegate if it isn't - /// . - /// - /// - /// An EventHandler<TEventArgs> to emit. - /// - /// - /// An from which emits this . - /// - /// - /// A TEventArgs that represents the event data. - /// - /// - /// The type of the event data generated by the event. - /// - public static void Emit ( - this EventHandler eventHandler, object sender, TEventArgs e) - where TEventArgs : EventArgs - { - if (eventHandler != null) - eventHandler (sender, e); - } - - /// - /// Gets the collection of the HTTP cookies from the specified HTTP . - /// - /// - /// A that receives a collection of the HTTP cookies. - /// - /// - /// A that contains a collection of the HTTP headers. - /// - /// - /// true if is a collection of the response headers; - /// otherwise, false. - /// - public static CookieCollection GetCookies (this NameValueCollection headers, bool response) - { - var name = response ? "Set-Cookie" : "Cookie"; - return headers != null && headers.Contains (name) - ? CookieCollection.Parse (headers[name], response) - : new CookieCollection (); - } - - /// - /// Gets the description of the specified HTTP status . - /// - /// - /// A that represents the description of the HTTP status code. - /// - /// - /// One of enum values, indicates the HTTP status code. - /// - public static string GetDescription (this HttpStatusCode code) - { - return ((int) code).GetStatusDescription (); - } - - /// - /// Gets the description of the specified HTTP status . - /// - /// - /// A that represents the description of the HTTP status code. - /// - /// - /// An that represents the HTTP status code. - /// - public static string GetStatusDescription (this int code) - { - switch (code) { - case 100: return "Continue"; - case 101: return "Switching Protocols"; - case 102: return "Processing"; - case 200: return "OK"; - case 201: return "Created"; - case 202: return "Accepted"; - case 203: return "Non-Authoritative Information"; - case 204: return "No Content"; - case 205: return "Reset Content"; - case 206: return "Partial Content"; - case 207: return "Multi-Status"; - case 300: return "Multiple Choices"; - case 301: return "Moved Permanently"; - case 302: return "Found"; - case 303: return "See Other"; - case 304: return "Not Modified"; - case 305: return "Use Proxy"; - case 307: return "Temporary Redirect"; - case 400: return "Bad Request"; - case 401: return "Unauthorized"; - case 402: return "Payment Required"; - case 403: return "Forbidden"; - case 404: return "Not Found"; - case 405: return "Method Not Allowed"; - case 406: return "Not Acceptable"; - case 407: return "Proxy Authentication Required"; - case 408: return "Request Timeout"; - case 409: return "Conflict"; - case 410: return "Gone"; - case 411: return "Length Required"; - case 412: return "Precondition Failed"; - case 413: return "Request Entity Too Large"; - case 414: return "Request-Uri Too Long"; - case 415: return "Unsupported Media Type"; - case 416: return "Requested Range Not Satisfiable"; - case 417: return "Expectation Failed"; - case 422: return "Unprocessable Entity"; - case 423: return "Locked"; - case 424: return "Failed Dependency"; - case 500: return "Internal Server Error"; - case 501: return "Not Implemented"; - case 502: return "Bad Gateway"; - case 503: return "Service Unavailable"; - case 504: return "Gateway Timeout"; - case 505: return "Http Version Not Supported"; - case 507: return "Insufficient Storage"; - } - - return String.Empty; - } - - /// - /// Determines whether the specified is in the - /// range of the status code for the WebSocket connection close. - /// - /// - /// - /// The ranges are the following: - /// - /// - /// - /// - /// 1000-2999: These numbers are reserved for definition by - /// the WebSocket protocol. - /// - /// - /// - /// - /// 3000-3999: These numbers are reserved for use by libraries, - /// frameworks, and applications. - /// - /// - /// - /// - /// 4000-4999: These numbers are reserved for private use. - /// - /// - /// - /// - /// - /// true if is in the range of - /// the status code for the close; otherwise, false. - /// - /// - /// A to test. - /// - public static bool IsCloseStatusCode (this ushort value) - { - return value > 999 && value < 5000; - } - - /// - /// Determines whether the specified is - /// enclosed in the specified . - /// - /// - /// true if is enclosed in - /// ; otherwise, false. - /// - /// - /// A to test. - /// - /// - /// A to find. - /// - public static bool IsEnclosedIn (this string value, char c) - { - return value != null - && value.Length > 1 - && value[0] == c - && value[value.Length - 1] == c; - } - - /// - /// Determines whether the specified is host (this computer - /// architecture) byte order. - /// - /// - /// true if is host byte order; otherwise, false. - /// - /// - /// One of the enum values, to test. - /// - public static bool IsHostOrder (this ByteOrder order) - { - // true: !(true ^ true) or !(false ^ false) - // false: !(true ^ false) or !(false ^ true) - return !(BitConverter.IsLittleEndian ^ (order == ByteOrder.Little)); - } - - /// - /// Determines whether the specified - /// represents a local IP address. - /// - /// - /// This local means NOT REMOTE for the current host. - /// - /// - /// true if represents a local IP address; - /// otherwise, false. - /// - /// - /// A to test. - /// - public static bool IsLocal (this System.Net.IPAddress address) - { - if (address == null) - return false; - - if (address.Equals (System.Net.IPAddress.Any)) - return true; - - if (address.Equals (System.Net.IPAddress.Loopback)) - return true; - - if (Socket.OSSupportsIPv6) { - if (address.Equals (System.Net.IPAddress.IPv6Any)) - return true; - - if (address.Equals (System.Net.IPAddress.IPv6Loopback)) - return true; - } - - var host = System.Net.Dns.GetHostName (); - var addrs = System.Net.Dns.GetHostAddresses (host); - foreach (var addr in addrs) { - if (address.Equals (addr)) - return true; - } - - return false; - } - - /// - /// Determines whether the specified is - /// or an empty string. - /// - /// - /// true if is or - /// an empty string; otherwise, false. - /// - /// - /// A to test. - /// - public static bool IsNullOrEmpty (this string value) - { - return value == null || value.Length == 0; - } - - /// - /// Determines whether the specified is - /// a predefined scheme. - /// - /// - /// true if is a predefined scheme; - /// otherwise, false. - /// - /// - /// A to test. - /// - public static bool IsPredefinedScheme (this string value) - { - if (value == null || value.Length < 2) - return false; - - var c = value[0]; - if (c == 'h') - return value == "http" || value == "https"; - - if (c == 'w') - return value == "ws" || value == "wss"; - - if (c == 'f') - return value == "file" || value == "ftp"; - - if (c == 'g') - return value == "gopher"; - - if (c == 'm') - return value == "mailto"; - - if (c == 'n') { - c = value[1]; - return c == 'e' - ? value == "news" || value == "net.pipe" || value == "net.tcp" - : value == "nntp"; - } - - return false; - } - - /// - /// Determines whether the specified is - /// an HTTP Upgrade request to switch to the specified . - /// - /// - /// true if is an HTTP Upgrade request to switch to - /// ; otherwise, false. - /// - /// - /// A that represents the HTTP request. - /// - /// - /// A that represents the protocol name. - /// - /// - /// - /// is . - /// - /// - /// -or- - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - public static bool IsUpgradeTo (this HttpListenerRequest request, string protocol) - { - if (request == null) - throw new ArgumentNullException ("request"); - - if (protocol == null) - throw new ArgumentNullException ("protocol"); - - if (protocol.Length == 0) - throw new ArgumentException ("An empty string.", "protocol"); - - return request.Headers.Contains ("Upgrade", protocol) && - request.Headers.Contains ("Connection", "Upgrade"); - } - - /// - /// Determines whether the specified is a URI string. - /// - /// - /// true if may be a URI string; - /// otherwise, false. - /// - /// - /// A to test. - /// - public static bool MaybeUri (this string value) - { - if (value == null || value.Length == 0) - return false; - - var idx = value.IndexOf (':'); - if (idx == -1) - return false; - - if (idx >= 10) - return false; - - var schm = value.Substring (0, idx); - return schm.IsPredefinedScheme (); - } - - /// - /// Retrieves a sub-array from the specified . A sub-array starts at - /// the specified element position in . - /// - /// - /// An array of T that receives a sub-array, or an empty array of T if any problems with - /// the parameters. - /// - /// - /// An array of T from which to retrieve a sub-array. - /// - /// - /// An that represents the zero-based starting position of - /// a sub-array in . - /// - /// - /// An that represents the number of elements to retrieve. - /// - /// - /// The type of elements in . - /// - public static T[] SubArray (this T[] array, int startIndex, int length) - { - int len; - if (array == null || (len = array.Length) == 0) - return new T[0]; - - if (startIndex < 0 || length <= 0 || startIndex + length > len) - return new T[0]; - - if (startIndex == 0 && length == len) - return array; - - var subArray = new T[length]; - Array.Copy (array, startIndex, subArray, 0, length); - - return subArray; - } - - /// - /// Retrieves a sub-array from the specified . A sub-array starts at - /// the specified element position in . - /// - /// - /// An array of T that receives a sub-array, or an empty array of T if any problems with - /// the parameters. - /// - /// - /// An array of T from which to retrieve a sub-array. - /// - /// - /// A that represents the zero-based starting position of - /// a sub-array in . - /// - /// - /// A that represents the number of elements to retrieve. - /// - /// - /// The type of elements in . - /// - public static T[] SubArray (this T[] array, long startIndex, long length) - { - long len; - if (array == null || (len = array.LongLength) == 0) - return new T[0]; - - if (startIndex < 0 || length <= 0 || startIndex + length > len) - return new T[0]; - - if (startIndex == 0 && length == len) - return array; - - var subArray = new T[length]; - Array.Copy (array, startIndex, subArray, 0, length); - - return subArray; - } - - /// - /// Executes the specified delegate times. - /// - /// - /// An is the number of times to execute. - /// - /// - /// An delegate that references the method(s) to execute. - /// - public static void Times (this int n, Action action) - { - if (n > 0 && action != null) - ((ulong) n).times (action); - } - - /// - /// Executes the specified delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An delegate that references the method(s) to execute. - /// - public static void Times (this long n, Action action) - { - if (n > 0 && action != null) - ((ulong) n).times (action); - } - - /// - /// Executes the specified delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An delegate that references the method(s) to execute. - /// - public static void Times (this uint n, Action action) - { - if (n > 0 && action != null) - ((ulong) n).times (action); - } - - /// - /// Executes the specified delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An delegate that references the method(s) to execute. - /// - public static void Times (this ulong n, Action action) - { - if (n > 0 && action != null) - n.times (action); - } - - /// - /// Executes the specified Action<int> delegate times. - /// - /// - /// An is the number of times to execute. - /// - /// - /// An Action<int> delegate that references the method(s) to execute. - /// An parameter to pass to the method(s) is the zero-based count of - /// iteration. - /// - public static void Times (this int n, Action action) - { - if (n > 0 && action != null) - for (int i = 0; i < n; i++) - action (i); - } - - /// - /// Executes the specified Action<long> delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An Action<long> delegate that references the method(s) to execute. - /// A parameter to pass to the method(s) is the zero-based count of - /// iteration. - /// - public static void Times (this long n, Action action) - { - if (n > 0 && action != null) - for (long i = 0; i < n; i++) - action (i); - } - - /// - /// Executes the specified Action<uint> delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An Action<uint> delegate that references the method(s) to execute. - /// A parameter to pass to the method(s) is the zero-based count of - /// iteration. - /// - public static void Times (this uint n, Action action) - { - if (n > 0 && action != null) - for (uint i = 0; i < n; i++) - action (i); - } - - /// - /// Executes the specified Action<ulong> delegate times. - /// - /// - /// A is the number of times to execute. - /// - /// - /// An Action<ulong> delegate that references the method(s) to execute. - /// A parameter to pass to this method(s) is the zero-based count of - /// iteration. - /// - public static void Times (this ulong n, Action action) - { - if (n > 0 && action != null) - for (ulong i = 0; i < n; i++) - action (i); - } - - /// - /// Converts the specified array of to the specified type data. - /// - /// - /// A T converted from , or a default value of - /// T if is an empty array of or - /// if the type of T isn't , , , - /// , , , , - /// , , or . - /// - /// - /// An array of to convert. - /// - /// - /// One of the enum values, specifies the byte order of - /// . - /// - /// - /// The type of the return. The T must be a value type. - /// - /// - /// is . - /// - public static T To (this byte[] source, ByteOrder sourceOrder) - where T : struct - { - if (source == null) - throw new ArgumentNullException ("source"); - - if (source.Length == 0) - return default (T); - - var type = typeof (T); - var buff = source.ToHostOrder (sourceOrder); - - return type == typeof (Boolean) - ? (T)(object) BitConverter.ToBoolean (buff, 0) - : type == typeof (Char) - ? (T)(object) BitConverter.ToChar (buff, 0) - : type == typeof (Double) - ? (T)(object) BitConverter.ToDouble (buff, 0) - : type == typeof (Int16) - ? (T)(object) BitConverter.ToInt16 (buff, 0) - : type == typeof (Int32) - ? (T)(object) BitConverter.ToInt32 (buff, 0) - : type == typeof (Int64) - ? (T)(object) BitConverter.ToInt64 (buff, 0) - : type == typeof (Single) - ? (T)(object) BitConverter.ToSingle (buff, 0) - : type == typeof (UInt16) - ? (T)(object) BitConverter.ToUInt16 (buff, 0) - : type == typeof (UInt32) - ? (T)(object) BitConverter.ToUInt32 (buff, 0) - : type == typeof (UInt64) - ? (T)(object) BitConverter.ToUInt64 (buff, 0) - : default (T); - } - - /// - /// Converts the specified to an array of . - /// - /// - /// An array of converted from . - /// - /// - /// A T to convert. - /// - /// - /// One of the enum values, specifies the byte order of the return. - /// - /// - /// The type of . The T must be a value type. - /// - public static byte[] ToByteArray (this T value, ByteOrder order) - where T : struct - { - var type = typeof (T); - var bytes = type == typeof (Boolean) - ? BitConverter.GetBytes ((Boolean)(object) value) - : type == typeof (Byte) - ? new byte[] { (Byte)(object) value } - : type == typeof (Char) - ? BitConverter.GetBytes ((Char)(object) value) - : type == typeof (Double) - ? BitConverter.GetBytes ((Double)(object) value) - : type == typeof (Int16) - ? BitConverter.GetBytes ((Int16)(object) value) - : type == typeof (Int32) - ? BitConverter.GetBytes ((Int32)(object) value) - : type == typeof (Int64) - ? BitConverter.GetBytes ((Int64)(object) value) - : type == typeof (Single) - ? BitConverter.GetBytes ((Single)(object) value) - : type == typeof (UInt16) - ? BitConverter.GetBytes ((UInt16)(object) value) - : type == typeof (UInt32) - ? BitConverter.GetBytes ((UInt32)(object) value) - : type == typeof (UInt64) - ? BitConverter.GetBytes ((UInt64)(object) value) - : WebSocket.EmptyBytes; - - if (bytes.Length > 1 && !order.IsHostOrder ()) - Array.Reverse (bytes); - - return bytes; - } - - /// - /// Converts the order of the specified array of to the host byte order. - /// - /// - /// An array of converted from . - /// - /// - /// An array of to convert. - /// - /// - /// One of the enum values, specifies the byte order of - /// . - /// - /// - /// is . - /// - public static byte[] ToHostOrder (this byte[] source, ByteOrder sourceOrder) - { - if (source == null) - throw new ArgumentNullException ("source"); - - return source.Length > 1 && !sourceOrder.IsHostOrder () ? source.Reverse () : source; - } - - /// - /// Converts the specified to a that - /// concatenates the each element of across the specified - /// . - /// - /// - /// A converted from , - /// or if is empty. - /// - /// - /// An array of T to convert. - /// - /// - /// A that represents the separator string. - /// - /// - /// The type of elements in . - /// - /// - /// is . - /// - public static string ToString (this T[] array, string separator) - { - if (array == null) - throw new ArgumentNullException ("array"); - - var len = array.Length; - if (len == 0) - return String.Empty; - - if (separator == null) - separator = String.Empty; - - var buff = new StringBuilder (64); - (len - 1).Times (i => buff.AppendFormat ("{0}{1}", array[i].ToString (), separator)); - - buff.Append (array[len - 1].ToString ()); - return buff.ToString (); - } - - /// - /// Converts the specified to a . - /// - /// - /// A converted from or - /// if the convert has failed. - /// - /// - /// A to convert. - /// - public static Uri ToUri (this string value) - { - Uri ret; - Uri.TryCreate ( - value, value.MaybeUri () ? UriKind.Absolute : UriKind.Relative, out ret - ); - - return ret; - } - - /// - /// URL-decodes the specified . - /// - /// - /// A that receives the decoded string or - /// if it is or empty. - /// - /// - /// A to decode. - /// - public static string UrlDecode (this string value) - { - return value != null && value.Length > 0 - ? HttpUtility.UrlDecode (value) - : value; - } - - /// - /// URL-encodes the specified . - /// - /// - /// A that receives the encoded string or - /// if it is or empty. - /// - /// - /// A to encode. - /// - public static string UrlEncode (this string value) - { - return value != null && value.Length > 0 - ? HttpUtility.UrlEncode (value) - : value; - } - - /// - /// Writes and sends the specified data with the specified - /// . - /// - /// - /// A that represents the HTTP response used to - /// send the content data. - /// - /// - /// An array of that represents the content data to send. - /// - /// - /// - /// is . - /// - /// - /// -or- - /// - /// - /// is . - /// - /// - public static void WriteContent (this HttpListenerResponse response, byte[] content) - { - if (response == null) - throw new ArgumentNullException ("response"); - - if (content == null) - throw new ArgumentNullException ("content"); - - var len = content.LongLength; - if (len == 0) { - response.Close (); - return; - } - - response.ContentLength64 = len; - var output = response.OutputStream; - if (len <= Int32.MaxValue) - output.Write (content, 0, (int) len); - else - output.WriteBytes (content, 1024); - - output.Close (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Ext.cs.meta b/ThirdParty/WebSocketSharp/Ext.cs.meta deleted file mode 100644 index 1089dffd1..000000000 --- a/ThirdParty/WebSocketSharp/Ext.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ded13c80c7bc5fd41afa627c77d98b3b -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Fin.cs b/ThirdParty/WebSocketSharp/Fin.cs deleted file mode 100644 index 8965c378e..000000000 --- a/ThirdParty/WebSocketSharp/Fin.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region License -/* - * Fin.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates whether a WebSocket frame is the final frame of a message. - /// - /// - /// The values of this enumeration are defined in - /// Section 5.2 of RFC 6455. - /// - internal enum Fin : byte - { - /// - /// Equivalent to numeric value 0. Indicates more frames of a message follow. - /// - More = 0x0, - /// - /// Equivalent to numeric value 1. Indicates the final frame of a message. - /// - Final = 0x1 - } -} diff --git a/ThirdParty/WebSocketSharp/Fin.cs.meta b/ThirdParty/WebSocketSharp/Fin.cs.meta deleted file mode 100644 index 74cc7b9d0..000000000 --- a/ThirdParty/WebSocketSharp/Fin.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 45db767b7760bc34f92cc33d92d3d3a8 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/HttpBase.cs b/ThirdParty/WebSocketSharp/HttpBase.cs deleted file mode 100644 index a7dbd4026..000000000 --- a/ThirdParty/WebSocketSharp/HttpBase.cs +++ /dev/null @@ -1,208 +0,0 @@ -#region License -/* - * HttpBase.cs - * - * The MIT License - * - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Text; -using System.Threading; -using WebSocketSharp.Net; - -namespace WebSocketSharp -{ - internal abstract class HttpBase - { - #region Private Fields - - private NameValueCollection _headers; - private const int _headersMaxLength = 8192; - private Version _version; - - #endregion - - #region Internal Fields - - internal byte[] EntityBodyData; - - #endregion - - #region Protected Fields - - protected const string CrLf = "\r\n"; - - #endregion - - #region Protected Constructors - - protected HttpBase (Version version, NameValueCollection headers) - { - _version = version; - _headers = headers; - } - - #endregion - - #region Public Properties - - public string EntityBody { - get { - if (EntityBodyData == null || EntityBodyData.LongLength == 0) - return String.Empty; - - Encoding enc = null; - - var contentType = _headers["Content-Type"]; - if (contentType != null && contentType.Length > 0) - enc = HttpUtility.GetEncoding (contentType); - - return (enc ?? Encoding.UTF8).GetString (EntityBodyData); - } - } - - public NameValueCollection Headers { - get { - return _headers; - } - } - - public Version ProtocolVersion { - get { - return _version; - } - } - - #endregion - - #region Private Methods - - private static byte[] readEntityBody (Stream stream, string length) - { - long len; - if (!Int64.TryParse (length, out len)) - throw new ArgumentException ("Cannot be parsed.", "length"); - - if (len < 0) - throw new ArgumentOutOfRangeException ("length", "Less than zero."); - - return len > 1024 - ? stream.ReadBytes (len, 1024) - : len > 0 - ? stream.ReadBytes ((int) len) - : null; - } - - private static string[] readHeaders (Stream stream, int maxLength) - { - var buff = new List (); - var cnt = 0; - Action add = i => { - if (i == -1) - throw new EndOfStreamException ("The header cannot be read from the data source."); - - buff.Add ((byte) i); - cnt++; - }; - - var read = false; - while (cnt < maxLength) { - if (stream.ReadByte ().EqualsWith ('\r', add) && - stream.ReadByte ().EqualsWith ('\n', add) && - stream.ReadByte ().EqualsWith ('\r', add) && - stream.ReadByte ().EqualsWith ('\n', add)) { - read = true; - break; - } - } - - if (!read) - throw new WebSocketException ("The length of header part is greater than the max length."); - - return Encoding.UTF8.GetString (buff.ToArray ()) - .Replace (CrLf + " ", " ") - .Replace (CrLf + "\t", " ") - .Split (new[] { CrLf }, StringSplitOptions.RemoveEmptyEntries); - } - - #endregion - - #region Protected Methods - - protected static T Read (Stream stream, Func parser, int millisecondsTimeout) - where T : HttpBase - { - var timeout = false; - var timer = new Timer ( - state => { - timeout = true; - stream.Close (); - }, - null, - millisecondsTimeout, - -1); - - T http = null; - Exception exception = null; - try { - http = parser (readHeaders (stream, _headersMaxLength)); - var contentLen = http.Headers["Content-Length"]; - if (contentLen != null && contentLen.Length > 0) - http.EntityBodyData = readEntityBody (stream, contentLen); - } - catch (Exception ex) { - exception = ex; - } - finally { - timer.Change (-1, -1); - timer.Dispose (); - } - - var msg = timeout - ? "A timeout has occurred while reading an HTTP request/response." - : exception != null - ? "An exception has occurred while reading an HTTP request/response." - : null; - - if (msg != null) - throw new WebSocketException (msg, exception); - - return http; - } - - #endregion - - #region Public Methods - - public byte[] ToByteArray () - { - return Encoding.UTF8.GetBytes (ToString ()); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/HttpBase.cs.meta b/ThirdParty/WebSocketSharp/HttpBase.cs.meta deleted file mode 100644 index 852125d12..000000000 --- a/ThirdParty/WebSocketSharp/HttpBase.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 8900a7cfb2516df43b107f92fe3d356b -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/HttpRequest.cs b/ThirdParty/WebSocketSharp/HttpRequest.cs deleted file mode 100644 index f9aa5cb33..000000000 --- a/ThirdParty/WebSocketSharp/HttpRequest.cs +++ /dev/null @@ -1,223 +0,0 @@ -#region License -/* - * HttpRequest.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - David Burhans - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Text; -using WebSocketSharp.Net; - -namespace WebSocketSharp -{ - internal class HttpRequest : HttpBase - { - #region Private Fields - - private string _method; - private string _uri; - private bool _websocketRequest; - private bool _websocketRequestSet; - - #endregion - - #region Private Constructors - - private HttpRequest (string method, string uri, Version version, NameValueCollection headers) - : base (version, headers) - { - _method = method; - _uri = uri; - } - - #endregion - - #region Internal Constructors - - internal HttpRequest (string method, string uri) - : this (method, uri, HttpVersion.Version11, new NameValueCollection ()) - { - Headers["User-Agent"] = "websocket-sharp/1.0"; - } - - #endregion - - #region Public Properties - - public AuthenticationResponse AuthenticationResponse { - get { - var res = Headers["Authorization"]; - return res != null && res.Length > 0 - ? AuthenticationResponse.Parse (res) - : null; - } - } - - public CookieCollection Cookies { - get { - return Headers.GetCookies (false); - } - } - - public string HttpMethod { - get { - return _method; - } - } - - public bool IsWebSocketRequest { - get { - if (!_websocketRequestSet) { - var headers = Headers; - _websocketRequest = _method == "GET" && - ProtocolVersion > HttpVersion.Version10 && - headers.Contains ("Upgrade", "websocket") && - headers.Contains ("Connection", "Upgrade"); - - _websocketRequestSet = true; - } - - return _websocketRequest; - } - } - - public string RequestUri { - get { - return _uri; - } - } - - #endregion - - #region Internal Methods - - internal static HttpRequest CreateConnectRequest (Uri uri) - { - var host = uri.DnsSafeHost; - var port = uri.Port; - var authority = String.Format ("{0}:{1}", host, port); - var req = new HttpRequest ("CONNECT", authority); - req.Headers["Host"] = port == 80 ? host : authority; - - return req; - } - - internal static HttpRequest CreateWebSocketRequest (Uri uri) - { - var req = new HttpRequest ("GET", uri.PathAndQuery); - var headers = req.Headers; - - // Only includes a port number in the Host header value if it's non-default. - // See: https://tools.ietf.org/html/rfc6455#page-17 - var port = uri.Port; - var schm = uri.Scheme; - headers["Host"] = (port == 80 && schm == "ws") || (port == 443 && schm == "wss") - ? uri.DnsSafeHost - : uri.Authority; - - headers["Upgrade"] = "websocket"; - headers["Connection"] = "Upgrade"; - - return req; - } - - internal HttpResponse GetResponse (Stream stream, int millisecondsTimeout) - { - var buff = ToByteArray (); - stream.Write (buff, 0, buff.Length); - - return Read (stream, HttpResponse.Parse, millisecondsTimeout); - } - - internal static HttpRequest Parse (string[] headerParts) - { - var requestLine = headerParts[0].Split (new[] { ' ' }, 3); - if (requestLine.Length != 3) - throw new ArgumentException ("Invalid request line: " + headerParts[0]); - - var headers = new WebHeaderCollection (); - for (int i = 1; i < headerParts.Length; i++) - headers.InternalSet (headerParts[i], false); - - return new HttpRequest ( - requestLine[0], requestLine[1], new Version (requestLine[2].Substring (5)), headers); - } - - internal static HttpRequest Read (Stream stream, int millisecondsTimeout) - { - return Read (stream, Parse, millisecondsTimeout); - } - - #endregion - - #region Public Methods - - public void SetCookies (CookieCollection cookies) - { - if (cookies == null || cookies.Count == 0) - return; - - var buff = new StringBuilder (64); - foreach (var cookie in cookies.Sorted) - if (!cookie.Expired) - buff.AppendFormat ("{0}; ", cookie.ToString ()); - - var len = buff.Length; - if (len > 2) { - buff.Length = len - 2; - Headers["Cookie"] = buff.ToString (); - } - } - - public override string ToString () - { - var output = new StringBuilder (64); - output.AppendFormat ("{0} {1} HTTP/{2}{3}", _method, _uri, ProtocolVersion, CrLf); - - var headers = Headers; - foreach (var key in headers.AllKeys) - output.AppendFormat ("{0}: {1}{2}", key, headers[key], CrLf); - - output.Append (CrLf); - - var entity = EntityBody; - if (entity.Length > 0) - output.Append (entity); - - return output.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/HttpRequest.cs.meta b/ThirdParty/WebSocketSharp/HttpRequest.cs.meta deleted file mode 100644 index 63a226280..000000000 --- a/ThirdParty/WebSocketSharp/HttpRequest.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 28e371c48595c7245b2a715dc5aa5fa3 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/HttpResponse.cs b/ThirdParty/WebSocketSharp/HttpResponse.cs deleted file mode 100644 index 19315a3f0..000000000 --- a/ThirdParty/WebSocketSharp/HttpResponse.cs +++ /dev/null @@ -1,210 +0,0 @@ -#region License -/* - * HttpResponse.cs - * - * The MIT License - * - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Text; -using WebSocketSharp.Net; - -namespace WebSocketSharp -{ - internal class HttpResponse : HttpBase - { - #region Private Fields - - private string _code; - private string _reason; - - #endregion - - #region Private Constructors - - private HttpResponse (string code, string reason, Version version, NameValueCollection headers) - : base (version, headers) - { - _code = code; - _reason = reason; - } - - #endregion - - #region Internal Constructors - - internal HttpResponse (HttpStatusCode code) - : this (code, code.GetDescription ()) - { - } - - internal HttpResponse (HttpStatusCode code, string reason) - : this (((int) code).ToString (), reason, HttpVersion.Version11, new NameValueCollection ()) - { - Headers["Server"] = "websocket-sharp/1.0"; - } - - #endregion - - #region Public Properties - - public CookieCollection Cookies { - get { - return Headers.GetCookies (true); - } - } - - public bool HasConnectionClose { - get { - return Headers.Contains ("Connection", "close"); - } - } - - public bool IsProxyAuthenticationRequired { - get { - return _code == "407"; - } - } - - public bool IsRedirect { - get { - return _code == "301" || _code == "302"; - } - } - - public bool IsUnauthorized { - get { - return _code == "401"; - } - } - - public bool IsWebSocketResponse { - get { - var headers = Headers; - return ProtocolVersion > HttpVersion.Version10 && - _code == "101" && - headers.Contains ("Upgrade", "websocket") && - headers.Contains ("Connection", "Upgrade"); - } - } - - public string Reason { - get { - return _reason; - } - } - - public string StatusCode { - get { - return _code; - } - } - - #endregion - - #region Internal Methods - - internal static HttpResponse CreateCloseResponse (HttpStatusCode code) - { - var res = new HttpResponse (code); - res.Headers["Connection"] = "close"; - - return res; - } - - internal static HttpResponse CreateUnauthorizedResponse (string challenge) - { - var res = new HttpResponse (HttpStatusCode.Unauthorized); - res.Headers["WWW-Authenticate"] = challenge; - - return res; - } - - internal static HttpResponse CreateWebSocketResponse () - { - var res = new HttpResponse (HttpStatusCode.SwitchingProtocols); - - var headers = res.Headers; - headers["Upgrade"] = "websocket"; - headers["Connection"] = "Upgrade"; - - return res; - } - - internal static HttpResponse Parse (string[] headerParts) - { - var statusLine = headerParts[0].Split (new[] { ' ' }, 3); - if (statusLine.Length != 3) - throw new ArgumentException ("Invalid status line: " + headerParts[0]); - - var headers = new WebHeaderCollection (); - for (int i = 1; i < headerParts.Length; i++) - headers.InternalSet (headerParts[i], true); - - return new HttpResponse ( - statusLine[1], statusLine[2], new Version (statusLine[0].Substring (5)), headers); - } - - internal static HttpResponse Read (Stream stream, int millisecondsTimeout) - { - return Read (stream, Parse, millisecondsTimeout); - } - - #endregion - - #region Public Methods - - public void SetCookies (CookieCollection cookies) - { - if (cookies == null || cookies.Count == 0) - return; - - var headers = Headers; - foreach (var cookie in cookies.Sorted) - headers.Add ("Set-Cookie", cookie.ToResponseString ()); - } - - public override string ToString () - { - var output = new StringBuilder (64); - output.AppendFormat ("HTTP/{0} {1} {2}{3}", ProtocolVersion, _code, _reason, CrLf); - - var headers = Headers; - foreach (var key in headers.AllKeys) - output.AppendFormat ("{0}: {1}{2}", key, headers[key], CrLf); - - output.Append (CrLf); - - var entity = EntityBody; - if (entity.Length > 0) - output.Append (entity); - - return output.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/HttpResponse.cs.meta b/ThirdParty/WebSocketSharp/HttpResponse.cs.meta deleted file mode 100644 index 09080a04b..000000000 --- a/ThirdParty/WebSocketSharp/HttpResponse.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ba9a52d416621e94aa62956bcbb980dd -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/LogData.cs b/ThirdParty/WebSocketSharp/LogData.cs deleted file mode 100644 index 9c0843093..000000000 --- a/ThirdParty/WebSocketSharp/LogData.cs +++ /dev/null @@ -1,149 +0,0 @@ -#region License -/* - * LogData.cs - * - * The MIT License - * - * Copyright (c) 2013-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Diagnostics; -using System.Text; - -namespace WebSocketSharp -{ - /// - /// Represents a log data used by the class. - /// - public class LogData - { - #region Private Fields - - private StackFrame _caller; - private DateTime _date; - private LogLevel _level; - private string _message; - - #endregion - - #region Internal Constructors - - internal LogData (LogLevel level, StackFrame caller, string message) - { - _level = level; - _caller = caller; - _message = message ?? String.Empty; - _date = DateTime.Now; - } - - #endregion - - #region Public Properties - - /// - /// Gets the information of the logging method caller. - /// - /// - /// A that provides the information of the logging method caller. - /// - public StackFrame Caller { - get { - return _caller; - } - } - - /// - /// Gets the date and time when the log data was created. - /// - /// - /// A that represents the date and time when the log data was created. - /// - public DateTime Date { - get { - return _date; - } - } - - /// - /// Gets the logging level of the log data. - /// - /// - /// One of the enum values, indicates the logging level of the log data. - /// - public LogLevel Level { - get { - return _level; - } - } - - /// - /// Gets the message of the log data. - /// - /// - /// A that represents the message of the log data. - /// - public string Message { - get { - return _message; - } - } - - #endregion - - #region Public Methods - - /// - /// Returns a that represents the current . - /// - /// - /// A that represents the current . - /// - public override string ToString () - { - var header = String.Format ("{0}|{1,-5}|", _date, _level); - var method = _caller.GetMethod (); - var type = method.DeclaringType; -#if DEBUG - var lineNum = _caller.GetFileLineNumber (); - var headerAndCaller = - String.Format ("{0}{1}.{2}:{3}|", header, type.Name, method.Name, lineNum); -#else - var headerAndCaller = String.Format ("{0}{1}.{2}|", header, type.Name, method.Name); -#endif - var msgs = _message.Replace ("\r\n", "\n").TrimEnd ('\n').Split ('\n'); - if (msgs.Length <= 1) - return String.Format ("{0}{1}", headerAndCaller, _message); - - var buff = new StringBuilder (String.Format ("{0}{1}\n", headerAndCaller, msgs[0]), 64); - - var fmt = String.Format ("{{0,{0}}}{{1}}\n", header.Length); - for (var i = 1; i < msgs.Length; i++) - buff.AppendFormat (fmt, "", msgs[i]); - - buff.Length--; - return buff.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/LogData.cs.meta b/ThirdParty/WebSocketSharp/LogData.cs.meta deleted file mode 100644 index 616b72dfe..000000000 --- a/ThirdParty/WebSocketSharp/LogData.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: d9a3e4050989c0b40960b33d9ec0d786 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/LogLevel.cs b/ThirdParty/WebSocketSharp/LogLevel.cs deleted file mode 100644 index ef9967728..000000000 --- a/ThirdParty/WebSocketSharp/LogLevel.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region License -/* - * LogLevel.cs - * - * The MIT License - * - * Copyright (c) 2013-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Specifies the logging level. - /// - public enum LogLevel - { - /// - /// Specifies the bottom logging level. - /// - Trace, - /// - /// Specifies the 2nd logging level from the bottom. - /// - Debug, - /// - /// Specifies the 3rd logging level from the bottom. - /// - Info, - /// - /// Specifies the 3rd logging level from the top. - /// - Warn, - /// - /// Specifies the 2nd logging level from the top. - /// - Error, - /// - /// Specifies the top logging level. - /// - Fatal - } -} diff --git a/ThirdParty/WebSocketSharp/LogLevel.cs.meta b/ThirdParty/WebSocketSharp/LogLevel.cs.meta deleted file mode 100644 index 291dc3403..000000000 --- a/ThirdParty/WebSocketSharp/LogLevel.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 95786093a1de6644bac6ad384b2b4e25 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Logger.cs b/ThirdParty/WebSocketSharp/Logger.cs deleted file mode 100644 index 17850e67e..000000000 --- a/ThirdParty/WebSocketSharp/Logger.cs +++ /dev/null @@ -1,330 +0,0 @@ -#region License -/* - * Logger.cs - * - * The MIT License - * - * Copyright (c) 2013-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Diagnostics; -using System.IO; - -namespace WebSocketSharp -{ - /// - /// Provides a set of methods and properties for logging. - /// - /// - /// - /// If you output a log with lower than the value of the property, - /// it cannot be outputted. - /// - /// - /// The default output action writes a log to the standard output stream and the log file - /// if the property has a valid path to it. - /// - /// - /// If you would like to use the custom output action, you should set - /// the property to any Action<LogData, string> - /// delegate. - /// - /// - public class Logger - { - #region Private Fields - - private volatile string _file; - private volatile LogLevel _level; - private Action _output; - private object _sync; - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - /// - /// This constructor initializes the current logging level with . - /// - public Logger () - : this (LogLevel.Error, null, null) - { - } - - /// - /// Initializes a new instance of the class with - /// the specified logging . - /// - /// - /// One of the enum values. - /// - public Logger (LogLevel level) - : this (level, null, null) - { - } - - /// - /// Initializes a new instance of the class with - /// the specified logging , path to the log , - /// and action. - /// - /// - /// One of the enum values. - /// - /// - /// A that represents the path to the log file. - /// - /// - /// An Action<LogData, string> delegate that references the method(s) used to - /// output a log. A parameter passed to this delegate is - /// . - /// - public Logger (LogLevel level, string file, Action output) - { - _level = level; - _file = file; - _output = output ?? defaultOutput; - _sync = new object (); - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets the current path to the log file. - /// - /// - /// A that represents the current path to the log file if any. - /// - public string File { - get { - return _file; - } - - set { - lock (_sync) { - _file = value; - Warn ( - String.Format ("The current path to the log file has been changed to {0}.", _file)); - } - } - } - - /// - /// Gets or sets the current logging level. - /// - /// - /// A log with lower than the value of this property cannot be outputted. - /// - /// - /// One of the enum values, specifies the current logging level. - /// - public LogLevel Level { - get { - return _level; - } - - set { - lock (_sync) { - _level = value; - Warn (String.Format ("The current logging level has been changed to {0}.", _level)); - } - } - } - - /// - /// Gets or sets the current output action used to output a log. - /// - /// - /// - /// An Action<LogData, string> delegate that references the method(s) used to - /// output a log. A parameter passed to this delegate is the value of - /// the property. - /// - /// - /// If the value to set is , the current output action is changed to - /// the default output action. - /// - /// - public Action Output { - get { - return _output; - } - - set { - lock (_sync) { - _output = value ?? defaultOutput; - Warn ("The current output action has been changed."); - } - } - } - - #endregion - - #region Private Methods - - private static void defaultOutput (LogData data, string path) - { - var log = data.ToString (); - Console.WriteLine (log); - if (path != null && path.Length > 0) - writeToFile (log, path); - } - - private void output (string message, LogLevel level) - { - lock (_sync) { - if (_level > level) - return; - - LogData data = null; - try { - data = new LogData (level, new StackFrame (2, true), message); - _output (data, _file); - } - catch (Exception ex) { - data = new LogData (LogLevel.Fatal, new StackFrame (0, true), ex.Message); - Console.WriteLine (data.ToString ()); - } - } - } - - private static void writeToFile (string value, string path) - { - using (var writer = new StreamWriter (path, true)) - using (var syncWriter = TextWriter.Synchronized (writer)) - syncWriter.WriteLine (value); - } - - #endregion - - #region Public Methods - - /// - /// Outputs as a log with . - /// - /// - /// If the current logging level is higher than , - /// this method doesn't output as a log. - /// - /// - /// A that represents the message to output as a log. - /// - public void Debug (string message) - { - if (_level > LogLevel.Debug) - return; - - output (message, LogLevel.Debug); - } - - /// - /// Outputs as a log with . - /// - /// - /// If the current logging level is higher than , - /// this method doesn't output as a log. - /// - /// - /// A that represents the message to output as a log. - /// - public void Error (string message) - { - if (_level > LogLevel.Error) - return; - - output (message, LogLevel.Error); - } - - /// - /// Outputs as a log with . - /// - /// - /// A that represents the message to output as a log. - /// - public void Fatal (string message) - { - output (message, LogLevel.Fatal); - } - - /// - /// Outputs as a log with . - /// - /// - /// If the current logging level is higher than , - /// this method doesn't output as a log. - /// - /// - /// A that represents the message to output as a log. - /// - public void Info (string message) - { - if (_level > LogLevel.Info) - return; - - output (message, LogLevel.Info); - } - - /// - /// Outputs as a log with . - /// - /// - /// If the current logging level is higher than , - /// this method doesn't output as a log. - /// - /// - /// A that represents the message to output as a log. - /// - public void Trace (string message) - { - if (_level > LogLevel.Trace) - return; - - output (message, LogLevel.Trace); - } - - /// - /// Outputs as a log with . - /// - /// - /// If the current logging level is higher than , - /// this method doesn't output as a log. - /// - /// - /// A that represents the message to output as a log. - /// - public void Warn (string message) - { - if (_level > LogLevel.Warn) - return; - - output (message, LogLevel.Warn); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Logger.cs.meta b/ThirdParty/WebSocketSharp/Logger.cs.meta deleted file mode 100644 index a43b2cb90..000000000 --- a/ThirdParty/WebSocketSharp/Logger.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: b45fab28966caff4383b0346f142930a -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Mask.cs b/ThirdParty/WebSocketSharp/Mask.cs deleted file mode 100644 index fcafac80c..000000000 --- a/ThirdParty/WebSocketSharp/Mask.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region License -/* - * Mask.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates whether the payload data of a WebSocket frame is masked. - /// - /// - /// The values of this enumeration are defined in - /// Section 5.2 of RFC 6455. - /// - internal enum Mask : byte - { - /// - /// Equivalent to numeric value 0. Indicates not masked. - /// - Off = 0x0, - /// - /// Equivalent to numeric value 1. Indicates masked. - /// - On = 0x1 - } -} diff --git a/ThirdParty/WebSocketSharp/Mask.cs.meta b/ThirdParty/WebSocketSharp/Mask.cs.meta deleted file mode 100644 index 69297b224..000000000 --- a/ThirdParty/WebSocketSharp/Mask.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: a9e973f31c90e214098f6cca10b2782c -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/MessageEventArgs.cs b/ThirdParty/WebSocketSharp/MessageEventArgs.cs deleted file mode 100644 index adf7391aa..000000000 --- a/ThirdParty/WebSocketSharp/MessageEventArgs.cs +++ /dev/null @@ -1,180 +0,0 @@ -#region License -/* - * MessageEventArgs.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Represents the event data for the event. - /// - /// - /// - /// That event occurs when the receives - /// a message or a ping if the - /// property is set to true. - /// - /// - /// If you would like to get the message data, you should access - /// the or property. - /// - /// - public class MessageEventArgs : EventArgs - { - #region Private Fields - - private string _data; - private bool _dataSet; - private Opcode _opcode; - private byte[] _rawData; - - #endregion - - #region Internal Constructors - - internal MessageEventArgs (WebSocketFrame frame) - { - _opcode = frame.Opcode; - _rawData = frame.PayloadData.ApplicationData; - } - - internal MessageEventArgs (Opcode opcode, byte[] rawData) - { - if ((ulong) rawData.LongLength > PayloadData.MaxLength) - throw new WebSocketException (CloseStatusCode.TooBig); - - _opcode = opcode; - _rawData = rawData; - } - - #endregion - - #region Internal Properties - - /// - /// Gets the opcode for the message. - /// - /// - /// , , - /// or . - /// - internal Opcode Opcode { - get { - return _opcode; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the message data as a . - /// - /// - /// A that represents the message data if its type is - /// text or ping and if decoding it to a string has successfully done; - /// otherwise, . - /// - public string Data { - get { - setData (); - return _data; - } - } - - /// - /// Gets a value indicating whether the message type is binary. - /// - /// - /// true if the message type is binary; otherwise, false. - /// - public bool IsBinary { - get { - return _opcode == Opcode.Binary; - } - } - - /// - /// Gets a value indicating whether the message type is ping. - /// - /// - /// true if the message type is ping; otherwise, false. - /// - public bool IsPing { - get { - return _opcode == Opcode.Ping; - } - } - - /// - /// Gets a value indicating whether the message type is text. - /// - /// - /// true if the message type is text; otherwise, false. - /// - public bool IsText { - get { - return _opcode == Opcode.Text; - } - } - - /// - /// Gets the message data as an array of . - /// - /// - /// An array of that represents the message data. - /// - public byte[] RawData { - get { - setData (); - return _rawData; - } - } - - #endregion - - #region Private Methods - - private void setData () - { - if (_dataSet) - return; - - if (_opcode == Opcode.Binary) { - _dataSet = true; - return; - } - - _data = _rawData.UTF8Decode (); - _dataSet = true; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/MessageEventArgs.cs.meta b/ThirdParty/WebSocketSharp/MessageEventArgs.cs.meta deleted file mode 100644 index 923034505..000000000 --- a/ThirdParty/WebSocketSharp/MessageEventArgs.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 9e0ad4b8092a7a9419343e51c708de95 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net.meta b/ThirdParty/WebSocketSharp/Net.meta deleted file mode 100644 index ce234ad44..000000000 --- a/ThirdParty/WebSocketSharp/Net.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 52289007cd661d341a7a2fb176649175 -folderAsset: yes -timeCreated: 1443712075 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs b/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs deleted file mode 100644 index 107750499..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs +++ /dev/null @@ -1,151 +0,0 @@ -#region License -/* - * AuthenticationBase.cs - * - * The MIT License - * - * Copyright (c) 2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal abstract class AuthenticationBase - { - #region Private Fields - - private AuthenticationSchemes _scheme; - - #endregion - - #region Internal Fields - - internal NameValueCollection Parameters; - - #endregion - - #region Protected Constructors - - protected AuthenticationBase (AuthenticationSchemes scheme, NameValueCollection parameters) - { - _scheme = scheme; - Parameters = parameters; - } - - #endregion - - #region Public Properties - - public string Algorithm { - get { - return Parameters["algorithm"]; - } - } - - public string Nonce { - get { - return Parameters["nonce"]; - } - } - - public string Opaque { - get { - return Parameters["opaque"]; - } - } - - public string Qop { - get { - return Parameters["qop"]; - } - } - - public string Realm { - get { - return Parameters["realm"]; - } - } - - public AuthenticationSchemes Scheme { - get { - return _scheme; - } - } - - #endregion - - #region Internal Methods - - internal static string CreateNonceValue () - { - var src = new byte[16]; - var rand = new Random (); - rand.NextBytes (src); - - var res = new StringBuilder (32); - foreach (var b in src) - res.Append (b.ToString ("x2")); - - return res.ToString (); - } - - internal static NameValueCollection ParseParameters (string value) - { - var res = new NameValueCollection (); - foreach (var param in value.SplitHeaderValue (',')) { - var i = param.IndexOf ('='); - var name = i > 0 ? param.Substring (0, i).Trim () : null; - var val = i < 0 - ? param.Trim ().Trim ('"') - : i < param.Length - 1 - ? param.Substring (i + 1).Trim ().Trim ('"') - : String.Empty; - - res.Add (name, val); - } - - return res; - } - - internal abstract string ToBasicString (); - - internal abstract string ToDigestString (); - - #endregion - - #region Public Methods - - public override string ToString () - { - return _scheme == AuthenticationSchemes.Basic - ? ToBasicString () - : _scheme == AuthenticationSchemes.Digest - ? ToDigestString () - : String.Empty; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs.meta b/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs.meta deleted file mode 100644 index fe889eed6..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationBase.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ecfae5d5b6b00c24191938faaf7b5fce -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs b/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs deleted file mode 100644 index 3472204b9..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs +++ /dev/null @@ -1,146 +0,0 @@ -#region License -/* - * AuthenticationChallenge.cs - * - * The MIT License - * - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal class AuthenticationChallenge : AuthenticationBase - { - #region Private Constructors - - private AuthenticationChallenge (AuthenticationSchemes scheme, NameValueCollection parameters) - : base (scheme, parameters) - { - } - - #endregion - - #region Internal Constructors - - internal AuthenticationChallenge (AuthenticationSchemes scheme, string realm) - : base (scheme, new NameValueCollection ()) - { - Parameters["realm"] = realm; - if (scheme == AuthenticationSchemes.Digest) { - Parameters["nonce"] = CreateNonceValue (); - Parameters["algorithm"] = "MD5"; - Parameters["qop"] = "auth"; - } - } - - #endregion - - #region Public Properties - - public string Domain { - get { - return Parameters["domain"]; - } - } - - public string Stale { - get { - return Parameters["stale"]; - } - } - - #endregion - - #region Internal Methods - - internal static AuthenticationChallenge CreateBasicChallenge (string realm) - { - return new AuthenticationChallenge (AuthenticationSchemes.Basic, realm); - } - - internal static AuthenticationChallenge CreateDigestChallenge (string realm) - { - return new AuthenticationChallenge (AuthenticationSchemes.Digest, realm); - } - - internal static AuthenticationChallenge Parse (string value) - { - var chal = value.Split (new[] { ' ' }, 2); - if (chal.Length != 2) - return null; - - var schm = chal[0].ToLower (); - return schm == "basic" - ? new AuthenticationChallenge ( - AuthenticationSchemes.Basic, ParseParameters (chal[1])) - : schm == "digest" - ? new AuthenticationChallenge ( - AuthenticationSchemes.Digest, ParseParameters (chal[1])) - : null; - } - - internal override string ToBasicString () - { - return String.Format ("Basic realm=\"{0}\"", Parameters["realm"]); - } - - internal override string ToDigestString () - { - var output = new StringBuilder (128); - - var domain = Parameters["domain"]; - if (domain != null) - output.AppendFormat ( - "Digest realm=\"{0}\", domain=\"{1}\", nonce=\"{2}\"", - Parameters["realm"], - domain, - Parameters["nonce"]); - else - output.AppendFormat ( - "Digest realm=\"{0}\", nonce=\"{1}\"", Parameters["realm"], Parameters["nonce"]); - - var opaque = Parameters["opaque"]; - if (opaque != null) - output.AppendFormat (", opaque=\"{0}\"", opaque); - - var stale = Parameters["stale"]; - if (stale != null) - output.AppendFormat (", stale={0}", stale); - - var algo = Parameters["algorithm"]; - if (algo != null) - output.AppendFormat (", algorithm={0}", algo); - - var qop = Parameters["qop"]; - if (qop != null) - output.AppendFormat (", qop=\"{0}\"", qop); - - return output.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs.meta b/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs.meta deleted file mode 100644 index e6547af8f..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationChallenge.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 83c54029d5ecbc14790b9754f3f1440b -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs b/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs deleted file mode 100644 index 0257d85b2..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs +++ /dev/null @@ -1,323 +0,0 @@ -#region License -/* - * AuthenticationResponse.cs - * - * ParseBasicCredentials is derived from System.Net.HttpListenerContext.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.Security.Cryptography; -using System.Security.Principal; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal class AuthenticationResponse : AuthenticationBase - { - #region Private Fields - - private uint _nonceCount; - - #endregion - - #region Private Constructors - - private AuthenticationResponse (AuthenticationSchemes scheme, NameValueCollection parameters) - : base (scheme, parameters) - { - } - - #endregion - - #region Internal Constructors - - internal AuthenticationResponse (NetworkCredential credentials) - : this (AuthenticationSchemes.Basic, new NameValueCollection (), credentials, 0) - { - } - - internal AuthenticationResponse ( - AuthenticationChallenge challenge, NetworkCredential credentials, uint nonceCount) - : this (challenge.Scheme, challenge.Parameters, credentials, nonceCount) - { - } - - internal AuthenticationResponse ( - AuthenticationSchemes scheme, - NameValueCollection parameters, - NetworkCredential credentials, - uint nonceCount) - : base (scheme, parameters) - { - Parameters["username"] = credentials.Username; - Parameters["password"] = credentials.Password; - Parameters["uri"] = credentials.Domain; - _nonceCount = nonceCount; - if (scheme == AuthenticationSchemes.Digest) - initAsDigest (); - } - - #endregion - - #region Internal Properties - - internal uint NonceCount { - get { - return _nonceCount < UInt32.MaxValue - ? _nonceCount - : 0; - } - } - - #endregion - - #region Public Properties - - public string Cnonce { - get { - return Parameters["cnonce"]; - } - } - - public string Nc { - get { - return Parameters["nc"]; - } - } - - public string Password { - get { - return Parameters["password"]; - } - } - - public string Response { - get { - return Parameters["response"]; - } - } - - public string Uri { - get { - return Parameters["uri"]; - } - } - - public string UserName { - get { - return Parameters["username"]; - } - } - - #endregion - - #region Private Methods - - private static string createA1 (string username, string password, string realm) - { - return String.Format ("{0}:{1}:{2}", username, realm, password); - } - - private static string createA1 ( - string username, string password, string realm, string nonce, string cnonce) - { - return String.Format ( - "{0}:{1}:{2}", hash (createA1 (username, password, realm)), nonce, cnonce); - } - - private static string createA2 (string method, string uri) - { - return String.Format ("{0}:{1}", method, uri); - } - - private static string createA2 (string method, string uri, string entity) - { - return String.Format ("{0}:{1}:{2}", method, uri, hash (entity)); - } - - private static string hash (string value) - { - var src = Encoding.UTF8.GetBytes (value); - var md5 = MD5.Create (); - var hashed = md5.ComputeHash (src); - - var res = new StringBuilder (64); - foreach (var b in hashed) - res.Append (b.ToString ("x2")); - - return res.ToString (); - } - - private void initAsDigest () - { - var qops = Parameters["qop"]; - if (qops != null) { - if (qops.Split (',').Contains (qop => qop.Trim ().ToLower () == "auth")) { - Parameters["qop"] = "auth"; - Parameters["cnonce"] = CreateNonceValue (); - Parameters["nc"] = String.Format ("{0:x8}", ++_nonceCount); - } - else { - Parameters["qop"] = null; - } - } - - Parameters["method"] = "GET"; - Parameters["response"] = CreateRequestDigest (Parameters); - } - - #endregion - - #region Internal Methods - - internal static string CreateRequestDigest (NameValueCollection parameters) - { - var user = parameters["username"]; - var pass = parameters["password"]; - var realm = parameters["realm"]; - var nonce = parameters["nonce"]; - var uri = parameters["uri"]; - var algo = parameters["algorithm"]; - var qop = parameters["qop"]; - var cnonce = parameters["cnonce"]; - var nc = parameters["nc"]; - var method = parameters["method"]; - - var a1 = algo != null && algo.ToLower () == "md5-sess" - ? createA1 (user, pass, realm, nonce, cnonce) - : createA1 (user, pass, realm); - - var a2 = qop != null && qop.ToLower () == "auth-int" - ? createA2 (method, uri, parameters["entity"]) - : createA2 (method, uri); - - var secret = hash (a1); - var data = qop != null - ? String.Format ("{0}:{1}:{2}:{3}:{4}", nonce, nc, cnonce, qop, hash (a2)) - : String.Format ("{0}:{1}", nonce, hash (a2)); - - return hash (String.Format ("{0}:{1}", secret, data)); - } - - internal static AuthenticationResponse Parse (string value) - { - try { - var cred = value.Split (new[] { ' ' }, 2); - if (cred.Length != 2) - return null; - - var schm = cred[0].ToLower (); - return schm == "basic" - ? new AuthenticationResponse ( - AuthenticationSchemes.Basic, ParseBasicCredentials (cred[1])) - : schm == "digest" - ? new AuthenticationResponse ( - AuthenticationSchemes.Digest, ParseParameters (cred[1])) - : null; - } - catch { - } - - return null; - } - - internal static NameValueCollection ParseBasicCredentials (string value) - { - // Decode the basic-credentials (a Base64 encoded string). - var userPass = Encoding.Default.GetString (Convert.FromBase64String (value)); - - // The format is [\]:. - var i = userPass.IndexOf (':'); - var user = userPass.Substring (0, i); - var pass = i < userPass.Length - 1 ? userPass.Substring (i + 1) : String.Empty; - - // Check if 'domain' exists. - i = user.IndexOf ('\\'); - if (i > -1) - user = user.Substring (i + 1); - - var res = new NameValueCollection (); - res["username"] = user; - res["password"] = pass; - - return res; - } - - internal override string ToBasicString () - { - var userPass = String.Format ("{0}:{1}", Parameters["username"], Parameters["password"]); - var cred = Convert.ToBase64String (Encoding.UTF8.GetBytes (userPass)); - - return "Basic " + cred; - } - - internal override string ToDigestString () - { - var output = new StringBuilder (256); - output.AppendFormat ( - "Digest username=\"{0}\", realm=\"{1}\", nonce=\"{2}\", uri=\"{3}\", response=\"{4}\"", - Parameters["username"], - Parameters["realm"], - Parameters["nonce"], - Parameters["uri"], - Parameters["response"]); - - var opaque = Parameters["opaque"]; - if (opaque != null) - output.AppendFormat (", opaque=\"{0}\"", opaque); - - var algo = Parameters["algorithm"]; - if (algo != null) - output.AppendFormat (", algorithm={0}", algo); - - var qop = Parameters["qop"]; - if (qop != null) - output.AppendFormat ( - ", qop={0}, cnonce=\"{1}\", nc={2}", qop, Parameters["cnonce"], Parameters["nc"]); - - return output.ToString (); - } - - #endregion - - #region Public Methods - - public IIdentity ToIdentity () - { - var schm = Scheme; - return schm == AuthenticationSchemes.Basic - ? new HttpBasicIdentity (Parameters["username"], Parameters["password"]) as IIdentity - : schm == AuthenticationSchemes.Digest - ? new HttpDigestIdentity (Parameters) - : null; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs.meta b/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs.meta deleted file mode 100644 index 0e7df3c32..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationResponse.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 4cd756c8a3321c642a52515499c5c0f3 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs b/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs deleted file mode 100644 index ab7721a15..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region License -/* - * AuthenticationSchemes.cs - * - * This code is derived from AuthenticationSchemes.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Atsushi Enomoto - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - /// - /// Specifies the scheme for authentication. - /// - public enum AuthenticationSchemes - { - /// - /// No authentication is allowed. - /// - None, - /// - /// Specifies digest authentication. - /// - Digest = 1, - /// - /// Specifies basic authentication. - /// - Basic = 8, - /// - /// Specifies anonymous authentication. - /// - Anonymous = 0x8000 - } -} diff --git a/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs.meta b/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs.meta deleted file mode 100644 index 39536460c..000000000 --- a/ThirdParty/WebSocketSharp/Net/AuthenticationSchemes.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 56af515e07e9a1642b21a81576ed5b11 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/Chunk.cs b/ThirdParty/WebSocketSharp/Net/Chunk.cs deleted file mode 100644 index 7b6268b7f..000000000 --- a/ThirdParty/WebSocketSharp/Net/Chunk.cs +++ /dev/null @@ -1,91 +0,0 @@ -#region License -/* - * Chunk.cs - * - * This code is derived from ChunkStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2003 Ximian, Inc (http://www.ximian.com) - * Copyright (c) 2014-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal class Chunk - { - #region Private Fields - - private byte[] _data; - private int _offset; - - #endregion - - #region Public Constructors - - public Chunk (byte[] data) - { - _data = data; - } - - #endregion - - #region Public Properties - - public int ReadLeft { - get { - return _data.Length - _offset; - } - } - - #endregion - - #region Public Methods - - public int Read (byte[] buffer, int offset, int count) - { - var left = _data.Length - _offset; - if (left == 0) - return left; - - if (count > left) - count = left; - - Buffer.BlockCopy (_data, _offset, buffer, offset, count); - _offset += count; - - return count; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/Chunk.cs.meta b/ThirdParty/WebSocketSharp/Net/Chunk.cs.meta deleted file mode 100644 index d4bd99e09..000000000 --- a/ThirdParty/WebSocketSharp/Net/Chunk.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 0c37ef2cf2a56c54cb89f9f0bf98919b -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ChunkStream.cs b/ThirdParty/WebSocketSharp/Net/ChunkStream.cs deleted file mode 100644 index a5271b573..000000000 --- a/ThirdParty/WebSocketSharp/Net/ChunkStream.cs +++ /dev/null @@ -1,360 +0,0 @@ -#region License -/* - * ChunkStream.cs - * - * This code is derived from ChunkStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2003 Ximian, Inc (http://www.ximian.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Net; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal class ChunkStream - { - #region Private Fields - - private int _chunkRead; - private int _chunkSize; - private List _chunks; - private bool _gotIt; - private WebHeaderCollection _headers; - private StringBuilder _saved; - private bool _sawCr; - private InputChunkState _state; - private int _trailerState; - - #endregion - - #region Public Constructors - - public ChunkStream (WebHeaderCollection headers) - { - _headers = headers; - _chunkSize = -1; - _chunks = new List (); - _saved = new StringBuilder (); - } - - public ChunkStream (byte[] buffer, int offset, int count, WebHeaderCollection headers) - : this (headers) - { - Write (buffer, offset, count); - } - - #endregion - - #region Internal Properties - - internal WebHeaderCollection Headers { - get { - return _headers; - } - } - - #endregion - - #region Public Properties - - public int ChunkLeft { - get { - return _chunkSize - _chunkRead; - } - } - - public bool WantMore { - get { - return _state != InputChunkState.End; - } - } - - #endregion - - #region Private Methods - - private int read (byte[] buffer, int offset, int count) - { - var nread = 0; - - var cnt = _chunks.Count; - for (var i = 0; i < cnt; i++) { - var chunk = _chunks[i]; - if (chunk == null) - continue; - - if (chunk.ReadLeft == 0) { - _chunks[i] = null; - continue; - } - - nread += chunk.Read (buffer, offset + nread, count - nread); - if (nread == count) - break; - } - - return nread; - } - - private static string removeChunkExtension (string value) - { - var idx = value.IndexOf (';'); - return idx > -1 ? value.Substring (0, idx) : value; - } - - private InputChunkState seekCrLf (byte[] buffer, ref int offset, int length) - { - if (!_sawCr) { - if (buffer[offset++] != 13) - throwProtocolViolation ("CR is expected."); - - _sawCr = true; - if (offset == length) - return InputChunkState.DataEnded; - } - - if (buffer[offset++] != 10) - throwProtocolViolation ("LF is expected."); - - return InputChunkState.None; - } - - private InputChunkState setChunkSize (byte[] buffer, ref int offset, int length) - { - byte b = 0; - while (offset < length) { - b = buffer[offset++]; - if (_sawCr) { - if (b != 10) - throwProtocolViolation ("LF is expected."); - - break; - } - - if (b == 13) { - _sawCr = true; - continue; - } - - if (b == 10) - throwProtocolViolation ("LF is unexpected."); - - if (b == 32) // SP - _gotIt = true; - - if (!_gotIt) - _saved.Append ((char) b); - - if (_saved.Length > 20) - throwProtocolViolation ("The chunk size is too long."); - } - - if (!_sawCr || b != 10) - return InputChunkState.None; - - _chunkRead = 0; - try { - _chunkSize = Int32.Parse ( - removeChunkExtension (_saved.ToString ()), NumberStyles.HexNumber); - } - catch { - throwProtocolViolation ("The chunk size cannot be parsed."); - } - - if (_chunkSize == 0) { - _trailerState = 2; - return InputChunkState.Trailer; - } - - return InputChunkState.Data; - } - - private InputChunkState setTrailer (byte[] buffer, ref int offset, int length) - { - // Check if no trailer. - if (_trailerState == 2 && buffer[offset] == 13 && _saved.Length == 0) { - offset++; - if (offset < length && buffer[offset] == 10) { - offset++; - return InputChunkState.End; - } - - offset--; - } - - while (offset < length && _trailerState < 4) { - var b = buffer[offset++]; - _saved.Append ((char) b); - if (_saved.Length > 4196) - throwProtocolViolation ("The trailer is too long."); - - if (_trailerState == 1 || _trailerState == 3) { - if (b != 10) - throwProtocolViolation ("LF is expected."); - - _trailerState++; - continue; - } - - if (b == 13) { - _trailerState++; - continue; - } - - if (b == 10) - throwProtocolViolation ("LF is unexpected."); - - _trailerState = 0; - } - - if (_trailerState < 4) - return InputChunkState.Trailer; - - _saved.Length -= 2; - var reader = new StringReader (_saved.ToString ()); - - string line; - while ((line = reader.ReadLine ()) != null && line.Length > 0) - _headers.Add (line); - - return InputChunkState.End; - } - - private static void throwProtocolViolation (string message) - { - throw new WebException (message, null, WebExceptionStatus.ServerProtocolViolation, null); - } - - private void write (byte[] buffer, ref int offset, int length) - { - if (_state == InputChunkState.End) - throwProtocolViolation ("The chunks were ended."); - - if (_state == InputChunkState.None) { - _state = setChunkSize (buffer, ref offset, length); - if (_state == InputChunkState.None) - return; - - _saved.Length = 0; - _sawCr = false; - _gotIt = false; - } - - if (_state == InputChunkState.Data && offset < length) { - _state = writeData (buffer, ref offset, length); - if (_state == InputChunkState.Data) - return; - } - - if (_state == InputChunkState.DataEnded && offset < length) { - _state = seekCrLf (buffer, ref offset, length); - if (_state == InputChunkState.DataEnded) - return; - - _sawCr = false; - } - - if (_state == InputChunkState.Trailer && offset < length) { - _state = setTrailer (buffer, ref offset, length); - if (_state == InputChunkState.Trailer) - return; - - _saved.Length = 0; - } - - if (offset < length) - write (buffer, ref offset, length); - } - - private InputChunkState writeData (byte[] buffer, ref int offset, int length) - { - var cnt = length - offset; - var left = _chunkSize - _chunkRead; - if (cnt > left) - cnt = left; - - var data = new byte[cnt]; - Buffer.BlockCopy (buffer, offset, data, 0, cnt); - _chunks.Add (new Chunk (data)); - - offset += cnt; - _chunkRead += cnt; - - return _chunkRead == _chunkSize ? InputChunkState.DataEnded : InputChunkState.Data; - } - - #endregion - - #region Internal Methods - - internal void ResetBuffer () - { - _chunkRead = 0; - _chunkSize = -1; - _chunks.Clear (); - } - - internal int WriteAndReadBack (byte[] buffer, int offset, int writeCount, int readCount) - { - Write (buffer, offset, writeCount); - return Read (buffer, offset, readCount); - } - - #endregion - - #region Public Methods - - public int Read (byte[] buffer, int offset, int count) - { - if (count <= 0) - return 0; - - return read (buffer, offset, count); - } - - public void Write (byte[] buffer, int offset, int count) - { - if (count <= 0) - return; - - write (buffer, ref offset, offset + count); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ChunkStream.cs.meta b/ThirdParty/WebSocketSharp/Net/ChunkStream.cs.meta deleted file mode 100644 index a7542d7f7..000000000 --- a/ThirdParty/WebSocketSharp/Net/ChunkStream.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 13740a611bbbd7e479dbda85622b9f7d -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs b/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs deleted file mode 100644 index 913b505c3..000000000 --- a/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs +++ /dev/null @@ -1,211 +0,0 @@ -#region License -/* - * ChunkedRequestStream.cs - * - * This code is derived from ChunkedInputStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.IO; - -namespace WebSocketSharp.Net -{ - internal class ChunkedRequestStream : RequestStream - { - #region Private Fields - - private const int _bufferLength = 8192; - private HttpListenerContext _context; - private ChunkStream _decoder; - private bool _disposed; - private bool _noMoreData; - - #endregion - - #region Internal Constructors - - internal ChunkedRequestStream ( - Stream stream, byte[] buffer, int offset, int count, HttpListenerContext context) - : base (stream, buffer, offset, count) - { - _context = context; - _decoder = new ChunkStream ((WebHeaderCollection) context.Request.Headers); - } - - #endregion - - #region Internal Properties - - internal ChunkStream Decoder { - get { - return _decoder; - } - - set { - _decoder = value; - } - } - - #endregion - - #region Private Methods - - private void onRead (IAsyncResult asyncResult) - { - var rstate = (ReadBufferState) asyncResult.AsyncState; - var ares = rstate.AsyncResult; - try { - var nread = base.EndRead (asyncResult); - _decoder.Write (ares.Buffer, ares.Offset, nread); - nread = _decoder.Read (rstate.Buffer, rstate.Offset, rstate.Count); - rstate.Offset += nread; - rstate.Count -= nread; - if (rstate.Count == 0 || !_decoder.WantMore || nread == 0) { - _noMoreData = !_decoder.WantMore && nread == 0; - ares.Count = rstate.InitialCount - rstate.Count; - ares.Complete (); - - return; - } - - ares.Offset = 0; - ares.Count = Math.Min (_bufferLength, _decoder.ChunkLeft + 6); - base.BeginRead (ares.Buffer, ares.Offset, ares.Count, onRead, rstate); - } - catch (Exception ex) { - _context.Connection.SendError (ex.Message, 400); - ares.Complete (ex); - } - } - - #endregion - - #region Public Methods - - public override IAsyncResult BeginRead ( - byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - if (buffer == null) - throw new ArgumentNullException ("buffer"); - - if (offset < 0) - throw new ArgumentOutOfRangeException ("offset", "A negative value."); - - if (count < 0) - throw new ArgumentOutOfRangeException ("count", "A negative value."); - - var len = buffer.Length; - if (offset + count > len) - throw new ArgumentException ( - "The sum of 'offset' and 'count' is greater than 'buffer' length."); - - var ares = new HttpStreamAsyncResult (callback, state); - if (_noMoreData) { - ares.Complete (); - return ares; - } - - var nread = _decoder.Read (buffer, offset, count); - offset += nread; - count -= nread; - if (count == 0) { - // Got all we wanted, no need to bother the decoder yet. - ares.Count = nread; - ares.Complete (); - - return ares; - } - - if (!_decoder.WantMore) { - _noMoreData = nread == 0; - ares.Count = nread; - ares.Complete (); - - return ares; - } - - ares.Buffer = new byte[_bufferLength]; - ares.Offset = 0; - ares.Count = _bufferLength; - - var rstate = new ReadBufferState (buffer, offset, count, ares); - rstate.InitialCount += nread; - base.BeginRead (ares.Buffer, ares.Offset, ares.Count, onRead, rstate); - - return ares; - } - - public override void Close () - { - if (_disposed) - return; - - _disposed = true; - base.Close (); - } - - public override int EndRead (IAsyncResult asyncResult) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - if (asyncResult == null) - throw new ArgumentNullException ("asyncResult"); - - var ares = asyncResult as HttpStreamAsyncResult; - if (ares == null) - throw new ArgumentException ("A wrong IAsyncResult.", "asyncResult"); - - if (!ares.IsCompleted) - ares.AsyncWaitHandle.WaitOne (); - - if (ares.HasException) - throw new HttpListenerException (400, "I/O operation aborted."); - - return ares.Count; - } - - public override int Read (byte[] buffer, int offset, int count) - { - var ares = BeginRead (buffer, offset, count, null, null); - return EndRead (ares); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs.meta b/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs.meta deleted file mode 100644 index bb5a2087a..000000000 --- a/ThirdParty/WebSocketSharp/Net/ChunkedRequestStream.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 634918859e6a1c044b5cb38c0ac19341 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs b/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs deleted file mode 100644 index 800bcb30d..000000000 --- a/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs +++ /dev/null @@ -1,291 +0,0 @@ -#region License -/* - * ClientSslConfiguration.cs - * - * The MIT License - * - * Copyright (c) 2014 liryna - * Copyright (c) 2014-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Liryna - */ -#endregion - -using System; -using System.Net.Security; -using System.Security.Authentication; -using System.Security.Cryptography.X509Certificates; - -namespace WebSocketSharp.Net -{ - /// - /// Stores the parameters for the used by clients. - /// - public class ClientSslConfiguration - { - #region Private Fields - - private bool _checkCertRevocation; - private LocalCertificateSelectionCallback _clientCertSelectionCallback; - private X509CertificateCollection _clientCerts; - private SslProtocols _enabledSslProtocols; - private RemoteCertificateValidationCallback _serverCertValidationCallback; - private string _targetHost; - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public ClientSslConfiguration () - { - _enabledSslProtocols = SslProtocols.Default; - } - - /// - /// Initializes a new instance of the class - /// with the specified . - /// - /// - /// A that represents the target host server name. - /// - public ClientSslConfiguration (string targetHost) - { - _targetHost = targetHost; - _enabledSslProtocols = SslProtocols.Default; - } - - /// - /// Copies the parameters from the specified to - /// a new instance of the class. - /// - /// - /// A from which to copy. - /// - /// - /// is . - /// - public ClientSslConfiguration (ClientSslConfiguration configuration) - { - if (configuration == null) - throw new ArgumentNullException ("configuration"); - - _checkCertRevocation = configuration._checkCertRevocation; - _clientCertSelectionCallback = configuration._clientCertSelectionCallback; - _clientCerts = configuration._clientCerts; - _enabledSslProtocols = configuration._enabledSslProtocols; - _serverCertValidationCallback = configuration._serverCertValidationCallback; - _targetHost = configuration._targetHost; - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets a value indicating whether the certificate revocation - /// list is checked during authentication. - /// - /// - /// - /// true if the certificate revocation list is checked during - /// authentication; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool CheckCertificateRevocation { - get { - return _checkCertRevocation; - } - - set { - _checkCertRevocation = value; - } - } - - /// - /// Gets or sets the certificates from which to select one to - /// supply to the server. - /// - /// - /// - /// A or . - /// - /// - /// That collection contains client certificates from which to select. - /// - /// - /// The default value is . - /// - /// - public X509CertificateCollection ClientCertificates { - get { - return _clientCerts; - } - - set { - _clientCerts = value; - } - } - - /// - /// Gets or sets the callback used to select the certificate to - /// supply to the server. - /// - /// - /// No certificate is supplied if the callback returns - /// . - /// - /// - /// - /// A delegate that - /// invokes the method called for selecting the certificate. - /// - /// - /// The default value is a delegate that invokes a method that - /// only returns . - /// - /// - public LocalCertificateSelectionCallback ClientCertificateSelectionCallback { - get { - if (_clientCertSelectionCallback == null) - _clientCertSelectionCallback = defaultSelectClientCertificate; - - return _clientCertSelectionCallback; - } - - set { - _clientCertSelectionCallback = value; - } - } - - /// - /// Gets or sets the protocols used for authentication. - /// - /// - /// - /// The enum values that represent - /// the protocols used for authentication. - /// - /// - /// The default value is . - /// - /// - public SslProtocols EnabledSslProtocols { - get { - return _enabledSslProtocols; - } - - set { - _enabledSslProtocols = value; - } - } - - /// - /// Gets or sets the callback used to validate the certificate - /// supplied by the server. - /// - /// - /// The certificate is valid if the callback returns true. - /// - /// - /// - /// A delegate that - /// invokes the method called for validating the certificate. - /// - /// - /// The default value is a delegate that invokes a method that - /// only returns true. - /// - /// - public RemoteCertificateValidationCallback ServerCertificateValidationCallback { - get { - if (_serverCertValidationCallback == null) - _serverCertValidationCallback = defaultValidateServerCertificate; - - return _serverCertValidationCallback; - } - - set { - _serverCertValidationCallback = value; - } - } - - /// - /// Gets or sets the target host server name. - /// - /// - /// - /// A or - /// if not specified. - /// - /// - /// That string represents the name of the server that - /// will share a secure connection with a client. - /// - /// - public string TargetHost { - get { - return _targetHost; - } - - set { - _targetHost = value; - } - } - - #endregion - - #region Private Methods - - private static X509Certificate defaultSelectClientCertificate ( - object sender, - string targetHost, - X509CertificateCollection clientCertificates, - X509Certificate serverCertificate, - string[] acceptableIssuers - ) - { - return null; - } - - private static bool defaultValidateServerCertificate ( - object sender, - X509Certificate certificate, - X509Chain chain, - SslPolicyErrors sslPolicyErrors - ) - { - return true; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs.meta b/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs.meta deleted file mode 100644 index cfb77180e..000000000 --- a/ThirdParty/WebSocketSharp/Net/ClientSslConfiguration.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ca2cc177fe39b254cadcd3c519136992 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/Cookie.cs b/ThirdParty/WebSocketSharp/Net/Cookie.cs deleted file mode 100644 index fffc52730..000000000 --- a/ThirdParty/WebSocketSharp/Net/Cookie.cs +++ /dev/null @@ -1,822 +0,0 @@ -#region License -/* - * Cookie.cs - * - * This code is derived from System.Net.Cookie.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2004,2009 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Lawrence Pit - * - Gonzalo Paniagua Javier - * - Daniel Nauck - * - Sebastien Pouliot - */ -#endregion - -using System; -using System.Globalization; -using System.Text; - -namespace WebSocketSharp.Net -{ - /// - /// Provides a set of methods and properties used to manage an HTTP Cookie. - /// - /// - /// - /// The Cookie class supports the following cookie formats: - /// Netscape specification, - /// RFC 2109, and - /// RFC 2965 - /// - /// - /// The Cookie class cannot be inherited. - /// - /// - [Serializable] - public sealed class Cookie - { - #region Private Fields - - private string _comment; - private Uri _commentUri; - private bool _discard; - private string _domain; - private DateTime _expires; - private bool _httpOnly; - private string _name; - private string _path; - private string _port; - private int[] _ports; - private static readonly char[] _reservedCharsForName; - private static readonly char[] _reservedCharsForValue; - private bool _secure; - private DateTime _timestamp; - private string _value; - private int _version; - - #endregion - - #region Static Constructor - - static Cookie () - { - _reservedCharsForName = new[] { ' ', '=', ';', ',', '\n', '\r', '\t' }; - _reservedCharsForValue = new[] { ';', ',' }; - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public Cookie () - { - _comment = String.Empty; - _domain = String.Empty; - _expires = DateTime.MinValue; - _name = String.Empty; - _path = String.Empty; - _port = String.Empty; - _ports = new int[0]; - _timestamp = DateTime.Now; - _value = String.Empty; - _version = 0; - } - - /// - /// Initializes a new instance of the class with the specified - /// and . - /// - /// - /// A that represents the Name of the cookie. - /// - /// - /// A that represents the Value of the cookie. - /// - /// - /// - /// is or empty. - /// - /// - /// - or - - /// - /// - /// contains an invalid character. - /// - /// - /// - or - - /// - /// - /// is . - /// - /// - /// - or - - /// - /// - /// contains a string not enclosed in double quotes - /// that contains an invalid character. - /// - /// - public Cookie (string name, string value) - : this () - { - Name = name; - Value = value; - } - - /// - /// Initializes a new instance of the class with the specified - /// , , and . - /// - /// - /// A that represents the Name of the cookie. - /// - /// - /// A that represents the Value of the cookie. - /// - /// - /// A that represents the value of the Path attribute of the cookie. - /// - /// - /// - /// is or empty. - /// - /// - /// - or - - /// - /// - /// contains an invalid character. - /// - /// - /// - or - - /// - /// - /// is . - /// - /// - /// - or - - /// - /// - /// contains a string not enclosed in double quotes - /// that contains an invalid character. - /// - /// - public Cookie (string name, string value, string path) - : this (name, value) - { - Path = path; - } - - /// - /// Initializes a new instance of the class with the specified - /// , , , and - /// . - /// - /// - /// A that represents the Name of the cookie. - /// - /// - /// A that represents the Value of the cookie. - /// - /// - /// A that represents the value of the Path attribute of the cookie. - /// - /// - /// A that represents the value of the Domain attribute of the cookie. - /// - /// - /// - /// is or empty. - /// - /// - /// - or - - /// - /// - /// contains an invalid character. - /// - /// - /// - or - - /// - /// - /// is . - /// - /// - /// - or - - /// - /// - /// contains a string not enclosed in double quotes - /// that contains an invalid character. - /// - /// - public Cookie (string name, string value, string path, string domain) - : this (name, value, path) - { - Domain = domain; - } - - #endregion - - #region Internal Properties - - internal bool ExactDomain { - get; set; - } - - internal int MaxAge { - get { - if (_expires == DateTime.MinValue) - return 0; - - var expires = _expires.Kind != DateTimeKind.Local - ? _expires.ToLocalTime () - : _expires; - - var span = expires - DateTime.Now; - return span > TimeSpan.Zero - ? (int) span.TotalSeconds - : 0; - } - } - - internal int[] Ports { - get { - return _ports; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets the value of the Comment attribute of the cookie. - /// - /// - /// A that represents the comment to document intended use of the cookie. - /// - public string Comment { - get { - return _comment; - } - - set { - _comment = value ?? String.Empty; - } - } - - /// - /// Gets or sets the value of the CommentURL attribute of the cookie. - /// - /// - /// A that represents the URI that provides the comment to document intended - /// use of the cookie. - /// - public Uri CommentUri { - get { - return _commentUri; - } - - set { - _commentUri = value; - } - } - - /// - /// Gets or sets a value indicating whether the client discards the cookie unconditionally - /// when the client terminates. - /// - /// - /// true if the client discards the cookie unconditionally when the client terminates; - /// otherwise, false. The default value is false. - /// - public bool Discard { - get { - return _discard; - } - - set { - _discard = value; - } - } - - /// - /// Gets or sets the value of the Domain attribute of the cookie. - /// - /// - /// A that represents the URI for which the cookie is valid. - /// - public string Domain { - get { - return _domain; - } - - set { - if (value.IsNullOrEmpty ()) { - _domain = String.Empty; - ExactDomain = true; - } - else { - _domain = value; - ExactDomain = value[0] != '.'; - } - } - } - - /// - /// Gets or sets a value indicating whether the cookie has expired. - /// - /// - /// true if the cookie has expired; otherwise, false. - /// The default value is false. - /// - public bool Expired { - get { - return _expires != DateTime.MinValue && _expires <= DateTime.Now; - } - - set { - _expires = value ? DateTime.Now : DateTime.MinValue; - } - } - - /// - /// Gets or sets the value of the Expires attribute of the cookie. - /// - /// - /// A that represents the date and time at which the cookie expires. - /// The default value is . - /// - public DateTime Expires { - get { - return _expires; - } - - set { - _expires = value; - } - } - - /// - /// Gets or sets a value indicating whether non-HTTP APIs can access the cookie. - /// - /// - /// true if non-HTTP APIs cannot access the cookie; otherwise, false. - /// The default value is false. - /// - public bool HttpOnly { - get { - return _httpOnly; - } - - set { - _httpOnly = value; - } - } - - /// - /// Gets or sets the Name of the cookie. - /// - /// - /// A that represents the Name of the cookie. - /// - /// - /// - /// The value specified for a set operation is or empty. - /// - /// - /// - or - - /// - /// - /// The value specified for a set operation contains an invalid character. - /// - /// - public string Name { - get { - return _name; - } - - set { - string msg; - if (!canSetName (value, out msg)) - throw new CookieException (msg); - - _name = value; - } - } - - /// - /// Gets or sets the value of the Path attribute of the cookie. - /// - /// - /// A that represents the subset of URI on the origin server - /// to which the cookie applies. - /// - public string Path { - get { - return _path; - } - - set { - _path = value ?? String.Empty; - } - } - - /// - /// Gets or sets the value of the Port attribute of the cookie. - /// - /// - /// A that represents the list of TCP ports to which the cookie applies. - /// - /// - /// The value specified for a set operation isn't enclosed in double quotes or - /// couldn't be parsed. - /// - public string Port { - get { - return _port; - } - - set { - if (value.IsNullOrEmpty ()) { - _port = String.Empty; - _ports = new int[0]; - - return; - } - - if (!value.IsEnclosedIn ('"')) - throw new CookieException ( - "The value specified for the Port attribute isn't enclosed in double quotes."); - - string err; - if (!tryCreatePorts (value, out _ports, out err)) - throw new CookieException ( - String.Format ( - "The value specified for the Port attribute contains an invalid value: {0}", err)); - - _port = value; - } - } - - /// - /// Gets or sets a value indicating whether the security level of the cookie is secure. - /// - /// - /// When this property is true, the cookie may be included in the HTTP request - /// only if the request is transmitted over the HTTPS. - /// - /// - /// true if the security level of the cookie is secure; otherwise, false. - /// The default value is false. - /// - public bool Secure { - get { - return _secure; - } - - set { - _secure = value; - } - } - - /// - /// Gets the time when the cookie was issued. - /// - /// - /// A that represents the time when the cookie was issued. - /// - public DateTime TimeStamp { - get { - return _timestamp; - } - } - - /// - /// Gets or sets the Value of the cookie. - /// - /// - /// A that represents the Value of the cookie. - /// - /// - /// - /// The value specified for a set operation is . - /// - /// - /// - or - - /// - /// - /// The value specified for a set operation contains a string not enclosed in double quotes - /// that contains an invalid character. - /// - /// - public string Value { - get { - return _value; - } - - set { - string msg; - if (!canSetValue (value, out msg)) - throw new CookieException (msg); - - _value = value.Length > 0 ? value : "\"\""; - } - } - - /// - /// Gets or sets the value of the Version attribute of the cookie. - /// - /// - /// An that represents the version of the HTTP state management - /// to which the cookie conforms. - /// - /// - /// The value specified for a set operation isn't 0 or 1. - /// - public int Version { - get { - return _version; - } - - set { - if (value < 0 || value > 1) - throw new ArgumentOutOfRangeException ("value", "Not 0 or 1."); - - _version = value; - } - } - - #endregion - - #region Private Methods - - private static bool canSetName (string name, out string message) - { - if (name.IsNullOrEmpty ()) { - message = "The value specified for the Name is null or empty."; - return false; - } - - if (name[0] == '$' || name.Contains (_reservedCharsForName)) { - message = "The value specified for the Name contains an invalid character."; - return false; - } - - message = String.Empty; - return true; - } - - private static bool canSetValue (string value, out string message) - { - if (value == null) { - message = "The value specified for the Value is null."; - return false; - } - - if (value.Contains (_reservedCharsForValue) && !value.IsEnclosedIn ('"')) { - message = "The value specified for the Value contains an invalid character."; - return false; - } - - message = String.Empty; - return true; - } - - private static int hash (int i, int j, int k, int l, int m) - { - return i ^ - (j << 13 | j >> 19) ^ - (k << 26 | k >> 6) ^ - (l << 7 | l >> 25) ^ - (m << 20 | m >> 12); - } - - private string toResponseStringVersion0 () - { - var output = new StringBuilder (64); - output.AppendFormat ("{0}={1}", _name, _value); - - if (_expires != DateTime.MinValue) - output.AppendFormat ( - "; Expires={0}", - _expires.ToUniversalTime ().ToString ( - "ddd, dd'-'MMM'-'yyyy HH':'mm':'ss 'GMT'", - CultureInfo.CreateSpecificCulture ("en-US"))); - - if (!_path.IsNullOrEmpty ()) - output.AppendFormat ("; Path={0}", _path); - - if (!_domain.IsNullOrEmpty ()) - output.AppendFormat ("; Domain={0}", _domain); - - if (_secure) - output.Append ("; Secure"); - - if (_httpOnly) - output.Append ("; HttpOnly"); - - return output.ToString (); - } - - private string toResponseStringVersion1 () - { - var output = new StringBuilder (64); - output.AppendFormat ("{0}={1}; Version={2}", _name, _value, _version); - - if (_expires != DateTime.MinValue) - output.AppendFormat ("; Max-Age={0}", MaxAge); - - if (!_path.IsNullOrEmpty ()) - output.AppendFormat ("; Path={0}", _path); - - if (!_domain.IsNullOrEmpty ()) - output.AppendFormat ("; Domain={0}", _domain); - - if (!_port.IsNullOrEmpty ()) { - if (_port == "\"\"") - output.Append ("; Port"); - else - output.AppendFormat ("; Port={0}", _port); - } - - if (!_comment.IsNullOrEmpty ()) - output.AppendFormat ("; Comment={0}", _comment.UrlEncode ()); - - if (_commentUri != null) { - var url = _commentUri.OriginalString; - output.AppendFormat ("; CommentURL={0}", url.IsToken () ? url : url.Quote ()); - } - - if (_discard) - output.Append ("; Discard"); - - if (_secure) - output.Append ("; Secure"); - - return output.ToString (); - } - - private static bool tryCreatePorts (string value, out int[] result, out string parseError) - { - var ports = value.Trim ('"').Split (','); - var len = ports.Length; - var res = new int[len]; - for (var i = 0; i < len; i++) { - res[i] = Int32.MinValue; - - var port = ports[i].Trim (); - if (port.Length == 0) - continue; - - if (!Int32.TryParse (port, out res[i])) { - result = new int[0]; - parseError = port; - - return false; - } - } - - result = res; - parseError = String.Empty; - - return true; - } - - #endregion - - #region Internal Methods - - // From client to server - internal string ToRequestString (Uri uri) - { - if (_name.Length == 0) - return String.Empty; - - if (_version == 0) - return String.Format ("{0}={1}", _name, _value); - - var output = new StringBuilder (64); - output.AppendFormat ("$Version={0}; {1}={2}", _version, _name, _value); - - if (!_path.IsNullOrEmpty ()) - output.AppendFormat ("; $Path={0}", _path); - else if (uri != null) - output.AppendFormat ("; $Path={0}", uri.GetAbsolutePath ()); - else - output.Append ("; $Path=/"); - - var appendDomain = uri == null || uri.Host != _domain; - if (appendDomain && !_domain.IsNullOrEmpty ()) - output.AppendFormat ("; $Domain={0}", _domain); - - if (!_port.IsNullOrEmpty ()) { - if (_port == "\"\"") - output.Append ("; $Port"); - else - output.AppendFormat ("; $Port={0}", _port); - } - - return output.ToString (); - } - - // From server to client - internal string ToResponseString () - { - return _name.Length > 0 - ? (_version == 0 ? toResponseStringVersion0 () : toResponseStringVersion1 ()) - : String.Empty; - } - - #endregion - - #region Public Methods - - /// - /// Determines whether the specified is equal to the current - /// . - /// - /// - /// An to compare with the current . - /// - /// - /// true if is equal to the current ; - /// otherwise, false. - /// - public override bool Equals (Object comparand) - { - var cookie = comparand as Cookie; - return cookie != null && - _name.Equals (cookie.Name, StringComparison.InvariantCultureIgnoreCase) && - _value.Equals (cookie.Value, StringComparison.InvariantCulture) && - _path.Equals (cookie.Path, StringComparison.InvariantCulture) && - _domain.Equals (cookie.Domain, StringComparison.InvariantCultureIgnoreCase) && - _version == cookie.Version; - } - - /// - /// Serves as a hash function for a object. - /// - /// - /// An that represents the hash code for the current . - /// - public override int GetHashCode () - { - return hash ( - StringComparer.InvariantCultureIgnoreCase.GetHashCode (_name), - _value.GetHashCode (), - _path.GetHashCode (), - StringComparer.InvariantCultureIgnoreCase.GetHashCode (_domain), - _version); - } - - /// - /// Returns a that represents the current . - /// - /// - /// This method returns a to use to send an HTTP Cookie to - /// an origin server. - /// - /// - /// A that represents the current . - /// - public override string ToString () - { - // i.e., only used for clients - // See para 4.2.2 of RFC 2109 and para 3.3.4 of RFC 2965 - // See also bug #316017 - return ToRequestString (null); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/Cookie.cs.meta b/ThirdParty/WebSocketSharp/Net/Cookie.cs.meta deleted file mode 100644 index 7a5b6d587..000000000 --- a/ThirdParty/WebSocketSharp/Net/Cookie.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c4a78eb82db79e7499b0522d261f67c4 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/CookieCollection.cs b/ThirdParty/WebSocketSharp/Net/CookieCollection.cs deleted file mode 100644 index a4caada92..000000000 --- a/ThirdParty/WebSocketSharp/Net/CookieCollection.cs +++ /dev/null @@ -1,598 +0,0 @@ -#region License -/* - * CookieCollection.cs - * - * This code is derived from System.Net.CookieCollection.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2004,2009 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Lawrence Pit - * - Gonzalo Paniagua Javier - * - Sebastien Pouliot - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.Text; - -namespace WebSocketSharp.Net -{ - /// - /// Provides a collection container for instances of the class. - /// - [Serializable] - public class CookieCollection : ICollection, IEnumerable - { - #region Private Fields - - private List _list; - private object _sync; - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public CookieCollection () - { - _list = new List (); - } - - #endregion - - #region Internal Properties - - internal IList List { - get { - return _list; - } - } - - internal IEnumerable Sorted { - get { - var list = new List (_list); - if (list.Count > 1) - list.Sort (compareCookieWithinSorted); - - return list; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the number of cookies in the collection. - /// - /// - /// An that represents the number of cookies in the collection. - /// - public int Count { - get { - return _list.Count; - } - } - - /// - /// Gets a value indicating whether the collection is read-only. - /// - /// - /// true if the collection is read-only; otherwise, false. - /// The default value is true. - /// - public bool IsReadOnly { - // LAMESPEC: So how is one supposed to create a writable CookieCollection instance? - // We simply ignore this property, as this collection is always writable. - get { - return true; - } - } - - /// - /// Gets a value indicating whether the access to the collection is thread safe. - /// - /// - /// true if the access to the collection is thread safe; otherwise, false. - /// The default value is false. - /// - public bool IsSynchronized { - get { - return false; - } - } - - /// - /// Gets the at the specified from - /// the collection. - /// - /// - /// A at the specified in the collection. - /// - /// - /// An that represents the zero-based index of the - /// to find. - /// - /// - /// is out of allowable range of indexes for the collection. - /// - public Cookie this[int index] { - get { - if (index < 0 || index >= _list.Count) - throw new ArgumentOutOfRangeException ("index"); - - return _list[index]; - } - } - - /// - /// Gets the with the specified from - /// the collection. - /// - /// - /// A with the specified in the collection. - /// - /// - /// A that represents the name of the to find. - /// - /// - /// is . - /// - public Cookie this[string name] { - get { - if (name == null) - throw new ArgumentNullException ("name"); - - foreach (var cookie in Sorted) - if (cookie.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase)) - return cookie; - - return null; - } - } - - /// - /// Gets an object used to synchronize access to the collection. - /// - /// - /// An used to synchronize access to the collection. - /// - public Object SyncRoot { - get { - return _sync ?? (_sync = ((ICollection) _list).SyncRoot); - } - } - - #endregion - - #region Private Methods - - private static int compareCookieWithinSort (Cookie x, Cookie y) - { - return (x.Name.Length + x.Value.Length) - (y.Name.Length + y.Value.Length); - } - - private static int compareCookieWithinSorted (Cookie x, Cookie y) - { - var ret = 0; - return (ret = x.Version - y.Version) != 0 - ? ret - : (ret = x.Name.CompareTo (y.Name)) != 0 - ? ret - : y.Path.Length - x.Path.Length; - } - - private static CookieCollection parseRequest (string value) - { - var cookies = new CookieCollection (); - - Cookie cookie = null; - var ver = 0; - var pairs = splitCookieHeaderValue (value); - for (var i = 0; i < pairs.Length; i++) { - var pair = pairs[i].Trim (); - if (pair.Length == 0) - continue; - - if (pair.StartsWith ("$version", StringComparison.InvariantCultureIgnoreCase)) { - ver = Int32.Parse (pair.GetValue ('=', true)); - } - else if (pair.StartsWith ("$path", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Path = pair.GetValue ('='); - } - else if (pair.StartsWith ("$domain", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Domain = pair.GetValue ('='); - } - else if (pair.StartsWith ("$port", StringComparison.InvariantCultureIgnoreCase)) { - var port = pair.Equals ("$port", StringComparison.InvariantCultureIgnoreCase) - ? "\"\"" - : pair.GetValue ('='); - - if (cookie != null) - cookie.Port = port; - } - else { - if (cookie != null) - cookies.Add (cookie); - - string name; - string val = String.Empty; - - var pos = pair.IndexOf ('='); - if (pos == -1) { - name = pair; - } - else if (pos == pair.Length - 1) { - name = pair.Substring (0, pos).TrimEnd (' '); - } - else { - name = pair.Substring (0, pos).TrimEnd (' '); - val = pair.Substring (pos + 1).TrimStart (' '); - } - - cookie = new Cookie (name, val); - if (ver != 0) - cookie.Version = ver; - } - } - - if (cookie != null) - cookies.Add (cookie); - - return cookies; - } - - private static CookieCollection parseResponse (string value) - { - var cookies = new CookieCollection (); - - Cookie cookie = null; - var pairs = splitCookieHeaderValue (value); - for (var i = 0; i < pairs.Length; i++) { - var pair = pairs[i].Trim (); - if (pair.Length == 0) - continue; - - if (pair.StartsWith ("version", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Version = Int32.Parse (pair.GetValue ('=', true)); - } - else if (pair.StartsWith ("expires", StringComparison.InvariantCultureIgnoreCase)) { - var buff = new StringBuilder (pair.GetValue ('='), 32); - if (i < pairs.Length - 1) - buff.AppendFormat (", {0}", pairs[++i].Trim ()); - - DateTime expires; - if (!DateTime.TryParseExact ( - buff.ToString (), - new[] { "ddd, dd'-'MMM'-'yyyy HH':'mm':'ss 'GMT'", "r" }, - CultureInfo.CreateSpecificCulture ("en-US"), - DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal, - out expires)) - expires = DateTime.Now; - - if (cookie != null && cookie.Expires == DateTime.MinValue) - cookie.Expires = expires.ToLocalTime (); - } - else if (pair.StartsWith ("max-age", StringComparison.InvariantCultureIgnoreCase)) { - var max = Int32.Parse (pair.GetValue ('=', true)); - var expires = DateTime.Now.AddSeconds ((double) max); - if (cookie != null) - cookie.Expires = expires; - } - else if (pair.StartsWith ("path", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Path = pair.GetValue ('='); - } - else if (pair.StartsWith ("domain", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Domain = pair.GetValue ('='); - } - else if (pair.StartsWith ("port", StringComparison.InvariantCultureIgnoreCase)) { - var port = pair.Equals ("port", StringComparison.InvariantCultureIgnoreCase) - ? "\"\"" - : pair.GetValue ('='); - - if (cookie != null) - cookie.Port = port; - } - else if (pair.StartsWith ("comment", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Comment = pair.GetValue ('=').UrlDecode (); - } - else if (pair.StartsWith ("commenturl", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.CommentUri = pair.GetValue ('=', true).ToUri (); - } - else if (pair.StartsWith ("discard", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Discard = true; - } - else if (pair.StartsWith ("secure", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.Secure = true; - } - else if (pair.StartsWith ("httponly", StringComparison.InvariantCultureIgnoreCase)) { - if (cookie != null) - cookie.HttpOnly = true; - } - else { - if (cookie != null) - cookies.Add (cookie); - - string name; - string val = String.Empty; - - var pos = pair.IndexOf ('='); - if (pos == -1) { - name = pair; - } - else if (pos == pair.Length - 1) { - name = pair.Substring (0, pos).TrimEnd (' '); - } - else { - name = pair.Substring (0, pos).TrimEnd (' '); - val = pair.Substring (pos + 1).TrimStart (' '); - } - - cookie = new Cookie (name, val); - } - } - - if (cookie != null) - cookies.Add (cookie); - - return cookies; - } - - private int searchCookie (Cookie cookie) - { - var name = cookie.Name; - var path = cookie.Path; - var domain = cookie.Domain; - var ver = cookie.Version; - - for (var i = _list.Count - 1; i >= 0; i--) { - var c = _list[i]; - if (c.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase) && - c.Path.Equals (path, StringComparison.InvariantCulture) && - c.Domain.Equals (domain, StringComparison.InvariantCultureIgnoreCase) && - c.Version == ver) - return i; - } - - return -1; - } - - private static string[] splitCookieHeaderValue (string value) - { - return new List (value.SplitHeaderValue (',', ';')).ToArray (); - } - - #endregion - - #region Internal Methods - - internal static CookieCollection Parse (string value, bool response) - { - return response - ? parseResponse (value) - : parseRequest (value); - } - - internal void SetOrRemove (Cookie cookie) - { - var pos = searchCookie (cookie); - if (pos == -1) { - if (!cookie.Expired) - _list.Add (cookie); - - return; - } - - if (!cookie.Expired) { - _list[pos] = cookie; - return; - } - - _list.RemoveAt (pos); - } - - internal void SetOrRemove (CookieCollection cookies) - { - foreach (Cookie cookie in cookies) - SetOrRemove (cookie); - } - - internal void Sort () - { - if (_list.Count > 1) - _list.Sort (compareCookieWithinSort); - } - - #endregion - - #region Public Methods - - /// - /// Adds the specified to the collection. - /// - /// - /// A to add. - /// - /// - /// is . - /// - public void Add (Cookie cookie) - { - if (cookie == null) - throw new ArgumentNullException ("cookie"); - - var pos = searchCookie (cookie); - if (pos == -1) { - _list.Add (cookie); - return; - } - - _list[pos] = cookie; - } - - /// - /// Adds the specified to the collection. - /// - /// - /// A that contains the cookies to add. - /// - /// - /// is . - /// - public void Add (CookieCollection cookies) - { - if (cookies == null) - throw new ArgumentNullException ("cookies"); - - foreach (Cookie cookie in cookies) - Add (cookie); - } - - /// - /// Copies the elements of the collection to the specified , starting at - /// the specified in the . - /// - /// - /// An that represents the destination of the elements copied from - /// the collection. - /// - /// - /// An that represents the zero-based index in - /// at which copying begins. - /// - /// - /// is . - /// - /// - /// is less than zero. - /// - /// - /// - /// is multidimensional. - /// - /// - /// -or- - /// - /// - /// The number of elements in the collection is greater than the available space from - /// to the end of the destination . - /// - /// - /// - /// The elements in the collection cannot be cast automatically to the type of the destination - /// . - /// - public void CopyTo (Array array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index", "Less than zero."); - - if (array.Rank > 1) - throw new ArgumentException ("Multidimensional.", "array"); - - if (array.Length - index < _list.Count) - throw new ArgumentException ( - "The number of elements in this collection is greater than the available space of the destination array."); - - if (!array.GetType ().GetElementType ().IsAssignableFrom (typeof (Cookie))) - throw new InvalidCastException ( - "The elements in this collection cannot be cast automatically to the type of the destination array."); - - ((IList) _list).CopyTo (array, index); - } - - /// - /// Copies the elements of the collection to the specified array of , - /// starting at the specified in the . - /// - /// - /// An array of that represents the destination of the elements - /// copied from the collection. - /// - /// - /// An that represents the zero-based index in - /// at which copying begins. - /// - /// - /// is . - /// - /// - /// is less than zero. - /// - /// - /// The number of elements in the collection is greater than the available space from - /// to the end of the destination . - /// - public void CopyTo (Cookie[] array, int index) - { - if (array == null) - throw new ArgumentNullException ("array"); - - if (index < 0) - throw new ArgumentOutOfRangeException ("index", "Less than zero."); - - if (array.Length - index < _list.Count) - throw new ArgumentException ( - "The number of elements in this collection is greater than the available space of the destination array."); - - _list.CopyTo (array, index); - } - - /// - /// Gets the enumerator used to iterate through the collection. - /// - /// - /// An instance used to iterate through the collection. - /// - public IEnumerator GetEnumerator () - { - return _list.GetEnumerator (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/CookieCollection.cs.meta b/ThirdParty/WebSocketSharp/Net/CookieCollection.cs.meta deleted file mode 100644 index e34976d5c..000000000 --- a/ThirdParty/WebSocketSharp/Net/CookieCollection.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 4109fe1aa1fbb704fa2c745f424d4179 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/CookieException.cs b/ThirdParty/WebSocketSharp/Net/CookieException.cs deleted file mode 100644 index ca6c8c134..000000000 --- a/ThirdParty/WebSocketSharp/Net/CookieException.cs +++ /dev/null @@ -1,144 +0,0 @@ -#region License -/* - * CookieException.cs - * - * This code is derived from System.Net.CookieException.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Lawrence Pit - */ -#endregion - -using System; -using System.Runtime.Serialization; -using System.Security.Permissions; -#pragma warning disable 0618 - -namespace WebSocketSharp.Net -{ - /// - /// The exception that is thrown when a gets an error. - /// - [Serializable] - public class CookieException : FormatException, ISerializable - { - #region Internal Constructors - - internal CookieException (string message) - : base (message) - { - } - - internal CookieException (string message, Exception innerException) - : base (message, innerException) - { - } - - #endregion - - #region Protected Constructors - - /// - /// Initializes a new instance of the class from - /// the specified and . - /// - /// - /// A that contains the serialized object data. - /// - /// - /// A that specifies the source for the deserialization. - /// - protected CookieException ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - : base (serializationInfo, streamingContext) - { - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public CookieException () - : base () - { - } - - #endregion - - #region Public Methods - - /// - /// Populates the specified with the data needed to serialize - /// the current . - /// - /// - /// A that holds the serialized object data. - /// - /// - /// A that specifies the destination for the serialization. - /// - [SecurityPermission ( - SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] - public override void GetObjectData ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - { - base.GetObjectData (serializationInfo, streamingContext); - } - - #endregion - - #region Explicit Interface Implementation - - /// - /// Populates the specified with the data needed to serialize - /// the current . - /// - /// - /// A that holds the serialized object data. - /// - /// - /// A that specifies the destination for the serialization. - /// - [SecurityPermission ( - SecurityAction.LinkDemand, - Flags = SecurityPermissionFlag.SerializationFormatter, - SerializationFormatter = true)] - void ISerializable.GetObjectData ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - { - base.GetObjectData (serializationInfo, streamingContext); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/CookieException.cs.meta b/ThirdParty/WebSocketSharp/Net/CookieException.cs.meta deleted file mode 100644 index a3ecd488e..000000000 --- a/ThirdParty/WebSocketSharp/Net/CookieException.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 12d2bc193306cf44a888e7e0c640945b -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/EndPointListener.cs b/ThirdParty/WebSocketSharp/Net/EndPointListener.cs deleted file mode 100644 index 67fa26393..000000000 --- a/ThirdParty/WebSocketSharp/Net/EndPointListener.cs +++ /dev/null @@ -1,515 +0,0 @@ -#region License -/* - * EndPointListener.cs - * - * This code is derived from EndPointListener.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - * - Nicholas Devenish - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Threading; - -namespace WebSocketSharp.Net -{ - internal sealed class EndPointListener - { - #region Private Fields - - private List _all; // host == '+' - private static readonly string _defaultCertFolderPath; - private IPEndPoint _endpoint; - private Dictionary _prefixes; - private bool _secure; - private Socket _socket; - private ServerSslConfiguration _sslConfig; - private List _unhandled; // host == '*' - private Dictionary _unregistered; - private object _unregisteredSync; - - #endregion - - #region Static Constructor - - static EndPointListener () - { - _defaultCertFolderPath = - Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); - } - - #endregion - - #region Internal Constructors - - internal EndPointListener ( - IPEndPoint endpoint, - bool secure, - string certificateFolderPath, - ServerSslConfiguration sslConfig, - bool reuseAddress - ) - { - if (secure) { - var cert = - getCertificate (endpoint.Port, certificateFolderPath, sslConfig.ServerCertificate); - - if (cert == null) - throw new ArgumentException ("No server certificate could be found."); - - _secure = true; - _sslConfig = new ServerSslConfiguration (sslConfig); - _sslConfig.ServerCertificate = cert; - } - - _endpoint = endpoint; - _prefixes = new Dictionary (); - _unregistered = new Dictionary (); - _unregisteredSync = ((ICollection) _unregistered).SyncRoot; - _socket = - new Socket (endpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - - if (reuseAddress) - _socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - - _socket.Bind (endpoint); - _socket.Listen (500); - _socket.BeginAccept (onAccept, this); - } - - #endregion - - #region Public Properties - - public IPAddress Address { - get { - return _endpoint.Address; - } - } - - public bool IsSecure { - get { - return _secure; - } - } - - public int Port { - get { - return _endpoint.Port; - } - } - - public ServerSslConfiguration SslConfiguration { - get { - return _sslConfig; - } - } - - #endregion - - #region Private Methods - - private static void addSpecial (List prefixes, HttpListenerPrefix prefix) - { - var path = prefix.Path; - foreach (var pref in prefixes) { - if (pref.Path == path) - throw new HttpListenerException (87, "The prefix is already in use."); - } - - prefixes.Add (prefix); - } - - private static RSACryptoServiceProvider createRSAFromFile (string filename) - { - byte[] pvk = null; - using (var fs = File.Open (filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { - pvk = new byte[fs.Length]; - fs.Read (pvk, 0, pvk.Length); - } - - var rsa = new RSACryptoServiceProvider (); - rsa.ImportCspBlob (pvk); - - return rsa; - } - - private static X509Certificate2 getCertificate ( - int port, string folderPath, X509Certificate2 defaultCertificate - ) - { - if (folderPath == null || folderPath.Length == 0) - folderPath = _defaultCertFolderPath; - - try { - var cer = Path.Combine (folderPath, String.Format ("{0}.cer", port)); - var key = Path.Combine (folderPath, String.Format ("{0}.key", port)); - if (File.Exists (cer) && File.Exists (key)) { - var cert = new X509Certificate2 (cer); - cert.PrivateKey = createRSAFromFile (key); - - return cert; - } - } - catch { - } - - return defaultCertificate; - } - - private void leaveIfNoPrefix () - { - if (_prefixes.Count > 0) - return; - - var prefs = _unhandled; - if (prefs != null && prefs.Count > 0) - return; - - prefs = _all; - if (prefs != null && prefs.Count > 0) - return; - - EndPointManager.RemoveEndPoint (_endpoint); - } - - private static void onAccept (IAsyncResult asyncResult) - { - var lsnr = (EndPointListener) asyncResult.AsyncState; - - Socket sock = null; - try { - sock = lsnr._socket.EndAccept (asyncResult); - } - catch (SocketException) { - // TODO: Should log the error code when this class has a logging. - } - catch (ObjectDisposedException) { - return; - } - - try { - lsnr._socket.BeginAccept (onAccept, lsnr); - } - catch { - if (sock != null) - sock.Close (); - - return; - } - - if (sock == null) - return; - - processAccepted (sock, lsnr); - } - - private static void processAccepted (Socket socket, EndPointListener listener) - { - HttpConnection conn = null; - try { - conn = new HttpConnection (socket, listener); - lock (listener._unregisteredSync) - listener._unregistered[conn] = conn; - - conn.BeginReadRequest (); - } - catch { - if (conn != null) { - conn.Close (true); - return; - } - - socket.Close (); - } - } - - private static bool removeSpecial (List prefixes, HttpListenerPrefix prefix) - { - var path = prefix.Path; - var cnt = prefixes.Count; - for (var i = 0; i < cnt; i++) { - if (prefixes[i].Path == path) { - prefixes.RemoveAt (i); - return true; - } - } - - return false; - } - - private static HttpListener searchHttpListenerFromSpecial ( - string path, List prefixes - ) - { - if (prefixes == null) - return null; - - HttpListener bestMatch = null; - - var bestLen = -1; - foreach (var pref in prefixes) { - var prefPath = pref.Path; - - var len = prefPath.Length; - if (len < bestLen) - continue; - - if (path.StartsWith (prefPath)) { - bestLen = len; - bestMatch = pref.Listener; - } - } - - return bestMatch; - } - - #endregion - - #region Internal Methods - - internal static bool CertificateExists (int port, string folderPath) - { - if (folderPath == null || folderPath.Length == 0) - folderPath = _defaultCertFolderPath; - - var cer = Path.Combine (folderPath, String.Format ("{0}.cer", port)); - var key = Path.Combine (folderPath, String.Format ("{0}.key", port)); - - return File.Exists (cer) && File.Exists (key); - } - - internal void RemoveConnection (HttpConnection connection) - { - lock (_unregisteredSync) - _unregistered.Remove (connection); - } - - internal bool TrySearchHttpListener (Uri uri, out HttpListener listener) - { - listener = null; - - if (uri == null) - return false; - - var host = uri.Host; - var dns = Uri.CheckHostName (host) == UriHostNameType.Dns; - var port = uri.Port.ToString (); - var path = HttpUtility.UrlDecode (uri.AbsolutePath); - var pathSlash = path[path.Length - 1] != '/' ? path + "/" : path; - - if (host != null && host.Length > 0) { - var bestLen = -1; - foreach (var pref in _prefixes.Keys) { - if (dns) { - var prefHost = pref.Host; - if (Uri.CheckHostName (prefHost) == UriHostNameType.Dns && prefHost != host) - continue; - } - - if (pref.Port != port) - continue; - - var prefPath = pref.Path; - - var len = prefPath.Length; - if (len < bestLen) - continue; - - if (path.StartsWith (prefPath) || pathSlash.StartsWith (prefPath)) { - bestLen = len; - listener = _prefixes[pref]; - } - } - - if (bestLen != -1) - return true; - } - - var prefs = _unhandled; - listener = searchHttpListenerFromSpecial (path, prefs); - if (listener == null && pathSlash != path) - listener = searchHttpListenerFromSpecial (pathSlash, prefs); - - if (listener != null) - return true; - - prefs = _all; - listener = searchHttpListenerFromSpecial (path, prefs); - if (listener == null && pathSlash != path) - listener = searchHttpListenerFromSpecial (pathSlash, prefs); - - return listener != null; - } - - #endregion - - #region Public Methods - - public void AddPrefix (HttpListenerPrefix prefix, HttpListener listener) - { - List current, future; - if (prefix.Host == "*") { - do { - current = _unhandled; - future = current != null - ? new List (current) - : new List (); - - prefix.Listener = listener; - addSpecial (future, prefix); - } - while (Interlocked.CompareExchange (ref _unhandled, future, current) != current); - - return; - } - - if (prefix.Host == "+") { - do { - current = _all; - future = current != null - ? new List (current) - : new List (); - - prefix.Listener = listener; - addSpecial (future, prefix); - } - while (Interlocked.CompareExchange (ref _all, future, current) != current); - - return; - } - - Dictionary prefs, prefs2; - do { - prefs = _prefixes; - if (prefs.ContainsKey (prefix)) { - if (prefs[prefix] != listener) { - throw new HttpListenerException ( - 87, String.Format ("There's another listener for {0}.", prefix) - ); - } - - return; - } - - prefs2 = new Dictionary (prefs); - prefs2[prefix] = listener; - } - while (Interlocked.CompareExchange (ref _prefixes, prefs2, prefs) != prefs); - } - - public void Close () - { - _socket.Close (); - - HttpConnection[] conns = null; - lock (_unregisteredSync) { - if (_unregistered.Count == 0) - return; - - var keys = _unregistered.Keys; - conns = new HttpConnection[keys.Count]; - keys.CopyTo (conns, 0); - _unregistered.Clear (); - } - - for (var i = conns.Length - 1; i >= 0; i--) - conns[i].Close (true); - } - - public void RemovePrefix (HttpListenerPrefix prefix, HttpListener listener) - { - List current, future; - if (prefix.Host == "*") { - do { - current = _unhandled; - if (current == null) - break; - - future = new List (current); - if (!removeSpecial (future, prefix)) - break; // The prefix wasn't found. - } - while (Interlocked.CompareExchange (ref _unhandled, future, current) != current); - - leaveIfNoPrefix (); - return; - } - - if (prefix.Host == "+") { - do { - current = _all; - if (current == null) - break; - - future = new List (current); - if (!removeSpecial (future, prefix)) - break; // The prefix wasn't found. - } - while (Interlocked.CompareExchange (ref _all, future, current) != current); - - leaveIfNoPrefix (); - return; - } - - Dictionary prefs, prefs2; - do { - prefs = _prefixes; - if (!prefs.ContainsKey (prefix)) - break; - - prefs2 = new Dictionary (prefs); - prefs2.Remove (prefix); - } - while (Interlocked.CompareExchange (ref _prefixes, prefs2, prefs) != prefs); - - leaveIfNoPrefix (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/EndPointListener.cs.meta b/ThirdParty/WebSocketSharp/Net/EndPointListener.cs.meta deleted file mode 100644 index 9380ef197..000000000 --- a/ThirdParty/WebSocketSharp/Net/EndPointListener.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 40ff77aebfc0f0741b39721b69fff573 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/EndPointManager.cs b/ThirdParty/WebSocketSharp/Net/EndPointManager.cs deleted file mode 100644 index ebecf459e..000000000 --- a/ThirdParty/WebSocketSharp/Net/EndPointManager.cs +++ /dev/null @@ -1,228 +0,0 @@ -#region License -/* - * EndPointManager.cs - * - * This code is derived from EndPointManager.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Net; - -namespace WebSocketSharp.Net -{ - internal sealed class EndPointManager - { - #region Private Fields - - private static readonly Dictionary _endpoints; - - #endregion - - #region Static Constructor - - static EndPointManager () - { - _endpoints = new Dictionary (); - } - - #endregion - - #region Private Constructors - - private EndPointManager () - { - } - - #endregion - - #region Private Methods - - private static void addPrefix (string uriPrefix, HttpListener listener) - { - var pref = new HttpListenerPrefix (uriPrefix); - - var addr = convertToIPAddress (pref.Host); - if (!addr.IsLocal ()) - throw new HttpListenerException (87, "Includes an invalid host."); - - int port; - if (!Int32.TryParse (pref.Port, out port)) - throw new HttpListenerException (87, "Includes an invalid port."); - - if (!port.IsPortNumber ()) - throw new HttpListenerException (87, "Includes an invalid port."); - - var path = pref.Path; - if (path.IndexOf ('%') != -1) - throw new HttpListenerException (87, "Includes an invalid path."); - - if (path.IndexOf ("//", StringComparison.Ordinal) != -1) - throw new HttpListenerException (87, "Includes an invalid path."); - - var endpoint = new IPEndPoint (addr, port); - - EndPointListener lsnr; - if (_endpoints.TryGetValue (endpoint, out lsnr)) { - if (lsnr.IsSecure ^ pref.IsSecure) - throw new HttpListenerException (87, "Includes an invalid scheme."); - } - else { - lsnr = - new EndPointListener ( - endpoint, - pref.IsSecure, - listener.CertificateFolderPath, - listener.SslConfiguration, - listener.ReuseAddress - ); - - _endpoints.Add (endpoint, lsnr); - } - - lsnr.AddPrefix (pref, listener); - } - - private static IPAddress convertToIPAddress (string hostname) - { - return hostname == "*" || hostname == "+" ? IPAddress.Any : hostname.ToIPAddress (); - } - - private static void removePrefix (string uriPrefix, HttpListener listener) - { - var pref = new HttpListenerPrefix (uriPrefix); - - var addr = convertToIPAddress (pref.Host); - if (!addr.IsLocal ()) - return; - - int port; - if (!Int32.TryParse (pref.Port, out port)) - return; - - if (!port.IsPortNumber ()) - return; - - var path = pref.Path; - if (path.IndexOf ('%') != -1) - return; - - if (path.IndexOf ("//", StringComparison.Ordinal) != -1) - return; - - var endpoint = new IPEndPoint (addr, port); - - EndPointListener lsnr; - if (!_endpoints.TryGetValue (endpoint, out lsnr)) - return; - - if (lsnr.IsSecure ^ pref.IsSecure) - return; - - lsnr.RemovePrefix (pref, listener); - } - - #endregion - - #region Internal Methods - - internal static bool RemoveEndPoint (IPEndPoint endpoint) - { - lock (((ICollection) _endpoints).SyncRoot) { - EndPointListener lsnr; - if (!_endpoints.TryGetValue (endpoint, out lsnr)) - return false; - - _endpoints.Remove (endpoint); - lsnr.Close (); - - return true; - } - } - - #endregion - - #region Public Methods - - public static void AddListener (HttpListener listener) - { - var added = new List (); - lock (((ICollection) _endpoints).SyncRoot) { - try { - foreach (var pref in listener.Prefixes) { - addPrefix (pref, listener); - added.Add (pref); - } - } - catch { - foreach (var pref in added) - removePrefix (pref, listener); - - throw; - } - } - } - - public static void AddPrefix (string uriPrefix, HttpListener listener) - { - lock (((ICollection) _endpoints).SyncRoot) - addPrefix (uriPrefix, listener); - } - - public static void RemoveListener (HttpListener listener) - { - lock (((ICollection) _endpoints).SyncRoot) { - foreach (var pref in listener.Prefixes) - removePrefix (pref, listener); - } - } - - public static void RemovePrefix (string uriPrefix, HttpListener listener) - { - lock (((ICollection) _endpoints).SyncRoot) - removePrefix (uriPrefix, listener); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/EndPointManager.cs.meta b/ThirdParty/WebSocketSharp/Net/EndPointManager.cs.meta deleted file mode 100644 index 5100842da..000000000 --- a/ThirdParty/WebSocketSharp/Net/EndPointManager.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 41eda606bbcdb174787941ae41734aa9 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs b/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs deleted file mode 100644 index da2eb90a9..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs +++ /dev/null @@ -1,82 +0,0 @@ -#region License -/* - * HttpBasicIdentity.cs - * - * This code is derived from HttpListenerBasicIdentity.cs (System.Net) of - * Mono (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Security.Principal; - -namespace WebSocketSharp.Net -{ - /// - /// Holds the username and password from an HTTP Basic authentication attempt. - /// - public class HttpBasicIdentity : GenericIdentity - { - #region Private Fields - - private string _password = null; - - #endregion - - #region Internal Constructors - - internal HttpBasicIdentity (string username, string password) - : base (username, "Basic") - { - _password = password; - } - - #endregion - - #region Public Properties - - /// - /// Gets the password from a basic authentication attempt. - /// - /// - /// A that represents the password. - /// - public virtual string Password { - get { - return _password; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs.meta deleted file mode 100644 index a91c7587d..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpBasicIdentity.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 6491a32eeb283bd4dbe6dfbbe01672d7 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpConnection.cs b/ThirdParty/WebSocketSharp/Net/HttpConnection.cs deleted file mode 100644 index 36d9a461e..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpConnection.cs +++ /dev/null @@ -1,574 +0,0 @@ -#region License -/* - * HttpConnection.cs - * - * This code is derived from HttpConnection.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - * - Rohan Singh - */ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Net.Security; -using System.Net.Sockets; -using System.Text; -using System.Threading; - -namespace WebSocketSharp.Net -{ - internal sealed class HttpConnection - { - #region Private Fields - - private byte[] _buffer; - private const int _bufferLength = 8192; - private HttpListenerContext _context; - private bool _contextRegistered; - private StringBuilder _currentLine; - private InputState _inputState; - private RequestStream _inputStream; - private HttpListener _lastListener; - private LineState _lineState; - private EndPointListener _listener; - private ResponseStream _outputStream; - private int _position; - private MemoryStream _requestBuffer; - private int _reuses; - private bool _secure; - private Socket _socket; - private Stream _stream; - private object _sync; - private int _timeout; - private Dictionary _timeoutCanceled; - private Timer _timer; - - #endregion - - #region Internal Constructors - - internal HttpConnection (Socket socket, EndPointListener listener) - { - _socket = socket; - _listener = listener; - _secure = listener.IsSecure; - - var netStream = new NetworkStream (socket, false); - if (_secure) { - var conf = listener.SslConfiguration; - var sslStream = new SslStream (netStream, false, conf.ClientCertificateValidationCallback); - sslStream.AuthenticateAsServer ( - conf.ServerCertificate, - conf.ClientCertificateRequired, - conf.EnabledSslProtocols, - conf.CheckCertificateRevocation - ); - - _stream = sslStream; - } - else { - _stream = netStream; - } - - _sync = new object (); - _timeout = 90000; // 90k ms for first request, 15k ms from then on. - _timeoutCanceled = new Dictionary (); - _timer = new Timer (onTimeout, this, Timeout.Infinite, Timeout.Infinite); - - init (); - } - - #endregion - - #region Public Properties - - public bool IsClosed { - get { - return _socket == null; - } - } - - public bool IsSecure { - get { - return _secure; - } - } - - public IPEndPoint LocalEndPoint { - get { - return (IPEndPoint) _socket.LocalEndPoint; - } - } - - public IPEndPoint RemoteEndPoint { - get { - return (IPEndPoint) _socket.RemoteEndPoint; - } - } - - public int Reuses { - get { - return _reuses; - } - } - - public Stream Stream { - get { - return _stream; - } - } - - #endregion - - #region Private Methods - - private void close () - { - lock (_sync) { - if (_socket == null) - return; - - disposeTimer (); - disposeRequestBuffer (); - disposeStream (); - closeSocket (); - } - - unregisterContext (); - removeConnection (); - } - - private void closeSocket () - { - try { - _socket.Shutdown (SocketShutdown.Both); - } - catch { - } - - _socket.Close (); - _socket = null; - } - - private void disposeRequestBuffer () - { - if (_requestBuffer == null) - return; - - _requestBuffer.Dispose (); - _requestBuffer = null; - } - - private void disposeStream () - { - if (_stream == null) - return; - - _inputStream = null; - _outputStream = null; - - _stream.Dispose (); - _stream = null; - } - - private void disposeTimer () - { - if (_timer == null) - return; - - try { - _timer.Change (Timeout.Infinite, Timeout.Infinite); - } - catch { - } - - _timer.Dispose (); - _timer = null; - } - - private void init () - { - _context = new HttpListenerContext (this); - _inputState = InputState.RequestLine; - _inputStream = null; - _lineState = LineState.None; - _outputStream = null; - _position = 0; - _requestBuffer = new MemoryStream (); - } - - private static void onRead (IAsyncResult asyncResult) - { - var conn = (HttpConnection) asyncResult.AsyncState; - if (conn._socket == null) - return; - - lock (conn._sync) { - if (conn._socket == null) - return; - - var nread = -1; - var len = 0; - try { - var current = conn._reuses; - if (!conn._timeoutCanceled[current]) { - conn._timer.Change (Timeout.Infinite, Timeout.Infinite); - conn._timeoutCanceled[current] = true; - } - - nread = conn._stream.EndRead (asyncResult); - conn._requestBuffer.Write (conn._buffer, 0, nread); - len = (int) conn._requestBuffer.Length; - } - catch (Exception ex) { - if (conn._requestBuffer != null && conn._requestBuffer.Length > 0) { - conn.SendError (ex.Message, 400); - return; - } - - conn.close (); - return; - } - - if (nread <= 0) { - conn.close (); - return; - } - - if (conn.processInput (conn._requestBuffer.GetBuffer (), len)) { - if (!conn._context.HasError) - conn._context.Request.FinishInitialization (); - - if (conn._context.HasError) { - conn.SendError (); - return; - } - - HttpListener lsnr; - if (!conn._listener.TrySearchHttpListener (conn._context.Request.Url, out lsnr)) { - conn.SendError (null, 404); - return; - } - - if (conn._lastListener != lsnr) { - conn.removeConnection (); - if (!lsnr.AddConnection (conn)) { - conn.close (); - return; - } - - conn._lastListener = lsnr; - } - - conn._context.Listener = lsnr; - if (!conn._context.Authenticate ()) - return; - - if (conn._context.Register ()) - conn._contextRegistered = true; - - return; - } - - conn._stream.BeginRead (conn._buffer, 0, _bufferLength, onRead, conn); - } - } - - private static void onTimeout (object state) - { - var conn = (HttpConnection) state; - var current = conn._reuses; - if (conn._socket == null) - return; - - lock (conn._sync) { - if (conn._socket == null) - return; - - if (conn._timeoutCanceled[current]) - return; - - conn.SendError (null, 408); - } - } - - // true -> Done processing. - // false -> Need more input. - private bool processInput (byte[] data, int length) - { - if (_currentLine == null) - _currentLine = new StringBuilder (64); - - var nread = 0; - try { - string line; - while ((line = readLineFrom (data, _position, length, out nread)) != null) { - _position += nread; - if (line.Length == 0) { - if (_inputState == InputState.RequestLine) - continue; - - if (_position > 32768) - _context.ErrorMessage = "Headers too long"; - - _currentLine = null; - return true; - } - - if (_inputState == InputState.RequestLine) { - _context.Request.SetRequestLine (line); - _inputState = InputState.Headers; - } - else { - _context.Request.AddHeader (line); - } - - if (_context.HasError) - return true; - } - } - catch (Exception ex) { - _context.ErrorMessage = ex.Message; - return true; - } - - _position += nread; - if (_position >= 32768) { - _context.ErrorMessage = "Headers too long"; - return true; - } - - return false; - } - - private string readLineFrom (byte[] buffer, int offset, int length, out int read) - { - read = 0; - - for (var i = offset; i < length && _lineState != LineState.Lf; i++) { - read++; - - var b = buffer[i]; - if (b == 13) - _lineState = LineState.Cr; - else if (b == 10) - _lineState = LineState.Lf; - else - _currentLine.Append ((char) b); - } - - if (_lineState != LineState.Lf) - return null; - - var line = _currentLine.ToString (); - - _currentLine.Length = 0; - _lineState = LineState.None; - - return line; - } - - private void removeConnection () - { - if (_lastListener != null) - _lastListener.RemoveConnection (this); - else - _listener.RemoveConnection (this); - } - - private void unregisterContext () - { - if (!_contextRegistered) - return; - - _context.Unregister (); - _contextRegistered = false; - } - - #endregion - - #region Internal Methods - - internal void Close (bool force) - { - if (_socket == null) - return; - - lock (_sync) { - if (_socket == null) - return; - - if (!force) { - GetResponseStream ().Close (false); - if (!_context.Response.CloseConnection && _context.Request.FlushInput ()) { - // Don't close. Keep working. - _reuses++; - disposeRequestBuffer (); - unregisterContext (); - init (); - BeginReadRequest (); - - return; - } - } - else if (_outputStream != null) { - _outputStream.Close (true); - } - - close (); - } - } - - #endregion - - #region Public Methods - - public void BeginReadRequest () - { - if (_buffer == null) - _buffer = new byte[_bufferLength]; - - if (_reuses == 1) - _timeout = 15000; - - try { - _timeoutCanceled.Add (_reuses, false); - _timer.Change (_timeout, Timeout.Infinite); - _stream.BeginRead (_buffer, 0, _bufferLength, onRead, this); - } - catch { - close (); - } - } - - public void Close () - { - Close (false); - } - - public RequestStream GetRequestStream (long contentLength, bool chunked) - { - if (_inputStream != null || _socket == null) - return _inputStream; - - lock (_sync) { - if (_socket == null) - return _inputStream; - - var buff = _requestBuffer.GetBuffer (); - var len = (int) _requestBuffer.Length; - disposeRequestBuffer (); - if (chunked) { - _context.Response.SendChunked = true; - _inputStream = - new ChunkedRequestStream (_stream, buff, _position, len - _position, _context); - } - else { - _inputStream = - new RequestStream (_stream, buff, _position, len - _position, contentLength); - } - - return _inputStream; - } - } - - public ResponseStream GetResponseStream () - { - // TODO: Can we get this stream before reading the input? - - if (_outputStream != null || _socket == null) - return _outputStream; - - lock (_sync) { - if (_socket == null) - return _outputStream; - - var lsnr = _context.Listener; - var ignore = lsnr != null ? lsnr.IgnoreWriteExceptions : true; - _outputStream = new ResponseStream (_stream, _context.Response, ignore); - - return _outputStream; - } - } - - public void SendError () - { - SendError (_context.ErrorMessage, _context.ErrorStatus); - } - - public void SendError (string message, int status) - { - if (_socket == null) - return; - - lock (_sync) { - if (_socket == null) - return; - - try { - var res = _context.Response; - res.StatusCode = status; - res.ContentType = "text/html"; - - var content = new StringBuilder (64); - content.AppendFormat ("

{0} {1}", status, res.StatusDescription); - if (message != null && message.Length > 0) - content.AppendFormat (" ({0})

", message); - else - content.Append ("

"); - - var enc = Encoding.UTF8; - var entity = enc.GetBytes (content.ToString ()); - res.ContentEncoding = enc; - res.ContentLength64 = entity.LongLength; - - res.Close (entity, true); - } - catch { - Close (true); - } - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpConnection.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpConnection.cs.meta deleted file mode 100644 index d2b57a9cf..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpConnection.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 58f4ccbe1b94b304095eaad7eb12c19d -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs b/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs deleted file mode 100644 index 68ec86d9f..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs +++ /dev/null @@ -1,187 +0,0 @@ -#region License -/* - * HttpDigestIdentity.cs - * - * The MIT License - * - * Copyright (c) 2014-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.Security.Principal; - -namespace WebSocketSharp.Net -{ - /// - /// Holds the username and other parameters from - /// an HTTP Digest authentication attempt. - /// - public class HttpDigestIdentity : GenericIdentity - { - #region Private Fields - - private NameValueCollection _parameters; - - #endregion - - #region Internal Constructors - - internal HttpDigestIdentity (NameValueCollection parameters) - : base (parameters["username"], "Digest") - { - _parameters = parameters; - } - - #endregion - - #region Public Properties - - /// - /// Gets the algorithm parameter from a digest authentication attempt. - /// - /// - /// A that represents the algorithm parameter. - /// - public string Algorithm { - get { - return _parameters["algorithm"]; - } - } - - /// - /// Gets the cnonce parameter from a digest authentication attempt. - /// - /// - /// A that represents the cnonce parameter. - /// - public string Cnonce { - get { - return _parameters["cnonce"]; - } - } - - /// - /// Gets the nc parameter from a digest authentication attempt. - /// - /// - /// A that represents the nc parameter. - /// - public string Nc { - get { - return _parameters["nc"]; - } - } - - /// - /// Gets the nonce parameter from a digest authentication attempt. - /// - /// - /// A that represents the nonce parameter. - /// - public string Nonce { - get { - return _parameters["nonce"]; - } - } - - /// - /// Gets the opaque parameter from a digest authentication attempt. - /// - /// - /// A that represents the opaque parameter. - /// - public string Opaque { - get { - return _parameters["opaque"]; - } - } - - /// - /// Gets the qop parameter from a digest authentication attempt. - /// - /// - /// A that represents the qop parameter. - /// - public string Qop { - get { - return _parameters["qop"]; - } - } - - /// - /// Gets the realm parameter from a digest authentication attempt. - /// - /// - /// A that represents the realm parameter. - /// - public string Realm { - get { - return _parameters["realm"]; - } - } - - /// - /// Gets the response parameter from a digest authentication attempt. - /// - /// - /// A that represents the response parameter. - /// - public string Response { - get { - return _parameters["response"]; - } - } - - /// - /// Gets the uri parameter from a digest authentication attempt. - /// - /// - /// A that represents the uri parameter. - /// - public string Uri { - get { - return _parameters["uri"]; - } - } - - #endregion - - #region Internal Methods - - internal bool IsValid ( - string password, string realm, string method, string entity - ) - { - var copied = new NameValueCollection (_parameters); - copied["password"] = password; - copied["realm"] = realm; - copied["method"] = method; - copied["entity"] = entity; - - var expected = AuthenticationResponse.CreateRequestDigest (copied); - return _parameters["response"] == expected; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs.meta deleted file mode 100644 index 0a8afe7fa..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpDigestIdentity.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c9d775205a72a3a44a649c431d298246 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs b/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs deleted file mode 100644 index 717f8f46d..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs +++ /dev/null @@ -1,114 +0,0 @@ -#region License -/* - * HttpHeaderInfo.cs - * - * The MIT License - * - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal class HttpHeaderInfo - { - #region Private Fields - - private string _name; - private HttpHeaderType _type; - - #endregion - - #region Internal Constructors - - internal HttpHeaderInfo (string name, HttpHeaderType type) - { - _name = name; - _type = type; - } - - #endregion - - #region Internal Properties - - internal bool IsMultiValueInRequest { - get { - return (_type & HttpHeaderType.MultiValueInRequest) == HttpHeaderType.MultiValueInRequest; - } - } - - internal bool IsMultiValueInResponse { - get { - return (_type & HttpHeaderType.MultiValueInResponse) == HttpHeaderType.MultiValueInResponse; - } - } - - #endregion - - #region Public Properties - - public bool IsRequest { - get { - return (_type & HttpHeaderType.Request) == HttpHeaderType.Request; - } - } - - public bool IsResponse { - get { - return (_type & HttpHeaderType.Response) == HttpHeaderType.Response; - } - } - - public string Name { - get { - return _name; - } - } - - public HttpHeaderType Type { - get { - return _type; - } - } - - #endregion - - #region Public Methods - - public bool IsMultiValue (bool response) - { - return (_type & HttpHeaderType.MultiValue) == HttpHeaderType.MultiValue - ? (response ? IsResponse : IsRequest) - : (response ? IsMultiValueInResponse : IsMultiValueInRequest); - } - - public bool IsRestricted (bool response) - { - return (_type & HttpHeaderType.Restricted) == HttpHeaderType.Restricted - ? (response ? IsResponse : IsRequest) - : false; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs.meta deleted file mode 100644 index 7578eebe7..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpHeaderInfo.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 8142288a11c6390418ef5f3ae892febc -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs b/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs deleted file mode 100644 index 113fb63b6..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs +++ /dev/null @@ -1,44 +0,0 @@ -#region License -/* - * HttpHeaderType.cs - * - * The MIT License - * - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - [Flags] - internal enum HttpHeaderType - { - Unspecified = 0, - Request = 1, - Response = 1 << 1, - Restricted = 1 << 2, - MultiValue = 1 << 3, - MultiValueInRequest = 1 << 4, - MultiValueInResponse = 1 << 5 - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs.meta deleted file mode 100644 index 2b2785098..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpHeaderType.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 2d457e89165765b4c917839a2228168e -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListener.cs b/ThirdParty/WebSocketSharp/Net/HttpListener.cs deleted file mode 100644 index 07970e14d..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListener.cs +++ /dev/null @@ -1,836 +0,0 @@ -#region License -/* - * HttpListener.cs - * - * This code is derived from HttpListener.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; -using System.Security.Principal; -using System.Threading; - -// TODO: Logging. -namespace WebSocketSharp.Net -{ - /// - /// Provides a simple, programmatically controlled HTTP listener. - /// - public sealed class HttpListener : IDisposable - { - #region Private Fields - - private AuthenticationSchemes _authSchemes; - private Func _authSchemeSelector; - private string _certFolderPath; - private Dictionary _connections; - private object _connectionsSync; - private List _ctxQueue; - private object _ctxQueueSync; - private Dictionary _ctxRegistry; - private object _ctxRegistrySync; - private static readonly string _defaultRealm; - private bool _disposed; - private bool _ignoreWriteExceptions; - private volatile bool _listening; - private Logger _logger; - private HttpListenerPrefixCollection _prefixes; - private string _realm; - private bool _reuseAddress; - private ServerSslConfiguration _sslConfig; - private Func _userCredFinder; - private List _waitQueue; - private object _waitQueueSync; - - #endregion - - #region Static Constructor - - static HttpListener () - { - _defaultRealm = "SECRET AREA"; - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public HttpListener () - { - _authSchemes = AuthenticationSchemes.Anonymous; - - _connections = new Dictionary (); - _connectionsSync = ((ICollection) _connections).SyncRoot; - - _ctxQueue = new List (); - _ctxQueueSync = ((ICollection) _ctxQueue).SyncRoot; - - _ctxRegistry = new Dictionary (); - _ctxRegistrySync = ((ICollection) _ctxRegistry).SyncRoot; - - _logger = new Logger (); - - _prefixes = new HttpListenerPrefixCollection (this); - - _waitQueue = new List (); - _waitQueueSync = ((ICollection) _waitQueue).SyncRoot; - } - - #endregion - - #region Internal Properties - - internal bool IsDisposed { - get { - return _disposed; - } - } - - internal bool ReuseAddress { - get { - return _reuseAddress; - } - - set { - _reuseAddress = value; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets the scheme used to authenticate the clients. - /// - /// - /// One of the enum values, - /// represents the scheme used to authenticate the clients. The default value is - /// . - /// - /// - /// This listener has been closed. - /// - public AuthenticationSchemes AuthenticationSchemes { - get { - CheckDisposed (); - return _authSchemes; - } - - set { - CheckDisposed (); - _authSchemes = value; - } - } - - /// - /// Gets or sets the delegate called to select the scheme used to authenticate the clients. - /// - /// - /// If you set this property, the listener uses the authentication scheme selected by - /// the delegate for each request. Or if you don't set, the listener uses the value of - /// the property as the authentication - /// scheme for all requests. - /// - /// - /// A Func<, > - /// delegate that references the method used to select an authentication scheme. The default - /// value is . - /// - /// - /// This listener has been closed. - /// - public Func AuthenticationSchemeSelector { - get { - CheckDisposed (); - return _authSchemeSelector; - } - - set { - CheckDisposed (); - _authSchemeSelector = value; - } - } - - /// - /// Gets or sets the path to the folder in which stores the certificate files used to - /// authenticate the server on the secure connection. - /// - /// - /// - /// This property represents the path to the folder in which stores the certificate files - /// associated with each port number of added URI prefixes. A set of the certificate files - /// is a pair of the 'port number'.cer (DER) and 'port number'.key - /// (DER, RSA Private Key). - /// - /// - /// If this property is or empty, the result of - /// System.Environment.GetFolderPath - /// () is used as the default path. - /// - /// - /// - /// A that represents the path to the folder in which stores - /// the certificate files. The default value is . - /// - /// - /// This listener has been closed. - /// - public string CertificateFolderPath { - get { - CheckDisposed (); - return _certFolderPath; - } - - set { - CheckDisposed (); - _certFolderPath = value; - } - } - - /// - /// Gets or sets a value indicating whether the listener returns exceptions that occur when - /// sending the response to the client. - /// - /// - /// true if the listener shouldn't return those exceptions; otherwise, false. - /// The default value is false. - /// - /// - /// This listener has been closed. - /// - public bool IgnoreWriteExceptions { - get { - CheckDisposed (); - return _ignoreWriteExceptions; - } - - set { - CheckDisposed (); - _ignoreWriteExceptions = value; - } - } - - /// - /// Gets a value indicating whether the listener has been started. - /// - /// - /// true if the listener has been started; otherwise, false. - /// - public bool IsListening { - get { - return _listening; - } - } - - /// - /// Gets a value indicating whether the listener can be used with the current operating system. - /// - /// - /// true. - /// - public static bool IsSupported { - get { - return true; - } - } - - /// - /// Gets the logging functions. - /// - /// - /// The default logging level is . If you would like to change it, - /// you should set the Log.Level property to any of the enum - /// values. - /// - /// - /// A that provides the logging functions. - /// - public Logger Log { - get { - return _logger; - } - } - - /// - /// Gets the URI prefixes handled by the listener. - /// - /// - /// A that contains the URI prefixes. - /// - /// - /// This listener has been closed. - /// - public HttpListenerPrefixCollection Prefixes { - get { - CheckDisposed (); - return _prefixes; - } - } - - /// - /// Gets or sets the name of the realm associated with the listener. - /// - /// - /// If this property is or empty, "SECRET AREA" will be used as - /// the name of the realm. - /// - /// - /// A that represents the name of the realm. The default value is - /// . - /// - /// - /// This listener has been closed. - /// - public string Realm { - get { - CheckDisposed (); - return _realm; - } - - set { - CheckDisposed (); - _realm = value; - } - } - - /// - /// Gets or sets the SSL configuration used to authenticate the server and - /// optionally the client for secure connection. - /// - /// - /// A that represents the configuration used to - /// authenticate the server and optionally the client for secure connection. - /// - /// - /// This listener has been closed. - /// - public ServerSslConfiguration SslConfiguration { - get { - CheckDisposed (); - return _sslConfig ?? (_sslConfig = new ServerSslConfiguration ()); - } - - set { - CheckDisposed (); - _sslConfig = value; - } - } - - /// - /// Gets or sets a value indicating whether, when NTLM authentication is used, - /// the authentication information of first request is used to authenticate - /// additional requests on the same connection. - /// - /// - /// This property isn't currently supported and always throws - /// a . - /// - /// - /// true if the authentication information of first request is used; - /// otherwise, false. - /// - /// - /// Any use of this property. - /// - public bool UnsafeConnectionNtlmAuthentication { - get { - throw new NotSupportedException (); - } - - set { - throw new NotSupportedException (); - } - } - - /// - /// Gets or sets the delegate called to find the credentials for an identity used to - /// authenticate a client. - /// - /// - /// A Func<, > delegate - /// that references the method used to find the credentials. The default value is - /// . - /// - /// - /// This listener has been closed. - /// - public Func UserCredentialsFinder { - get { - CheckDisposed (); - return _userCredFinder; - } - - set { - CheckDisposed (); - _userCredFinder = value; - } - } - - #endregion - - #region Private Methods - - private void cleanupConnections () - { - HttpConnection[] conns = null; - lock (_connectionsSync) { - if (_connections.Count == 0) - return; - - // Need to copy this since closing will call the RemoveConnection method. - var keys = _connections.Keys; - conns = new HttpConnection[keys.Count]; - keys.CopyTo (conns, 0); - _connections.Clear (); - } - - for (var i = conns.Length - 1; i >= 0; i--) - conns[i].Close (true); - } - - private void cleanupContextQueue (bool sendServiceUnavailable) - { - HttpListenerContext[] ctxs = null; - lock (_ctxQueueSync) { - if (_ctxQueue.Count == 0) - return; - - ctxs = _ctxQueue.ToArray (); - _ctxQueue.Clear (); - } - - if (!sendServiceUnavailable) - return; - - foreach (var ctx in ctxs) { - var res = ctx.Response; - res.StatusCode = (int) HttpStatusCode.ServiceUnavailable; - res.Close (); - } - } - - private void cleanupContextRegistry () - { - HttpListenerContext[] ctxs = null; - lock (_ctxRegistrySync) { - if (_ctxRegistry.Count == 0) - return; - - // Need to copy this since closing will call the UnregisterContext method. - var keys = _ctxRegistry.Keys; - ctxs = new HttpListenerContext[keys.Count]; - keys.CopyTo (ctxs, 0); - _ctxRegistry.Clear (); - } - - for (var i = ctxs.Length - 1; i >= 0; i--) - ctxs[i].Connection.Close (true); - } - - private void cleanupWaitQueue (Exception exception) - { - HttpListenerAsyncResult[] aress = null; - lock (_waitQueueSync) { - if (_waitQueue.Count == 0) - return; - - aress = _waitQueue.ToArray (); - _waitQueue.Clear (); - } - - foreach (var ares in aress) - ares.Complete (exception); - } - - private void close (bool force) - { - if (_listening) { - _listening = false; - EndPointManager.RemoveListener (this); - } - - lock (_ctxRegistrySync) - cleanupContextQueue (!force); - - cleanupContextRegistry (); - cleanupConnections (); - cleanupWaitQueue (new ObjectDisposedException (GetType ().ToString ())); - - _disposed = true; - } - - private HttpListenerAsyncResult getAsyncResultFromQueue () - { - if (_waitQueue.Count == 0) - return null; - - var ares = _waitQueue[0]; - _waitQueue.RemoveAt (0); - - return ares; - } - - private HttpListenerContext getContextFromQueue () - { - if (_ctxQueue.Count == 0) - return null; - - var ctx = _ctxQueue[0]; - _ctxQueue.RemoveAt (0); - - return ctx; - } - - #endregion - - #region Internal Methods - - internal bool AddConnection (HttpConnection connection) - { - if (!_listening) - return false; - - lock (_connectionsSync) { - if (!_listening) - return false; - - _connections[connection] = connection; - return true; - } - } - - internal HttpListenerAsyncResult BeginGetContext (HttpListenerAsyncResult asyncResult) - { - lock (_ctxRegistrySync) { - if (!_listening) - throw new HttpListenerException (995); - - var ctx = getContextFromQueue (); - if (ctx == null) - _waitQueue.Add (asyncResult); - else - asyncResult.Complete (ctx, true); - - return asyncResult; - } - } - - internal void CheckDisposed () - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - } - - internal string GetRealm () - { - var realm = _realm; - return realm != null && realm.Length > 0 ? realm : _defaultRealm; - } - - internal Func GetUserCredentialsFinder () - { - return _userCredFinder; - } - - internal bool RegisterContext (HttpListenerContext context) - { - if (!_listening) - return false; - - lock (_ctxRegistrySync) { - if (!_listening) - return false; - - _ctxRegistry[context] = context; - - var ares = getAsyncResultFromQueue (); - if (ares == null) - _ctxQueue.Add (context); - else - ares.Complete (context); - - return true; - } - } - - internal void RemoveConnection (HttpConnection connection) - { - lock (_connectionsSync) - _connections.Remove (connection); - } - - internal AuthenticationSchemes SelectAuthenticationScheme (HttpListenerRequest request) - { - var selector = _authSchemeSelector; - if (selector == null) - return _authSchemes; - - try { - return selector (request); - } - catch { - return AuthenticationSchemes.None; - } - } - - internal void UnregisterContext (HttpListenerContext context) - { - lock (_ctxRegistrySync) - _ctxRegistry.Remove (context); - } - - #endregion - - #region Public Methods - - /// - /// Shuts down the listener immediately. - /// - public void Abort () - { - if (_disposed) - return; - - close (true); - } - - /// - /// Begins getting an incoming request asynchronously. - /// - /// - /// This asynchronous operation must be completed by calling the EndGetContext method. - /// Typically, the method is invoked by the delegate. - /// - /// - /// An that represents the status of the asynchronous operation. - /// - /// - /// An delegate that references the method to invoke when - /// the asynchronous operation completes. - /// - /// - /// An that represents a user defined object to pass to - /// the delegate. - /// - /// - /// - /// This listener has no URI prefix on which listens. - /// - /// - /// -or- - /// - /// - /// This listener hasn't been started, or is currently stopped. - /// - /// - /// - /// This listener has been closed. - /// - public IAsyncResult BeginGetContext (AsyncCallback callback, Object state) - { - CheckDisposed (); - if (_prefixes.Count == 0) - throw new InvalidOperationException ("The listener has no URI prefix on which listens."); - - if (!_listening) - throw new InvalidOperationException ("The listener hasn't been started."); - - return BeginGetContext (new HttpListenerAsyncResult (callback, state)); - } - - /// - /// Shuts down the listener. - /// - public void Close () - { - if (_disposed) - return; - - close (false); - } - - /// - /// Ends an asynchronous operation to get an incoming request. - /// - /// - /// This method completes an asynchronous operation started by calling - /// the BeginGetContext method. - /// - /// - /// A that represents a request. - /// - /// - /// An obtained by calling the BeginGetContext method. - /// - /// - /// is . - /// - /// - /// wasn't obtained by calling the BeginGetContext method. - /// - /// - /// This method was already called for the specified . - /// - /// - /// This listener has been closed. - /// - public HttpListenerContext EndGetContext (IAsyncResult asyncResult) - { - CheckDisposed (); - if (asyncResult == null) - throw new ArgumentNullException ("asyncResult"); - - var ares = asyncResult as HttpListenerAsyncResult; - if (ares == null) - throw new ArgumentException ("A wrong IAsyncResult.", "asyncResult"); - - if (ares.EndCalled) - throw new InvalidOperationException ("This IAsyncResult cannot be reused."); - - ares.EndCalled = true; - if (!ares.IsCompleted) - ares.AsyncWaitHandle.WaitOne (); - - return ares.GetContext (); // This may throw an exception. - } - - /// - /// Gets an incoming request. - /// - /// - /// This method waits for an incoming request, and returns when a request is received. - /// - /// - /// A that represents a request. - /// - /// - /// - /// This listener has no URI prefix on which listens. - /// - /// - /// -or- - /// - /// - /// This listener hasn't been started, or is currently stopped. - /// - /// - /// - /// This listener has been closed. - /// - public HttpListenerContext GetContext () - { - CheckDisposed (); - if (_prefixes.Count == 0) - throw new InvalidOperationException ("The listener has no URI prefix on which listens."); - - if (!_listening) - throw new InvalidOperationException ("The listener hasn't been started."); - - var ares = BeginGetContext (new HttpListenerAsyncResult (null, null)); - ares.InGet = true; - - return EndGetContext (ares); - } - - /// - /// Starts receiving incoming requests. - /// - /// - /// This listener has been closed. - /// - public void Start () - { - CheckDisposed (); - if (_listening) - return; - - EndPointManager.AddListener (this); - _listening = true; - } - - /// - /// Stops receiving incoming requests. - /// - /// - /// This listener has been closed. - /// - public void Stop () - { - CheckDisposed (); - if (!_listening) - return; - - _listening = false; - EndPointManager.RemoveListener (this); - - lock (_ctxRegistrySync) - cleanupContextQueue (true); - - cleanupContextRegistry (); - cleanupConnections (); - cleanupWaitQueue (new HttpListenerException (995, "The listener is stopped.")); - } - - #endregion - - #region Explicit Interface Implementations - - /// - /// Releases all resources used by the listener. - /// - void IDisposable.Dispose () - { - if (_disposed) - return; - - close (true); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListener.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListener.cs.meta deleted file mode 100644 index 9cff2958b..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListener.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ba54dea96873f3d448c4518786d37f35 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs deleted file mode 100644 index a1c737421..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs +++ /dev/null @@ -1,198 +0,0 @@ -#region License -/* - * HttpListenerAsyncResult.cs - * - * This code is derived from ListenerAsyncResult.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Ximian, Inc. (http://www.ximian.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Nicholas Devenish - */ -#endregion - -using System; -using System.Threading; - -namespace WebSocketSharp.Net -{ - internal class HttpListenerAsyncResult : IAsyncResult - { - #region Private Fields - - private AsyncCallback _callback; - private bool _completed; - private HttpListenerContext _context; - private bool _endCalled; - private Exception _exception; - private bool _inGet; - private object _state; - private object _sync; - private bool _syncCompleted; - private ManualResetEvent _waitHandle; - - #endregion - - #region Internal Constructors - - internal HttpListenerAsyncResult (AsyncCallback callback, object state) - { - _callback = callback; - _state = state; - _sync = new object (); - } - - #endregion - - #region Internal Properties - - internal bool EndCalled { - get { - return _endCalled; - } - - set { - _endCalled = value; - } - } - - internal bool InGet { - get { - return _inGet; - } - - set { - _inGet = value; - } - } - - #endregion - - #region Public Properties - - public object AsyncState { - get { - return _state; - } - } - - public WaitHandle AsyncWaitHandle { - get { - lock (_sync) - return _waitHandle ?? (_waitHandle = new ManualResetEvent (_completed)); - } - } - - public bool CompletedSynchronously { - get { - return _syncCompleted; - } - } - - public bool IsCompleted { - get { - lock (_sync) - return _completed; - } - } - - #endregion - - #region Private Methods - - private static void complete (HttpListenerAsyncResult asyncResult) - { - lock (asyncResult._sync) { - asyncResult._completed = true; - - var waitHandle = asyncResult._waitHandle; - if (waitHandle != null) - waitHandle.Set (); - } - - var callback = asyncResult._callback; - if (callback == null) - return; - - ThreadPool.QueueUserWorkItem ( - state => { - try { - callback (asyncResult); - } - catch { - } - }, - null - ); - } - - #endregion - - #region Internal Methods - - internal void Complete (Exception exception) - { - _exception = _inGet && (exception is ObjectDisposedException) - ? new HttpListenerException (995, "The listener is closed.") - : exception; - - complete (this); - } - - internal void Complete (HttpListenerContext context) - { - Complete (context, false); - } - - internal void Complete (HttpListenerContext context, bool syncCompleted) - { - _context = context; - _syncCompleted = syncCompleted; - - complete (this); - } - - internal HttpListenerContext GetContext () - { - if (_exception != null) - throw _exception; - - return _context; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs.meta deleted file mode 100644 index ea40b2fb1..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerAsyncResult.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 27c1b321e4861ad4b82151477049d1c2 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs deleted file mode 100644 index 638078d4f..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs +++ /dev/null @@ -1,256 +0,0 @@ -#region License -/* - * HttpListenerContext.cs - * - * This code is derived from HttpListenerContext.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Security.Principal; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the access to the HTTP request and response objects used by - /// the . - /// - /// - /// This class cannot be inherited. - /// - public sealed class HttpListenerContext - { - #region Private Fields - - private HttpConnection _connection; - private string _error; - private int _errorStatus; - private HttpListener _listener; - private HttpListenerRequest _request; - private HttpListenerResponse _response; - private IPrincipal _user; - private HttpListenerWebSocketContext _websocketContext; - - #endregion - - #region Internal Constructors - - internal HttpListenerContext (HttpConnection connection) - { - _connection = connection; - _errorStatus = 400; - _request = new HttpListenerRequest (this); - _response = new HttpListenerResponse (this); - } - - #endregion - - #region Internal Properties - - internal HttpConnection Connection { - get { - return _connection; - } - } - - internal string ErrorMessage { - get { - return _error; - } - - set { - _error = value; - } - } - - internal int ErrorStatus { - get { - return _errorStatus; - } - - set { - _errorStatus = value; - } - } - - internal bool HasError { - get { - return _error != null; - } - } - - internal HttpListener Listener { - get { - return _listener; - } - - set { - _listener = value; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the HTTP request object that represents a client request. - /// - /// - /// A that represents the client request. - /// - public HttpListenerRequest Request { - get { - return _request; - } - } - - /// - /// Gets the HTTP response object used to send a response to the client. - /// - /// - /// A that represents a response to the client request. - /// - public HttpListenerResponse Response { - get { - return _response; - } - } - - /// - /// Gets the client information (identity, authentication, and security roles). - /// - /// - /// A instance that represents the client information. - /// - public IPrincipal User { - get { - return _user; - } - } - - #endregion - - #region Internal Methods - - internal bool Authenticate () - { - var schm = _listener.SelectAuthenticationScheme (_request); - if (schm == AuthenticationSchemes.Anonymous) - return true; - - if (schm == AuthenticationSchemes.None) { - _response.Close (HttpStatusCode.Forbidden); - return false; - } - - var realm = _listener.GetRealm (); - var user = - HttpUtility.CreateUser ( - _request.Headers["Authorization"], - schm, - realm, - _request.HttpMethod, - _listener.GetUserCredentialsFinder () - ); - - if (user == null || !user.Identity.IsAuthenticated) { - _response.CloseWithAuthChallenge (new AuthenticationChallenge (schm, realm).ToString ()); - return false; - } - - _user = user; - return true; - } - - internal bool Register () - { - return _listener.RegisterContext (this); - } - - internal void Unregister () - { - _listener.UnregisterContext (this); - } - - #endregion - - #region Public Methods - - /// - /// Accepts a WebSocket handshake request. - /// - /// - /// A that represents - /// the WebSocket handshake request. - /// - /// - /// A that represents the subprotocol supported on - /// this WebSocket connection. - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// contains an invalid character. - /// - /// - /// - /// This method has already been called. - /// - public HttpListenerWebSocketContext AcceptWebSocket (string protocol) - { - if (_websocketContext != null) - throw new InvalidOperationException ("The accepting is already in progress."); - - if (protocol != null) { - if (protocol.Length == 0) - throw new ArgumentException ("An empty string.", "protocol"); - - if (!protocol.IsToken ()) - throw new ArgumentException ("Contains an invalid character.", "protocol"); - } - - _websocketContext = new HttpListenerWebSocketContext (this, protocol); - return _websocketContext; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs.meta deleted file mode 100644 index 5a7c4f0b6..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerContext.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: d62f3b21d12fac64a95a092c7e618f57 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs deleted file mode 100644 index a52eeec03..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs +++ /dev/null @@ -1,127 +0,0 @@ -#region License -/* - * HttpListenerException.cs - * - * This code is derived from System.Net.HttpListenerException.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.ComponentModel; -using System.Runtime.Serialization; - -namespace WebSocketSharp.Net -{ - /// - /// The exception that is thrown when a gets an error - /// processing an HTTP request. - /// - [Serializable] - public class HttpListenerException : Win32Exception - { - #region Protected Constructors - - /// - /// Initializes a new instance of the class from - /// the specified and . - /// - /// - /// A that contains the serialized object data. - /// - /// - /// A that specifies the source for the deserialization. - /// - protected HttpListenerException ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - : base (serializationInfo, streamingContext) - { - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public HttpListenerException () - { - } - - /// - /// Initializes a new instance of the class - /// with the specified . - /// - /// - /// An that identifies the error. - /// - public HttpListenerException (int errorCode) - : base (errorCode) - { - } - - /// - /// Initializes a new instance of the class - /// with the specified and . - /// - /// - /// An that identifies the error. - /// - /// - /// A that describes the error. - /// - public HttpListenerException (int errorCode, string message) - : base (errorCode, message) - { - } - - #endregion - - #region Public Properties - - /// - /// Gets the error code that identifies the error that occurred. - /// - /// - /// An that identifies the error. - /// - public override int ErrorCode { - get { - return NativeErrorCode; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs.meta deleted file mode 100644 index 20168a068..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerException.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 5a1e6dc0fdb72764aa09258feb384017 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs deleted file mode 100644 index 960d02edf..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs +++ /dev/null @@ -1,228 +0,0 @@ -#region License -/* - * HttpListenerPrefix.cs - * - * This code is derived from ListenerPrefix.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - * - Oleg Mihailik - */ -#endregion - -using System; -using System.Net; - -namespace WebSocketSharp.Net -{ - internal sealed class HttpListenerPrefix - { - #region Private Fields - - private string _host; - private HttpListener _listener; - private string _original; - private string _path; - private string _port; - private string _prefix; - private bool _secure; - - #endregion - - #region Internal Constructors - - /// - /// Initializes a new instance of the class with - /// the specified . - /// - /// - /// This constructor must be called after calling the CheckPrefix method. - /// - /// - /// A that represents the URI prefix. - /// - internal HttpListenerPrefix (string uriPrefix) - { - _original = uriPrefix; - parse (uriPrefix); - } - - #endregion - - #region Public Properties - - public string Host { - get { - return _host; - } - } - - public bool IsSecure { - get { - return _secure; - } - } - - public HttpListener Listener { - get { - return _listener; - } - - set { - _listener = value; - } - } - - public string Original { - get { - return _original; - } - } - - public string Path { - get { - return _path; - } - } - - public string Port { - get { - return _port; - } - } - - #endregion - - #region Private Methods - - private void parse (string uriPrefix) - { - if (uriPrefix.StartsWith ("https")) - _secure = true; - - var len = uriPrefix.Length; - var startHost = uriPrefix.IndexOf (':') + 3; - var root = uriPrefix.IndexOf ('/', startHost + 1, len - startHost - 1); - - var colon = uriPrefix.LastIndexOf (':', root - 1, root - startHost - 1); - if (uriPrefix[root - 1] != ']' && colon > startHost) { - _host = uriPrefix.Substring (startHost, colon - startHost); - _port = uriPrefix.Substring (colon + 1, root - colon - 1); - } - else { - _host = uriPrefix.Substring (startHost, root - startHost); - _port = _secure ? "443" : "80"; - } - - _path = uriPrefix.Substring (root); - - _prefix = - String.Format ("http{0}://{1}:{2}{3}", _secure ? "s" : "", _host, _port, _path); - } - - #endregion - - #region Public Methods - - public static void CheckPrefix (string uriPrefix) - { - if (uriPrefix == null) - throw new ArgumentNullException ("uriPrefix"); - - var len = uriPrefix.Length; - if (len == 0) - throw new ArgumentException ("An empty string.", "uriPrefix"); - - if (!(uriPrefix.StartsWith ("http://") || uriPrefix.StartsWith ("https://"))) - throw new ArgumentException ("The scheme isn't 'http' or 'https'.", "uriPrefix"); - - var startHost = uriPrefix.IndexOf (':') + 3; - if (startHost >= len) - throw new ArgumentException ("No host is specified.", "uriPrefix"); - - if (uriPrefix[startHost] == ':') - throw new ArgumentException ("No host is specified.", "uriPrefix"); - - var root = uriPrefix.IndexOf ('/', startHost, len - startHost); - if (root == startHost) - throw new ArgumentException ("No host is specified.", "uriPrefix"); - - if (root == -1 || uriPrefix[len - 1] != '/') - throw new ArgumentException ("Ends without '/'.", "uriPrefix"); - - if (uriPrefix[root - 1] == ':') - throw new ArgumentException ("No port is specified.", "uriPrefix"); - - if (root == len - 2) - throw new ArgumentException ("No path is specified.", "uriPrefix"); - } - - /// - /// Determines whether this instance and the specified have the same value. - /// - /// - /// This method will be required to detect duplicates in any collection. - /// - /// - /// An to compare to this instance. - /// - /// - /// true if is a and - /// its value is the same as this instance; otherwise, false. - /// - public override bool Equals (Object obj) - { - var pref = obj as HttpListenerPrefix; - return pref != null && pref._prefix == _prefix; - } - - /// - /// Gets the hash code for this instance. - /// - /// - /// This method will be required to detect duplicates in any collection. - /// - /// - /// An that represents the hash code. - /// - public override int GetHashCode () - { - return _prefix.GetHashCode (); - } - - public override string ToString () - { - return _prefix; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs.meta deleted file mode 100644 index c5d72a58f..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefix.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 68d37e458885d7042ac6b487e2224032 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs deleted file mode 100644 index 6373b8d65..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs +++ /dev/null @@ -1,278 +0,0 @@ -#region License -/* - * HttpListenerPrefixCollection.cs - * - * This code is derived from HttpListenerPrefixCollection.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the collection used to store the URI prefixes for the . - /// - /// - /// The responds to the request which has a requested URI that - /// the prefixes most closely match. - /// - public class HttpListenerPrefixCollection : ICollection, IEnumerable, IEnumerable - { - #region Private Fields - - private HttpListener _listener; - private List _prefixes; - - #endregion - - #region Internal Constructors - - internal HttpListenerPrefixCollection (HttpListener listener) - { - _listener = listener; - _prefixes = new List (); - } - - #endregion - - #region Public Properties - - /// - /// Gets the number of prefixes in the collection. - /// - /// - /// An that represents the number of prefixes. - /// - public int Count { - get { - return _prefixes.Count; - } - } - - /// - /// Gets a value indicating whether the access to the collection is read-only. - /// - /// - /// Always returns false. - /// - public bool IsReadOnly { - get { - return false; - } - } - - /// - /// Gets a value indicating whether the access to the collection is synchronized. - /// - /// - /// Always returns false. - /// - public bool IsSynchronized { - get { - return false; - } - } - - #endregion - - #region Public Methods - - /// - /// Adds the specified to the collection. - /// - /// - /// A that represents the URI prefix to add. The prefix must be - /// a well-formed URI prefix with http or https scheme, and must end with a '/'. - /// - /// - /// is . - /// - /// - /// is invalid. - /// - /// - /// The associated with this collection is closed. - /// - public void Add (string uriPrefix) - { - _listener.CheckDisposed (); - HttpListenerPrefix.CheckPrefix (uriPrefix); - if (_prefixes.Contains (uriPrefix)) - return; - - _prefixes.Add (uriPrefix); - if (_listener.IsListening) - EndPointManager.AddPrefix (uriPrefix, _listener); - } - - /// - /// Removes all URI prefixes from the collection. - /// - /// - /// The associated with this collection is closed. - /// - public void Clear () - { - _listener.CheckDisposed (); - _prefixes.Clear (); - if (_listener.IsListening) - EndPointManager.RemoveListener (_listener); - } - - /// - /// Returns a value indicating whether the collection contains the specified - /// . - /// - /// - /// true if the collection contains ; - /// otherwise, false. - /// - /// - /// A that represents the URI prefix to test. - /// - /// - /// is . - /// - /// - /// The associated with this collection is closed. - /// - public bool Contains (string uriPrefix) - { - _listener.CheckDisposed (); - if (uriPrefix == null) - throw new ArgumentNullException ("uriPrefix"); - - return _prefixes.Contains (uriPrefix); - } - - /// - /// Copies the contents of the collection to the specified . - /// - /// - /// An that receives the URI prefix strings in the collection. - /// - /// - /// An that represents the zero-based index in - /// at which copying begins. - /// - /// - /// The associated with this collection is closed. - /// - public void CopyTo (Array array, int offset) - { - _listener.CheckDisposed (); - ((ICollection) _prefixes).CopyTo (array, offset); - } - - /// - /// Copies the contents of the collection to the specified array of . - /// - /// - /// An array of that receives the URI prefix strings in the collection. - /// - /// - /// An that represents the zero-based index in - /// at which copying begins. - /// - /// - /// The associated with this collection is closed. - /// - public void CopyTo (string[] array, int offset) - { - _listener.CheckDisposed (); - _prefixes.CopyTo (array, offset); - } - - /// - /// Gets the enumerator used to iterate through the . - /// - /// - /// An instance used to iterate - /// through the collection. - /// - public IEnumerator GetEnumerator () - { - return _prefixes.GetEnumerator (); - } - - /// - /// Removes the specified from the collection. - /// - /// - /// true if is successfully found and removed; - /// otherwise, false. - /// - /// - /// A that represents the URI prefix to remove. - /// - /// - /// is . - /// - /// - /// The associated with this collection is closed. - /// - public bool Remove (string uriPrefix) - { - _listener.CheckDisposed (); - if (uriPrefix == null) - throw new ArgumentNullException ("uriPrefix"); - - var ret = _prefixes.Remove (uriPrefix); - if (ret && _listener.IsListening) - EndPointManager.RemovePrefix (uriPrefix, _listener); - - return ret; - } - - #endregion - - #region Explicit Interface Implementations - - /// - /// Gets the enumerator used to iterate through the . - /// - /// - /// An instance used to iterate through the collection. - /// - IEnumerator IEnumerable.GetEnumerator () - { - return _prefixes.GetEnumerator (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs.meta deleted file mode 100644 index b23d0ef19..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerPrefixCollection.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: edf4e4f638dddfe4d802bfa81c5e8a0f -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs deleted file mode 100644 index 701128120..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs +++ /dev/null @@ -1,718 +0,0 @@ -#region License -/* - * HttpListenerRequest.cs - * - * This code is derived from HttpListenerRequest.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Globalization; -using System.IO; -using System.Security.Cryptography.X509Certificates; -using System.Text; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the access to a request to the . - /// - /// - /// The HttpListenerRequest class cannot be inherited. - /// - public sealed class HttpListenerRequest - { - #region Private Fields - - private static readonly byte[] _100continue; - private string[] _acceptTypes; - private bool _chunked; - private Encoding _contentEncoding; - private long _contentLength; - private bool _contentLengthSet; - private HttpListenerContext _context; - private CookieCollection _cookies; - private WebHeaderCollection _headers; - private Guid _identifier; - private Stream _inputStream; - private bool _keepAlive; - private bool _keepAliveSet; - private string _method; - private NameValueCollection _queryString; - private Uri _referer; - private string _uri; - private Uri _url; - private string[] _userLanguages; - private Version _version; - private bool _websocketRequest; - private bool _websocketRequestSet; - - #endregion - - #region Static Constructor - - static HttpListenerRequest () - { - _100continue = Encoding.ASCII.GetBytes ("HTTP/1.1 100 Continue\r\n\r\n"); - } - - #endregion - - #region Internal Constructors - - internal HttpListenerRequest (HttpListenerContext context) - { - _context = context; - _contentLength = -1; - _headers = new WebHeaderCollection (); - _identifier = Guid.NewGuid (); - } - - #endregion - - #region Public Properties - - /// - /// Gets the media types which are acceptable for the response. - /// - /// - /// An array of that contains the media type names in - /// the Accept request-header, or if the request didn't include - /// the Accept header. - /// - public string[] AcceptTypes { - get { - return _acceptTypes; - } - } - - /// - /// Gets an error code that identifies a problem with the client's certificate. - /// - /// - /// Always returns 0. - /// - public int ClientCertificateError { - get { - return 0; // TODO: Always returns 0. - } - } - - /// - /// Gets the encoding for the entity body data included in the request. - /// - /// - /// A that represents the encoding for the entity body data, - /// or if the request didn't include the information about - /// the encoding. - /// - public Encoding ContentEncoding { - get { - return _contentEncoding ?? (_contentEncoding = Encoding.Default); - } - } - - /// - /// Gets the number of bytes in the entity body data included in the request. - /// - /// - /// A that represents the value of the Content-Length entity-header, - /// or -1 if the value isn't known. - /// - public long ContentLength64 { - get { - return _contentLength; - } - } - - /// - /// Gets the media type of the entity body included in the request. - /// - /// - /// A that represents the value of the Content-Type entity-header. - /// - public string ContentType { - get { - return _headers["Content-Type"]; - } - } - - /// - /// Gets the cookies included in the request. - /// - /// - /// A that contains the cookies included in the request. - /// - public CookieCollection Cookies { - get { - return _cookies ?? (_cookies = _headers.GetCookies (false)); - } - } - - /// - /// Gets a value indicating whether the request has the entity body. - /// - /// - /// true if the request has the entity body; otherwise, false. - /// - public bool HasEntityBody { - get { - return _contentLength > 0 || _chunked; - } - } - - /// - /// Gets the HTTP headers used in the request. - /// - /// - /// A that contains the HTTP headers used in the request. - /// - public NameValueCollection Headers { - get { - return _headers; - } - } - - /// - /// Gets the HTTP method used in the request. - /// - /// - /// A that represents the HTTP method used in the request. - /// - public string HttpMethod { - get { - return _method; - } - } - - /// - /// Gets a that contains the entity body data included in the request. - /// - /// - /// A that contains the entity body data included in the request. - /// - public Stream InputStream { - get { - return _inputStream ?? - (_inputStream = HasEntityBody - ? _context.Connection.GetRequestStream (_contentLength, _chunked) - : Stream.Null); - } - } - - /// - /// Gets a value indicating whether the client that sent the request is authenticated. - /// - /// - /// true if the client is authenticated; otherwise, false. - /// - public bool IsAuthenticated { - get { - return _context.User != null; - } - } - - /// - /// Gets a value indicating whether the request is sent from the local computer. - /// - /// - /// true if the request is sent from the local computer; otherwise, false. - /// - public bool IsLocal { - get { - return RemoteEndPoint.Address.IsLocal (); - } - } - - /// - /// Gets a value indicating whether the HTTP connection is secured using the SSL protocol. - /// - /// - /// true if the HTTP connection is secured; otherwise, false. - /// - public bool IsSecureConnection { - get { - return _context.Connection.IsSecure; - } - } - - /// - /// Gets a value indicating whether the request is a WebSocket connection request. - /// - /// - /// true if the request is a WebSocket connection request; otherwise, false. - /// - public bool IsWebSocketRequest { - get { - if (!_websocketRequestSet) { - _websocketRequest = _method == "GET" && - _version > HttpVersion.Version10 && - _headers.Contains ("Upgrade", "websocket") && - _headers.Contains ("Connection", "Upgrade"); - - _websocketRequestSet = true; - } - - return _websocketRequest; - } - } - - /// - /// Gets a value indicating whether the client requests a persistent connection. - /// - /// - /// true if the client requests a persistent connection; otherwise, false. - /// - public bool KeepAlive { - get { - if (!_keepAliveSet) { - string keepAlive; - _keepAlive = _version > HttpVersion.Version10 || - _headers.Contains ("Connection", "keep-alive") || - ((keepAlive = _headers["Keep-Alive"]) != null && keepAlive != "closed"); - - _keepAliveSet = true; - } - - return _keepAlive; - } - } - - /// - /// Gets the server endpoint as an IP address and a port number. - /// - /// - /// A that represents the server endpoint. - /// - public System.Net.IPEndPoint LocalEndPoint { - get { - return _context.Connection.LocalEndPoint; - } - } - - /// - /// Gets the HTTP version used in the request. - /// - /// - /// A that represents the HTTP version used in the request. - /// - public Version ProtocolVersion { - get { - return _version; - } - } - - /// - /// Gets the query string included in the request. - /// - /// - /// A that contains the query string parameters. - /// - public NameValueCollection QueryString { - get { - return _queryString ?? - (_queryString = HttpUtility.InternalParseQueryString (_url.Query, Encoding.UTF8)); - } - } - - /// - /// Gets the raw URL (without the scheme, host, and port) requested by the client. - /// - /// - /// A that represents the raw URL requested by the client. - /// - public string RawUrl { - get { - return _url.PathAndQuery; // TODO: Should decode? - } - } - - /// - /// Gets the client endpoint as an IP address and a port number. - /// - /// - /// A that represents the client endpoint. - /// - public System.Net.IPEndPoint RemoteEndPoint { - get { - return _context.Connection.RemoteEndPoint; - } - } - - /// - /// Gets the request identifier of a incoming HTTP request. - /// - /// - /// A that represents the identifier of a request. - /// - public Guid RequestTraceIdentifier { - get { - return _identifier; - } - } - - /// - /// Gets the URL requested by the client. - /// - /// - /// A that represents the URL requested by the client. - /// - public Uri Url { - get { - return _url; - } - } - - /// - /// Gets the URL of the resource from which the requested URL was obtained. - /// - /// - /// A that represents the value of the Referer request-header, - /// or if the request didn't include an Referer header. - /// - public Uri UrlReferrer { - get { - return _referer; - } - } - - /// - /// Gets the information about the user agent originating the request. - /// - /// - /// A that represents the value of the User-Agent request-header. - /// - public string UserAgent { - get { - return _headers["User-Agent"]; - } - } - - /// - /// Gets the server endpoint as an IP address and a port number. - /// - /// - /// A that represents the server endpoint. - /// - public string UserHostAddress { - get { - return LocalEndPoint.ToString (); - } - } - - /// - /// Gets the internet host name and port number (if present) specified by the client. - /// - /// - /// A that represents the value of the Host request-header. - /// - public string UserHostName { - get { - return _headers["Host"]; - } - } - - /// - /// Gets the natural languages which are preferred for the response. - /// - /// - /// An array of that contains the natural language names in - /// the Accept-Language request-header, or if the request - /// didn't include an Accept-Language header. - /// - public string[] UserLanguages { - get { - return _userLanguages; - } - } - - #endregion - - #region Private Methods - - private static bool tryCreateVersion (string version, out Version result) - { - try { - result = new Version (version); - return true; - } - catch { - result = null; - return false; - } - } - - #endregion - - #region Internal Methods - - internal void AddHeader (string header) - { - var colon = header.IndexOf (':'); - if (colon == -1) { - _context.ErrorMessage = "Invalid header"; - return; - } - - var name = header.Substring (0, colon).Trim (); - var val = header.Substring (colon + 1).Trim (); - _headers.InternalSet (name, val, false); - - var lower = name.ToLower (CultureInfo.InvariantCulture); - if (lower == "accept") { - _acceptTypes = new List (val.SplitHeaderValue (',')).ToArray (); - return; - } - - if (lower == "accept-language") { - _userLanguages = val.Split (','); - return; - } - - if (lower == "content-length") { - long len; - if (Int64.TryParse (val, out len) && len >= 0) { - _contentLength = len; - _contentLengthSet = true; - } - else { - _context.ErrorMessage = "Invalid Content-Length header"; - } - - return; - } - - if (lower == "content-type") { - try { - _contentEncoding = HttpUtility.GetEncoding (val); - } - catch { - _context.ErrorMessage = "Invalid Content-Type header"; - } - - return; - } - - if (lower == "referer") - _referer = val.ToUri (); - } - - internal void FinishInitialization () - { - var host = _headers["Host"]; - var nohost = host == null || host.Length == 0; - if (_version > HttpVersion.Version10 && nohost) { - _context.ErrorMessage = "Invalid Host header"; - return; - } - - if (nohost) - host = UserHostAddress; - - _url = HttpUtility.CreateRequestUrl (_uri, host, IsWebSocketRequest, IsSecureConnection); - if (_url == null) { - _context.ErrorMessage = "Invalid request url"; - return; - } - - var enc = Headers["Transfer-Encoding"]; - if (_version > HttpVersion.Version10 && enc != null && enc.Length > 0) { - _chunked = enc.ToLower () == "chunked"; - if (!_chunked) { - _context.ErrorMessage = String.Empty; - _context.ErrorStatus = 501; - - return; - } - } - - if (!_chunked && !_contentLengthSet) { - var method = _method.ToLower (); - if (method == "post" || method == "put") { - _context.ErrorMessage = String.Empty; - _context.ErrorStatus = 411; - - return; - } - } - - var expect = Headers["Expect"]; - if (expect != null && expect.Length > 0 && expect.ToLower () == "100-continue") { - var output = _context.Connection.GetResponseStream (); - output.InternalWrite (_100continue, 0, _100continue.Length); - } - } - - // Returns true is the stream could be reused. - internal bool FlushInput () - { - if (!HasEntityBody) - return true; - - var len = 2048; - if (_contentLength > 0) - len = (int) Math.Min (_contentLength, (long) len); - - var buff = new byte[len]; - while (true) { - // TODO: Test if MS has a timeout when doing this. - try { - var ares = InputStream.BeginRead (buff, 0, len, null, null); - if (!ares.IsCompleted && !ares.AsyncWaitHandle.WaitOne (100)) - return false; - - if (InputStream.EndRead (ares) <= 0) - return true; - } - catch { - return false; - } - } - } - - internal void SetRequestLine (string requestLine) - { - var parts = requestLine.Split (new[] { ' ' }, 3); - if (parts.Length != 3) { - _context.ErrorMessage = "Invalid request line (parts)"; - return; - } - - _method = parts[0]; - if (!_method.IsToken ()) { - _context.ErrorMessage = "Invalid request line (method)"; - return; - } - - _uri = parts[1]; - - var ver = parts[2]; - if (ver.Length != 8 || - !ver.StartsWith ("HTTP/") || - !tryCreateVersion (ver.Substring (5), out _version) || - _version.Major < 1) - _context.ErrorMessage = "Invalid request line (version)"; - } - - #endregion - - #region Public Methods - - /// - /// Begins getting the client's X.509 v.3 certificate asynchronously. - /// - /// - /// This asynchronous operation must be completed by calling - /// the method. Typically, - /// that method is invoked by the delegate. - /// - /// - /// An that contains the status of the asynchronous operation. - /// - /// - /// An delegate that references the method(s) called when - /// the asynchronous operation completes. - /// - /// - /// An that contains a user defined object to pass to - /// the delegate. - /// - /// - /// This method isn't implemented. - /// - public IAsyncResult BeginGetClientCertificate (AsyncCallback requestCallback, object state) - { - // TODO: Not implemented. - throw new NotImplementedException (); - } - - /// - /// Ends an asynchronous operation to get the client's X.509 v.3 certificate. - /// - /// - /// This method completes an asynchronous operation started by calling - /// the method. - /// - /// - /// A that contains the client's X.509 v.3 certificate. - /// - /// - /// An obtained by calling - /// the method. - /// - /// - /// This method isn't implemented. - /// - public X509Certificate2 EndGetClientCertificate (IAsyncResult asyncResult) - { - // TODO: Not implemented. - throw new NotImplementedException (); - } - - /// - /// Gets the client's X.509 v.3 certificate. - /// - /// - /// A that contains the client's X.509 v.3 certificate. - /// - /// - /// This method isn't implemented. - /// - public X509Certificate2 GetClientCertificate () - { - // TODO: Not implemented. - throw new NotImplementedException (); - } - - /// - /// Returns a that represents - /// the current . - /// - /// - /// A that represents the current . - /// - public override string ToString () - { - var buff = new StringBuilder (64); - buff.AppendFormat ("{0} {1} HTTP/{2}\r\n", _method, _uri, _version); - buff.Append (_headers.ToString ()); - - return buff.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs.meta deleted file mode 100644 index d76cade9a..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerRequest.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c14da31c66da57e4f84bf0e677387817 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs b/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs deleted file mode 100644 index 92c0a7970..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs +++ /dev/null @@ -1,846 +0,0 @@ -#region License -/* - * HttpListenerResponse.cs - * - * This code is derived from HttpListenerResponse.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Nicholas Devenish - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the access to a response to a request received by the . - /// - /// - /// The HttpListenerResponse class cannot be inherited. - /// - public sealed class HttpListenerResponse : IDisposable - { - #region Private Fields - - private bool _closeConnection; - private Encoding _contentEncoding; - private long _contentLength; - private string _contentType; - private HttpListenerContext _context; - private CookieCollection _cookies; - private bool _disposed; - private WebHeaderCollection _headers; - private bool _headersSent; - private bool _keepAlive; - private string _location; - private ResponseStream _outputStream; - private bool _sendChunked; - private int _statusCode; - private string _statusDescription; - private Version _version; - - #endregion - - #region Internal Constructors - - internal HttpListenerResponse (HttpListenerContext context) - { - _context = context; - _keepAlive = true; - _statusCode = 200; - _statusDescription = "OK"; - _version = HttpVersion.Version11; - } - - #endregion - - #region Internal Properties - - internal bool CloseConnection { - get { - return _closeConnection; - } - - set { - _closeConnection = value; - } - } - - internal bool HeadersSent { - get { - return _headersSent; - } - - set { - _headersSent = value; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets the encoding for the entity body data included in the response. - /// - /// - /// A that represents the encoding for the entity body data, - /// or if no encoding is specified. - /// - /// - /// This object is closed. - /// - public Encoding ContentEncoding { - get { - return _contentEncoding; - } - - set { - checkDisposed (); - _contentEncoding = value; - } - } - - /// - /// Gets or sets the number of bytes in the entity body data included in the response. - /// - /// - /// A that represents the value of the Content-Length entity-header. - /// - /// - /// The value specified for a set operation is less than zero. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public long ContentLength64 { - get { - return _contentLength; - } - - set { - checkDisposedOrHeadersSent (); - if (value < 0) - throw new ArgumentOutOfRangeException ("Less than zero.", "value"); - - _contentLength = value; - } - } - - /// - /// Gets or sets the media type of the entity body included in the response. - /// - /// - /// A that represents the media type of the entity body, - /// or if no media type is specified. This value is - /// used for the value of the Content-Type entity-header. - /// - /// - /// The value specified for a set operation is empty. - /// - /// - /// This object is closed. - /// - public string ContentType { - get { - return _contentType; - } - - set { - checkDisposed (); - if (value != null && value.Length == 0) - throw new ArgumentException ("An empty string.", "value"); - - _contentType = value; - } - } - - /// - /// Gets or sets the cookies sent with the response. - /// - /// - /// A that contains the cookies sent with the response. - /// - public CookieCollection Cookies { - get { - return _cookies ?? (_cookies = new CookieCollection ()); - } - - set { - _cookies = value; - } - } - - /// - /// Gets or sets the HTTP headers sent to the client. - /// - /// - /// A that contains the headers sent to the client. - /// - /// - /// The value specified for a set operation isn't valid for a response. - /// - public WebHeaderCollection Headers { - get { - return _headers ?? (_headers = new WebHeaderCollection (HttpHeaderType.Response, false)); - } - - set { - if (value != null && value.State != HttpHeaderType.Response) - throw new InvalidOperationException ( - "The specified headers aren't valid for a response."); - - _headers = value; - } - } - - /// - /// Gets or sets a value indicating whether the server requests a persistent connection. - /// - /// - /// true if the server requests a persistent connection; otherwise, false. - /// The default value is true. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public bool KeepAlive { - get { - return _keepAlive; - } - - set { - checkDisposedOrHeadersSent (); - _keepAlive = value; - } - } - - /// - /// Gets a to use to write the entity body data. - /// - /// - /// A to use to write the entity body data. - /// - /// - /// This object is closed. - /// - public Stream OutputStream { - get { - checkDisposed (); - return _outputStream ?? (_outputStream = _context.Connection.GetResponseStream ()); - } - } - - /// - /// Gets or sets the HTTP version used in the response. - /// - /// - /// A that represents the version used in the response. - /// - /// - /// The value specified for a set operation is . - /// - /// - /// The value specified for a set operation doesn't have its Major property set to 1 or - /// doesn't have its Minor property set to either 0 or 1. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public Version ProtocolVersion { - get { - return _version; - } - - set { - checkDisposedOrHeadersSent (); - if (value == null) - throw new ArgumentNullException ("value"); - - if (value.Major != 1 || (value.Minor != 0 && value.Minor != 1)) - throw new ArgumentException ("Not 1.0 or 1.1.", "value"); - - _version = value; - } - } - - /// - /// Gets or sets the URL to which the client is redirected to locate a requested resource. - /// - /// - /// A that represents the value of the Location response-header, - /// or if no redirect location is specified. - /// - /// - /// The value specified for a set operation isn't an absolute URL. - /// - /// - /// This object is closed. - /// - public string RedirectLocation { - get { - return _location; - } - - set { - checkDisposed (); - if (value == null) { - _location = null; - return; - } - - Uri uri = null; - if (!value.MaybeUri () || !Uri.TryCreate (value, UriKind.Absolute, out uri)) - throw new ArgumentException ("Not an absolute URL.", "value"); - - _location = value; - } - } - - /// - /// Gets or sets a value indicating whether the response uses the chunked transfer encoding. - /// - /// - /// true if the response uses the chunked transfer encoding; - /// otherwise, false. The default value is false. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public bool SendChunked { - get { - return _sendChunked; - } - - set { - checkDisposedOrHeadersSent (); - _sendChunked = value; - } - } - - /// - /// Gets or sets the HTTP status code returned to the client. - /// - /// - /// An that represents the status code for the response to - /// the request. The default value is same as . - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - /// - /// The value specified for a set operation is invalid. Valid values are - /// between 100 and 999 inclusive. - /// - public int StatusCode { - get { - return _statusCode; - } - - set { - checkDisposedOrHeadersSent (); - if (value < 100 || value > 999) - throw new System.Net.ProtocolViolationException ( - "A value isn't between 100 and 999 inclusive."); - - _statusCode = value; - _statusDescription = value.GetStatusDescription (); - } - } - - /// - /// Gets or sets the description of the HTTP status code returned to the client. - /// - /// - /// A that represents the description of the status code. The default - /// value is the RFC 2616 - /// description for the property value, - /// or if an RFC 2616 description doesn't exist. - /// - /// - /// The value specified for a set operation contains invalid characters. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public string StatusDescription { - get { - return _statusDescription; - } - - set { - checkDisposedOrHeadersSent (); - if (value == null || value.Length == 0) { - _statusDescription = _statusCode.GetStatusDescription (); - return; - } - - if (!value.IsText () || value.IndexOfAny (new[] { '\r', '\n' }) > -1) - throw new ArgumentException ("Contains invalid characters.", "value"); - - _statusDescription = value; - } - } - - #endregion - - #region Private Methods - - private bool canAddOrUpdate (Cookie cookie) - { - if (_cookies == null || _cookies.Count == 0) - return true; - - var found = findCookie (cookie).ToList (); - if (found.Count == 0) - return true; - - var ver = cookie.Version; - foreach (var c in found) - if (c.Version == ver) - return true; - - return false; - } - - private void checkDisposed () - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - } - - private void checkDisposedOrHeadersSent () - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - if (_headersSent) - throw new InvalidOperationException ("Cannot be changed after the headers are sent."); - } - - private void close (bool force) - { - _disposed = true; - _context.Connection.Close (force); - } - - private IEnumerable findCookie (Cookie cookie) - { - var name = cookie.Name; - var domain = cookie.Domain; - var path = cookie.Path; - if (_cookies != null) - foreach (Cookie c in _cookies) - if (c.Name.Equals (name, StringComparison.OrdinalIgnoreCase) && - c.Domain.Equals (domain, StringComparison.OrdinalIgnoreCase) && - c.Path.Equals (path, StringComparison.Ordinal)) - yield return c; - } - - #endregion - - #region Internal Methods - - internal WebHeaderCollection WriteHeadersTo (MemoryStream destination) - { - var headers = new WebHeaderCollection (HttpHeaderType.Response, true); - if (_headers != null) - headers.Add (_headers); - - if (_contentType != null) { - var type = _contentType.IndexOf ("charset=", StringComparison.Ordinal) == -1 && - _contentEncoding != null - ? String.Format ("{0}; charset={1}", _contentType, _contentEncoding.WebName) - : _contentType; - - headers.InternalSet ("Content-Type", type, true); - } - - if (headers["Server"] == null) - headers.InternalSet ("Server", "websocket-sharp/1.0", true); - - var prov = CultureInfo.InvariantCulture; - if (headers["Date"] == null) - headers.InternalSet ("Date", DateTime.UtcNow.ToString ("r", prov), true); - - if (!_sendChunked) - headers.InternalSet ("Content-Length", _contentLength.ToString (prov), true); - else - headers.InternalSet ("Transfer-Encoding", "chunked", true); - - /* - * Apache forces closing the connection for these status codes: - * - 400 Bad Request - * - 408 Request Timeout - * - 411 Length Required - * - 413 Request Entity Too Large - * - 414 Request-Uri Too Long - * - 500 Internal Server Error - * - 503 Service Unavailable - */ - var closeConn = !_context.Request.KeepAlive || - !_keepAlive || - _statusCode == 400 || - _statusCode == 408 || - _statusCode == 411 || - _statusCode == 413 || - _statusCode == 414 || - _statusCode == 500 || - _statusCode == 503; - - var reuses = _context.Connection.Reuses; - if (closeConn || reuses >= 100) { - headers.InternalSet ("Connection", "close", true); - } - else { - headers.InternalSet ( - "Keep-Alive", String.Format ("timeout=15,max={0}", 100 - reuses), true); - - if (_context.Request.ProtocolVersion < HttpVersion.Version11) - headers.InternalSet ("Connection", "keep-alive", true); - } - - if (_location != null) - headers.InternalSet ("Location", _location, true); - - if (_cookies != null) - foreach (Cookie cookie in _cookies) - headers.InternalSet ("Set-Cookie", cookie.ToResponseString (), true); - - var enc = _contentEncoding ?? Encoding.Default; - var writer = new StreamWriter (destination, enc, 256); - writer.Write ("HTTP/{0} {1} {2}\r\n", _version, _statusCode, _statusDescription); - writer.Write (headers.ToStringMultiValue (true)); - writer.Flush (); - - // Assumes that the destination was at position 0. - destination.Position = enc.GetPreamble ().Length; - - return headers; - } - - #endregion - - #region Public Methods - - /// - /// Closes the connection to the client without returning a response. - /// - public void Abort () - { - if (_disposed) - return; - - close (true); - } - - /// - /// Adds an HTTP header with the specified and - /// to the headers for the response. - /// - /// - /// A that represents the name of the header to add. - /// - /// - /// A that represents the value of the header to add. - /// - /// - /// is or empty. - /// - /// - /// - /// or contains invalid characters. - /// - /// - /// -or- - /// - /// - /// is a restricted header name. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The header cannot be allowed to add to the current headers. - /// - public void AddHeader (string name, string value) - { - Headers.Set (name, value); - } - - /// - /// Appends the specified to the cookies sent with the response. - /// - /// - /// A to append. - /// - /// - /// is . - /// - public void AppendCookie (Cookie cookie) - { - Cookies.Add (cookie); - } - - /// - /// Appends a to the specified HTTP header sent with the response. - /// - /// - /// A that represents the name of the header to append - /// to. - /// - /// - /// A that represents the value to append to the header. - /// - /// - /// is or empty. - /// - /// - /// - /// or contains invalid characters. - /// - /// - /// -or- - /// - /// - /// is a restricted header name. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current headers cannot allow the header to append a value. - /// - public void AppendHeader (string name, string value) - { - Headers.Add (name, value); - } - - /// - /// Returns the response to the client and releases the resources used by - /// this instance. - /// - public void Close () - { - if (_disposed) - return; - - close (false); - } - - /// - /// Returns the response with the specified array of to the client and - /// releases the resources used by this instance. - /// - /// - /// An array of that contains the response entity body data. - /// - /// - /// true if this method blocks execution while flushing the stream to the client; - /// otherwise, false. - /// - /// - /// is . - /// - /// - /// This object is closed. - /// - public void Close (byte[] responseEntity, bool willBlock) - { - checkDisposed (); - if (responseEntity == null) - throw new ArgumentNullException ("responseEntity"); - - var len = responseEntity.Length; - var output = OutputStream; - if (willBlock) { - output.Write (responseEntity, 0, len); - close (false); - - return; - } - - output.BeginWrite ( - responseEntity, - 0, - len, - ar => { - output.EndWrite (ar); - close (false); - }, - null); - } - - /// - /// Copies some properties from the specified to - /// this response. - /// - /// - /// A to copy. - /// - /// - /// is . - /// - public void CopyFrom (HttpListenerResponse templateResponse) - { - if (templateResponse == null) - throw new ArgumentNullException ("templateResponse"); - - if (templateResponse._headers != null) { - if (_headers != null) - _headers.Clear (); - - Headers.Add (templateResponse._headers); - } - else if (_headers != null) { - _headers = null; - } - - _contentLength = templateResponse._contentLength; - _statusCode = templateResponse._statusCode; - _statusDescription = templateResponse._statusDescription; - _keepAlive = templateResponse._keepAlive; - _version = templateResponse._version; - } - - /// - /// Configures the response to redirect the client's request to - /// the specified . - /// - /// - /// This method sets the property to - /// , the property to - /// 302, and the property to - /// "Found". - /// - /// - /// A that represents the URL to redirect the client's request to. - /// - /// - /// is . - /// - /// - /// isn't an absolute URL. - /// - /// - /// The response has already been sent. - /// - /// - /// This object is closed. - /// - public void Redirect (string url) - { - checkDisposedOrHeadersSent (); - if (url == null) - throw new ArgumentNullException ("url"); - - Uri uri = null; - if (!url.MaybeUri () || !Uri.TryCreate (url, UriKind.Absolute, out uri)) - throw new ArgumentException ("Not an absolute URL.", "url"); - - _location = url; - _statusCode = 302; - _statusDescription = "Found"; - } - - /// - /// Adds or updates a in the cookies sent with the response. - /// - /// - /// A to set. - /// - /// - /// is . - /// - /// - /// already exists in the cookies and couldn't be replaced. - /// - public void SetCookie (Cookie cookie) - { - if (cookie == null) - throw new ArgumentNullException ("cookie"); - - if (!canAddOrUpdate (cookie)) - throw new ArgumentException ("Cannot be replaced.", "cookie"); - - Cookies.Add (cookie); - } - - #endregion - - #region Explicit Interface Implementations - - /// - /// Releases all resources used by the . - /// - void IDisposable.Dispose () - { - if (_disposed) - return; - - close (true); // Same as the Abort method. - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs.meta deleted file mode 100644 index 5bccc1d22..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpListenerResponse.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: f3be1e98739249042874055efc1b023c -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs b/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs deleted file mode 100644 index 08785db34..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs +++ /dev/null @@ -1,233 +0,0 @@ -#region License -/* - * HttpRequestHeader.cs - * - * This code is derived from System.Net.HttpRequestHeader.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -namespace WebSocketSharp.Net -{ - /// - /// Contains the HTTP headers that may be specified in a client request. - /// - /// - /// The HttpRequestHeader enumeration contains the HTTP request headers defined in - /// RFC 2616 for the HTTP/1.1 and - /// RFC 6455 for the WebSocket. - /// - public enum HttpRequestHeader - { - /// - /// Indicates the Cache-Control header. - /// - CacheControl, - /// - /// Indicates the Connection header. - /// - Connection, - /// - /// Indicates the Date header. - /// - Date, - /// - /// Indicates the Keep-Alive header. - /// - KeepAlive, - /// - /// Indicates the Pragma header. - /// - Pragma, - /// - /// Indicates the Trailer header. - /// - Trailer, - /// - /// Indicates the Transfer-Encoding header. - /// - TransferEncoding, - /// - /// Indicates the Upgrade header. - /// - Upgrade, - /// - /// Indicates the Via header. - /// - Via, - /// - /// Indicates the Warning header. - /// - Warning, - /// - /// Indicates the Allow header. - /// - Allow, - /// - /// Indicates the Content-Length header. - /// - ContentLength, - /// - /// Indicates the Content-Type header. - /// - ContentType, - /// - /// Indicates the Content-Encoding header. - /// - ContentEncoding, - /// - /// Indicates the Content-Language header. - /// - ContentLanguage, - /// - /// Indicates the Content-Location header. - /// - ContentLocation, - /// - /// Indicates the Content-MD5 header. - /// - ContentMd5, - /// - /// Indicates the Content-Range header. - /// - ContentRange, - /// - /// Indicates the Expires header. - /// - Expires, - /// - /// Indicates the Last-Modified header. - /// - LastModified, - /// - /// Indicates the Accept header. - /// - Accept, - /// - /// Indicates the Accept-Charset header. - /// - AcceptCharset, - /// - /// Indicates the Accept-Encoding header. - /// - AcceptEncoding, - /// - /// Indicates the Accept-Language header. - /// - AcceptLanguage, - /// - /// Indicates the Authorization header. - /// - Authorization, - /// - /// Indicates the Cookie header. - /// - Cookie, - /// - /// Indicates the Expect header. - /// - Expect, - /// - /// Indicates the From header. - /// - From, - /// - /// Indicates the Host header. - /// - Host, - /// - /// Indicates the If-Match header. - /// - IfMatch, - /// - /// Indicates the If-Modified-Since header. - /// - IfModifiedSince, - /// - /// Indicates the If-None-Match header. - /// - IfNoneMatch, - /// - /// Indicates the If-Range header. - /// - IfRange, - /// - /// Indicates the If-Unmodified-Since header. - /// - IfUnmodifiedSince, - /// - /// Indicates the Max-Forwards header. - /// - MaxForwards, - /// - /// Indicates the Proxy-Authorization header. - /// - ProxyAuthorization, - /// - /// Indicates the Referer header. - /// - Referer, - /// - /// Indicates the Range header. - /// - Range, - /// - /// Indicates the TE header. - /// - Te, - /// - /// Indicates the Translate header. - /// - Translate, - /// - /// Indicates the User-Agent header. - /// - UserAgent, - /// - /// Indicates the Sec-WebSocket-Key header. - /// - SecWebSocketKey, - /// - /// Indicates the Sec-WebSocket-Extensions header. - /// - SecWebSocketExtensions, - /// - /// Indicates the Sec-WebSocket-Protocol header. - /// - SecWebSocketProtocol, - /// - /// Indicates the Sec-WebSocket-Version header. - /// - SecWebSocketVersion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs.meta deleted file mode 100644 index 583b99491..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpRequestHeader.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: b9bcdfbd42b241546b56922afde9ca05 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs b/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs deleted file mode 100644 index d8f36ed84..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs +++ /dev/null @@ -1,189 +0,0 @@ -#region License -/* - * HttpResponseHeader.cs - * - * This code is derived from System.Net.HttpResponseHeader.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -namespace WebSocketSharp.Net -{ - /// - /// Contains the HTTP headers that can be specified in a server response. - /// - /// - /// The HttpResponseHeader enumeration contains the HTTP response headers defined in - /// RFC 2616 for the HTTP/1.1 and - /// RFC 6455 for the WebSocket. - /// - public enum HttpResponseHeader - { - /// - /// Indicates the Cache-Control header. - /// - CacheControl, - /// - /// Indicates the Connection header. - /// - Connection, - /// - /// Indicates the Date header. - /// - Date, - /// - /// Indicates the Keep-Alive header. - /// - KeepAlive, - /// - /// Indicates the Pragma header. - /// - Pragma, - /// - /// Indicates the Trailer header. - /// - Trailer, - /// - /// Indicates the Transfer-Encoding header. - /// - TransferEncoding, - /// - /// Indicates the Upgrade header. - /// - Upgrade, - /// - /// Indicates the Via header. - /// - Via, - /// - /// Indicates the Warning header. - /// - Warning, - /// - /// Indicates the Allow header. - /// - Allow, - /// - /// Indicates the Content-Length header. - /// - ContentLength, - /// - /// Indicates the Content-Type header. - /// - ContentType, - /// - /// Indicates the Content-Encoding header. - /// - ContentEncoding, - /// - /// Indicates the Content-Language header. - /// - ContentLanguage, - /// - /// Indicates the Content-Location header. - /// - ContentLocation, - /// - /// Indicates the Content-MD5 header. - /// - ContentMd5, - /// - /// Indicates the Content-Range header. - /// - ContentRange, - /// - /// Indicates the Expires header. - /// - Expires, - /// - /// Indicates the Last-Modified header. - /// - LastModified, - /// - /// Indicates the Accept-Ranges header. - /// - AcceptRanges, - /// - /// Indicates the Age header. - /// - Age, - /// - /// Indicates the ETag header. - /// - ETag, - /// - /// Indicates the Location header. - /// - Location, - /// - /// Indicates the Proxy-Authenticate header. - /// - ProxyAuthenticate, - /// - /// Indicates the Retry-After header. - /// - RetryAfter, - /// - /// Indicates the Server header. - /// - Server, - /// - /// Indicates the Set-Cookie header. - /// - SetCookie, - /// - /// Indicates the Vary header. - /// - Vary, - /// - /// Indicates the WWW-Authenticate header. - /// - WwwAuthenticate, - /// - /// Indicates the Sec-WebSocket-Extensions header. - /// - SecWebSocketExtensions, - /// - /// Indicates the Sec-WebSocket-Accept header. - /// - SecWebSocketAccept, - /// - /// Indicates the Sec-WebSocket-Protocol header. - /// - SecWebSocketProtocol, - /// - /// Indicates the Sec-WebSocket-Version header. - /// - SecWebSocketVersion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs.meta deleted file mode 100644 index 3c294bccc..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpResponseHeader.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ac1e991b0db3f1046bdd5051ed917aa9 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs b/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs deleted file mode 100644 index 123415f01..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs +++ /dev/null @@ -1,359 +0,0 @@ -#region License -/* - * HttpStatusCode.cs - * - * This code is derived from System.Net.HttpStatusCode.cs of Mono - * (http://www.mono-project.com). - * - * It was automatically generated from ECMA CLI XML Library Specification. - * Generator: libgen.xsl [1.0; (C) Sergey Chaban (serge@wildwestsoftware.com)] - * Created: Wed, 5 Sep 2001 06:32:05 UTC - * Source file: AllTypes.xml - * URL: http://msdn.microsoft.com/net/ecma/AllTypes.xml - * - * The MIT License - * - * Copyright (c) 2001 Ximian, Inc. (http://www.ximian.com) - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -namespace WebSocketSharp.Net -{ - /// - /// Contains the values of the HTTP status codes. - /// - /// - /// The HttpStatusCode enumeration contains the values of the HTTP status codes defined in - /// RFC 2616 for the HTTP/1.1. - /// - public enum HttpStatusCode - { - /// - /// Equivalent to status code 100. - /// Indicates that the client should continue with its request. - /// - Continue = 100, - /// - /// Equivalent to status code 101. - /// Indicates that the server is switching the HTTP version or protocol on the connection. - /// - SwitchingProtocols = 101, - /// - /// Equivalent to status code 200. - /// Indicates that the client's request has succeeded. - /// - OK = 200, - /// - /// Equivalent to status code 201. - /// Indicates that the client's request has been fulfilled and resulted in a new resource being - /// created. - /// - Created = 201, - /// - /// Equivalent to status code 202. - /// Indicates that the client's request has been accepted for processing, but the processing - /// hasn't been completed. - /// - Accepted = 202, - /// - /// Equivalent to status code 203. - /// Indicates that the returned metainformation is from a local or a third-party copy instead of - /// the origin server. - /// - NonAuthoritativeInformation = 203, - /// - /// Equivalent to status code 204. - /// Indicates that the server has fulfilled the client's request but doesn't need to return - /// an entity-body. - /// - NoContent = 204, - /// - /// Equivalent to status code 205. - /// Indicates that the server has fulfilled the client's request, and the user agent should - /// reset the document view which caused the request to be sent. - /// - ResetContent = 205, - /// - /// Equivalent to status code 206. - /// Indicates that the server has fulfilled the partial GET request for the resource. - /// - PartialContent = 206, - /// - /// - /// Equivalent to status code 300. - /// Indicates that the requested resource corresponds to any of multiple representations. - /// - /// - /// MultipleChoices is a synonym for Ambiguous. - /// - /// - MultipleChoices = 300, - /// - /// - /// Equivalent to status code 300. - /// Indicates that the requested resource corresponds to any of multiple representations. - /// - /// - /// Ambiguous is a synonym for MultipleChoices. - /// - /// - Ambiguous = 300, - /// - /// - /// Equivalent to status code 301. - /// Indicates that the requested resource has been assigned a new permanent URI and - /// any future references to this resource should use one of the returned URIs. - /// - /// - /// MovedPermanently is a synonym for Moved. - /// - /// - MovedPermanently = 301, - /// - /// - /// Equivalent to status code 301. - /// Indicates that the requested resource has been assigned a new permanent URI and - /// any future references to this resource should use one of the returned URIs. - /// - /// - /// Moved is a synonym for MovedPermanently. - /// - /// - Moved = 301, - /// - /// - /// Equivalent to status code 302. - /// Indicates that the requested resource is located temporarily under a different URI. - /// - /// - /// Found is a synonym for Redirect. - /// - /// - Found = 302, - /// - /// - /// Equivalent to status code 302. - /// Indicates that the requested resource is located temporarily under a different URI. - /// - /// - /// Redirect is a synonym for Found. - /// - /// - Redirect = 302, - /// - /// - /// Equivalent to status code 303. - /// Indicates that the response to the request can be found under a different URI and - /// should be retrieved using a GET method on that resource. - /// - /// - /// SeeOther is a synonym for RedirectMethod. - /// - /// - SeeOther = 303, - /// - /// - /// Equivalent to status code 303. - /// Indicates that the response to the request can be found under a different URI and - /// should be retrieved using a GET method on that resource. - /// - /// - /// RedirectMethod is a synonym for SeeOther. - /// - /// - RedirectMethod = 303, - /// - /// Equivalent to status code 304. - /// Indicates that the client has performed a conditional GET request and access is allowed, - /// but the document hasn't been modified. - /// - NotModified = 304, - /// - /// Equivalent to status code 305. - /// Indicates that the requested resource must be accessed through the proxy given by - /// the Location field. - /// - UseProxy = 305, - /// - /// Equivalent to status code 306. - /// This status code was used in a previous version of the specification, is no longer used, - /// and is reserved for future use. - /// - Unused = 306, - /// - /// - /// Equivalent to status code 307. - /// Indicates that the requested resource is located temporarily under a different URI. - /// - /// - /// TemporaryRedirect is a synonym for RedirectKeepVerb. - /// - /// - TemporaryRedirect = 307, - /// - /// - /// Equivalent to status code 307. - /// Indicates that the requested resource is located temporarily under a different URI. - /// - /// - /// RedirectKeepVerb is a synonym for TemporaryRedirect. - /// - /// - RedirectKeepVerb = 307, - /// - /// Equivalent to status code 400. - /// Indicates that the client's request couldn't be understood by the server due to - /// malformed syntax. - /// - BadRequest = 400, - /// - /// Equivalent to status code 401. - /// Indicates that the client's request requires user authentication. - /// - Unauthorized = 401, - /// - /// Equivalent to status code 402. - /// This status code is reserved for future use. - /// - PaymentRequired = 402, - /// - /// Equivalent to status code 403. - /// Indicates that the server understood the client's request but is refusing to fulfill it. - /// - Forbidden = 403, - /// - /// Equivalent to status code 404. - /// Indicates that the server hasn't found anything matching the request URI. - /// - NotFound = 404, - /// - /// Equivalent to status code 405. - /// Indicates that the method specified in the request line isn't allowed for the resource - /// identified by the request URI. - /// - MethodNotAllowed = 405, - /// - /// Equivalent to status code 406. - /// Indicates that the server doesn't have the appropriate resource to respond to the Accept - /// headers in the client's request. - /// - NotAcceptable = 406, - /// - /// Equivalent to status code 407. - /// Indicates that the client must first authenticate itself with the proxy. - /// - ProxyAuthenticationRequired = 407, - /// - /// Equivalent to status code 408. - /// Indicates that the client didn't produce a request within the time that the server was - /// prepared to wait. - /// - RequestTimeout = 408, - /// - /// Equivalent to status code 409. - /// Indicates that the client's request couldn't be completed due to a conflict on the server. - /// - Conflict = 409, - /// - /// Equivalent to status code 410. - /// Indicates that the requested resource is no longer available at the server and - /// no forwarding address is known. - /// - Gone = 410, - /// - /// Equivalent to status code 411. - /// Indicates that the server refuses to accept the client's request without a defined - /// Content-Length. - /// - LengthRequired = 411, - /// - /// Equivalent to status code 412. - /// Indicates that the precondition given in one or more of the request headers evaluated to - /// false when it was tested on the server. - /// - PreconditionFailed = 412, - /// - /// Equivalent to status code 413. - /// Indicates that the entity of the client's request is larger than the server is willing or - /// able to process. - /// - RequestEntityTooLarge = 413, - /// - /// Equivalent to status code 414. - /// Indicates that the request URI is longer than the server is willing to interpret. - /// - RequestUriTooLong = 414, - /// - /// Equivalent to status code 415. - /// Indicates that the entity of the client's request is in a format not supported by - /// the requested resource for the requested method. - /// - UnsupportedMediaType = 415, - /// - /// Equivalent to status code 416. - /// Indicates that none of the range specifier values in a Range request header overlap - /// the current extent of the selected resource. - /// - RequestedRangeNotSatisfiable = 416, - /// - /// Equivalent to status code 417. - /// Indicates that the expectation given in an Expect request header couldn't be met by - /// the server. - /// - ExpectationFailed = 417, - /// - /// Equivalent to status code 500. - /// Indicates that the server encountered an unexpected condition which prevented it from - /// fulfilling the client's request. - /// - InternalServerError = 500, - /// - /// Equivalent to status code 501. - /// Indicates that the server doesn't support the functionality required to fulfill the client's - /// request. - /// - NotImplemented = 501, - /// - /// Equivalent to status code 502. - /// Indicates that a gateway or proxy server received an invalid response from the upstream - /// server. - /// - BadGateway = 502, - /// - /// Equivalent to status code 503. - /// Indicates that the server is currently unable to handle the client's request due to - /// a temporary overloading or maintenance of the server. - /// - ServiceUnavailable = 503, - /// - /// Equivalent to status code 504. - /// Indicates that a gateway or proxy server didn't receive a timely response from the upstream - /// server or some other auxiliary server. - /// - GatewayTimeout = 504, - /// - /// Equivalent to status code 505. - /// Indicates that the server doesn't support the HTTP version used in the client's request. - /// - HttpVersionNotSupported = 505, - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs.meta deleted file mode 100644 index 1c37b5f44..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpStatusCode.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: ad016c9c04d409142bce3b6e5cdf04e3 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs b/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs deleted file mode 100644 index 44189303c..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs +++ /dev/null @@ -1,184 +0,0 @@ -#region License -/* - * HttpStreamAsyncResult.cs - * - * This code is derived from HttpStreamAsyncResult.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Threading; - -namespace WebSocketSharp.Net -{ - internal class HttpStreamAsyncResult : IAsyncResult - { - #region Private Fields - - private byte[] _buffer; - private AsyncCallback _callback; - private bool _completed; - private int _count; - private Exception _exception; - private int _offset; - private object _state; - private object _sync; - private int _syncRead; - private ManualResetEvent _waitHandle; - - #endregion - - #region Internal Constructors - - internal HttpStreamAsyncResult (AsyncCallback callback, object state) - { - _callback = callback; - _state = state; - _sync = new object (); - } - - #endregion - - #region Internal Properties - - internal byte[] Buffer { - get { - return _buffer; - } - - set { - _buffer = value; - } - } - - internal int Count { - get { - return _count; - } - - set { - _count = value; - } - } - - internal Exception Exception { - get { - return _exception; - } - } - - internal bool HasException { - get { - return _exception != null; - } - } - - internal int Offset { - get { - return _offset; - } - - set { - _offset = value; - } - } - - internal int SyncRead { - get { - return _syncRead; - } - - set { - _syncRead = value; - } - } - - #endregion - - #region Public Properties - - public object AsyncState { - get { - return _state; - } - } - - public WaitHandle AsyncWaitHandle { - get { - lock (_sync) - return _waitHandle ?? (_waitHandle = new ManualResetEvent (_completed)); - } - } - - public bool CompletedSynchronously { - get { - return _syncRead == _count; - } - } - - public bool IsCompleted { - get { - lock (_sync) - return _completed; - } - } - - #endregion - - #region Internal Methods - - internal void Complete () - { - lock (_sync) { - if (_completed) - return; - - _completed = true; - if (_waitHandle != null) - _waitHandle.Set (); - - if (_callback != null) - _callback.BeginInvoke (this, ar => _callback.EndInvoke (ar), null); - } - } - - internal void Complete (Exception exception) - { - _exception = exception; - Complete (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs.meta deleted file mode 100644 index b913f9b2d..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpStreamAsyncResult.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: c439a9175eadaf345bf8db3b5c4aaf7d -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpUtility.cs b/ThirdParty/WebSocketSharp/Net/HttpUtility.cs deleted file mode 100644 index 3e3c78cf6..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpUtility.cs +++ /dev/null @@ -1,1264 +0,0 @@ -#region License -/* - * HttpUtility.cs - * - * This code is derived from System.Net.HttpUtility.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005-2009 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Patrik Torstensson - * - Wictor Wilén (decode/encode functions) - * - Tim Coleman - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Globalization; -using System.IO; -using System.Security.Principal; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal sealed class HttpUtility - { - #region Private Fields - - private static Dictionary _entities; - private static char[] _hexChars = "0123456789abcdef".ToCharArray (); - private static object _sync = new object (); - - #endregion - - #region Private Methods - - private static int getChar (byte[] bytes, int offset, int length) - { - var val = 0; - var end = length + offset; - for (var i = offset; i < end; i++) { - var current = getInt (bytes[i]); - if (current == -1) - return -1; - - val = (val << 4) + current; - } - - return val; - } - - private static int getChar (string s, int offset, int length) - { - var val = 0; - var end = length + offset; - for (var i = offset; i < end; i++) { - var c = s[i]; - if (c > 127) - return -1; - - var current = getInt ((byte) c); - if (current == -1) - return -1; - - val = (val << 4) + current; - } - - return val; - } - - private static char[] getChars (MemoryStream buffer, Encoding encoding) - { - return encoding.GetChars (buffer.GetBuffer (), 0, (int) buffer.Length); - } - - private static Dictionary getEntities () - { - lock (_sync) { - if (_entities == null) - initEntities (); - - return _entities; - } - } - - private static int getInt (byte b) - { - var c = (char) b; - return c >= '0' && c <= '9' - ? c - '0' - : c >= 'a' && c <= 'f' - ? c - 'a' + 10 - : c >= 'A' && c <= 'F' - ? c - 'A' + 10 - : -1; - } - - private static void initEntities () - { - // Build the dictionary of HTML entity references. - // This list comes from the HTML 4.01 W3C recommendation. - _entities = new Dictionary (); - _entities.Add ("nbsp", '\u00A0'); - _entities.Add ("iexcl", '\u00A1'); - _entities.Add ("cent", '\u00A2'); - _entities.Add ("pound", '\u00A3'); - _entities.Add ("curren", '\u00A4'); - _entities.Add ("yen", '\u00A5'); - _entities.Add ("brvbar", '\u00A6'); - _entities.Add ("sect", '\u00A7'); - _entities.Add ("uml", '\u00A8'); - _entities.Add ("copy", '\u00A9'); - _entities.Add ("ordf", '\u00AA'); - _entities.Add ("laquo", '\u00AB'); - _entities.Add ("not", '\u00AC'); - _entities.Add ("shy", '\u00AD'); - _entities.Add ("reg", '\u00AE'); - _entities.Add ("macr", '\u00AF'); - _entities.Add ("deg", '\u00B0'); - _entities.Add ("plusmn", '\u00B1'); - _entities.Add ("sup2", '\u00B2'); - _entities.Add ("sup3", '\u00B3'); - _entities.Add ("acute", '\u00B4'); - _entities.Add ("micro", '\u00B5'); - _entities.Add ("para", '\u00B6'); - _entities.Add ("middot", '\u00B7'); - _entities.Add ("cedil", '\u00B8'); - _entities.Add ("sup1", '\u00B9'); - _entities.Add ("ordm", '\u00BA'); - _entities.Add ("raquo", '\u00BB'); - _entities.Add ("frac14", '\u00BC'); - _entities.Add ("frac12", '\u00BD'); - _entities.Add ("frac34", '\u00BE'); - _entities.Add ("iquest", '\u00BF'); - _entities.Add ("Agrave", '\u00C0'); - _entities.Add ("Aacute", '\u00C1'); - _entities.Add ("Acirc", '\u00C2'); - _entities.Add ("Atilde", '\u00C3'); - _entities.Add ("Auml", '\u00C4'); - _entities.Add ("Aring", '\u00C5'); - _entities.Add ("AElig", '\u00C6'); - _entities.Add ("Ccedil", '\u00C7'); - _entities.Add ("Egrave", '\u00C8'); - _entities.Add ("Eacute", '\u00C9'); - _entities.Add ("Ecirc", '\u00CA'); - _entities.Add ("Euml", '\u00CB'); - _entities.Add ("Igrave", '\u00CC'); - _entities.Add ("Iacute", '\u00CD'); - _entities.Add ("Icirc", '\u00CE'); - _entities.Add ("Iuml", '\u00CF'); - _entities.Add ("ETH", '\u00D0'); - _entities.Add ("Ntilde", '\u00D1'); - _entities.Add ("Ograve", '\u00D2'); - _entities.Add ("Oacute", '\u00D3'); - _entities.Add ("Ocirc", '\u00D4'); - _entities.Add ("Otilde", '\u00D5'); - _entities.Add ("Ouml", '\u00D6'); - _entities.Add ("times", '\u00D7'); - _entities.Add ("Oslash", '\u00D8'); - _entities.Add ("Ugrave", '\u00D9'); - _entities.Add ("Uacute", '\u00DA'); - _entities.Add ("Ucirc", '\u00DB'); - _entities.Add ("Uuml", '\u00DC'); - _entities.Add ("Yacute", '\u00DD'); - _entities.Add ("THORN", '\u00DE'); - _entities.Add ("szlig", '\u00DF'); - _entities.Add ("agrave", '\u00E0'); - _entities.Add ("aacute", '\u00E1'); - _entities.Add ("acirc", '\u00E2'); - _entities.Add ("atilde", '\u00E3'); - _entities.Add ("auml", '\u00E4'); - _entities.Add ("aring", '\u00E5'); - _entities.Add ("aelig", '\u00E6'); - _entities.Add ("ccedil", '\u00E7'); - _entities.Add ("egrave", '\u00E8'); - _entities.Add ("eacute", '\u00E9'); - _entities.Add ("ecirc", '\u00EA'); - _entities.Add ("euml", '\u00EB'); - _entities.Add ("igrave", '\u00EC'); - _entities.Add ("iacute", '\u00ED'); - _entities.Add ("icirc", '\u00EE'); - _entities.Add ("iuml", '\u00EF'); - _entities.Add ("eth", '\u00F0'); - _entities.Add ("ntilde", '\u00F1'); - _entities.Add ("ograve", '\u00F2'); - _entities.Add ("oacute", '\u00F3'); - _entities.Add ("ocirc", '\u00F4'); - _entities.Add ("otilde", '\u00F5'); - _entities.Add ("ouml", '\u00F6'); - _entities.Add ("divide", '\u00F7'); - _entities.Add ("oslash", '\u00F8'); - _entities.Add ("ugrave", '\u00F9'); - _entities.Add ("uacute", '\u00FA'); - _entities.Add ("ucirc", '\u00FB'); - _entities.Add ("uuml", '\u00FC'); - _entities.Add ("yacute", '\u00FD'); - _entities.Add ("thorn", '\u00FE'); - _entities.Add ("yuml", '\u00FF'); - _entities.Add ("fnof", '\u0192'); - _entities.Add ("Alpha", '\u0391'); - _entities.Add ("Beta", '\u0392'); - _entities.Add ("Gamma", '\u0393'); - _entities.Add ("Delta", '\u0394'); - _entities.Add ("Epsilon", '\u0395'); - _entities.Add ("Zeta", '\u0396'); - _entities.Add ("Eta", '\u0397'); - _entities.Add ("Theta", '\u0398'); - _entities.Add ("Iota", '\u0399'); - _entities.Add ("Kappa", '\u039A'); - _entities.Add ("Lambda", '\u039B'); - _entities.Add ("Mu", '\u039C'); - _entities.Add ("Nu", '\u039D'); - _entities.Add ("Xi", '\u039E'); - _entities.Add ("Omicron", '\u039F'); - _entities.Add ("Pi", '\u03A0'); - _entities.Add ("Rho", '\u03A1'); - _entities.Add ("Sigma", '\u03A3'); - _entities.Add ("Tau", '\u03A4'); - _entities.Add ("Upsilon", '\u03A5'); - _entities.Add ("Phi", '\u03A6'); - _entities.Add ("Chi", '\u03A7'); - _entities.Add ("Psi", '\u03A8'); - _entities.Add ("Omega", '\u03A9'); - _entities.Add ("alpha", '\u03B1'); - _entities.Add ("beta", '\u03B2'); - _entities.Add ("gamma", '\u03B3'); - _entities.Add ("delta", '\u03B4'); - _entities.Add ("epsilon", '\u03B5'); - _entities.Add ("zeta", '\u03B6'); - _entities.Add ("eta", '\u03B7'); - _entities.Add ("theta", '\u03B8'); - _entities.Add ("iota", '\u03B9'); - _entities.Add ("kappa", '\u03BA'); - _entities.Add ("lambda", '\u03BB'); - _entities.Add ("mu", '\u03BC'); - _entities.Add ("nu", '\u03BD'); - _entities.Add ("xi", '\u03BE'); - _entities.Add ("omicron", '\u03BF'); - _entities.Add ("pi", '\u03C0'); - _entities.Add ("rho", '\u03C1'); - _entities.Add ("sigmaf", '\u03C2'); - _entities.Add ("sigma", '\u03C3'); - _entities.Add ("tau", '\u03C4'); - _entities.Add ("upsilon", '\u03C5'); - _entities.Add ("phi", '\u03C6'); - _entities.Add ("chi", '\u03C7'); - _entities.Add ("psi", '\u03C8'); - _entities.Add ("omega", '\u03C9'); - _entities.Add ("thetasym", '\u03D1'); - _entities.Add ("upsih", '\u03D2'); - _entities.Add ("piv", '\u03D6'); - _entities.Add ("bull", '\u2022'); - _entities.Add ("hellip", '\u2026'); - _entities.Add ("prime", '\u2032'); - _entities.Add ("Prime", '\u2033'); - _entities.Add ("oline", '\u203E'); - _entities.Add ("frasl", '\u2044'); - _entities.Add ("weierp", '\u2118'); - _entities.Add ("image", '\u2111'); - _entities.Add ("real", '\u211C'); - _entities.Add ("trade", '\u2122'); - _entities.Add ("alefsym", '\u2135'); - _entities.Add ("larr", '\u2190'); - _entities.Add ("uarr", '\u2191'); - _entities.Add ("rarr", '\u2192'); - _entities.Add ("darr", '\u2193'); - _entities.Add ("harr", '\u2194'); - _entities.Add ("crarr", '\u21B5'); - _entities.Add ("lArr", '\u21D0'); - _entities.Add ("uArr", '\u21D1'); - _entities.Add ("rArr", '\u21D2'); - _entities.Add ("dArr", '\u21D3'); - _entities.Add ("hArr", '\u21D4'); - _entities.Add ("forall", '\u2200'); - _entities.Add ("part", '\u2202'); - _entities.Add ("exist", '\u2203'); - _entities.Add ("empty", '\u2205'); - _entities.Add ("nabla", '\u2207'); - _entities.Add ("isin", '\u2208'); - _entities.Add ("notin", '\u2209'); - _entities.Add ("ni", '\u220B'); - _entities.Add ("prod", '\u220F'); - _entities.Add ("sum", '\u2211'); - _entities.Add ("minus", '\u2212'); - _entities.Add ("lowast", '\u2217'); - _entities.Add ("radic", '\u221A'); - _entities.Add ("prop", '\u221D'); - _entities.Add ("infin", '\u221E'); - _entities.Add ("ang", '\u2220'); - _entities.Add ("and", '\u2227'); - _entities.Add ("or", '\u2228'); - _entities.Add ("cap", '\u2229'); - _entities.Add ("cup", '\u222A'); - _entities.Add ("int", '\u222B'); - _entities.Add ("there4", '\u2234'); - _entities.Add ("sim", '\u223C'); - _entities.Add ("cong", '\u2245'); - _entities.Add ("asymp", '\u2248'); - _entities.Add ("ne", '\u2260'); - _entities.Add ("equiv", '\u2261'); - _entities.Add ("le", '\u2264'); - _entities.Add ("ge", '\u2265'); - _entities.Add ("sub", '\u2282'); - _entities.Add ("sup", '\u2283'); - _entities.Add ("nsub", '\u2284'); - _entities.Add ("sube", '\u2286'); - _entities.Add ("supe", '\u2287'); - _entities.Add ("oplus", '\u2295'); - _entities.Add ("otimes", '\u2297'); - _entities.Add ("perp", '\u22A5'); - _entities.Add ("sdot", '\u22C5'); - _entities.Add ("lceil", '\u2308'); - _entities.Add ("rceil", '\u2309'); - _entities.Add ("lfloor", '\u230A'); - _entities.Add ("rfloor", '\u230B'); - _entities.Add ("lang", '\u2329'); - _entities.Add ("rang", '\u232A'); - _entities.Add ("loz", '\u25CA'); - _entities.Add ("spades", '\u2660'); - _entities.Add ("clubs", '\u2663'); - _entities.Add ("hearts", '\u2665'); - _entities.Add ("diams", '\u2666'); - _entities.Add ("quot", '\u0022'); - _entities.Add ("amp", '\u0026'); - _entities.Add ("lt", '\u003C'); - _entities.Add ("gt", '\u003E'); - _entities.Add ("OElig", '\u0152'); - _entities.Add ("oelig", '\u0153'); - _entities.Add ("Scaron", '\u0160'); - _entities.Add ("scaron", '\u0161'); - _entities.Add ("Yuml", '\u0178'); - _entities.Add ("circ", '\u02C6'); - _entities.Add ("tilde", '\u02DC'); - _entities.Add ("ensp", '\u2002'); - _entities.Add ("emsp", '\u2003'); - _entities.Add ("thinsp", '\u2009'); - _entities.Add ("zwnj", '\u200C'); - _entities.Add ("zwj", '\u200D'); - _entities.Add ("lrm", '\u200E'); - _entities.Add ("rlm", '\u200F'); - _entities.Add ("ndash", '\u2013'); - _entities.Add ("mdash", '\u2014'); - _entities.Add ("lsquo", '\u2018'); - _entities.Add ("rsquo", '\u2019'); - _entities.Add ("sbquo", '\u201A'); - _entities.Add ("ldquo", '\u201C'); - _entities.Add ("rdquo", '\u201D'); - _entities.Add ("bdquo", '\u201E'); - _entities.Add ("dagger", '\u2020'); - _entities.Add ("Dagger", '\u2021'); - _entities.Add ("permil", '\u2030'); - _entities.Add ("lsaquo", '\u2039'); - _entities.Add ("rsaquo", '\u203A'); - _entities.Add ("euro", '\u20AC'); - } - - private static bool notEncoded (char c) - { - return c == '!' || - c == '\'' || - c == '(' || - c == ')' || - c == '*' || - c == '-' || - c == '.' || - c == '_'; - } - - private static void urlEncode (char c, Stream result, bool unicode) - { - if (c > 255) { - // FIXME: What happens when there is an internal error? - //if (!unicode) - // throw new ArgumentOutOfRangeException ("c", c, "Greater than 255."); - - result.WriteByte ((byte) '%'); - result.WriteByte ((byte) 'u'); - - var i = (int) c; - var idx = i >> 12; - result.WriteByte ((byte) _hexChars[idx]); - - idx = (i >> 8) & 0x0F; - result.WriteByte ((byte) _hexChars[idx]); - - idx = (i >> 4) & 0x0F; - result.WriteByte ((byte) _hexChars[idx]); - - idx = i & 0x0F; - result.WriteByte ((byte) _hexChars[idx]); - - return; - } - - if (c > ' ' && notEncoded (c)) { - result.WriteByte ((byte) c); - return; - } - - if (c == ' ') { - result.WriteByte ((byte) '+'); - return; - } - - if ((c < '0') || - (c < 'A' && c > '9') || - (c > 'Z' && c < 'a') || - (c > 'z')) { - if (unicode && c > 127) { - result.WriteByte ((byte) '%'); - result.WriteByte ((byte) 'u'); - result.WriteByte ((byte) '0'); - result.WriteByte ((byte) '0'); - } - else { - result.WriteByte ((byte) '%'); - } - - var i = (int) c; - var idx = i >> 4; - result.WriteByte ((byte) _hexChars[idx]); - - idx = i & 0x0F; - result.WriteByte ((byte) _hexChars[idx]); - - return; - } - - result.WriteByte ((byte) c); - } - - private static void urlPathEncode (char c, Stream result) - { - if (c < 33 || c > 126) { - var bytes = Encoding.UTF8.GetBytes (c.ToString ()); - foreach (var b in bytes) { - result.WriteByte ((byte) '%'); - - var i = (int) b; - var idx = i >> 4; - result.WriteByte ((byte) _hexChars[idx]); - - idx = i & 0x0F; - result.WriteByte ((byte) _hexChars[idx]); - } - - return; - } - - if (c == ' ') { - result.WriteByte ((byte) '%'); - result.WriteByte ((byte) '2'); - result.WriteByte ((byte) '0'); - - return; - } - - result.WriteByte ((byte) c); - } - - private static void writeCharBytes (char c, IList buffer, Encoding encoding) - { - if (c > 255) { - foreach (var b in encoding.GetBytes (new[] { c })) - buffer.Add (b); - - return; - } - - buffer.Add ((byte) c); - } - - #endregion - - #region Internal Methods - - internal static Uri CreateRequestUrl ( - string requestUri, string host, bool websocketRequest, bool secure) - { - if (requestUri == null || requestUri.Length == 0 || host == null || host.Length == 0) - return null; - - string schm = null; - string path = null; - if (requestUri.StartsWith ("/")) { - path = requestUri; - } - else if (requestUri.MaybeUri ()) { - Uri uri; - var valid = Uri.TryCreate (requestUri, UriKind.Absolute, out uri) && - (((schm = uri.Scheme).StartsWith ("http") && !websocketRequest) || - (schm.StartsWith ("ws") && websocketRequest)); - - if (!valid) - return null; - - host = uri.Authority; - path = uri.PathAndQuery; - } - else if (requestUri == "*") { - } - else { - // As authority form - host = requestUri; - } - - if (schm == null) - schm = (websocketRequest ? "ws" : "http") + (secure ? "s" : String.Empty); - - var colon = host.IndexOf (':'); - if (colon == -1) - host = String.Format ("{0}:{1}", host, schm == "http" || schm == "ws" ? 80 : 443); - - var url = String.Format ("{0}://{1}{2}", schm, host, path); - - Uri res; - if (!Uri.TryCreate (url, UriKind.Absolute, out res)) - return null; - - return res; - } - - internal static IPrincipal CreateUser ( - string response, - AuthenticationSchemes scheme, - string realm, - string method, - Func credentialsFinder - ) - { - if (response == null || response.Length == 0) - return null; - - if (credentialsFinder == null) - return null; - - if (!(scheme == AuthenticationSchemes.Basic || scheme == AuthenticationSchemes.Digest)) - return null; - - if (scheme == AuthenticationSchemes.Digest) { - if (realm == null || realm.Length == 0) - return null; - - if (method == null || method.Length == 0) - return null; - } - - if (!response.StartsWith (scheme.ToString (), StringComparison.OrdinalIgnoreCase)) - return null; - - var res = AuthenticationResponse.Parse (response); - if (res == null) - return null; - - var id = res.ToIdentity (); - if (id == null) - return null; - - NetworkCredential cred = null; - try { - cred = credentialsFinder (id); - } - catch { - } - - if (cred == null) - return null; - - if (scheme == AuthenticationSchemes.Basic - && ((HttpBasicIdentity) id).Password != cred.Password - ) { - return null; - } - - if (scheme == AuthenticationSchemes.Digest - && !((HttpDigestIdentity) id).IsValid (cred.Password, realm, method, null) - ) { - return null; - } - - return new GenericPrincipal (id, cred.Roles); - } - - internal static Encoding GetEncoding (string contentType) - { - var parts = contentType.Split (';'); - foreach (var p in parts) { - var part = p.Trim (); - if (part.StartsWith ("charset", StringComparison.OrdinalIgnoreCase)) - return Encoding.GetEncoding (part.GetValue ('=', true)); - } - - return null; - } - - internal static NameValueCollection InternalParseQueryString (string query, Encoding encoding) - { - int len; - if (query == null || (len = query.Length) == 0 || (len == 1 && query[0] == '?')) - return new NameValueCollection (1); - - if (query[0] == '?') - query = query.Substring (1); - - var res = new QueryStringCollection (); - var components = query.Split ('&'); - foreach (var component in components) { - var i = component.IndexOf ('='); - if (i > -1) { - var name = UrlDecode (component.Substring (0, i), encoding); - var val = component.Length > i + 1 - ? UrlDecode (component.Substring (i + 1), encoding) - : String.Empty; - - res.Add (name, val); - } - else { - res.Add (null, UrlDecode (component, encoding)); - } - } - - return res; - } - - internal static string InternalUrlDecode ( - byte[] bytes, int offset, int count, Encoding encoding) - { - var output = new StringBuilder (); - using (var acc = new MemoryStream ()) { - var end = count + offset; - for (var i = offset; i < end; i++) { - if (bytes[i] == '%' && i + 2 < count && bytes[i + 1] != '%') { - int xchar; - if (bytes[i + 1] == (byte) 'u' && i + 5 < end) { - if (acc.Length > 0) { - output.Append (getChars (acc, encoding)); - acc.SetLength (0); - } - - xchar = getChar (bytes, i + 2, 4); - if (xchar != -1) { - output.Append ((char) xchar); - i += 5; - - continue; - } - } - else if ((xchar = getChar (bytes, i + 1, 2)) != -1) { - acc.WriteByte ((byte) xchar); - i += 2; - - continue; - } - } - - if (acc.Length > 0) { - output.Append (getChars (acc, encoding)); - acc.SetLength (0); - } - - if (bytes[i] == '+') { - output.Append (' '); - continue; - } - - output.Append ((char) bytes[i]); - } - - if (acc.Length > 0) - output.Append (getChars (acc, encoding)); - } - - return output.ToString (); - } - - internal static byte[] InternalUrlDecodeToBytes (byte[] bytes, int offset, int count) - { - using (var res = new MemoryStream ()) { - var end = offset + count; - for (var i = offset; i < end; i++) { - var c = (char) bytes[i]; - if (c == '+') { - c = ' '; - } - else if (c == '%' && i < end - 2) { - var xchar = getChar (bytes, i + 1, 2); - if (xchar != -1) { - c = (char) xchar; - i += 2; - } - } - - res.WriteByte ((byte) c); - } - - res.Close (); - return res.ToArray (); - } - } - - internal static byte[] InternalUrlEncodeToBytes (byte[] bytes, int offset, int count) - { - using (var res = new MemoryStream ()) { - var end = offset + count; - for (var i = offset; i < end; i++) - urlEncode ((char) bytes[i], res, false); - - res.Close (); - return res.ToArray (); - } - } - - internal static byte[] InternalUrlEncodeUnicodeToBytes (string s) - { - using (var res = new MemoryStream ()) { - foreach (var c in s) - urlEncode (c, res, true); - - res.Close (); - return res.ToArray (); - } - } - - #endregion - - #region Public Methods - - public static string HtmlAttributeEncode (string s) - { - if (s == null || s.Length == 0 || !s.Contains ('&', '"', '<', '>')) - return s; - - var output = new StringBuilder (); - foreach (var c in s) - output.Append ( - c == '&' - ? "&" - : c == '"' - ? """ - : c == '<' - ? "<" - : c == '>' - ? ">" - : c.ToString ()); - - return output.ToString (); - } - - public static void HtmlAttributeEncode (string s, TextWriter output) - { - if (output == null) - throw new ArgumentNullException ("output"); - - output.Write (HtmlAttributeEncode (s)); - } - - /// - /// Decodes an HTML-encoded and returns the decoded . - /// - /// - /// A that represents the decoded string. - /// - /// - /// A to decode. - /// - public static string HtmlDecode (string s) - { - if (s == null || s.Length == 0 || !s.Contains ('&')) - return s; - - var entity = new StringBuilder (); - var output = new StringBuilder (); - - // 0 -> nothing, - // 1 -> right after '&' - // 2 -> between '&' and ';' but no '#' - // 3 -> '#' found after '&' and getting numbers - var state = 0; - - var number = 0; - var haveTrailingDigits = false; - foreach (var c in s) { - if (state == 0) { - if (c == '&') { - entity.Append (c); - state = 1; - } - else { - output.Append (c); - } - - continue; - } - - if (c == '&') { - state = 1; - if (haveTrailingDigits) { - entity.Append (number.ToString (CultureInfo.InvariantCulture)); - haveTrailingDigits = false; - } - - output.Append (entity.ToString ()); - entity.Length = 0; - entity.Append ('&'); - - continue; - } - - if (state == 1) { - if (c == ';') { - state = 0; - output.Append (entity.ToString ()); - output.Append (c); - entity.Length = 0; - } - else { - number = 0; - if (c != '#') - state = 2; - else - state = 3; - - entity.Append (c); - } - } - else if (state == 2) { - entity.Append (c); - if (c == ';') { - var key = entity.ToString (); - var entities = getEntities (); - if (key.Length > 1 && entities.ContainsKey (key.Substring (1, key.Length - 2))) - key = entities[key.Substring (1, key.Length - 2)].ToString (); - - output.Append (key); - state = 0; - entity.Length = 0; - } - } - else if (state == 3) { - if (c == ';') { - if (number > 65535) { - output.Append ("&#"); - output.Append (number.ToString (CultureInfo.InvariantCulture)); - output.Append (";"); - } - else { - output.Append ((char) number); - } - - state = 0; - entity.Length = 0; - haveTrailingDigits = false; - } - else if (Char.IsDigit (c)) { - number = number * 10 + ((int) c - '0'); - haveTrailingDigits = true; - } - else { - state = 2; - if (haveTrailingDigits) { - entity.Append (number.ToString (CultureInfo.InvariantCulture)); - haveTrailingDigits = false; - } - - entity.Append (c); - } - } - } - - if (entity.Length > 0) - output.Append (entity.ToString ()); - else if (haveTrailingDigits) - output.Append (number.ToString (CultureInfo.InvariantCulture)); - - return output.ToString (); - } - - /// - /// Decodes an HTML-encoded and sends the decoded - /// to the specified . - /// - /// - /// A to decode. - /// - /// - /// A that receives the decoded string. - /// - public static void HtmlDecode (string s, TextWriter output) - { - if (output == null) - throw new ArgumentNullException ("output"); - - output.Write (HtmlDecode (s)); - } - - /// - /// HTML-encodes a and returns the encoded . - /// - /// - /// A that represents the encoded string. - /// - /// - /// A to encode. - /// - public static string HtmlEncode (string s) - { - if (s == null || s.Length == 0) - return s; - - var needEncode = false; - foreach (var c in s) { - if (c == '&' || c == '"' || c == '<' || c == '>' || c > 159) { - needEncode = true; - break; - } - } - - if (!needEncode) - return s; - - var output = new StringBuilder (); - foreach (var c in s) { - if (c == '&') { - output.Append ("&"); - } - else if (c == '"') { - output.Append ("""); - } - else if (c == '<') { - output.Append ("<"); - } - else if (c == '>') { - output.Append (">"); - } - else if (c > 159) { - // MS starts encoding with &# from 160 and stops at 255. - // We don't do that. One reason is the 65308/65310 unicode - // characters that look like '<' and '>'. - output.Append ("&#"); - output.Append (((int) c).ToString (CultureInfo.InvariantCulture)); - output.Append (";"); - } - else { - output.Append (c); - } - } - - return output.ToString (); - } - - /// - /// HTML-encodes a and sends the encoded - /// to the specified . - /// - /// - /// A to encode. - /// - /// - /// A that receives the encoded string. - /// - public static void HtmlEncode (string s, TextWriter output) - { - if (output == null) - throw new ArgumentNullException ("output"); - - output.Write (HtmlEncode (s)); - } - - public static NameValueCollection ParseQueryString (string query) - { - return ParseQueryString (query, Encoding.UTF8); - } - - public static NameValueCollection ParseQueryString (string query, Encoding encoding) - { - if (query == null) - throw new ArgumentNullException ("query"); - - return InternalParseQueryString (query, encoding ?? Encoding.UTF8); - } - - public static string UrlDecode (string s) - { - return UrlDecode (s, Encoding.UTF8); - } - - public static string UrlDecode (string s, Encoding encoding) - { - if (s == null || s.Length == 0 || !s.Contains ('%', '+')) - return s; - - if (encoding == null) - encoding = Encoding.UTF8; - - var buff = new List (); - var len = s.Length; - for (var i = 0; i < len; i++) { - var c = s[i]; - if (c == '%' && i + 2 < len && s[i + 1] != '%') { - int xchar; - if (s[i + 1] == 'u' && i + 5 < len) { - // Unicode hex sequence. - xchar = getChar (s, i + 2, 4); - if (xchar != -1) { - writeCharBytes ((char) xchar, buff, encoding); - i += 5; - } - else { - writeCharBytes ('%', buff, encoding); - } - } - else if ((xchar = getChar (s, i + 1, 2)) != -1) { - writeCharBytes ((char) xchar, buff, encoding); - i += 2; - } - else { - writeCharBytes ('%', buff, encoding); - } - - continue; - } - - if (c == '+') { - writeCharBytes (' ', buff, encoding); - continue; - } - - writeCharBytes (c, buff, encoding); - } - - return encoding.GetString (buff.ToArray ()); - } - - public static string UrlDecode (byte[] bytes, Encoding encoding) - { - int len; - return bytes == null - ? null - : (len = bytes.Length) == 0 - ? String.Empty - : InternalUrlDecode (bytes, 0, len, encoding ?? Encoding.UTF8); - } - - public static string UrlDecode (byte[] bytes, int offset, int count, Encoding encoding) - { - if (bytes == null) - return null; - - var len = bytes.Length; - if (len == 0 || count == 0) - return String.Empty; - - if (offset < 0 || offset >= len) - throw new ArgumentOutOfRangeException ("offset"); - - if (count < 0 || count > len - offset) - throw new ArgumentOutOfRangeException ("count"); - - return InternalUrlDecode (bytes, offset, count, encoding ?? Encoding.UTF8); - } - - public static byte[] UrlDecodeToBytes (byte[] bytes) - { - int len; - return bytes != null && (len = bytes.Length) > 0 - ? InternalUrlDecodeToBytes (bytes, 0, len) - : bytes; - } - - public static byte[] UrlDecodeToBytes (string s) - { - return UrlDecodeToBytes (s, Encoding.UTF8); - } - - public static byte[] UrlDecodeToBytes (string s, Encoding encoding) - { - if (s == null) - return null; - - if (s.Length == 0) - return new byte[0]; - - var bytes = (encoding ?? Encoding.UTF8).GetBytes (s); - return InternalUrlDecodeToBytes (bytes, 0, bytes.Length); - } - - public static byte[] UrlDecodeToBytes (byte[] bytes, int offset, int count) - { - int len; - if (bytes == null || (len = bytes.Length) == 0) - return bytes; - - if (count == 0) - return new byte[0]; - - if (offset < 0 || offset >= len) - throw new ArgumentOutOfRangeException ("offset"); - - if (count < 0 || count > len - offset ) - throw new ArgumentOutOfRangeException ("count"); - - return InternalUrlDecodeToBytes (bytes, offset, count); - } - - public static string UrlEncode (byte[] bytes) - { - int len; - return bytes == null - ? null - : (len = bytes.Length) == 0 - ? String.Empty - : Encoding.ASCII.GetString (InternalUrlEncodeToBytes (bytes, 0, len)); - } - - public static string UrlEncode (string s) - { - return UrlEncode (s, Encoding.UTF8); - } - - public static string UrlEncode (string s, Encoding encoding) - { - int len; - if (s == null || (len = s.Length) == 0) - return s; - - var needEncode = false; - foreach (var c in s) { - if ((c < '0') || (c < 'A' && c > '9') || (c > 'Z' && c < 'a') || (c > 'z')) { - if (notEncoded (c)) - continue; - - needEncode = true; - break; - } - } - - if (!needEncode) - return s; - - if (encoding == null) - encoding = Encoding.UTF8; - - // Avoided GetByteCount call. - var bytes = new byte[encoding.GetMaxByteCount (len)]; - var realLen = encoding.GetBytes (s, 0, len, bytes, 0); - - return Encoding.ASCII.GetString (InternalUrlEncodeToBytes (bytes, 0, realLen)); - } - - public static string UrlEncode (byte[] bytes, int offset, int count) - { - var encoded = UrlEncodeToBytes (bytes, offset, count); - return encoded == null - ? null - : encoded.Length == 0 - ? String.Empty - : Encoding.ASCII.GetString (encoded); - } - - public static byte[] UrlEncodeToBytes (byte[] bytes) - { - int len; - return bytes != null && (len = bytes.Length) > 0 - ? InternalUrlEncodeToBytes (bytes, 0, len) - : bytes; - } - - public static byte[] UrlEncodeToBytes (string s) - { - return UrlEncodeToBytes (s, Encoding.UTF8); - } - - public static byte[] UrlEncodeToBytes (string s, Encoding encoding) - { - if (s == null) - return null; - - if (s.Length == 0) - return new byte[0]; - - var bytes = (encoding ?? Encoding.UTF8).GetBytes (s); - return InternalUrlEncodeToBytes (bytes, 0, bytes.Length); - } - - public static byte[] UrlEncodeToBytes (byte[] bytes, int offset, int count) - { - int len; - if (bytes == null || (len = bytes.Length) == 0) - return bytes; - - if (count == 0) - return new byte[0]; - - if (offset < 0 || offset >= len) - throw new ArgumentOutOfRangeException ("offset"); - - if (count < 0 || count > len - offset) - throw new ArgumentOutOfRangeException ("count"); - - return InternalUrlEncodeToBytes (bytes, offset, count); - } - - public static string UrlEncodeUnicode (string s) - { - return s != null && s.Length > 0 - ? Encoding.ASCII.GetString (InternalUrlEncodeUnicodeToBytes (s)) - : s; - } - - public static byte[] UrlEncodeUnicodeToBytes (string s) - { - return s == null - ? null - : s.Length == 0 - ? new byte[0] - : InternalUrlEncodeUnicodeToBytes (s); - } - - public static string UrlPathEncode (string s) - { - if (s == null || s.Length == 0) - return s; - - using (var res = new MemoryStream ()) { - foreach (var c in s) - urlPathEncode (c, res); - - res.Close (); - return Encoding.ASCII.GetString (res.ToArray ()); - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpUtility.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpUtility.cs.meta deleted file mode 100644 index f9306ff95..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpUtility.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: dcdaa18ad05a759408ceee3dbb099642 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/HttpVersion.cs b/ThirdParty/WebSocketSharp/Net/HttpVersion.cs deleted file mode 100644 index d20061e0b..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpVersion.cs +++ /dev/null @@ -1,73 +0,0 @@ -#region License -/* - * HttpVersion.cs - * - * This code is derived from System.Net.HttpVersion.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2012-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Lawrence Pit - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the HTTP version numbers. - /// - public class HttpVersion - { - #region Public Fields - - /// - /// Provides a instance for the HTTP/1.0. - /// - public static readonly Version Version10 = new Version (1, 0); - - /// - /// Provides a instance for the HTTP/1.1. - /// - public static readonly Version Version11 = new Version (1, 1); - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public HttpVersion () - { - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/HttpVersion.cs.meta b/ThirdParty/WebSocketSharp/Net/HttpVersion.cs.meta deleted file mode 100644 index 41c60ca3d..000000000 --- a/ThirdParty/WebSocketSharp/Net/HttpVersion.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: a8c70e10a6140484083b2812e6e7ad3f -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/InputChunkState.cs b/ThirdParty/WebSocketSharp/Net/InputChunkState.cs deleted file mode 100644 index f50ad6b7a..000000000 --- a/ThirdParty/WebSocketSharp/Net/InputChunkState.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region License -/* - * InputChunkState.cs - * - * This code is derived from ChunkStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2003 Ximian, Inc (http://www.ximian.com) - * Copyright (c) 2014-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal enum InputChunkState - { - None, - Data, - DataEnded, - Trailer, - End - } -} diff --git a/ThirdParty/WebSocketSharp/Net/InputChunkState.cs.meta b/ThirdParty/WebSocketSharp/Net/InputChunkState.cs.meta deleted file mode 100644 index 6e43d10e2..000000000 --- a/ThirdParty/WebSocketSharp/Net/InputChunkState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 1d95a9c72044a744fbe2e83dfb9d546d -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/InputState.cs b/ThirdParty/WebSocketSharp/Net/InputState.cs deleted file mode 100644 index 9f566d246..000000000 --- a/ThirdParty/WebSocketSharp/Net/InputState.cs +++ /dev/null @@ -1,49 +0,0 @@ -#region License -/* - * InputState.cs - * - * This code is derived from HttpConnection.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal enum InputState - { - RequestLine, - Headers - } -} diff --git a/ThirdParty/WebSocketSharp/Net/InputState.cs.meta b/ThirdParty/WebSocketSharp/Net/InputState.cs.meta deleted file mode 100644 index 0ba738888..000000000 --- a/ThirdParty/WebSocketSharp/Net/InputState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 8e5c21eb435b41b4689815aacc29dc60 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/LineState.cs b/ThirdParty/WebSocketSharp/Net/LineState.cs deleted file mode 100644 index 84e271a7b..000000000 --- a/ThirdParty/WebSocketSharp/Net/LineState.cs +++ /dev/null @@ -1,50 +0,0 @@ -#region License -/* - * LineState.cs - * - * This code is derived from HttpConnection.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal enum LineState - { - None, - Cr, - Lf - } -} diff --git a/ThirdParty/WebSocketSharp/Net/LineState.cs.meta b/ThirdParty/WebSocketSharp/Net/LineState.cs.meta deleted file mode 100644 index 6b41fde52..000000000 --- a/ThirdParty/WebSocketSharp/Net/LineState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 1641d703700d7904faa56307ed81c0c9 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs b/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs deleted file mode 100644 index 3ee52f402..000000000 --- a/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs +++ /dev/null @@ -1,209 +0,0 @@ -#region License -/* - * NetworkCredential.cs - * - * The MIT License - * - * Copyright (c) 2014-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - /// - /// Provides the credentials for the password-based authentication. - /// - public class NetworkCredential - { - #region Private Fields - - private string _domain; - private static readonly string[] _noRoles; - private string _password; - private string[] _roles; - private string _username; - - #endregion - - #region Static Constructor - - static NetworkCredential () - { - _noRoles = new string[0]; - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class with - /// the specified and . - /// - /// - /// A that represents the username associated with - /// the credentials. - /// - /// - /// A that represents the password for the username - /// associated with the credentials. - /// - /// - /// is . - /// - /// - /// is empty. - /// - public NetworkCredential (string username, string password) - : this (username, password, null, null) - { - } - - /// - /// Initializes a new instance of the class with - /// the specified , , - /// and . - /// - /// - /// A that represents the username associated with - /// the credentials. - /// - /// - /// A that represents the password for the username - /// associated with the credentials. - /// - /// - /// A that represents the domain associated with - /// the credentials. - /// - /// - /// An array of that represents the roles - /// associated with the credentials if any. - /// - /// - /// is . - /// - /// - /// is empty. - /// - public NetworkCredential ( - string username, string password, string domain, params string[] roles - ) - { - if (username == null) - throw new ArgumentNullException ("username"); - - if (username.Length == 0) - throw new ArgumentException ("An empty string.", "username"); - - _username = username; - _password = password; - _domain = domain; - _roles = roles; - } - - #endregion - - #region Public Properties - - /// - /// Gets the domain associated with the credentials. - /// - /// - /// This property returns an empty string if the domain was - /// initialized with . - /// - /// - /// A that represents the domain name - /// to which the username belongs. - /// - public string Domain { - get { - return _domain ?? String.Empty; - } - - internal set { - _domain = value; - } - } - - /// - /// Gets the password for the username associated with the credentials. - /// - /// - /// This property returns an empty string if the password was - /// initialized with . - /// - /// - /// A that represents the password. - /// - public string Password { - get { - return _password ?? String.Empty; - } - - internal set { - _password = value; - } - } - - /// - /// Gets the roles associated with the credentials. - /// - /// - /// This property returns an empty array if the roles were - /// initialized with . - /// - /// - /// An array of that represents the role names - /// to which the username belongs. - /// - public string[] Roles { - get { - return _roles ?? _noRoles; - } - - internal set { - _roles = value; - } - } - - /// - /// Gets the username associated with the credentials. - /// - /// - /// A that represents the username. - /// - public string Username { - get { - return _username; - } - - internal set { - _username = value; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs.meta b/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs.meta deleted file mode 100644 index 9d788bc45..000000000 --- a/ThirdParty/WebSocketSharp/Net/NetworkCredential.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 36d05e46b652a7d468a083d82206a662 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs b/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs deleted file mode 100644 index 6a2285fb6..000000000 --- a/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region License -/* - * QueryStringCollection.cs - * - * This code is derived from System.Net.HttpUtility.cs of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005-2009 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Patrik Torstensson - * - Wictor Wilén (decode/encode functions) - * - Tim Coleman - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.Collections.Specialized; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal sealed class QueryStringCollection : NameValueCollection - { - public override string ToString () - { - var cnt = Count; - if (cnt == 0) - return String.Empty; - - var output = new StringBuilder (); - var keys = AllKeys; - foreach (var key in keys) - output.AppendFormat ("{0}={1}&", key, this [key]); - - if (output.Length > 0) - output.Length--; - - return output.ToString (); - } - } -} diff --git a/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs.meta b/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs.meta deleted file mode 100644 index afcc7eadb..000000000 --- a/ThirdParty/WebSocketSharp/Net/QueryStringCollection.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 2264266d234aa3446bc1b0787cd6bdb9 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs b/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs deleted file mode 100644 index 780a69b5a..000000000 --- a/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs +++ /dev/null @@ -1,124 +0,0 @@ -#region License -/* - * ReadBufferState.cs - * - * This code is derived from ChunkedInputStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2014-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; - -namespace WebSocketSharp.Net -{ - internal class ReadBufferState - { - #region Private Fields - - private HttpStreamAsyncResult _asyncResult; - private byte[] _buffer; - private int _count; - private int _initialCount; - private int _offset; - - #endregion - - #region Public Constructors - - public ReadBufferState ( - byte[] buffer, int offset, int count, HttpStreamAsyncResult asyncResult) - { - _buffer = buffer; - _offset = offset; - _count = count; - _initialCount = count; - _asyncResult = asyncResult; - } - - #endregion - - #region Public Properties - - public HttpStreamAsyncResult AsyncResult { - get { - return _asyncResult; - } - - set { - _asyncResult = value; - } - } - - public byte[] Buffer { - get { - return _buffer; - } - - set { - _buffer = value; - } - } - - public int Count { - get { - return _count; - } - - set { - _count = value; - } - } - - public int InitialCount { - get { - return _initialCount; - } - - set { - _initialCount = value; - } - } - - public int Offset { - get { - return _offset; - } - - set { - _offset = value; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs.meta b/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs.meta deleted file mode 100644 index ccba4e292..000000000 --- a/ThirdParty/WebSocketSharp/Net/ReadBufferState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 6f29d3c527dff5344859741ad5bfb2f7 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/RequestStream.cs b/ThirdParty/WebSocketSharp/Net/RequestStream.cs deleted file mode 100644 index dd40b3784..000000000 --- a/ThirdParty/WebSocketSharp/Net/RequestStream.cs +++ /dev/null @@ -1,267 +0,0 @@ -#region License -/* - * RequestStream.cs - * - * This code is derived from RequestStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.IO; - -namespace WebSocketSharp.Net -{ - internal class RequestStream : Stream - { - #region Private Fields - - private long _bodyLeft; - private byte[] _buffer; - private int _count; - private bool _disposed; - private int _offset; - private Stream _stream; - - #endregion - - #region Internal Constructors - - internal RequestStream (Stream stream, byte[] buffer, int offset, int count) - : this (stream, buffer, offset, count, -1) - { - } - - internal RequestStream ( - Stream stream, byte[] buffer, int offset, int count, long contentLength) - { - _stream = stream; - _buffer = buffer; - _offset = offset; - _count = count; - _bodyLeft = contentLength; - } - - #endregion - - #region Public Properties - - public override bool CanRead { - get { - return true; - } - } - - public override bool CanSeek { - get { - return false; - } - } - - public override bool CanWrite { - get { - return false; - } - } - - public override long Length { - get { - throw new NotSupportedException (); - } - } - - public override long Position { - get { - throw new NotSupportedException (); - } - - set { - throw new NotSupportedException (); - } - } - - #endregion - - #region Private Methods - - // Returns 0 if we can keep reading from the base stream, - // > 0 if we read something from the buffer, - // -1 if we had a content length set and we finished reading that many bytes. - private int fillFromBuffer (byte[] buffer, int offset, int count) - { - if (buffer == null) - throw new ArgumentNullException ("buffer"); - - if (offset < 0) - throw new ArgumentOutOfRangeException ("offset", "A negative value."); - - if (count < 0) - throw new ArgumentOutOfRangeException ("count", "A negative value."); - - var len = buffer.Length; - if (offset + count > len) - throw new ArgumentException ( - "The sum of 'offset' and 'count' is greater than 'buffer' length."); - - if (_bodyLeft == 0) - return -1; - - if (_count == 0 || count == 0) - return 0; - - if (count > _count) - count = _count; - - if (_bodyLeft > 0 && count > _bodyLeft) - count = (int) _bodyLeft; - - Buffer.BlockCopy (_buffer, _offset, buffer, offset, count); - _offset += count; - _count -= count; - if (_bodyLeft > 0) - _bodyLeft -= count; - - return count; - } - - #endregion - - #region Public Methods - - public override IAsyncResult BeginRead ( - byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - var nread = fillFromBuffer (buffer, offset, count); - if (nread > 0 || nread == -1) { - var ares = new HttpStreamAsyncResult (callback, state); - ares.Buffer = buffer; - ares.Offset = offset; - ares.Count = count; - ares.SyncRead = nread > 0 ? nread : 0; - ares.Complete (); - - return ares; - } - - // Avoid reading past the end of the request to allow for HTTP pipelining. - if (_bodyLeft >= 0 && count > _bodyLeft) - count = (int) _bodyLeft; - - return _stream.BeginRead (buffer, offset, count, callback, state); - } - - public override IAsyncResult BeginWrite ( - byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException (); - } - - public override void Close () - { - _disposed = true; - } - - public override int EndRead (IAsyncResult asyncResult) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - if (asyncResult == null) - throw new ArgumentNullException ("asyncResult"); - - if (asyncResult is HttpStreamAsyncResult) { - var ares = (HttpStreamAsyncResult) asyncResult; - if (!ares.IsCompleted) - ares.AsyncWaitHandle.WaitOne (); - - return ares.SyncRead; - } - - // Close on exception? - var nread = _stream.EndRead (asyncResult); - if (nread > 0 && _bodyLeft > 0) - _bodyLeft -= nread; - - return nread; - } - - public override void EndWrite (IAsyncResult asyncResult) - { - throw new NotSupportedException (); - } - - public override void Flush () - { - } - - public override int Read (byte[] buffer, int offset, int count) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - // Call the fillFromBuffer method to check for buffer boundaries even when _bodyLeft is 0. - var nread = fillFromBuffer (buffer, offset, count); - if (nread == -1) // No more bytes available (Content-Length). - return 0; - - if (nread > 0) - return nread; - - nread = _stream.Read (buffer, offset, count); - if (nread > 0 && _bodyLeft > 0) - _bodyLeft -= nread; - - return nread; - } - - public override long Seek (long offset, SeekOrigin origin) - { - throw new NotSupportedException (); - } - - public override void SetLength (long value) - { - throw new NotSupportedException (); - } - - public override void Write (byte[] buffer, int offset, int count) - { - throw new NotSupportedException (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/RequestStream.cs.meta b/ThirdParty/WebSocketSharp/Net/RequestStream.cs.meta deleted file mode 100644 index 43e203615..000000000 --- a/ThirdParty/WebSocketSharp/Net/RequestStream.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: e6988df97c06a9040af33ee3180d5028 -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ResponseStream.cs b/ThirdParty/WebSocketSharp/Net/ResponseStream.cs deleted file mode 100644 index 85059a407..000000000 --- a/ThirdParty/WebSocketSharp/Net/ResponseStream.cs +++ /dev/null @@ -1,325 +0,0 @@ -#region License -/* - * ResponseStream.cs - * - * This code is derived from ResponseStream.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Gonzalo Paniagua Javier - */ -#endregion - -using System; -using System.IO; -using System.Text; - -namespace WebSocketSharp.Net -{ - internal class ResponseStream : Stream - { - #region Private Fields - - private MemoryStream _body; - private static readonly byte[] _crlf = new byte[] { 13, 10 }; - private bool _disposed; - private HttpListenerResponse _response; - private bool _sendChunked; - private Stream _stream; - private Action _write; - private Action _writeBody; - private Action _writeChunked; - - #endregion - - #region Internal Constructors - - internal ResponseStream ( - Stream stream, HttpListenerResponse response, bool ignoreWriteExceptions) - { - _stream = stream; - _response = response; - - if (ignoreWriteExceptions) { - _write = writeWithoutThrowingException; - _writeChunked = writeChunkedWithoutThrowingException; - } - else { - _write = stream.Write; - _writeChunked = writeChunked; - } - - _body = new MemoryStream (); - } - - #endregion - - #region Public Properties - - public override bool CanRead { - get { - return false; - } - } - - public override bool CanSeek { - get { - return false; - } - } - - public override bool CanWrite { - get { - return !_disposed; - } - } - - public override long Length { - get { - throw new NotSupportedException (); - } - } - - public override long Position { - get { - throw new NotSupportedException (); - } - - set { - throw new NotSupportedException (); - } - } - - #endregion - - #region Private Methods - - private bool flush (bool closing) - { - if (!_response.HeadersSent) { - if (!flushHeaders (closing)) { - if (closing) - _response.CloseConnection = true; - - return false; - } - - _sendChunked = _response.SendChunked; - _writeBody = _sendChunked ? _writeChunked : _write; - } - - flushBody (closing); - if (closing && _sendChunked) { - var last = getChunkSizeBytes (0, true); - _write (last, 0, last.Length); - } - - return true; - } - - private void flushBody (bool closing) - { - using (_body) { - var len = _body.Length; - if (len > Int32.MaxValue) { - _body.Position = 0; - var buffLen = 1024; - var buff = new byte[buffLen]; - var nread = 0; - while ((nread = _body.Read (buff, 0, buffLen)) > 0) - _writeBody (buff, 0, nread); - } - else if (len > 0) { - _writeBody (_body.GetBuffer (), 0, (int) len); - } - } - - _body = !closing ? new MemoryStream () : null; - } - - private bool flushHeaders (bool closing) - { - using (var buff = new MemoryStream ()) { - var headers = _response.WriteHeadersTo (buff); - var start = buff.Position; - var len = buff.Length - start; - if (len > 32768) - return false; - - if (!_response.SendChunked && _response.ContentLength64 != _body.Length) - return false; - - _write (buff.GetBuffer (), (int) start, (int) len); - _response.CloseConnection = headers["Connection"] == "close"; - _response.HeadersSent = true; - } - - return true; - } - - private static byte[] getChunkSizeBytes (int size, bool final) - { - return Encoding.ASCII.GetBytes (String.Format ("{0:x}\r\n{1}", size, final ? "\r\n" : "")); - } - - private void writeChunked (byte[] buffer, int offset, int count) - { - var size = getChunkSizeBytes (count, false); - _stream.Write (size, 0, size.Length); - _stream.Write (buffer, offset, count); - _stream.Write (_crlf, 0, 2); - } - - private void writeChunkedWithoutThrowingException (byte[] buffer, int offset, int count) - { - try { - writeChunked (buffer, offset, count); - } - catch { - } - } - - private void writeWithoutThrowingException (byte[] buffer, int offset, int count) - { - try { - _stream.Write (buffer, offset, count); - } - catch { - } - } - - #endregion - - #region Internal Methods - - internal void Close (bool force) - { - if (_disposed) - return; - - _disposed = true; - if (!force && flush (true)) { - _response.Close (); - } - else { - if (_sendChunked) { - var last = getChunkSizeBytes (0, true); - _write (last, 0, last.Length); - } - - _body.Dispose (); - _body = null; - - _response.Abort (); - } - - _response = null; - _stream = null; - } - - internal void InternalWrite (byte[] buffer, int offset, int count) - { - _write (buffer, offset, count); - } - - #endregion - - #region Public Methods - - public override IAsyncResult BeginRead ( - byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException (); - } - - public override IAsyncResult BeginWrite ( - byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - return _body.BeginWrite (buffer, offset, count, callback, state); - } - - public override void Close () - { - Close (false); - } - - protected override void Dispose (bool disposing) - { - Close (!disposing); - } - - public override int EndRead (IAsyncResult asyncResult) - { - throw new NotSupportedException (); - } - - public override void EndWrite (IAsyncResult asyncResult) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - _body.EndWrite (asyncResult); - } - - public override void Flush () - { - if (!_disposed && (_sendChunked || _response.SendChunked)) - flush (false); - } - - public override int Read (byte[] buffer, int offset, int count) - { - throw new NotSupportedException (); - } - - public override long Seek (long offset, SeekOrigin origin) - { - throw new NotSupportedException (); - } - - public override void SetLength (long value) - { - throw new NotSupportedException (); - } - - public override void Write (byte[] buffer, int offset, int count) - { - if (_disposed) - throw new ObjectDisposedException (GetType ().ToString ()); - - _body.Write (buffer, offset, count); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ResponseStream.cs.meta b/ThirdParty/WebSocketSharp/Net/ResponseStream.cs.meta deleted file mode 100644 index 50aac090b..000000000 --- a/ThirdParty/WebSocketSharp/Net/ResponseStream.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: a8cb1aade016b66418ec38e8c38ffe73 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs b/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs deleted file mode 100644 index ad9b9e7c2..000000000 --- a/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs +++ /dev/null @@ -1,245 +0,0 @@ -#region License -/* - * ServerSslConfiguration.cs - * - * The MIT License - * - * Copyright (c) 2014 liryna - * Copyright (c) 2014-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Liryna - */ -#endregion - -using System; -using System.Net.Security; -using System.Security.Authentication; -using System.Security.Cryptography.X509Certificates; - -namespace WebSocketSharp.Net -{ - /// - /// Stores the parameters for the used by servers. - /// - public class ServerSslConfiguration - { - #region Private Fields - - private bool _checkCertRevocation; - private bool _clientCertRequired; - private RemoteCertificateValidationCallback _clientCertValidationCallback; - private SslProtocols _enabledSslProtocols; - private X509Certificate2 _serverCert; - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public ServerSslConfiguration () - { - _enabledSslProtocols = SslProtocols.Default; - } - - /// - /// Initializes a new instance of the class - /// with the specified . - /// - /// - /// A that represents the certificate used to - /// authenticate the server. - /// - public ServerSslConfiguration (X509Certificate2 serverCertificate) - { - _serverCert = serverCertificate; - _enabledSslProtocols = SslProtocols.Default; - } - - /// - /// Copies the parameters from the specified to - /// a new instance of the class. - /// - /// - /// A from which to copy. - /// - /// - /// is . - /// - public ServerSslConfiguration (ServerSslConfiguration configuration) - { - if (configuration == null) - throw new ArgumentNullException ("configuration"); - - _checkCertRevocation = configuration._checkCertRevocation; - _clientCertRequired = configuration._clientCertRequired; - _clientCertValidationCallback = configuration._clientCertValidationCallback; - _enabledSslProtocols = configuration._enabledSslProtocols; - _serverCert = configuration._serverCert; - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets a value indicating whether the certificate revocation - /// list is checked during authentication. - /// - /// - /// - /// true if the certificate revocation list is checked during - /// authentication; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool CheckCertificateRevocation { - get { - return _checkCertRevocation; - } - - set { - _checkCertRevocation = value; - } - } - - /// - /// Gets or sets a value indicating whether the client is asked for - /// a certificate for authentication. - /// - /// - /// - /// true if the client is asked for a certificate for - /// authentication; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool ClientCertificateRequired { - get { - return _clientCertRequired; - } - - set { - _clientCertRequired = value; - } - } - - /// - /// Gets or sets the callback used to validate the certificate - /// supplied by the client. - /// - /// - /// The certificate is valid if the callback returns true. - /// - /// - /// - /// A delegate that - /// invokes the method called for validating the certificate. - /// - /// - /// The default value is a delegate that invokes a method that - /// only returns true. - /// - /// - public RemoteCertificateValidationCallback ClientCertificateValidationCallback { - get { - if (_clientCertValidationCallback == null) - _clientCertValidationCallback = defaultValidateClientCertificate; - - return _clientCertValidationCallback; - } - - set { - _clientCertValidationCallback = value; - } - } - - /// - /// Gets or sets the protocols used for authentication. - /// - /// - /// - /// The enum values that represent - /// the protocols used for authentication. - /// - /// - /// The default value is . - /// - /// - public SslProtocols EnabledSslProtocols { - get { - return _enabledSslProtocols; - } - - set { - _enabledSslProtocols = value; - } - } - - /// - /// Gets or sets the certificate used to authenticate the server. - /// - /// - /// - /// A or - /// if not specified. - /// - /// - /// That instance represents an X.509 certificate. - /// - /// - public X509Certificate2 ServerCertificate { - get { - return _serverCert; - } - - set { - _serverCert = value; - } - } - - #endregion - - #region Private Methods - - private static bool defaultValidateClientCertificate ( - object sender, - X509Certificate certificate, - X509Chain chain, - SslPolicyErrors sslPolicyErrors - ) - { - return true; - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs.meta b/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs.meta deleted file mode 100644 index bf37e8511..000000000 --- a/ThirdParty/WebSocketSharp/Net/ServerSslConfiguration.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 9802402648f81db4584ab8b48193fbe5 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs b/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs deleted file mode 100644 index ad05746a2..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs +++ /dev/null @@ -1,1460 +0,0 @@ -#region License -/* - * WebHeaderCollection.cs - * - * This code is derived from WebHeaderCollection.cs (System.Net) of Mono - * (http://www.mono-project.com). - * - * The MIT License - * - * Copyright (c) 2003 Ximian, Inc. (http://www.ximian.com) - * Copyright (c) 2007 Novell, Inc. (http://www.novell.com) - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Authors -/* - * Authors: - * - Lawrence Pit - * - Gonzalo Paniagua Javier - * - Miguel de Icaza - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Runtime.InteropServices; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Text; -#pragma warning disable 0618 - -namespace WebSocketSharp.Net -{ - /// - /// Provides a collection of the HTTP headers associated with a request or response. - /// - [Serializable] - [ComVisible (true)] - public class WebHeaderCollection : NameValueCollection, ISerializable - { - #region Private Fields - - private static readonly Dictionary _headers; - private bool _internallyUsed; - private HttpHeaderType _state; - - #endregion - - #region Static Constructor - - static WebHeaderCollection () - { - _headers = - new Dictionary (StringComparer.InvariantCultureIgnoreCase) { - { - "Accept", - new HttpHeaderInfo ( - "Accept", - HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue) - }, - { - "AcceptCharset", - new HttpHeaderInfo ( - "Accept-Charset", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "AcceptEncoding", - new HttpHeaderInfo ( - "Accept-Encoding", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "AcceptLanguage", - new HttpHeaderInfo ( - "Accept-Language", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "AcceptRanges", - new HttpHeaderInfo ( - "Accept-Ranges", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Age", - new HttpHeaderInfo ( - "Age", - HttpHeaderType.Response) - }, - { - "Allow", - new HttpHeaderInfo ( - "Allow", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Authorization", - new HttpHeaderInfo ( - "Authorization", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "CacheControl", - new HttpHeaderInfo ( - "Cache-Control", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Connection", - new HttpHeaderInfo ( - "Connection", - HttpHeaderType.Request | - HttpHeaderType.Response | - HttpHeaderType.Restricted | - HttpHeaderType.MultiValue) - }, - { - "ContentEncoding", - new HttpHeaderInfo ( - "Content-Encoding", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "ContentLanguage", - new HttpHeaderInfo ( - "Content-Language", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "ContentLength", - new HttpHeaderInfo ( - "Content-Length", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted) - }, - { - "ContentLocation", - new HttpHeaderInfo ( - "Content-Location", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "ContentMd5", - new HttpHeaderInfo ( - "Content-MD5", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "ContentRange", - new HttpHeaderInfo ( - "Content-Range", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "ContentType", - new HttpHeaderInfo ( - "Content-Type", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted) - }, - { - "Cookie", - new HttpHeaderInfo ( - "Cookie", - HttpHeaderType.Request) - }, - { - "Cookie2", - new HttpHeaderInfo ( - "Cookie2", - HttpHeaderType.Request) - }, - { - "Date", - new HttpHeaderInfo ( - "Date", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted) - }, - { - "Expect", - new HttpHeaderInfo ( - "Expect", - HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue) - }, - { - "Expires", - new HttpHeaderInfo ( - "Expires", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "ETag", - new HttpHeaderInfo ( - "ETag", - HttpHeaderType.Response) - }, - { - "From", - new HttpHeaderInfo ( - "From", - HttpHeaderType.Request) - }, - { - "Host", - new HttpHeaderInfo ( - "Host", - HttpHeaderType.Request | HttpHeaderType.Restricted) - }, - { - "IfMatch", - new HttpHeaderInfo ( - "If-Match", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "IfModifiedSince", - new HttpHeaderInfo ( - "If-Modified-Since", - HttpHeaderType.Request | HttpHeaderType.Restricted) - }, - { - "IfNoneMatch", - new HttpHeaderInfo ( - "If-None-Match", - HttpHeaderType.Request | HttpHeaderType.MultiValue) - }, - { - "IfRange", - new HttpHeaderInfo ( - "If-Range", - HttpHeaderType.Request) - }, - { - "IfUnmodifiedSince", - new HttpHeaderInfo ( - "If-Unmodified-Since", - HttpHeaderType.Request) - }, - { - "KeepAlive", - new HttpHeaderInfo ( - "Keep-Alive", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "LastModified", - new HttpHeaderInfo ( - "Last-Modified", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "Location", - new HttpHeaderInfo ( - "Location", - HttpHeaderType.Response) - }, - { - "MaxForwards", - new HttpHeaderInfo ( - "Max-Forwards", - HttpHeaderType.Request) - }, - { - "Pragma", - new HttpHeaderInfo ( - "Pragma", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "ProxyAuthenticate", - new HttpHeaderInfo ( - "Proxy-Authenticate", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "ProxyAuthorization", - new HttpHeaderInfo ( - "Proxy-Authorization", - HttpHeaderType.Request) - }, - { - "ProxyConnection", - new HttpHeaderInfo ( - "Proxy-Connection", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted) - }, - { - "Public", - new HttpHeaderInfo ( - "Public", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Range", - new HttpHeaderInfo ( - "Range", - HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue) - }, - { - "Referer", - new HttpHeaderInfo ( - "Referer", - HttpHeaderType.Request | HttpHeaderType.Restricted) - }, - { - "RetryAfter", - new HttpHeaderInfo ( - "Retry-After", - HttpHeaderType.Response) - }, - { - "SecWebSocketAccept", - new HttpHeaderInfo ( - "Sec-WebSocket-Accept", - HttpHeaderType.Response | HttpHeaderType.Restricted) - }, - { - "SecWebSocketExtensions", - new HttpHeaderInfo ( - "Sec-WebSocket-Extensions", - HttpHeaderType.Request | - HttpHeaderType.Response | - HttpHeaderType.Restricted | - HttpHeaderType.MultiValueInRequest) - }, - { - "SecWebSocketKey", - new HttpHeaderInfo ( - "Sec-WebSocket-Key", - HttpHeaderType.Request | HttpHeaderType.Restricted) - }, - { - "SecWebSocketProtocol", - new HttpHeaderInfo ( - "Sec-WebSocket-Protocol", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValueInRequest) - }, - { - "SecWebSocketVersion", - new HttpHeaderInfo ( - "Sec-WebSocket-Version", - HttpHeaderType.Request | - HttpHeaderType.Response | - HttpHeaderType.Restricted | - HttpHeaderType.MultiValueInResponse) - }, - { - "Server", - new HttpHeaderInfo ( - "Server", - HttpHeaderType.Response) - }, - { - "SetCookie", - new HttpHeaderInfo ( - "Set-Cookie", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "SetCookie2", - new HttpHeaderInfo ( - "Set-Cookie2", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Te", - new HttpHeaderInfo ( - "TE", - HttpHeaderType.Request) - }, - { - "Trailer", - new HttpHeaderInfo ( - "Trailer", - HttpHeaderType.Request | HttpHeaderType.Response) - }, - { - "TransferEncoding", - new HttpHeaderInfo ( - "Transfer-Encoding", - HttpHeaderType.Request | - HttpHeaderType.Response | - HttpHeaderType.Restricted | - HttpHeaderType.MultiValue) - }, - { - "Translate", - new HttpHeaderInfo ( - "Translate", - HttpHeaderType.Request) - }, - { - "Upgrade", - new HttpHeaderInfo ( - "Upgrade", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "UserAgent", - new HttpHeaderInfo ( - "User-Agent", - HttpHeaderType.Request | HttpHeaderType.Restricted) - }, - { - "Vary", - new HttpHeaderInfo ( - "Vary", - HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Via", - new HttpHeaderInfo ( - "Via", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "Warning", - new HttpHeaderInfo ( - "Warning", - HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue) - }, - { - "WwwAuthenticate", - new HttpHeaderInfo ( - "WWW-Authenticate", - HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValue) - } - }; - } - - #endregion - - #region Internal Constructors - - internal WebHeaderCollection (HttpHeaderType state, bool internallyUsed) - { - _state = state; - _internallyUsed = internallyUsed; - } - - #endregion - - #region Protected Constructors - - /// - /// Initializes a new instance of the class from - /// the specified and . - /// - /// - /// A that contains the serialized object data. - /// - /// - /// A that specifies the source for the deserialization. - /// - /// - /// is . - /// - /// - /// An element with the specified name isn't found in . - /// - protected WebHeaderCollection ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - { - if (serializationInfo == null) - throw new ArgumentNullException ("serializationInfo"); - - try { - _internallyUsed = serializationInfo.GetBoolean ("InternallyUsed"); - _state = (HttpHeaderType) serializationInfo.GetInt32 ("State"); - - var cnt = serializationInfo.GetInt32 ("Count"); - for (var i = 0; i < cnt; i++) { - base.Add ( - serializationInfo.GetString (i.ToString ()), - serializationInfo.GetString ((cnt + i).ToString ())); - } - } - catch (SerializationException ex) { - throw new ArgumentException (ex.Message, "serializationInfo", ex); - } - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - public WebHeaderCollection () - { - } - - #endregion - - #region Internal Properties - - internal HttpHeaderType State { - get { - return _state; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets all header names in the collection. - /// - /// - /// An array of that contains all header names in the collection. - /// - public override string[] AllKeys { - get { - return base.AllKeys; - } - } - - /// - /// Gets the number of headers in the collection. - /// - /// - /// An that represents the number of headers in the collection. - /// - public override int Count { - get { - return base.Count; - } - } - - /// - /// Gets or sets the specified request in the collection. - /// - /// - /// A that represents the value of the request . - /// - /// - /// One of the enum values, represents - /// the request header to get or set. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the request . - /// - public string this[HttpRequestHeader header] { - get { - return Get (Convert (header)); - } - - set { - Add (header, value); - } - } - - /// - /// Gets or sets the specified response in the collection. - /// - /// - /// A that represents the value of the response . - /// - /// - /// One of the enum values, represents - /// the response header to get or set. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the response . - /// - public string this[HttpResponseHeader header] { - get { - return Get (Convert (header)); - } - - set { - Add (header, value); - } - } - - /// - /// Gets a collection of header names in the collection. - /// - /// - /// A that contains - /// all header names in the collection. - /// - public override NameObjectCollectionBase.KeysCollection Keys { - get { - return base.Keys; - } - } - - #endregion - - #region Private Methods - - private void add (string name, string value, bool ignoreRestricted) - { - var act = ignoreRestricted - ? (Action ) addWithoutCheckingNameAndRestricted - : addWithoutCheckingName; - - doWithCheckingState (act, checkName (name), value, true); - } - - private void addWithoutCheckingName (string name, string value) - { - doWithoutCheckingName (base.Add, name, value); - } - - private void addWithoutCheckingNameAndRestricted (string name, string value) - { - base.Add (name, checkValue (value)); - } - - private static int checkColonSeparated (string header) - { - var idx = header.IndexOf (':'); - if (idx == -1) - throw new ArgumentException ("No colon could be found.", "header"); - - return idx; - } - - private static HttpHeaderType checkHeaderType (string name) - { - var info = getHeaderInfo (name); - return info == null - ? HttpHeaderType.Unspecified - : info.IsRequest && !info.IsResponse - ? HttpHeaderType.Request - : !info.IsRequest && info.IsResponse - ? HttpHeaderType.Response - : HttpHeaderType.Unspecified; - } - - private static string checkName (string name) - { - if (name == null || name.Length == 0) - throw new ArgumentNullException ("name"); - - name = name.Trim (); - if (!IsHeaderName (name)) - throw new ArgumentException ("Contains invalid characters.", "name"); - - return name; - } - - private void checkRestricted (string name) - { - if (!_internallyUsed && isRestricted (name, true)) - throw new ArgumentException ("This header must be modified with the appropiate property."); - } - - private void checkState (bool response) - { - if (_state == HttpHeaderType.Unspecified) - return; - - if (response && _state == HttpHeaderType.Request) - throw new InvalidOperationException ( - "This collection has already been used to store the request headers."); - - if (!response && _state == HttpHeaderType.Response) - throw new InvalidOperationException ( - "This collection has already been used to store the response headers."); - } - - private static string checkValue (string value) - { - if (value == null || value.Length == 0) - return String.Empty; - - value = value.Trim (); - if (value.Length > 65535) - throw new ArgumentOutOfRangeException ("value", "Greater than 65,535 characters."); - - if (!IsHeaderValue (value)) - throw new ArgumentException ("Contains invalid characters.", "value"); - - return value; - } - - private static string convert (string key) - { - HttpHeaderInfo info; - return _headers.TryGetValue (key, out info) ? info.Name : String.Empty; - } - - private void doWithCheckingState ( - Action action, string name, string value, bool setState) - { - var type = checkHeaderType (name); - if (type == HttpHeaderType.Request) - doWithCheckingState (action, name, value, false, setState); - else if (type == HttpHeaderType.Response) - doWithCheckingState (action, name, value, true, setState); - else - action (name, value); - } - - private void doWithCheckingState ( - Action action, string name, string value, bool response, bool setState) - { - checkState (response); - action (name, value); - if (setState && _state == HttpHeaderType.Unspecified) - _state = response ? HttpHeaderType.Response : HttpHeaderType.Request; - } - - private void doWithoutCheckingName (Action action, string name, string value) - { - checkRestricted (name); - action (name, checkValue (value)); - } - - private static HttpHeaderInfo getHeaderInfo (string name) - { - foreach (var info in _headers.Values) - if (info.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase)) - return info; - - return null; - } - - private static bool isRestricted (string name, bool response) - { - var info = getHeaderInfo (name); - return info != null && info.IsRestricted (response); - } - - private void removeWithoutCheckingName (string name, string unuse) - { - checkRestricted (name); - base.Remove (name); - } - - private void setWithoutCheckingName (string name, string value) - { - doWithoutCheckingName (base.Set, name, value); - } - - #endregion - - #region Internal Methods - - internal static string Convert (HttpRequestHeader header) - { - return convert (header.ToString ()); - } - - internal static string Convert (HttpResponseHeader header) - { - return convert (header.ToString ()); - } - - internal void InternalRemove (string name) - { - base.Remove (name); - } - - internal void InternalSet (string header, bool response) - { - var pos = checkColonSeparated (header); - InternalSet (header.Substring (0, pos), header.Substring (pos + 1), response); - } - - internal void InternalSet (string name, string value, bool response) - { - value = checkValue (value); - if (IsMultiValue (name, response)) - base.Add (name, value); - else - base.Set (name, value); - } - - internal static bool IsHeaderName (string name) - { - return name != null && name.Length > 0 && name.IsToken (); - } - - internal static bool IsHeaderValue (string value) - { - return value.IsText (); - } - - internal static bool IsMultiValue (string headerName, bool response) - { - if (headerName == null || headerName.Length == 0) - return false; - - var info = getHeaderInfo (headerName); - return info != null && info.IsMultiValue (response); - } - - internal string ToStringMultiValue (bool response) - { - var buff = new StringBuilder (); - Count.Times ( - i => { - var key = GetKey (i); - if (IsMultiValue (key, response)) - foreach (var val in GetValues (i)) - buff.AppendFormat ("{0}: {1}\r\n", key, val); - else - buff.AppendFormat ("{0}: {1}\r\n", key, Get (i)); - }); - - return buff.Append ("\r\n").ToString (); - } - - #endregion - - #region Protected Methods - - /// - /// Adds a header to the collection without checking if the header is on - /// the restricted header list. - /// - /// - /// A that represents the name of the header to add. - /// - /// - /// A that represents the value of the header to add. - /// - /// - /// is or empty. - /// - /// - /// or contains invalid characters. - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the . - /// - protected void AddWithoutValidate (string headerName, string headerValue) - { - add (headerName, headerValue, true); - } - - #endregion - - #region Public Methods - - /// - /// Adds the specified to the collection. - /// - /// - /// A that represents the header with the name and value separated by - /// a colon (':'). - /// - /// - /// is , empty, or the name part of - /// is empty. - /// - /// - /// - /// doesn't contain a colon. - /// - /// - /// -or- - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// The name or value part of contains invalid characters. - /// - /// - /// - /// The length of the value part of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the . - /// - public void Add (string header) - { - if (header == null || header.Length == 0) - throw new ArgumentNullException ("header"); - - var pos = checkColonSeparated (header); - add (header.Substring (0, pos), header.Substring (pos + 1), false); - } - - /// - /// Adds the specified request with - /// the specified to the collection. - /// - /// - /// One of the enum values, represents - /// the request header to add. - /// - /// - /// A that represents the value of the header to add. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the request . - /// - public void Add (HttpRequestHeader header, string value) - { - doWithCheckingState (addWithoutCheckingName, Convert (header), value, false, true); - } - - /// - /// Adds the specified response with - /// the specified to the collection. - /// - /// - /// One of the enum values, represents - /// the response header to add. - /// - /// - /// A that represents the value of the header to add. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the response . - /// - public void Add (HttpResponseHeader header, string value) - { - doWithCheckingState (addWithoutCheckingName, Convert (header), value, true, true); - } - - /// - /// Adds a header with the specified and - /// to the collection. - /// - /// - /// A that represents the name of the header to add. - /// - /// - /// A that represents the value of the header to add. - /// - /// - /// is or empty. - /// - /// - /// - /// or contains invalid characters. - /// - /// - /// -or- - /// - /// - /// is a restricted header name. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the header . - /// - public override void Add (string name, string value) - { - add (name, value, false); - } - - /// - /// Removes all headers from the collection. - /// - public override void Clear () - { - base.Clear (); - _state = HttpHeaderType.Unspecified; - } - - /// - /// Get the value of the header at the specified in the collection. - /// - /// - /// A that receives the value of the header. - /// - /// - /// An that represents the zero-based index of the header to find. - /// - /// - /// is out of allowable range of indexes for the collection. - /// - public override string Get (int index) - { - return base.Get (index); - } - - /// - /// Get the value of the header with the specified in the collection. - /// - /// - /// A that receives the value of the header if found; - /// otherwise, . - /// - /// - /// A that represents the name of the header to find. - /// - public override string Get (string name) - { - return base.Get (name); - } - - /// - /// Gets the enumerator used to iterate through the collection. - /// - /// - /// An instance used to iterate through the collection. - /// - public override IEnumerator GetEnumerator () - { - return base.GetEnumerator (); - } - - /// - /// Get the name of the header at the specified in the collection. - /// - /// - /// A that receives the header name. - /// - /// - /// An that represents the zero-based index of the header to find. - /// - /// - /// is out of allowable range of indexes for the collection. - /// - public override string GetKey (int index) - { - return base.GetKey (index); - } - - /// - /// Gets an array of header values stored in the specified position of - /// the collection. - /// - /// - /// An array of that receives the header values if found; - /// otherwise, . - /// - /// - /// An that represents the zero-based index of the header to find. - /// - /// - /// is out of allowable range of indexes for the collection. - /// - public override string[] GetValues (int index) - { - var vals = base.GetValues (index); - return vals != null && vals.Length > 0 ? vals : null; - } - - /// - /// Gets an array of header values stored in the specified . - /// - /// - /// An array of that receives the header values if found; - /// otherwise, . - /// - /// - /// A that represents the name of the header to find. - /// - public override string[] GetValues (string header) - { - var vals = base.GetValues (header); - return vals != null && vals.Length > 0 ? vals : null; - } - - /// - /// Populates the specified with the data needed to serialize - /// the . - /// - /// - /// A that holds the serialized object data. - /// - /// - /// A that specifies the destination for the serialization. - /// - /// - /// is . - /// - [SecurityPermission ( - SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] - public override void GetObjectData ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - { - if (serializationInfo == null) - throw new ArgumentNullException ("serializationInfo"); - - serializationInfo.AddValue ("InternallyUsed", _internallyUsed); - serializationInfo.AddValue ("State", (int) _state); - - var cnt = Count; - serializationInfo.AddValue ("Count", cnt); - cnt.Times ( - i => { - serializationInfo.AddValue (i.ToString (), GetKey (i)); - serializationInfo.AddValue ((cnt + i).ToString (), Get (i)); - }); - } - - /// - /// Determines whether the specified header can be set for the request. - /// - /// - /// true if the header is restricted; otherwise, false. - /// - /// - /// A that represents the name of the header to test. - /// - /// - /// is or empty. - /// - /// - /// contains invalid characters. - /// - public static bool IsRestricted (string headerName) - { - return isRestricted (checkName (headerName), false); - } - - /// - /// Determines whether the specified header can be set for the request or the response. - /// - /// - /// true if the header is restricted; otherwise, false. - /// - /// - /// A that represents the name of the header to test. - /// - /// - /// true if does the test for the response; for the request, false. - /// - /// - /// is or empty. - /// - /// - /// contains invalid characters. - /// - public static bool IsRestricted (string headerName, bool response) - { - return isRestricted (checkName (headerName), response); - } - - /// - /// Implements the interface and raises the deserialization event - /// when the deserialization is complete. - /// - /// - /// An that represents the source of the deserialization event. - /// - public override void OnDeserialization (object sender) - { - } - - /// - /// Removes the specified request from the collection. - /// - /// - /// One of the enum values, represents - /// the request header to remove. - /// - /// - /// is a restricted header. - /// - /// - /// The current instance doesn't allow - /// the request . - /// - public void Remove (HttpRequestHeader header) - { - doWithCheckingState (removeWithoutCheckingName, Convert (header), null, false, false); - } - - /// - /// Removes the specified response from the collection. - /// - /// - /// One of the enum values, represents - /// the response header to remove. - /// - /// - /// is a restricted header. - /// - /// - /// The current instance doesn't allow - /// the response . - /// - public void Remove (HttpResponseHeader header) - { - doWithCheckingState (removeWithoutCheckingName, Convert (header), null, true, false); - } - - /// - /// Removes the specified header from the collection. - /// - /// - /// A that represents the name of the header to remove. - /// - /// - /// is or empty. - /// - /// - /// - /// contains invalid characters. - /// - /// - /// -or- - /// - /// - /// is a restricted header name. - /// - /// - /// - /// The current instance doesn't allow - /// the header . - /// - public override void Remove (string name) - { - doWithCheckingState (removeWithoutCheckingName, checkName (name), null, false); - } - - /// - /// Sets the specified request to the specified value. - /// - /// - /// One of the enum values, represents - /// the request header to set. - /// - /// - /// A that represents the value of the request header to set. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the request . - /// - public void Set (HttpRequestHeader header, string value) - { - doWithCheckingState (setWithoutCheckingName, Convert (header), value, false, true); - } - - /// - /// Sets the specified response to the specified value. - /// - /// - /// One of the enum values, represents - /// the response header to set. - /// - /// - /// A that represents the value of the response header to set. - /// - /// - /// - /// is a restricted header. - /// - /// - /// -or- - /// - /// - /// contains invalid characters. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the response . - /// - public void Set (HttpResponseHeader header, string value) - { - doWithCheckingState (setWithoutCheckingName, Convert (header), value, true, true); - } - - /// - /// Sets the specified header to the specified value. - /// - /// - /// A that represents the name of the header to set. - /// - /// - /// A that represents the value of the header to set. - /// - /// - /// is or empty. - /// - /// - /// - /// or contains invalid characters. - /// - /// - /// -or- - /// - /// - /// is a restricted header name. - /// - /// - /// - /// The length of is greater than 65,535 characters. - /// - /// - /// The current instance doesn't allow - /// the header . - /// - public override void Set (string name, string value) - { - doWithCheckingState (setWithoutCheckingName, checkName (name), value, true); - } - - /// - /// Converts the current to an array of . - /// - /// - /// An array of that receives the converted current - /// . - /// - public byte[] ToByteArray () - { - return Encoding.UTF8.GetBytes (ToString ()); - } - - /// - /// Returns a that represents the current - /// . - /// - /// - /// A that represents the current . - /// - public override string ToString () - { - var buff = new StringBuilder (); - Count.Times (i => buff.AppendFormat ("{0}: {1}\r\n", GetKey (i), Get (i))); - - return buff.Append ("\r\n").ToString (); - } - - #endregion - - #region Explicit Interface Implementations - - /// - /// Populates the specified with the data needed to serialize - /// the current . - /// - /// - /// A that holds the serialized object data. - /// - /// - /// A that specifies the destination for the serialization. - /// - /// - /// is . - /// - [SecurityPermission ( - SecurityAction.LinkDemand, - Flags = SecurityPermissionFlag.SerializationFormatter, - SerializationFormatter = true)] - void ISerializable.GetObjectData ( - SerializationInfo serializationInfo, StreamingContext streamingContext) - { - GetObjectData (serializationInfo, streamingContext); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs.meta b/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs.meta deleted file mode 100644 index bcad81f41..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebHeaderCollection.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: dd2fc2bc8351c6443ad0fd6e45c5afde -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets.meta b/ThirdParty/WebSocketSharp/Net/WebSockets.meta deleted file mode 100644 index 03eec0419..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 5d4858acf4def1c4f8a5274b58e8554c -folderAsset: yes -timeCreated: 1443712075 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs b/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs deleted file mode 100644 index 86e4ff053..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs +++ /dev/null @@ -1,332 +0,0 @@ -#region License -/* - * HttpListenerWebSocketContext.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Security.Principal; - -namespace WebSocketSharp.Net.WebSockets -{ - /// - /// Provides the properties used to access the information in - /// a WebSocket handshake request received by the . - /// - public class HttpListenerWebSocketContext : WebSocketContext - { - #region Private Fields - - private HttpListenerContext _context; - private WebSocket _websocket; - - #endregion - - #region Internal Constructors - - internal HttpListenerWebSocketContext (HttpListenerContext context, string protocol) - { - _context = context; - _websocket = new WebSocket (this, protocol); - } - - #endregion - - #region Internal Properties - - internal Logger Log { - get { - return _context.Listener.Log; - } - } - - internal Stream Stream { - get { - return _context.Connection.Stream; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the HTTP cookies included in the request. - /// - /// - /// A that contains the cookies. - /// - public override CookieCollection CookieCollection { - get { - return _context.Request.Cookies; - } - } - - /// - /// Gets the HTTP headers included in the request. - /// - /// - /// A that contains the headers. - /// - public override NameValueCollection Headers { - get { - return _context.Request.Headers; - } - } - - /// - /// Gets the value of the Host header included in the request. - /// - /// - /// A that represents the value of the Host header. - /// - public override string Host { - get { - return _context.Request.Headers["Host"]; - } - } - - /// - /// Gets a value indicating whether the client is authenticated. - /// - /// - /// true if the client is authenticated; otherwise, false. - /// - public override bool IsAuthenticated { - get { - return _context.User != null; - } - } - - /// - /// Gets a value indicating whether the client connected from the local computer. - /// - /// - /// true if the client connected from the local computer; otherwise, false. - /// - public override bool IsLocal { - get { - return _context.Request.IsLocal; - } - } - - /// - /// Gets a value indicating whether the WebSocket connection is secured. - /// - /// - /// true if the connection is secured; otherwise, false. - /// - public override bool IsSecureConnection { - get { - return _context.Connection.IsSecure; - } - } - - /// - /// Gets a value indicating whether the request is a WebSocket handshake request. - /// - /// - /// true if the request is a WebSocket handshake request; otherwise, false. - /// - public override bool IsWebSocketRequest { - get { - return _context.Request.IsWebSocketRequest; - } - } - - /// - /// Gets the value of the Origin header included in the request. - /// - /// - /// A that represents the value of the Origin header. - /// - public override string Origin { - get { - return _context.Request.Headers["Origin"]; - } - } - - /// - /// Gets the query string included in the request. - /// - /// - /// A that contains the query string parameters. - /// - public override NameValueCollection QueryString { - get { - return _context.Request.QueryString; - } - } - - /// - /// Gets the URI requested by the client. - /// - /// - /// A that represents the requested URI. - /// - public override Uri RequestUri { - get { - return _context.Request.Url; - } - } - - /// - /// Gets the value of the Sec-WebSocket-Key header included in the request. - /// - /// - /// This property provides a part of the information used by the server to prove that - /// it received a valid WebSocket handshake request. - /// - /// - /// A that represents the value of the Sec-WebSocket-Key header. - /// - public override string SecWebSocketKey { - get { - return _context.Request.Headers["Sec-WebSocket-Key"]; - } - } - - /// - /// Gets the values of the Sec-WebSocket-Protocol header included in the request. - /// - /// - /// This property represents the subprotocols requested by the client. - /// - /// - /// An instance that provides - /// an enumerator which supports the iteration over the values of the Sec-WebSocket-Protocol - /// header. - /// - public override IEnumerable SecWebSocketProtocols { - get { - var protocols = _context.Request.Headers["Sec-WebSocket-Protocol"]; - if (protocols != null) { - foreach (var protocol in protocols.Split (',')) - yield return protocol.Trim (); - } - } - } - - /// - /// Gets the value of the Sec-WebSocket-Version header included in the request. - /// - /// - /// This property represents the WebSocket protocol version. - /// - /// - /// A that represents the value of the Sec-WebSocket-Version header. - /// - public override string SecWebSocketVersion { - get { - return _context.Request.Headers["Sec-WebSocket-Version"]; - } - } - - /// - /// Gets the server endpoint as an IP address and a port number. - /// - /// - /// A that represents the server endpoint. - /// - public override System.Net.IPEndPoint ServerEndPoint { - get { - return _context.Connection.LocalEndPoint; - } - } - - /// - /// Gets the client information (identity, authentication, and security roles). - /// - /// - /// A instance that represents the client information. - /// - public override IPrincipal User { - get { - return _context.User; - } - } - - /// - /// Gets the client endpoint as an IP address and a port number. - /// - /// - /// A that represents the client endpoint. - /// - public override System.Net.IPEndPoint UserEndPoint { - get { - return _context.Connection.RemoteEndPoint; - } - } - - /// - /// Gets the instance used for - /// two-way communication between client and server. - /// - /// - /// A . - /// - public override WebSocket WebSocket { - get { - return _websocket; - } - } - - #endregion - - #region Internal Methods - - internal void Close () - { - _context.Connection.Close (true); - } - - internal void Close (HttpStatusCode code) - { - _context.Response.Close (code); - } - - #endregion - - #region Public Methods - - /// - /// Returns a that represents - /// the current . - /// - /// - /// A that represents - /// the current . - /// - public override string ToString () - { - return _context.Request.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs.meta b/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs.meta deleted file mode 100644 index 239e9bc23..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/HttpListenerWebSocketContext.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: beb06d745189b154cbfb675b47d3929c -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs b/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs deleted file mode 100644 index b177c1c51..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs +++ /dev/null @@ -1,444 +0,0 @@ -#region License -/* - * TcpListenerWebSocketContext.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Liryna - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Net.Security; -using System.Net.Sockets; -using System.Security.Principal; -using System.Text; - -namespace WebSocketSharp.Net.WebSockets -{ - /// - /// Provides the properties used to access the information in - /// a WebSocket handshake request received by the . - /// - internal class TcpListenerWebSocketContext : WebSocketContext - { - #region Private Fields - - private CookieCollection _cookies; - private Logger _logger; - private NameValueCollection _queryString; - private HttpRequest _request; - private bool _secure; - private Stream _stream; - private TcpClient _tcpClient; - private Uri _uri; - private IPrincipal _user; - private WebSocket _websocket; - - #endregion - - #region Internal Constructors - - internal TcpListenerWebSocketContext ( - TcpClient tcpClient, - string protocol, - bool secure, - ServerSslConfiguration sslConfig, - Logger logger - ) - { - _tcpClient = tcpClient; - _secure = secure; - _logger = logger; - - var netStream = tcpClient.GetStream (); - if (secure) { - var sslStream = - new SslStream (netStream, false, sslConfig.ClientCertificateValidationCallback); - - sslStream.AuthenticateAsServer ( - sslConfig.ServerCertificate, - sslConfig.ClientCertificateRequired, - sslConfig.EnabledSslProtocols, - sslConfig.CheckCertificateRevocation - ); - - _stream = sslStream; - } - else { - _stream = netStream; - } - - _request = HttpRequest.Read (_stream, 90000); - _uri = - HttpUtility.CreateRequestUrl ( - _request.RequestUri, _request.Headers["Host"], _request.IsWebSocketRequest, secure - ); - - _websocket = new WebSocket (this, protocol); - } - - #endregion - - #region Internal Properties - - internal Logger Log { - get { - return _logger; - } - } - - internal Stream Stream { - get { - return _stream; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the HTTP cookies included in the request. - /// - /// - /// A that contains the cookies. - /// - public override CookieCollection CookieCollection { - get { - return _cookies ?? (_cookies = _request.Cookies); - } - } - - /// - /// Gets the HTTP headers included in the request. - /// - /// - /// A that contains the headers. - /// - public override NameValueCollection Headers { - get { - return _request.Headers; - } - } - - /// - /// Gets the value of the Host header included in the request. - /// - /// - /// A that represents the value of the Host header. - /// - public override string Host { - get { - return _request.Headers["Host"]; - } - } - - /// - /// Gets a value indicating whether the client is authenticated. - /// - /// - /// true if the client is authenticated; otherwise, false. - /// - public override bool IsAuthenticated { - get { - return _user != null; - } - } - - /// - /// Gets a value indicating whether the client connected from the local computer. - /// - /// - /// true if the client connected from the local computer; otherwise, false. - /// - public override bool IsLocal { - get { - return UserEndPoint.Address.IsLocal (); - } - } - - /// - /// Gets a value indicating whether the WebSocket connection is secured. - /// - /// - /// true if the connection is secured; otherwise, false. - /// - public override bool IsSecureConnection { - get { - return _secure; - } - } - - /// - /// Gets a value indicating whether the request is a WebSocket handshake request. - /// - /// - /// true if the request is a WebSocket handshake request; otherwise, false. - /// - public override bool IsWebSocketRequest { - get { - return _request.IsWebSocketRequest; - } - } - - /// - /// Gets the value of the Origin header included in the request. - /// - /// - /// A that represents the value of the Origin header. - /// - public override string Origin { - get { - return _request.Headers["Origin"]; - } - } - - /// - /// Gets the query string included in the request. - /// - /// - /// A that contains the query string parameters. - /// - public override NameValueCollection QueryString { - get { - return _queryString - ?? ( - _queryString = - HttpUtility.InternalParseQueryString ( - _uri != null ? _uri.Query : null, Encoding.UTF8 - ) - ); - } - } - - /// - /// Gets the URI requested by the client. - /// - /// - /// A that represents the requested URI. - /// - public override Uri RequestUri { - get { - return _uri; - } - } - - /// - /// Gets the value of the Sec-WebSocket-Key header included in the request. - /// - /// - /// This property provides a part of the information used by the server to prove that - /// it received a valid WebSocket handshake request. - /// - /// - /// A that represents the value of the Sec-WebSocket-Key header. - /// - public override string SecWebSocketKey { - get { - return _request.Headers["Sec-WebSocket-Key"]; - } - } - - /// - /// Gets the values of the Sec-WebSocket-Protocol header included in the request. - /// - /// - /// This property represents the subprotocols requested by the client. - /// - /// - /// An instance that provides - /// an enumerator which supports the iteration over the values of the Sec-WebSocket-Protocol - /// header. - /// - public override IEnumerable SecWebSocketProtocols { - get { - var protocols = _request.Headers["Sec-WebSocket-Protocol"]; - if (protocols != null) { - foreach (var protocol in protocols.Split (',')) - yield return protocol.Trim (); - } - } - } - - /// - /// Gets the value of the Sec-WebSocket-Version header included in the request. - /// - /// - /// This property represents the WebSocket protocol version. - /// - /// - /// A that represents the value of the Sec-WebSocket-Version header. - /// - public override string SecWebSocketVersion { - get { - return _request.Headers["Sec-WebSocket-Version"]; - } - } - - /// - /// Gets the server endpoint as an IP address and a port number. - /// - /// - /// A that represents the server endpoint. - /// - public override System.Net.IPEndPoint ServerEndPoint { - get { - return (System.Net.IPEndPoint) _tcpClient.Client.LocalEndPoint; - } - } - - /// - /// Gets the client information (identity, authentication, and security roles). - /// - /// - /// A instance that represents the client information. - /// - public override IPrincipal User { - get { - return _user; - } - } - - /// - /// Gets the client endpoint as an IP address and a port number. - /// - /// - /// A that represents the client endpoint. - /// - public override System.Net.IPEndPoint UserEndPoint { - get { - return (System.Net.IPEndPoint) _tcpClient.Client.RemoteEndPoint; - } - } - - /// - /// Gets the instance used for - /// two-way communication between client and server. - /// - /// - /// A . - /// - public override WebSocket WebSocket { - get { - return _websocket; - } - } - - #endregion - - #region Internal Methods - - internal bool Authenticate ( - AuthenticationSchemes scheme, - string realm, - Func credentialsFinder - ) - { - if (scheme == AuthenticationSchemes.Anonymous) - return true; - - if (scheme == AuthenticationSchemes.None) { - Close (HttpStatusCode.Forbidden); - return false; - } - - var chal = new AuthenticationChallenge (scheme, realm).ToString (); - - var retry = -1; - Func auth = null; - auth = - () => { - retry++; - if (retry > 99) { - Close (HttpStatusCode.Forbidden); - return false; - } - - var user = - HttpUtility.CreateUser ( - _request.Headers["Authorization"], - scheme, - realm, - _request.HttpMethod, - credentialsFinder - ); - - if (user == null || !user.Identity.IsAuthenticated) { - SendAuthenticationChallenge (chal); - return auth (); - } - - _user = user; - return true; - }; - - return auth (); - } - - internal void Close () - { - _stream.Close (); - _tcpClient.Close (); - } - - internal void Close (HttpStatusCode code) - { - _websocket.Close (HttpResponse.CreateCloseResponse (code)); - } - - internal void SendAuthenticationChallenge (string challenge) - { - var buff = HttpResponse.CreateUnauthorizedResponse (challenge).ToByteArray (); - _stream.Write (buff, 0, buff.Length); - _request = HttpRequest.Read (_stream, 15000); - } - - #endregion - - #region Public Methods - - /// - /// Returns a that represents - /// the current . - /// - /// - /// A that represents - /// the current . - /// - public override string ToString () - { - return _request.ToString (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs.meta b/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs.meta deleted file mode 100644 index 3888fe832..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/TcpListenerWebSocketContext.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 72456cc381e6f8a469ab3c920e2794e0 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs b/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs deleted file mode 100644 index 9ede501bf..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs +++ /dev/null @@ -1,208 +0,0 @@ -#region License -/* - * WebSocketContext.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Security.Principal; - -namespace WebSocketSharp.Net.WebSockets -{ - /// - /// Exposes the properties used to access the information in a WebSocket handshake request. - /// - /// - /// This class is an abstract class. - /// - public abstract class WebSocketContext - { - #region Protected Constructors - - /// - /// Initializes a new instance of the class. - /// - protected WebSocketContext () - { - } - - #endregion - - #region Public Properties - - /// - /// Gets the HTTP cookies included in the request. - /// - /// - /// A that contains the cookies. - /// - public abstract CookieCollection CookieCollection { get; } - - /// - /// Gets the HTTP headers included in the request. - /// - /// - /// A that contains the headers. - /// - public abstract NameValueCollection Headers { get; } - - /// - /// Gets the value of the Host header included in the request. - /// - /// - /// A that represents the value of the Host header. - /// - public abstract string Host { get; } - - /// - /// Gets a value indicating whether the client is authenticated. - /// - /// - /// true if the client is authenticated; otherwise, false. - /// - public abstract bool IsAuthenticated { get; } - - /// - /// Gets a value indicating whether the client connected from the local computer. - /// - /// - /// true if the client connected from the local computer; otherwise, false. - /// - public abstract bool IsLocal { get; } - - /// - /// Gets a value indicating whether the WebSocket connection is secured. - /// - /// - /// true if the connection is secured; otherwise, false. - /// - public abstract bool IsSecureConnection { get; } - - /// - /// Gets a value indicating whether the request is a WebSocket handshake request. - /// - /// - /// true if the request is a WebSocket handshake request; otherwise, false. - /// - public abstract bool IsWebSocketRequest { get; } - - /// - /// Gets the value of the Origin header included in the request. - /// - /// - /// A that represents the value of the Origin header. - /// - public abstract string Origin { get; } - - /// - /// Gets the query string included in the request. - /// - /// - /// A that contains the query string parameters. - /// - public abstract NameValueCollection QueryString { get; } - - /// - /// Gets the URI requested by the client. - /// - /// - /// A that represents the requested URI. - /// - public abstract Uri RequestUri { get; } - - /// - /// Gets the value of the Sec-WebSocket-Key header included in the request. - /// - /// - /// This property provides a part of the information used by the server to prove that - /// it received a valid WebSocket handshake request. - /// - /// - /// A that represents the value of the Sec-WebSocket-Key header. - /// - public abstract string SecWebSocketKey { get; } - - /// - /// Gets the values of the Sec-WebSocket-Protocol header included in the request. - /// - /// - /// This property represents the subprotocols requested by the client. - /// - /// - /// An instance that provides - /// an enumerator which supports the iteration over the values of the Sec-WebSocket-Protocol - /// header. - /// - public abstract IEnumerable SecWebSocketProtocols { get; } - - /// - /// Gets the value of the Sec-WebSocket-Version header included in the request. - /// - /// - /// This property represents the WebSocket protocol version. - /// - /// - /// A that represents the value of the Sec-WebSocket-Version header. - /// - public abstract string SecWebSocketVersion { get; } - - /// - /// Gets the server endpoint as an IP address and a port number. - /// - /// - /// A that represents the server endpoint. - /// - public abstract System.Net.IPEndPoint ServerEndPoint { get; } - - /// - /// Gets the client information (identity, authentication, and security roles). - /// - /// - /// A instance that represents the client information. - /// - public abstract IPrincipal User { get; } - - /// - /// Gets the client endpoint as an IP address and a port number. - /// - /// - /// A that represents the client endpoint. - /// - public abstract System.Net.IPEndPoint UserEndPoint { get; } - - /// - /// Gets the instance used for - /// two-way communication between client and server. - /// - /// - /// A . - /// - public abstract WebSocket WebSocket { get; } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs.meta b/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs.meta deleted file mode 100644 index 3ab707bcf..000000000 --- a/ThirdParty/WebSocketSharp/Net/WebSockets/WebSocketContext.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 53956222a0a11ae44ab1e9b3697b0d16 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Opcode.cs b/ThirdParty/WebSocketSharp/Opcode.cs deleted file mode 100644 index 5a8c632e0..000000000 --- a/ThirdParty/WebSocketSharp/Opcode.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region License -/* - * Opcode.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates the WebSocket frame type. - /// - /// - /// The values of this enumeration are defined in - /// - /// Section 5.2 of RFC 6455. - /// - internal enum Opcode : byte - { - /// - /// Equivalent to numeric value 0. Indicates continuation frame. - /// - Cont = 0x0, - /// - /// Equivalent to numeric value 1. Indicates text frame. - /// - Text = 0x1, - /// - /// Equivalent to numeric value 2. Indicates binary frame. - /// - Binary = 0x2, - /// - /// Equivalent to numeric value 8. Indicates connection close frame. - /// - Close = 0x8, - /// - /// Equivalent to numeric value 9. Indicates ping frame. - /// - Ping = 0x9, - /// - /// Equivalent to numeric value 10. Indicates pong frame. - /// - Pong = 0xa - } -} diff --git a/ThirdParty/WebSocketSharp/Opcode.cs.meta b/ThirdParty/WebSocketSharp/Opcode.cs.meta deleted file mode 100644 index afe9c26e5..000000000 --- a/ThirdParty/WebSocketSharp/Opcode.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 405736f447baddf408985159a32dd25e -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/PayloadData.cs b/ThirdParty/WebSocketSharp/PayloadData.cs deleted file mode 100644 index 4e629d88c..000000000 --- a/ThirdParty/WebSocketSharp/PayloadData.cs +++ /dev/null @@ -1,234 +0,0 @@ -#region License -/* - * PayloadData.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace WebSocketSharp -{ - internal class PayloadData : IEnumerable - { - #region Private Fields - - private ushort _code; - private bool _codeSet; - private byte[] _data; - private long _extDataLength; - private long _length; - private string _reason; - private bool _reasonSet; - - #endregion - - #region Public Fields - - /// - /// Represents the empty payload data. - /// - public static readonly PayloadData Empty; - - /// - /// Represents the allowable max length. - /// - /// - /// - /// A will occur if the payload data length is - /// greater than the value of this field. - /// - /// - /// If you would like to change the value, you must set it to a value between - /// WebSocket.FragmentLength and Int64.MaxValue inclusive. - /// - /// - public static readonly ulong MaxLength; - - #endregion - - #region Static Constructor - - static PayloadData () - { - Empty = new PayloadData (); - MaxLength = Int64.MaxValue; - } - - #endregion - - #region Internal Constructors - - internal PayloadData () - { - _code = 1005; - _reason = String.Empty; - - _data = WebSocket.EmptyBytes; - - _codeSet = true; - _reasonSet = true; - } - - internal PayloadData (byte[] data) - : this (data, data.LongLength) - { - } - - internal PayloadData (byte[] data, long length) - { - _data = data; - _length = length; - } - - internal PayloadData (ushort code, string reason) - { - _code = code; - _reason = reason ?? String.Empty; - - _data = code.Append (reason); - _length = _data.LongLength; - - _codeSet = true; - _reasonSet = true; - } - - #endregion - - #region Internal Properties - - internal ushort Code { - get { - if (!_codeSet) { - _code = _length > 1 - ? _data.SubArray (0, 2).ToUInt16 (ByteOrder.Big) - : (ushort) 1005; - - _codeSet = true; - } - - return _code; - } - } - - internal long ExtensionDataLength { - get { - return _extDataLength; - } - - set { - _extDataLength = value; - } - } - - internal bool HasReservedCode { - get { - return _length > 1 && Code.IsReserved (); - } - } - - internal string Reason { - get { - if (!_reasonSet) { - _reason = _length > 2 - ? _data.SubArray (2, _length - 2).UTF8Decode () - : String.Empty; - - _reasonSet = true; - } - - return _reason; - } - } - - #endregion - - #region Public Properties - - public byte[] ApplicationData { - get { - return _extDataLength > 0 - ? _data.SubArray (_extDataLength, _length - _extDataLength) - : _data; - } - } - - public byte[] ExtensionData { - get { - return _extDataLength > 0 - ? _data.SubArray (0, _extDataLength) - : WebSocket.EmptyBytes; - } - } - - public ulong Length { - get { - return (ulong) _length; - } - } - - #endregion - - #region Internal Methods - - internal void Mask (byte[] key) - { - for (long i = 0; i < _length; i++) - _data[i] = (byte) (_data[i] ^ key[i % 4]); - } - - #endregion - - #region Public Methods - - public IEnumerator GetEnumerator () - { - foreach (var b in _data) - yield return b; - } - - public byte[] ToArray () - { - return _data; - } - - public override string ToString () - { - return BitConverter.ToString (_data); - } - - #endregion - - #region Explicit Interface Implementations - - IEnumerator IEnumerable.GetEnumerator () - { - return GetEnumerator (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/PayloadData.cs.meta b/ThirdParty/WebSocketSharp/PayloadData.cs.meta deleted file mode 100644 index f39e6ad17..000000000 --- a/ThirdParty/WebSocketSharp/PayloadData.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 2f439d8319d91a34f9fd52b10623c5eb -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Rsv.cs b/ThirdParty/WebSocketSharp/Rsv.cs deleted file mode 100644 index 8a10567c5..000000000 --- a/ThirdParty/WebSocketSharp/Rsv.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region License -/* - * Rsv.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates whether each RSV (RSV1, RSV2, and RSV3) of a WebSocket frame is non-zero. - /// - /// - /// The values of this enumeration are defined in - /// Section 5.2 of RFC 6455. - /// - internal enum Rsv : byte - { - /// - /// Equivalent to numeric value 0. Indicates zero. - /// - Off = 0x0, - /// - /// Equivalent to numeric value 1. Indicates non-zero. - /// - On = 0x1 - } -} diff --git a/ThirdParty/WebSocketSharp/Rsv.cs.meta b/ThirdParty/WebSocketSharp/Rsv.cs.meta deleted file mode 100644 index 9d0ccfaa2..000000000 --- a/ThirdParty/WebSocketSharp/Rsv.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: fbabb2fe78bd330458e6221031ae5f2c -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server.meta b/ThirdParty/WebSocketSharp/Server.meta deleted file mode 100644 index b32a6367b..000000000 --- a/ThirdParty/WebSocketSharp/Server.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 63ab7ddb5ef249d4593c8edabffd926d -folderAsset: yes -timeCreated: 1443712075 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs b/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs deleted file mode 100644 index ee76cbab3..000000000 --- a/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs +++ /dev/null @@ -1,255 +0,0 @@ -#region License -/* - * HttpRequestEventArgs.cs - * - * The MIT License - * - * Copyright (c) 2012-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.IO; -using System.Security.Principal; -using System.Text; -using WebSocketSharp.Net; - -namespace WebSocketSharp.Server -{ - /// - /// Represents the event data for the HTTP request events of - /// the . - /// - /// - /// - /// An HTTP request event occurs when the - /// receives an HTTP request. - /// - /// - /// You should access the property if you would - /// like to get the request data sent from a client. - /// - /// - /// And you should access the property if you would - /// like to get the response data to return to the client. - /// - /// - public class HttpRequestEventArgs : EventArgs - { - #region Private Fields - - private HttpListenerContext _context; - private string _docRootPath; - - #endregion - - #region Internal Constructors - - internal HttpRequestEventArgs ( - HttpListenerContext context, string documentRootPath - ) - { - _context = context; - _docRootPath = documentRootPath; - } - - #endregion - - #region Public Properties - - /// - /// Gets the request data sent from a client. - /// - /// - /// A that provides the methods and - /// properties for the request data. - /// - public HttpListenerRequest Request { - get { - return _context.Request; - } - } - - /// - /// Gets the response data to return to the client. - /// - /// - /// A that provides the methods and - /// properties for the response data. - /// - public HttpListenerResponse Response { - get { - return _context.Response; - } - } - - /// - /// Gets the information for the client. - /// - /// - /// - /// A instance or - /// if not authenticated. - /// - /// - /// That instance describes the identity, authentication scheme, - /// and security roles for the client. - /// - /// - public IPrincipal User { - get { - return _context.User; - } - } - - #endregion - - #region Private Methods - - private string createFilePath (string childPath) - { - childPath = childPath.TrimStart ('/', '\\'); - return new StringBuilder (_docRootPath, 32) - .AppendFormat ("/{0}", childPath) - .ToString () - .Replace ('\\', '/'); - } - - private static bool tryReadFile (string path, out byte[] contents) - { - contents = null; - - if (!File.Exists (path)) - return false; - - try { - contents = File.ReadAllBytes (path); - } - catch { - return false; - } - - return true; - } - - #endregion - - #region Public Methods - - /// - /// Reads the specified file from the document folder of - /// the . - /// - /// - /// - /// An array of or - /// if it fails. - /// - /// - /// That array receives the contents of the file. - /// - /// - /// - /// A that represents a virtual path to - /// find the file from the document folder. - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// contains "..". - /// - /// - public byte[] ReadFile (string path) - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path.IndexOf ("..") > -1) - throw new ArgumentException ("It contains '..'.", "path"); - - byte[] contents; - tryReadFile (createFilePath (path), out contents); - - return contents; - } - - /// - /// Tries to read the specified file from the document folder of - /// the . - /// - /// - /// true if it succeeds to read; otherwise, false. - /// - /// - /// A that represents a virtual path to - /// find the file from the document folder. - /// - /// - /// - /// When this method returns, an array of or - /// if it fails. - /// - /// - /// That array receives the contents of the file. - /// - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// contains "..". - /// - /// - public bool TryReadFile (string path, out byte[] contents) - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path.IndexOf ("..") > -1) - throw new ArgumentException ("It contains '..'.", "path"); - - return tryReadFile (createFilePath (path), out contents); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs.meta b/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs.meta deleted file mode 100644 index a4b6685e5..000000000 --- a/ThirdParty/WebSocketSharp/Server/HttpRequestEventArgs.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: bc84097cfa66d1e408a1e2acf1ce5c5a -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/HttpServer.cs b/ThirdParty/WebSocketSharp/Server/HttpServer.cs deleted file mode 100644 index 53c18cd25..000000000 --- a/ThirdParty/WebSocketSharp/Server/HttpServer.cs +++ /dev/null @@ -1,1659 +0,0 @@ -#region License -/* - * HttpServer.cs - * - * A simple HTTP server that allows to accept WebSocket handshake requests. - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Juan Manuel Lallana - * - Liryna - * - Rohan Singh - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net.Sockets; -using System.Security.Cryptography.X509Certificates; -using System.Security.Principal; -using System.Text; -using System.Threading; -using WebSocketSharp.Net; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Server -{ - /// - /// Provides a simple HTTP server that allows to accept - /// WebSocket handshake requests. - /// - /// - /// This class can provide multiple WebSocket services. - /// - public class HttpServer - { - #region Private Fields - - private System.Net.IPAddress _address; - private string _docRootPath; - private string _hostname; - private HttpListener _listener; - private Logger _log; - private int _port; - private Thread _receiveThread; - private bool _secure; - private WebSocketServiceManager _services; - private volatile ServerState _state; - private object _sync; - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - /// - /// The new instance listens for incoming requests on - /// and port 80. - /// - public HttpServer () - { - init ("*", System.Net.IPAddress.Any, 80, false); - } - - /// - /// Initializes a new instance of the class with - /// the specified . - /// - /// - /// - /// The new instance listens for incoming requests on - /// and . - /// - /// - /// It provides secure connections if is 443. - /// - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// is less than 1 or greater than 65535. - /// - public HttpServer (int port) - : this (port, port == 443) - { - } - - /// - /// Initializes a new instance of the class with - /// the specified . - /// - /// - /// - /// The new instance listens for incoming requests on the IP address of the - /// host of and the port of . - /// - /// - /// Either port 80 or 443 is used if includes - /// no port. Port 443 is used if the scheme of - /// is https; otherwise, port 80 is used. - /// - /// - /// The new instance provides secure connections if the scheme of - /// is https. - /// - /// - /// - /// A that represents the HTTP URL of the server. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is invalid. - /// - /// - public HttpServer (string url) - { - if (url == null) - throw new ArgumentNullException ("url"); - - if (url.Length == 0) - throw new ArgumentException ("An empty string.", "url"); - - Uri uri; - string msg; - if (!tryCreateUri (url, out uri, out msg)) - throw new ArgumentException (msg, "url"); - - var host = uri.GetDnsSafeHost (true); - - var addr = host.ToIPAddress (); - if (addr == null) { - msg = "The host part could not be converted to an IP address."; - throw new ArgumentException (msg, "url"); - } - - if (!addr.IsLocal ()) { - msg = "The IP address of the host is not a local IP address."; - throw new ArgumentException (msg, "url"); - } - - init (host, addr, uri.Port, uri.Scheme == "https"); - } - - /// - /// Initializes a new instance of the class with - /// the specified and . - /// - /// - /// The new instance listens for incoming requests on - /// and . - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// A : true if the new instance provides - /// secure connections; otherwise, false. - /// - /// - /// is less than 1 or greater than 65535. - /// - public HttpServer (int port, bool secure) - { - if (!port.IsPortNumber ()) { - var msg = "Less than 1 or greater than 65535."; - throw new ArgumentOutOfRangeException ("port", msg); - } - - init ("*", System.Net.IPAddress.Any, port, secure); - } - - /// - /// Initializes a new instance of the class with - /// the specified and . - /// - /// - /// - /// The new instance listens for incoming requests on - /// and . - /// - /// - /// It provides secure connections if is 443. - /// - /// - /// - /// A that represents - /// the local IP address on which to listen. - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// is . - /// - /// - /// is not a local IP address. - /// - /// - /// is less than 1 or greater than 65535. - /// - public HttpServer (System.Net.IPAddress address, int port) - : this (address, port, port == 443) - { - } - - /// - /// Initializes a new instance of the class with - /// the specified , , - /// and . - /// - /// - /// The new instance listens for incoming requests on - /// and . - /// - /// - /// A that represents - /// the local IP address on which to listen. - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// A : true if the new instance provides - /// secure connections; otherwise, false. - /// - /// - /// is . - /// - /// - /// is not a local IP address. - /// - /// - /// is less than 1 or greater than 65535. - /// - public HttpServer (System.Net.IPAddress address, int port, bool secure) - { - if (address == null) - throw new ArgumentNullException ("address"); - - if (!address.IsLocal ()) - throw new ArgumentException ("Not a local IP address.", "address"); - - if (!port.IsPortNumber ()) { - var msg = "Less than 1 or greater than 65535."; - throw new ArgumentOutOfRangeException ("port", msg); - } - - init (address.ToString (true), address, port, secure); - } - - #endregion - - #region Public Properties - - /// - /// Gets the IP address of the server. - /// - /// - /// A that represents the local - /// IP address on which to listen for incoming requests. - /// - public System.Net.IPAddress Address { - get { - return _address; - } - } - - /// - /// Gets or sets the scheme used to authenticate the clients. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// One of the - /// enum values. - /// - /// - /// It represents the scheme used to authenticate the clients. - /// - /// - /// The default value is - /// . - /// - /// - public AuthenticationSchemes AuthenticationSchemes { - get { - return _listener.AuthenticationSchemes; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _listener.AuthenticationSchemes = value; - } - } - } - - /// - /// Gets or sets the path to the document folder of the server. - /// - /// - /// - /// '/' or '\' is trimmed from the end of the value if any. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// - /// A that represents a path to the folder - /// from which to find the requested file. - /// - /// - /// The default value is "./Public". - /// - /// - /// - /// The value specified for a set operation is . - /// - /// - /// - /// The value specified for a set operation is an empty string. - /// - /// - /// -or- - /// - /// - /// The value specified for a set operation is an absolute root. - /// - /// - public string DocumentRootPath { - get { - return _docRootPath; - } - - set { - if (value == null) - throw new ArgumentNullException ("value"); - - if (value.Length == 0) - throw new ArgumentException ("An empty string.", "value"); - - value = value.TrimSlashOrBackslashFromEnd (); - if (value == "/") - throw new ArgumentException ("An absolute root.", "value"); - - if (value == "\\") - throw new ArgumentException ("An absolute root.", "value"); - - if (value.Length == 2 && value[1] == ':') - throw new ArgumentException ("An absolute root.", "value"); - - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _docRootPath = value; - } - } - } - - /// - /// Gets a value indicating whether the server has started. - /// - /// - /// true if the server has started; otherwise, false. - /// - public bool IsListening { - get { - return _state == ServerState.Start; - } - } - - /// - /// Gets a value indicating whether the server provides - /// secure connections. - /// - /// - /// true if the server provides secure connections; - /// otherwise, false. - /// - public bool IsSecure { - get { - return _secure; - } - } - - /// - /// Gets or sets a value indicating whether the server cleans up - /// the inactive sessions periodically. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// true if the server cleans up the inactive sessions - /// every 60 seconds; otherwise, false. - /// - /// - /// The default value is true. - /// - /// - public bool KeepClean { - get { - return _services.KeepClean; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _services.KeepClean = value; - } - } - } - - /// - /// Gets the logging function for the server. - /// - /// - /// The default logging level is . - /// - /// - /// A that provides the logging function. - /// - public Logger Log { - get { - return _log; - } - } - - /// - /// Gets the port of the server. - /// - /// - /// An that represents the number of the port - /// on which to listen for incoming requests. - /// - public int Port { - get { - return _port; - } - } - - /// - /// Gets or sets the realm used for authentication. - /// - /// - /// - /// "SECRET AREA" is used as the realm if the value is - /// or an empty string. - /// - /// - /// The set operation does nothing if the server has - /// already started or it is shutting down. - /// - /// - /// - /// - /// A or by default. - /// - /// - /// That string represents the name of the realm. - /// - /// - public string Realm { - get { - return _listener.Realm; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _listener.Realm = value; - } - } - } - - /// - /// Gets or sets a value indicating whether the server is allowed to - /// be bound to an address that is already in use. - /// - /// - /// - /// You should set this property to true if you would - /// like to resolve to wait for socket in TIME_WAIT state. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// - /// true if the server is allowed to be bound to an address - /// that is already in use; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool ReuseAddress { - get { - return _listener.ReuseAddress; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _listener.ReuseAddress = value; - } - } - } - - /// - /// Gets the configuration for secure connections. - /// - /// - /// The configuration will be referenced when the server starts. - /// So you must configure it before calling the start method. - /// - /// - /// A that represents - /// the configuration used to provide secure connections. - /// - public ServerSslConfiguration SslConfiguration { - get { - return _listener.SslConfiguration; - } - } - - /// - /// Gets or sets the delegate used to find the credentials - /// for an identity. - /// - /// - /// - /// No credentials are found if the method invoked by - /// the delegate returns or - /// the value is . - /// - /// - /// The set operation does nothing if the server has - /// already started or it is shutting down. - /// - /// - /// - /// - /// A Func<, - /// > delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called for finding - /// the credentials used to authenticate a client. - /// - /// - /// The default value is . - /// - /// - public Func UserCredentialsFinder { - get { - return _listener.UserCredentialsFinder; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _listener.UserCredentialsFinder = value; - } - } - } - - /// - /// Gets or sets the time to wait for the response to - /// the WebSocket Ping or Close. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// A to wait for the response. - /// - /// - /// The default value is the same as 1 second. - /// - /// - /// - /// The value specified for a set operation is zero or less. - /// - public TimeSpan WaitTime { - get { - return _services.WaitTime; - } - - set { - if (value <= TimeSpan.Zero) - throw new ArgumentException ("Zero or less.", "value"); - - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _services.WaitTime = value; - } - } - } - - /// - /// Gets the management function for the WebSocket services - /// provided by the server. - /// - /// - /// A that manages - /// the WebSocket services provided by the server. - /// - public WebSocketServiceManager WebSocketServices { - get { - return _services; - } - } - - #endregion - - #region Public Events - - /// - /// Occurs when the server receives an HTTP CONNECT request. - /// - public event EventHandler OnConnect; - - /// - /// Occurs when the server receives an HTTP DELETE request. - /// - public event EventHandler OnDelete; - - /// - /// Occurs when the server receives an HTTP GET request. - /// - public event EventHandler OnGet; - - /// - /// Occurs when the server receives an HTTP HEAD request. - /// - public event EventHandler OnHead; - - /// - /// Occurs when the server receives an HTTP OPTIONS request. - /// - public event EventHandler OnOptions; - - /// - /// Occurs when the server receives an HTTP PATCH request. - /// - public event EventHandler OnPatch; - - /// - /// Occurs when the server receives an HTTP POST request. - /// - public event EventHandler OnPost; - - /// - /// Occurs when the server receives an HTTP PUT request. - /// - public event EventHandler OnPut; - - /// - /// Occurs when the server receives an HTTP TRACE request. - /// - public event EventHandler OnTrace; - - #endregion - - #region Private Methods - - private void abort () - { - lock (_sync) { - if (_state != ServerState.Start) - return; - - _state = ServerState.ShuttingDown; - } - - try { - try { - _services.Stop (1006, String.Empty); - } - finally { - _listener.Abort (); - } - } - catch { - } - - _state = ServerState.Stop; - } - - private bool canSet (out string message) - { - message = null; - - if (_state == ServerState.Start) { - message = "The server has already started."; - return false; - } - - if (_state == ServerState.ShuttingDown) { - message = "The server is shutting down."; - return false; - } - - return true; - } - - private bool checkCertificate (out string message) - { - message = null; - - if (!_secure) - return true; - - var user = _listener.SslConfiguration.ServerCertificate != null; - - var path = _listener.CertificateFolderPath; - var port = EndPointListener.CertificateExists (_port, path); - - if (user && port) { - _log.Warn ("The certificate associated with the port will be used."); - return true; - } - - if (!(user || port)) { - message = "There is no certificate used to authenticate the server."; - return false; - } - - return true; - } - - private string createFilePath (string childPath) - { - childPath = childPath.TrimStart ('/', '\\'); - return new StringBuilder (_docRootPath, 32) - .AppendFormat ("/{0}", childPath) - .ToString () - .Replace ('\\', '/'); - } - - private static HttpListener createListener ( - string hostname, int port, bool secure - ) - { - var lsnr = new HttpListener (); - - var schm = secure ? "https" : "http"; - var pref = String.Format ("{0}://{1}:{2}/", schm, hostname, port); - lsnr.Prefixes.Add (pref); - - return lsnr; - } - - private void init ( - string hostname, System.Net.IPAddress address, int port, bool secure - ) - { - _hostname = hostname; - _address = address; - _port = port; - _secure = secure; - - _docRootPath = "./Public"; - _listener = createListener (_hostname, _port, _secure); - _log = _listener.Log; - _services = new WebSocketServiceManager (_log); - _sync = new object (); - } - - private void processRequest (HttpListenerContext context) - { - var method = context.Request.HttpMethod; - var evt = method == "GET" - ? OnGet - : method == "HEAD" - ? OnHead - : method == "POST" - ? OnPost - : method == "PUT" - ? OnPut - : method == "DELETE" - ? OnDelete - : method == "OPTIONS" - ? OnOptions - : method == "TRACE" - ? OnTrace - : method == "CONNECT" - ? OnConnect - : method == "PATCH" - ? OnPatch - : null; - - if (evt != null) - evt (this, new HttpRequestEventArgs (context, _docRootPath)); - else - context.Response.StatusCode = (int) HttpStatusCode.NotImplemented; - - context.Response.Close (); - } - - private void processRequest (HttpListenerWebSocketContext context) - { - WebSocketServiceHost host; - if (!_services.InternalTryGetServiceHost (context.RequestUri.AbsolutePath, out host)) { - context.Close (HttpStatusCode.NotImplemented); - return; - } - - host.StartSession (context); - } - - private void receiveRequest () - { - while (true) { - HttpListenerContext ctx = null; - try { - ctx = _listener.GetContext (); - ThreadPool.QueueUserWorkItem ( - state => { - try { - if (ctx.Request.IsUpgradeTo ("websocket")) { - processRequest (ctx.AcceptWebSocket (null)); - return; - } - - processRequest (ctx); - } - catch (Exception ex) { - _log.Fatal (ex.Message); - _log.Debug (ex.ToString ()); - - ctx.Connection.Close (true); - } - } - ); - } - catch (HttpListenerException) { - _log.Info ("The underlying listener is stopped."); - break; - } - catch (InvalidOperationException) { - _log.Info ("The underlying listener is stopped."); - break; - } - catch (Exception ex) { - _log.Fatal (ex.Message); - _log.Debug (ex.ToString ()); - - if (ctx != null) - ctx.Connection.Close (true); - - break; - } - } - - if (_state != ServerState.ShuttingDown) - abort (); - } - - private void start () - { - if (_state == ServerState.Start) { - _log.Info ("The server has already started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Warn ("The server is shutting down."); - return; - } - - lock (_sync) { - if (_state == ServerState.Start) { - _log.Info ("The server has already started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Warn ("The server is shutting down."); - return; - } - - _services.Start (); - - try { - startReceiving (); - } - catch { - _services.Stop (1011, String.Empty); - throw; - } - - _state = ServerState.Start; - } - } - - private void startReceiving () - { - try { - _listener.Start (); - } - catch (Exception ex) { - var msg = "The underlying HttpListener has failed to start."; - throw new InvalidOperationException (msg, ex); - } - - _receiveThread = new Thread (new ThreadStart (receiveRequest)); - _receiveThread.IsBackground = true; - _receiveThread.Start (); - } - - private void stop (ushort code, string reason) - { - if (_state == ServerState.Ready) { - _log.Info ("The server is not started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Info ("The server is shutting down."); - return; - } - - if (_state == ServerState.Stop) { - _log.Info ("The server has already stopped."); - return; - } - - lock (_sync) { - if (_state == ServerState.ShuttingDown) { - _log.Info ("The server is shutting down."); - return; - } - - if (_state == ServerState.Stop) { - _log.Info ("The server has already stopped."); - return; - } - - _state = ServerState.ShuttingDown; - } - - try { - var threw = false; - try { - _services.Stop (code, reason); - } - catch { - threw = true; - throw; - } - finally { - try { - stopReceiving (5000); - } - catch { - if (!threw) - throw; - } - } - } - finally { - _state = ServerState.Stop; - } - } - - private void stopReceiving (int millisecondsTimeout) - { - _listener.Stop (); - _receiveThread.Join (millisecondsTimeout); - } - - private static bool tryCreateUri ( - string uriString, out Uri result, out string message - ) - { - result = null; - message = null; - - var uri = uriString.ToUri (); - if (uri == null) { - message = "An invalid URI string."; - return false; - } - - if (!uri.IsAbsoluteUri) { - message = "A relative URI."; - return false; - } - - var schm = uri.Scheme; - if (!(schm == "http" || schm == "https")) { - message = "The scheme part is not 'http' or 'https'."; - return false; - } - - if (uri.PathAndQuery != "/") { - message = "It includes either or both path and query components."; - return false; - } - - if (uri.Fragment.Length > 0) { - message = "It includes the fragment component."; - return false; - } - - if (uri.Port == 0) { - message = "The port part is zero."; - return false; - } - - result = uri; - return true; - } - - #endregion - - #region Public Methods - - /// - /// Adds a WebSocket service with the specified behavior, - /// , and . - /// - /// - /// is converted to a URL-decoded string and - /// '/' is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// A Func<TBehavior> delegate. - /// - /// - /// It invokes the method called for creating - /// a new session instance for the service. - /// - /// - /// The method must create a new instance of - /// the specified behavior class and return it. - /// - /// - /// - /// - /// The type of the behavior for the service. - /// - /// - /// It must inherit the class. - /// - /// - /// - /// - /// is . - /// - /// - /// -or- - /// - /// - /// is . - /// - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - [Obsolete ("This method will be removed. Use added one instead.")] - public void AddWebSocketService ( - string path, Func creator - ) - where TBehavior : WebSocketBehavior - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (creator == null) - throw new ArgumentNullException ("creator"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - _services.Add (path, creator); - } - - /// - /// Adds a WebSocket service with the specified behavior and - /// . - /// - /// - /// is converted to a URL-decoded string and - /// '/' is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// The type of the behavior for the service. - /// - /// - /// It must inherit the class and - /// must have a public parameterless constructor. - /// - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - public void AddWebSocketService (string path) - where TBehaviorWithNew : WebSocketBehavior, new () - { - _services.AddService (path, null); - } - - /// - /// Adds a WebSocket service with the specified behavior, - /// , and . - /// - /// - /// is converted to a URL-decoded string and - /// '/' is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// An Action<TBehaviorWithNew> delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called for initializing - /// a new session instance for the service. - /// - /// - /// - /// - /// The type of the behavior for the service. - /// - /// - /// It must inherit the class and - /// must have a public parameterless constructor. - /// - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - public void AddWebSocketService ( - string path, Action initializer - ) - where TBehaviorWithNew : WebSocketBehavior, new () - { - _services.AddService (path, initializer); - } - - /// - /// Gets the contents of the specified file from the document - /// folder of the server. - /// - /// - /// - /// An array of or - /// if it fails. - /// - /// - /// That array represents the contents of the file. - /// - /// - /// - /// A that represents a virtual path to - /// find the file from the document folder. - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// contains "..". - /// - /// - [Obsolete ("This method will be removed.")] - public byte[] GetFile (string path) - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path.IndexOf ("..") > -1) - throw new ArgumentException ("It contains '..'.", "path"); - - path = createFilePath (path); - return File.Exists (path) ? File.ReadAllBytes (path) : null; - } - - /// - /// Removes a WebSocket service with the specified . - /// - /// - /// - /// is converted to a URL-decoded string and - /// '/' is trimmed from the end of the converted string if any. - /// - /// - /// The service is stopped with close status 1001 (going away) - /// if it has already started. - /// - /// - /// - /// true if the service is successfully found and removed; - /// otherwise, false. - /// - /// - /// A that represents an absolute path to - /// the service to remove. - /// - /// - /// is . - /// - /// - /// - /// is an empty string. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - public bool RemoveWebSocketService (string path) - { - return _services.RemoveService (path); - } - - /// - /// Starts receiving incoming requests. - /// - /// - /// This method does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// There is no certificate used to authenticate the server. - /// - /// - /// -or- - /// - /// - /// The underlying has failed to start. - /// - /// - public void Start () - { - string msg; - if (!checkCertificate (out msg)) - throw new InvalidOperationException (msg); - - start (); - } - - /// - /// Stops receiving incoming requests and closes each connection. - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - public void Stop () - { - stop (1005, String.Empty); - } - - /// - /// Stops receiving incoming requests and closes each connection. - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - /// - /// - /// A that represents the status code - /// indicating the reason for the WebSocket connection close. - /// - /// - /// The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - /// - /// - /// - /// A that represents the reason for - /// the WebSocket connection close. - /// - /// - /// The size must be 123 bytes or less in UTF-8. - /// - /// - /// - /// - /// is less than 1000 or greater than 4999. - /// - /// - /// -or- - /// - /// - /// The size of is greater than 123 bytes. - /// - /// - /// - /// - /// is 1010 (mandatory extension). - /// - /// - /// -or- - /// - /// - /// is 1005 (no status) and - /// there is . - /// - /// - /// -or- - /// - /// - /// could not be UTF-8-encoded. - /// - /// - public void Stop (ushort code, string reason) - { - if (!code.IsCloseStatusCode ()) { - var msg = "Less than 1000 or greater than 4999."; - throw new ArgumentOutOfRangeException ("code", msg); - } - - if (code == 1010) { - var msg = "1010 cannot be used."; - throw new ArgumentException (msg, "code"); - } - - if (!reason.IsNullOrEmpty ()) { - if (code == 1005) { - var msg = "1005 cannot be used."; - throw new ArgumentException (msg, "code"); - } - - byte[] bytes; - if (!reason.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "reason"); - } - - if (bytes.Length > 123) { - var msg = "Its size is greater than 123 bytes."; - throw new ArgumentOutOfRangeException ("reason", msg); - } - } - - stop (code, reason); - } - - /// - /// Stops receiving incoming requests and closes each connection. - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - /// - /// - /// One of the enum values. - /// - /// - /// It represents the status code indicating the reason for - /// the WebSocket connection close. - /// - /// - /// - /// - /// A that represents the reason for - /// the WebSocket connection close. - /// - /// - /// The size must be 123 bytes or less in UTF-8. - /// - /// - /// - /// The size of is greater than 123 bytes. - /// - /// - /// - /// is - /// . - /// - /// - /// -or- - /// - /// - /// is - /// and - /// there is . - /// - /// - /// -or- - /// - /// - /// could not be UTF-8-encoded. - /// - /// - public void Stop (CloseStatusCode code, string reason) - { - if (code == CloseStatusCode.MandatoryExtension) { - var msg = "MandatoryExtension cannot be used."; - throw new ArgumentException (msg, "code"); - } - - if (!reason.IsNullOrEmpty ()) { - if (code == CloseStatusCode.NoStatus) { - var msg = "NoStatus cannot be used."; - throw new ArgumentException (msg, "code"); - } - - byte[] bytes; - if (!reason.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "reason"); - } - - if (bytes.Length > 123) { - var msg = "Its size is greater than 123 bytes."; - throw new ArgumentOutOfRangeException ("reason", msg); - } - } - - stop ((ushort) code, reason); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/HttpServer.cs.meta b/ThirdParty/WebSocketSharp/Server/HttpServer.cs.meta deleted file mode 100644 index c6c9bd1e7..000000000 --- a/ThirdParty/WebSocketSharp/Server/HttpServer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 8884d18a58acd154b990e2960e8f8d8f -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs b/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs deleted file mode 100644 index 530740a9c..000000000 --- a/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region License -/* - * IWebSocketSession.cs - * - * The MIT License - * - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Server -{ - /// - /// Exposes the properties used to access the information in a session in a WebSocket service. - /// - public interface IWebSocketSession - { - #region Properties - - /// - /// Gets the information in the connection request to the WebSocket service. - /// - /// - /// A that provides the access to the connection request. - /// - WebSocketContext Context { get; } - - /// - /// Gets the unique ID of the session. - /// - /// - /// A that represents the unique ID of the session. - /// - string ID { get; } - - /// - /// Gets the WebSocket subprotocol used in the session. - /// - /// - /// A that represents the subprotocol if any. - /// - string Protocol { get; } - - /// - /// Gets the time that the session has started. - /// - /// - /// A that represents the time that the session has started. - /// - DateTime StartTime { get; } - - /// - /// Gets the state of the used in the session. - /// - /// - /// One of the enum values, indicates the state of - /// the used in the session. - /// - WebSocketState State { get; } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs.meta b/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs.meta deleted file mode 100644 index 990220216..000000000 --- a/ThirdParty/WebSocketSharp/Server/IWebSocketSession.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 41ad8115841a2fb448300fe6927c2c4b -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/ServerState.cs b/ThirdParty/WebSocketSharp/Server/ServerState.cs deleted file mode 100644 index 2d7582920..000000000 --- a/ThirdParty/WebSocketSharp/Server/ServerState.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region License -/* - * ServerState.cs - * - * The MIT License - * - * Copyright (c) 2013-2014 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp.Server -{ - internal enum ServerState - { - Ready, - Start, - ShuttingDown, - Stop - } -} diff --git a/ThirdParty/WebSocketSharp/Server/ServerState.cs.meta b/ThirdParty/WebSocketSharp/Server/ServerState.cs.meta deleted file mode 100644 index 4bee9cfa3..000000000 --- a/ThirdParty/WebSocketSharp/Server/ServerState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: d2661cd8e5dcb804ea166abb0ee77a8b -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs b/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs deleted file mode 100644 index 3bdb4e3c3..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs +++ /dev/null @@ -1,597 +0,0 @@ -#region License -/* - * WebSocketBehavior.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.IO; -using WebSocketSharp.Net; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Server -{ - /// - /// Exposes the methods and properties used to define the behavior of a WebSocket service - /// provided by the or . - /// - /// - /// The WebSocketBehavior class is an abstract class. - /// - public abstract class WebSocketBehavior : IWebSocketSession - { - #region Private Fields - - private WebSocketContext _context; - private Func _cookiesValidator; - private bool _emitOnPing; - private string _id; - private bool _ignoreExtensions; - private Func _originValidator; - private string _protocol; - private WebSocketSessionManager _sessions; - private DateTime _startTime; - private WebSocket _websocket; - - #endregion - - #region Protected Constructors - - /// - /// Initializes a new instance of the class. - /// - protected WebSocketBehavior () - { - _startTime = DateTime.MaxValue; - } - - #endregion - - #region Protected Properties - - /// - /// Gets the logging functions. - /// - /// - /// A that provides the logging functions, - /// or if the WebSocket connection isn't established. - /// - protected Logger Log { - get { - return _websocket != null ? _websocket.Log : null; - } - } - - /// - /// Gets the access to the sessions in the WebSocket service. - /// - /// - /// A that provides the access to the sessions, - /// or if the WebSocket connection isn't established. - /// - protected WebSocketSessionManager Sessions { - get { - return _sessions; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the information in a handshake request to the WebSocket service. - /// - /// - /// A instance that provides the access to the handshake request, - /// or if the WebSocket connection isn't established. - /// - public WebSocketContext Context { - get { - return _context; - } - } - - /// - /// Gets or sets the delegate called to validate the HTTP cookies included in - /// a handshake request to the WebSocket service. - /// - /// - /// This delegate is called when the used in a session validates - /// the handshake request. - /// - /// - /// - /// A Func<CookieCollection, CookieCollection, bool> delegate that references - /// the method(s) used to validate the cookies. - /// - /// - /// 1st parameter passed to this delegate contains - /// the cookies to validate if any. - /// - /// - /// 2nd parameter passed to this delegate receives - /// the cookies to send to the client. - /// - /// - /// This delegate should return true if the cookies are valid. - /// - /// - /// The default value is , and it does nothing to validate. - /// - /// - public Func CookiesValidator { - get { - return _cookiesValidator; - } - - set { - _cookiesValidator = value; - } - } - - /// - /// Gets or sets a value indicating whether the used in a session emits - /// a event when receives a Ping. - /// - /// - /// true if the emits a event - /// when receives a Ping; otherwise, false. The default value is false. - /// - public bool EmitOnPing { - get { - return _websocket != null ? _websocket.EmitOnPing : _emitOnPing; - } - - set { - if (_websocket != null) { - _websocket.EmitOnPing = value; - return; - } - - _emitOnPing = value; - } - } - - /// - /// Gets the unique ID of a session. - /// - /// - /// A that represents the unique ID of the session, - /// or if the WebSocket connection isn't established. - /// - public string ID { - get { - return _id; - } - } - - /// - /// Gets or sets a value indicating whether the WebSocket service ignores - /// the Sec-WebSocket-Extensions header included in a handshake request. - /// - /// - /// true if the WebSocket service ignores the extensions requested from - /// a client; otherwise, false. The default value is false. - /// - public bool IgnoreExtensions { - get { - return _ignoreExtensions; - } - - set { - _ignoreExtensions = value; - } - } - - /// - /// Gets or sets the delegate called to validate the Origin header included in - /// a handshake request to the WebSocket service. - /// - /// - /// This delegate is called when the used in a session validates - /// the handshake request. - /// - /// - /// - /// A Func<string, bool> delegate that references the method(s) used to - /// validate the origin header. - /// - /// - /// parameter passed to this delegate represents the value of - /// the origin header to validate if any. - /// - /// - /// This delegate should return true if the origin header is valid. - /// - /// - /// The default value is , and it does nothing to validate. - /// - /// - public Func OriginValidator { - get { - return _originValidator; - } - - set { - _originValidator = value; - } - } - - /// - /// Gets or sets the WebSocket subprotocol used in the WebSocket service. - /// - /// - /// Set operation of this property is available before the WebSocket connection has - /// been established. - /// - /// - /// - /// A that represents the subprotocol if any. - /// The default value is . - /// - /// - /// The value to set must be a token defined in - /// RFC 2616. - /// - /// - public string Protocol { - get { - return _websocket != null ? _websocket.Protocol : (_protocol ?? String.Empty); - } - - set { - if (State != WebSocketState.Connecting) - return; - - if (value != null && (value.Length == 0 || !value.IsToken ())) - return; - - _protocol = value; - } - } - - /// - /// Gets the time that a session has started. - /// - /// - /// A that represents the time that the session has started, - /// or if the WebSocket connection isn't established. - /// - public DateTime StartTime { - get { - return _startTime; - } - } - - /// - /// Gets the state of the used in a session. - /// - /// - /// One of the enum values, indicates the state of - /// the . - /// - public WebSocketState State { - get { - return _websocket != null ? _websocket.ReadyState : WebSocketState.Connecting; - } - } - - #endregion - - #region Private Methods - - private string checkHandshakeRequest (WebSocketContext context) - { - return _originValidator != null && !_originValidator (context.Origin) - ? "Includes no Origin header, or it has an invalid value." - : _cookiesValidator != null - && !_cookiesValidator (context.CookieCollection, context.WebSocket.CookieCollection) - ? "Includes no cookie, or an invalid cookie exists." - : null; - } - - private void onClose (object sender, CloseEventArgs e) - { - if (_id == null) - return; - - _sessions.Remove (_id); - OnClose (e); - } - - private void onError (object sender, ErrorEventArgs e) - { - OnError (e); - } - - private void onMessage (object sender, MessageEventArgs e) - { - OnMessage (e); - } - - private void onOpen (object sender, EventArgs e) - { - _id = _sessions.Add (this); - if (_id == null) { - _websocket.Close (CloseStatusCode.Away); - return; - } - - _startTime = DateTime.Now; - OnOpen (); - } - - #endregion - - #region Internal Methods - - internal void Start (WebSocketContext context, WebSocketSessionManager sessions) - { - if (_websocket != null) { - _websocket.Log.Error ("A session instance cannot be reused."); - context.WebSocket.Close (HttpStatusCode.ServiceUnavailable); - - return; - } - - _context = context; - _sessions = sessions; - - _websocket = context.WebSocket; - _websocket.CustomHandshakeRequestChecker = checkHandshakeRequest; - _websocket.EmitOnPing = _emitOnPing; - _websocket.IgnoreExtensions = _ignoreExtensions; - _websocket.Protocol = _protocol; - - var waitTime = sessions.WaitTime; - if (waitTime != _websocket.WaitTime) - _websocket.WaitTime = waitTime; - - _websocket.OnOpen += onOpen; - _websocket.OnMessage += onMessage; - _websocket.OnError += onError; - _websocket.OnClose += onClose; - - _websocket.InternalAccept (); - } - - #endregion - - #region Protected Methods - - /// - /// Calls the method with the specified and - /// . - /// - /// - /// This method doesn't call the method if is - /// or empty. - /// - /// - /// A that represents the error message. - /// - /// - /// An instance that represents the cause of the error if any. - /// - protected void Error (string message, Exception exception) - { - if (message != null && message.Length > 0) - OnError (new ErrorEventArgs (message, exception)); - } - - /// - /// Called when the WebSocket connection used in a session has been closed. - /// - /// - /// A that represents the event data passed to - /// a event. - /// - protected virtual void OnClose (CloseEventArgs e) - { - } - - /// - /// Called when the used in a session gets an error. - /// - /// - /// A that represents the event data passed to - /// a event. - /// - protected virtual void OnError (ErrorEventArgs e) - { - } - - /// - /// Called when the used in a session receives a message. - /// - /// - /// A that represents the event data passed to - /// a event. - /// - protected virtual void OnMessage (MessageEventArgs e) - { - } - - /// - /// Called when the WebSocket connection used in a session has been established. - /// - protected virtual void OnOpen () - { - } - - /// - /// Sends binary to the client on a session. - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// An array of that represents the binary data to send. - /// - protected void Send (byte[] data) - { - if (_websocket != null) - _websocket.Send (data); - } - - /// - /// Sends the specified as binary data to the client on a session. - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// A that represents the file to send. - /// - protected void Send (FileInfo file) - { - if (_websocket != null) - _websocket.Send (file); - } - - /// - /// Sends text to the client on a session. - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// A that represents the text data to send. - /// - protected void Send (string data) - { - if (_websocket != null) - _websocket.Send (data); - } - - /// - /// Sends binary asynchronously to the client on a session. - /// - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - protected void SendAsync (byte[] data, Action completed) - { - if (_websocket != null) - _websocket.SendAsync (data, completed); - } - - /// - /// Sends the specified as binary data asynchronously to - /// the client on a session. - /// - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// - /// A that represents the file to send. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - protected void SendAsync (FileInfo file, Action completed) - { - if (_websocket != null) - _websocket.SendAsync (file, completed); - } - - /// - /// Sends text asynchronously to the client on a session. - /// - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// - /// A that represents the text data to send. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - protected void SendAsync (string data, Action completed) - { - if (_websocket != null) - _websocket.SendAsync (data, completed); - } - - /// - /// Sends binary data from the specified asynchronously to - /// the client on a session. - /// - /// - /// - /// This method is available after the WebSocket connection has been established. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// - /// A from which contains the binary data to send. - /// - /// - /// An that represents the number of bytes to send. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - protected void SendAsync (Stream stream, int length, Action completed) - { - if (_websocket != null) - _websocket.SendAsync (stream, length, completed); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs.meta deleted file mode 100644 index df4fd8d58..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketBehavior.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: f9983e55376bcaa40b5a034a57bb4c8f -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs b/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs deleted file mode 100644 index b858f4a64..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs +++ /dev/null @@ -1,1510 +0,0 @@ -#region License -/* - * WebSocketServer.cs - * - * A C# implementation of the WebSocket protocol server. - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Juan Manuel Lallana - * - Jonas Hovgaard - * - Liryna - * - Rohan Singh - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Security.Cryptography.X509Certificates; -using System.Security.Principal; -using System.Text; -using System.Threading; -using WebSocketSharp.Net; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Server -{ - /// - /// Provides a WebSocket protocol server. - /// - /// - /// This class can provide multiple WebSocket services. - /// - public class WebSocketServer - { - #region Private Fields - - private System.Net.IPAddress _address; - private bool _allowForwardedRequest; - private AuthenticationSchemes _authSchemes; - private static readonly string _defaultRealm; - private bool _dnsStyle; - private string _hostname; - private TcpListener _listener; - private Logger _log; - private int _port; - private string _realm; - private string _realmInUse; - private Thread _receiveThread; - private bool _reuseAddress; - private bool _secure; - private WebSocketServiceManager _services; - private ServerSslConfiguration _sslConfig; - private ServerSslConfiguration _sslConfigInUse; - private volatile ServerState _state; - private object _sync; - private Func _userCredFinder; - - #endregion - - #region Static Constructor - - static WebSocketServer () - { - _defaultRealm = "SECRET AREA"; - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class. - /// - /// - /// The new instance listens for incoming handshake requests on - /// and port 80. - /// - public WebSocketServer () - { - var addr = System.Net.IPAddress.Any; - init (addr.ToString (), addr, 80, false); - } - - /// - /// Initializes a new instance of the class - /// with the specified . - /// - /// - /// - /// The new instance listens for incoming handshake requests on - /// and . - /// - /// - /// It provides secure connections if is 443. - /// - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// is less than 1 or greater than 65535. - /// - public WebSocketServer (int port) - : this (port, port == 443) - { - } - - /// - /// Initializes a new instance of the class - /// with the specified . - /// - /// - /// - /// The new instance listens for incoming handshake requests on - /// the local IP address of the host of and - /// the port of . - /// - /// - /// Either port 80 or 443 is used if includes - /// no port. Port 443 is used if the scheme of - /// is wss; otherwise, port 80 is used. - /// - /// - /// That instance provides secure connections if the scheme of - /// is wss. - /// - /// - /// - /// A that represents the WebSocket URL - /// on which to listen. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is invalid. - /// - /// - public WebSocketServer (string url) - { - if (url == null) - throw new ArgumentNullException ("url"); - - if (url.Length == 0) - throw new ArgumentException ("An empty string.", "url"); - - Uri uri; - string msg; - if (!tryCreateUri (url, out uri, out msg)) - throw new ArgumentException (msg, "url"); - - var host = uri.DnsSafeHost; - - var addr = host.ToIPAddress (); - if (addr == null) { - msg = "The host part could not be converted to an IP address."; - throw new ArgumentException (msg, "url"); - } - - if (!addr.IsLocal ()) { - msg = "The IP address of the host is not a local IP address."; - throw new ArgumentException (msg, "url"); - } - - init (host, addr, uri.Port, uri.Scheme == "wss"); - } - - /// - /// Initializes a new instance of the class - /// with the specified and . - /// - /// - /// The new instance listens for incoming handshake requests on - /// and . - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// A : true if the new instance provides - /// secure connections; otherwise, false. - /// - /// - /// is less than 1 or greater than 65535. - /// - public WebSocketServer (int port, bool secure) - { - if (!port.IsPortNumber ()) { - var msg = "Less than 1 or greater than 65535."; - throw new ArgumentOutOfRangeException ("port", msg); - } - - var addr = System.Net.IPAddress.Any; - init (addr.ToString (), addr, port, secure); - } - - /// - /// Initializes a new instance of the class - /// with the specified and . - /// - /// - /// - /// The new instance listens for incoming handshake requests on - /// and . - /// - /// - /// It provides secure connections if is 443. - /// - /// - /// - /// A that represents - /// the local IP address on which to listen. - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// is . - /// - /// - /// is not a local IP address. - /// - /// - /// is less than 1 or greater than 65535. - /// - public WebSocketServer (System.Net.IPAddress address, int port) - : this (address, port, port == 443) - { - } - - /// - /// Initializes a new instance of the class - /// with the specified , , - /// and . - /// - /// - /// The new instance listens for incoming handshake requests on - /// and . - /// - /// - /// A that represents - /// the local IP address on which to listen. - /// - /// - /// An that represents the number of the port - /// on which to listen. - /// - /// - /// A : true if the new instance provides - /// secure connections; otherwise, false. - /// - /// - /// is . - /// - /// - /// is not a local IP address. - /// - /// - /// is less than 1 or greater than 65535. - /// - public WebSocketServer (System.Net.IPAddress address, int port, bool secure) - { - if (address == null) - throw new ArgumentNullException ("address"); - - if (!address.IsLocal ()) - throw new ArgumentException ("Not a local IP address.", "address"); - - if (!port.IsPortNumber ()) { - var msg = "Less than 1 or greater than 65535."; - throw new ArgumentOutOfRangeException ("port", msg); - } - - init (address.ToString (), address, port, secure); - } - - #endregion - - #region Public Properties - - /// - /// Gets the IP address of the server. - /// - /// - /// A that represents the local - /// IP address on which to listen for incoming handshake requests. - /// - public System.Net.IPAddress Address { - get { - return _address; - } - } - - /// - /// Gets or sets a value indicating whether the server accepts - /// a handshake request without checking the request URI. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// true if the server accepts a handshake request without - /// checking the request URI; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool AllowForwardedRequest { - get { - return _allowForwardedRequest; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _allowForwardedRequest = value; - } - } - } - - /// - /// Gets or sets the scheme used to authenticate the clients. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// One of the - /// enum values. - /// - /// - /// It represents the scheme used to authenticate the clients. - /// - /// - /// The default value is - /// . - /// - /// - public AuthenticationSchemes AuthenticationSchemes { - get { - return _authSchemes; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _authSchemes = value; - } - } - } - - /// - /// Gets a value indicating whether the server has started. - /// - /// - /// true if the server has started; otherwise, false. - /// - public bool IsListening { - get { - return _state == ServerState.Start; - } - } - - /// - /// Gets a value indicating whether the server provides - /// secure connections. - /// - /// - /// true if the server provides secure connections; - /// otherwise, false. - /// - public bool IsSecure { - get { - return _secure; - } - } - - /// - /// Gets or sets a value indicating whether the server cleans up - /// the inactive sessions periodically. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// true if the server cleans up the inactive sessions - /// every 60 seconds; otherwise, false. - /// - /// - /// The default value is true. - /// - /// - public bool KeepClean { - get { - return _services.KeepClean; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _services.KeepClean = value; - } - } - } - - /// - /// Gets the logging function for the server. - /// - /// - /// The default logging level is . - /// - /// - /// A that provides the logging function. - /// - public Logger Log { - get { - return _log; - } - } - - /// - /// Gets the port of the server. - /// - /// - /// An that represents the number of the port - /// on which to listen for incoming handshake requests. - /// - public int Port { - get { - return _port; - } - } - - /// - /// Gets or sets the realm used for authentication. - /// - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// SECRET AREA will be used as the name if the value is - /// or an empty string. - /// - /// - /// - /// - /// A or - /// by default. - /// - /// - /// That string represents the name of the realm. - /// - /// - public string Realm { - get { - return _realm; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _realm = value; - } - } - } - - /// - /// Gets or sets a value indicating whether the server is allowed to - /// be bound to an address that is already in use. - /// - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// You should set this property to true if you would - /// like to resolve to wait for socket in TIME_WAIT state. - /// - /// - /// - /// - /// true if the server is allowed to be bound to an address - /// that is already in use; otherwise, false. - /// - /// - /// The default value is false. - /// - /// - public bool ReuseAddress { - get { - return _reuseAddress; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _reuseAddress = value; - } - } - } - - /// - /// Gets the configuration for secure connections. - /// - /// - /// The configuration will be referenced when the server starts. - /// So you must configure it before calling the start method. - /// - /// - /// A that represents - /// the configuration used to provide secure connections. - /// - public ServerSslConfiguration SslConfiguration { - get { - if (_sslConfig == null) - _sslConfig = new ServerSslConfiguration (); - - return _sslConfig; - } - } - - /// - /// Gets or sets the delegate used to find the credentials for - /// an identity. - /// - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// No credentials are found if the method invoked by - /// the delegate returns or - /// the value is . - /// - /// - /// - /// - /// A Func<IIdentity, NetworkCredential> delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called for finding - /// the credentials used to authenticate a client. - /// - /// - /// The default value is . - /// - /// - public Func UserCredentialsFinder { - get { - return _userCredFinder; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _userCredFinder = value; - } - } - } - - /// - /// Gets or sets the time to wait for the response to - /// the WebSocket Ping or Close. - /// - /// - /// The set operation does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// A to wait for the response. - /// - /// - /// The default value is the same as 1 second. - /// - /// - /// - /// The value specified for a set operation is zero or less. - /// - public TimeSpan WaitTime { - get { - return _services.WaitTime; - } - - set { - string msg; - if (!value.CheckWaitTime (out msg)) - throw new ArgumentException (msg, "value"); - - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - lock (_sync) { - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _services.WaitTime = value; - } - } - } - - /// - /// Gets the management function for the WebSocket services - /// provided by the server. - /// - /// - /// A that manages - /// the WebSocket services provided by the server. - /// - public WebSocketServiceManager WebSocketServices { - get { - return _services; - } - } - - #endregion - - #region Private Methods - - private void abort () - { - lock (_sync) { - if (_state != ServerState.Start) - return; - - _state = ServerState.ShuttingDown; - } - - try { - try { - _listener.Stop (); - } - finally { - _services.Stop (1006, String.Empty); - } - } - catch { - } - - _state = ServerState.Stop; - } - - private bool canSet (out string message) - { - message = null; - - if (_state == ServerState.Start) { - message = "The server has already started."; - return false; - } - - if (_state == ServerState.ShuttingDown) { - message = "The server is shutting down."; - return false; - } - - return true; - } - - private bool checkHostNameForRequest (string name) - { - return !_dnsStyle - || Uri.CheckHostName (name) != UriHostNameType.Dns - || name == _hostname; - } - - private bool checkSslConfiguration ( - ServerSslConfiguration configuration, out string message - ) - { - message = null; - - if (!_secure) - return true; - - if (configuration == null) { - message = "There is no configuration for secure connections."; - return false; - } - - if (configuration.ServerCertificate == null) { - message = "There is no certificate in the configuration."; - return false; - } - - return true; - } - - private string getRealm () - { - var realm = _realm; - return realm != null && realm.Length > 0 ? realm : _defaultRealm; - } - - private ServerSslConfiguration getSslConfiguration () - { - return _secure && _sslConfig != null - ? new ServerSslConfiguration (_sslConfig) - : null; - } - - private void init ( - string hostname, System.Net.IPAddress address, int port, bool secure - ) - { - _hostname = hostname; - _address = address; - _port = port; - _secure = secure; - - _authSchemes = AuthenticationSchemes.Anonymous; - _dnsStyle = Uri.CheckHostName (hostname) == UriHostNameType.Dns; - _listener = new TcpListener (address, port); - _log = new Logger (); - _services = new WebSocketServiceManager (_log); - _sync = new object (); - } - - private void processRequest (TcpListenerWebSocketContext context) - { - var uri = context.RequestUri; - if (uri == null) { - context.Close (HttpStatusCode.BadRequest); - return; - } - - if (!_allowForwardedRequest) { - if (uri.Port != _port) { - context.Close (HttpStatusCode.BadRequest); - return; - } - - if (!checkHostNameForRequest (uri.DnsSafeHost)) { - context.Close (HttpStatusCode.NotFound); - return; - } - } - - WebSocketServiceHost host; - if (!_services.InternalTryGetServiceHost (uri.AbsolutePath, out host)) { - context.Close (HttpStatusCode.NotImplemented); - return; - } - - host.StartSession (context); - } - - private void receiveRequest () - { - while (true) { - TcpClient cl = null; - try { - cl = _listener.AcceptTcpClient (); - ThreadPool.QueueUserWorkItem ( - state => { - try { - var ctx = - cl.GetWebSocketContext (null, _secure, _sslConfigInUse, _log); - - if (!ctx.Authenticate (_authSchemes, _realmInUse, _userCredFinder)) - return; - - processRequest (ctx); - } - catch (Exception ex) { - _log.Fatal (ex.Message); - _log.Debug (ex.ToString ()); - - cl.Close (); - } - } - ); - } - catch (SocketException ex) { - if (_state == ServerState.ShuttingDown) { - _log.Info ("The receiving is stopped."); - break; - } - - _log.Fatal (ex.Message); - _log.Debug (ex.ToString ()); - - break; - } - catch (Exception ex) { - _log.Fatal (ex.Message); - _log.Debug (ex.ToString ()); - - if (cl != null) - cl.Close (); - - break; - } - } - - if (_state != ServerState.ShuttingDown) - abort (); - } - - private void start (ServerSslConfiguration sslConfig) - { - if (_state == ServerState.Start) { - _log.Info ("The server has already started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Warn ("The server is shutting down."); - return; - } - - lock (_sync) { - if (_state == ServerState.Start) { - _log.Info ("The server has already started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Warn ("The server is shutting down."); - return; - } - - _sslConfigInUse = sslConfig; - _realmInUse = getRealm (); - - _services.Start (); - try { - startReceiving (); - } - catch { - _services.Stop (1011, String.Empty); - throw; - } - - _state = ServerState.Start; - } - } - - private void startReceiving () - { - if (_reuseAddress) { - _listener.Server.SetSocketOption ( - SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true - ); - } - - _listener.Start (); - _receiveThread = new Thread (new ThreadStart (receiveRequest)); - _receiveThread.IsBackground = true; - _receiveThread.Start (); - } - - private void stop (ushort code, string reason) - { - if (_state == ServerState.Ready) { - _log.Info ("The server is not started."); - return; - } - - if (_state == ServerState.ShuttingDown) { - _log.Info ("The server is shutting down."); - return; - } - - if (_state == ServerState.Stop) { - _log.Info ("The server has already stopped."); - return; - } - - lock (_sync) { - if (_state == ServerState.ShuttingDown) { - _log.Info ("The server is shutting down."); - return; - } - - if (_state == ServerState.Stop) { - _log.Info ("The server has already stopped."); - return; - } - - _state = ServerState.ShuttingDown; - } - - try { - var threw = false; - try { - stopReceiving (5000); - } - catch { - threw = true; - throw; - } - finally { - try { - _services.Stop (code, reason); - } - catch { - if (!threw) - throw; - } - } - } - finally { - _state = ServerState.Stop; - } - } - - private void stopReceiving (int millisecondsTimeout) - { - _listener.Stop (); - _receiveThread.Join (millisecondsTimeout); - } - - private static bool tryCreateUri ( - string uriString, out Uri result, out string message - ) - { - if (!uriString.TryCreateWebSocketUri (out result, out message)) - return false; - - if (result.PathAndQuery != "/") { - result = null; - message = "It includes either or both path and query components."; - - return false; - } - - return true; - } - - #endregion - - #region Public Methods - - /// - /// Adds a WebSocket service with the specified behavior, - /// , and . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// A Func<TBehavior> delegate. - /// - /// - /// It invokes the method called for creating - /// a new session instance for the service. - /// - /// - /// The method must create a new instance of - /// the specified behavior class and return it. - /// - /// - /// - /// The type of the behavior for the service. It must inherit - /// the class. - /// - /// - /// - /// is . - /// - /// - /// -or- - /// - /// - /// is . - /// - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - [Obsolete ("This method will be removed. Use added one instead.")] - public void AddWebSocketService ( - string path, Func creator - ) - where TBehavior : WebSocketBehavior - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (creator == null) - throw new ArgumentNullException ("creator"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - _services.Add (path, creator); - } - - /// - /// Adds a WebSocket service with the specified behavior and - /// . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// The type of the behavior for the service. It must inherit - /// the class and it must have - /// a public parameterless constructor. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - public void AddWebSocketService (string path) - where TBehaviorWithNew : WebSocketBehavior, new () - { - _services.AddService (path, null); - } - - /// - /// Adds a WebSocket service with the specified behavior, - /// , and . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// An Action<TBehaviorWithNew> delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called for initializing - /// a new session instance for the service. - /// - /// - /// - /// The type of the behavior for the service. It must inherit - /// the class and it must have - /// a public parameterless constructor. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - public void AddWebSocketService ( - string path, Action initializer - ) - where TBehaviorWithNew : WebSocketBehavior, new () - { - _services.AddService (path, initializer); - } - - /// - /// Removes a WebSocket service with the specified . - /// - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// The service is stopped with close status 1001 (going away) - /// if it has already started. - /// - /// - /// - /// true if the service is successfully found and removed; - /// otherwise, false. - /// - /// - /// A that represents an absolute path to - /// the service to remove. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - public bool RemoveWebSocketService (string path) - { - return _services.RemoveService (path); - } - - /// - /// Starts receiving incoming handshake requests. - /// - /// - /// This method does nothing if the server has already - /// started or it is shutting down. - /// - /// - /// - /// There is no configuration for secure connections. - /// - /// - /// -or- - /// - /// - /// There is no certificate in the configuration. - /// - /// - /// - /// The underlying has failed to start. - /// - public void Start () - { - var sslConfig = getSslConfiguration (); - - string msg; - if (!checkSslConfiguration (sslConfig, out msg)) - throw new InvalidOperationException (msg); - - start (sslConfig); - } - - /// - /// Stops receiving incoming handshake requests and - /// closes each connection. - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - /// - /// The underlying has failed to stop. - /// - public void Stop () - { - stop (1005, String.Empty); - } - - /// - /// Stops receiving incoming handshake requests and closes each - /// connection with the specified and - /// . - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - /// - /// - /// A that represents the status code - /// indicating the reason for the close. - /// - /// - /// The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less in UTF-8. - /// - /// - /// - /// is less than 1000 or greater than 4999. - /// - /// - /// -or- - /// - /// - /// The size of is greater than 123 bytes. - /// - /// - /// - /// - /// is 1010 (mandatory extension). - /// - /// - /// -or- - /// - /// - /// is 1005 (no status) and - /// there is . - /// - /// - /// -or- - /// - /// - /// could not be UTF-8-encoded. - /// - /// - /// - /// The underlying has failed to stop. - /// - public void Stop (ushort code, string reason) - { - if (!code.IsCloseStatusCode ()) { - var msg = "Less than 1000 or greater than 4999."; - throw new ArgumentOutOfRangeException ("code", msg); - } - - if (code == 1010) { - var msg = "1010 cannot be used."; - throw new ArgumentException (msg, "code"); - } - - if (!reason.IsNullOrEmpty ()) { - if (code == 1005) { - var msg = "1005 cannot be used."; - throw new ArgumentException (msg, "code"); - } - - byte[] bytes; - if (!reason.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "reason"); - } - - if (bytes.Length > 123) { - var msg = "Its size is greater than 123 bytes."; - throw new ArgumentOutOfRangeException ("reason", msg); - } - } - - stop (code, reason); - } - - /// - /// Stops receiving incoming handshake requests and closes each - /// connection with the specified and - /// . - /// - /// - /// This method does nothing if the server is not started, - /// it is shutting down, or it has already stopped. - /// - /// - /// - /// One of the enum values. - /// - /// - /// It represents the status code indicating the reason for the close. - /// - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less in UTF-8. - /// - /// - /// The size of is greater than 123 bytes. - /// - /// - /// - /// is - /// . - /// - /// - /// -or- - /// - /// - /// is - /// and - /// there is . - /// - /// - /// -or- - /// - /// - /// could not be UTF-8-encoded. - /// - /// - /// - /// The underlying has failed to stop. - /// - public void Stop (CloseStatusCode code, string reason) - { - if (code == CloseStatusCode.MandatoryExtension) { - var msg = "MandatoryExtension cannot be used."; - throw new ArgumentException (msg, "code"); - } - - if (!reason.IsNullOrEmpty ()) { - if (code == CloseStatusCode.NoStatus) { - var msg = "NoStatus cannot be used."; - throw new ArgumentException (msg, "code"); - } - - byte[] bytes; - if (!reason.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "reason"); - } - - if (bytes.Length > 123) { - var msg = "Its size is greater than 123 bytes."; - throw new ArgumentOutOfRangeException ("reason", msg); - } - } - - stop ((ushort) code, reason); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs.meta deleted file mode 100644 index 7e0a7f587..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServer.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 12988ee6d2813fc46977916d243861f7 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs b/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs deleted file mode 100644 index 416d7d82a..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs +++ /dev/null @@ -1,262 +0,0 @@ -#region License -/* - * WebSocketServiceHost.cs - * - * The MIT License - * - * Copyright (c) 2012-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Juan Manuel Lallana - */ -#endregion - -using System; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp.Server -{ - /// - /// Exposes the methods and properties used to access the information in - /// a WebSocket service provided by the or - /// . - /// - /// - /// This class is an abstract class. - /// - public abstract class WebSocketServiceHost - { - #region Private Fields - - private Logger _log; - private string _path; - private WebSocketSessionManager _sessions; - - #endregion - - #region Protected Constructors - - /// - /// Initializes a new instance of the class - /// with the specified and . - /// - /// - /// A that represents the absolute path to the service. - /// - /// - /// A that represents the logging function for the service. - /// - protected WebSocketServiceHost (string path, Logger log) - { - _path = path; - _log = log; - - _sessions = new WebSocketSessionManager (log); - } - - #endregion - - #region Internal Properties - - internal ServerState State { - get { - return _sessions.State; - } - } - - #endregion - - #region Protected Properties - - /// - /// Gets the logging function for the service. - /// - /// - /// A that provides the logging function. - /// - protected Logger Log { - get { - return _log; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets a value indicating whether the service cleans up - /// the inactive sessions periodically. - /// - /// - /// The set operation does nothing if the service has already started or - /// it is shutting down. - /// - /// - /// true if the service cleans up the inactive sessions every 60 - /// seconds; otherwise, false. - /// - public bool KeepClean { - get { - return _sessions.KeepClean; - } - - set { - string msg; - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _sessions.KeepClean = value; - } - } - - /// - /// Gets the path to the service. - /// - /// - /// A that represents the absolute path to - /// the service. - /// - public string Path { - get { - return _path; - } - } - - /// - /// Gets the management function for the sessions in the service. - /// - /// - /// A that manages the sessions in - /// the service. - /// - public WebSocketSessionManager Sessions { - get { - return _sessions; - } - } - - /// - /// Gets the of the behavior of the service. - /// - /// - /// A that represents the type of the behavior of - /// the service. - /// - public abstract Type BehaviorType { get; } - - /// - /// Gets or sets the wait time for the response to the WebSocket Ping or - /// Close. - /// - /// - /// The set operation does nothing if the service has already started or - /// it is shutting down. - /// - /// - /// A that represents the wait time for - /// the response. - /// - /// - /// The value specified for a set operation is zero or less. - /// - public TimeSpan WaitTime { - get { - return _sessions.WaitTime; - } - - set { - string msg; - if (!value.CheckWaitTime (out msg)) - throw new ArgumentException (msg, "value"); - - if (!canSet (out msg)) { - _log.Warn (msg); - return; - } - - _sessions.WaitTime = value; - } - } - - #endregion - - #region Private Methods - - private bool canSet (out string message) - { - message = null; - - var state = _sessions.State; - if (state == ServerState.Start) { - message = "The service has already started."; - return false; - } - - if (state == ServerState.ShuttingDown) { - message = "The service is shutting down."; - return false; - } - - return true; - } - - #endregion - - #region Internal Methods - - internal void Start () - { - _sessions.Start (); - } - - internal void StartSession (WebSocketContext context) - { - CreateSession ().Start (context, _sessions); - } - - internal void Stop (ushort code, string reason) - { - _sessions.Stop (code, reason); - } - - #endregion - - #region Protected Methods - - /// - /// Creates a new session for the service. - /// - /// - /// A instance that represents - /// the new session. - /// - protected abstract WebSocketBehavior CreateSession (); - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs.meta deleted file mode 100644 index 5887f733a..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 6f4fa5c95028e7147bfa39187887b409 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs b/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs deleted file mode 100644 index d4ca6a2d1..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs +++ /dev/null @@ -1,102 +0,0 @@ -#region License -/* - * WebSocketServiceHost`1.cs - * - * The MIT License - * - * Copyright (c) 2015-2017 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp.Server -{ - internal class WebSocketServiceHost : WebSocketServiceHost - where TBehavior : WebSocketBehavior - { - #region Private Fields - - private Func _creator; - - #endregion - - #region Internal Constructors - - internal WebSocketServiceHost ( - string path, Func creator, Logger log - ) - : this (path, creator, null, log) - { - } - - internal WebSocketServiceHost ( - string path, - Func creator, - Action initializer, - Logger log - ) - : base (path, log) - { - _creator = createCreator (creator, initializer); - } - - #endregion - - #region Public Properties - - public override Type BehaviorType { - get { - return typeof (TBehavior); - } - } - - #endregion - - #region Private Methods - - private Func createCreator ( - Func creator, Action initializer - ) - { - if (initializer == null) - return creator; - - return () => { - var ret = creator (); - initializer (ret); - - return ret; - }; - } - - #endregion - - #region Protected Methods - - protected override WebSocketBehavior CreateSession () - { - return _creator (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs.meta deleted file mode 100644 index 5c776556c..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceHost`1.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 434cbdbcf15c3c145b035313e6ba1fe5 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs b/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs deleted file mode 100644 index c52998737..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs +++ /dev/null @@ -1,1009 +0,0 @@ -#region License -/* - * WebSocketServiceManager.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; -using WebSocketSharp.Net; - -namespace WebSocketSharp.Server -{ - /// - /// Provides the management function for the WebSocket services. - /// - /// - /// This class manages the WebSocket services provided by - /// the or . - /// - public class WebSocketServiceManager - { - #region Private Fields - - private volatile bool _clean; - private Dictionary _hosts; - private Logger _log; - private volatile ServerState _state; - private object _sync; - private TimeSpan _waitTime; - - #endregion - - #region Internal Constructors - - internal WebSocketServiceManager (Logger log) - { - _log = log; - - _clean = true; - _hosts = new Dictionary (); - _state = ServerState.Ready; - _sync = ((ICollection) _hosts).SyncRoot; - _waitTime = TimeSpan.FromSeconds (1); - } - - #endregion - - #region Public Properties - - /// - /// Gets the number of the WebSocket services. - /// - /// - /// An that represents the number of the services. - /// - public int Count { - get { - lock (_sync) - return _hosts.Count; - } - } - - /// - /// Gets the host instances for the WebSocket services. - /// - /// - /// - /// An IEnumerable<WebSocketServiceHost> instance. - /// - /// - /// It provides an enumerator which supports the iteration over - /// the collection of the host instances. - /// - /// - public IEnumerable Hosts { - get { - lock (_sync) - return _hosts.Values.ToList (); - } - } - - /// - /// Gets the host instance for a WebSocket service with - /// the specified . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// - /// A instance or - /// if not found. - /// - /// - /// That host instance provides the function to access - /// the information in the service. - /// - /// - /// - /// A that represents an absolute path to - /// the service to find. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - public WebSocketServiceHost this[string path] { - get { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - WebSocketServiceHost host; - InternalTryGetServiceHost (path, out host); - - return host; - } - } - - /// - /// Gets a value indicating whether the inactive sessions in - /// the WebSocket services are cleaned up periodically. - /// - /// - /// true if the inactive sessions in the services are - /// cleaned up every 60 seconds; otherwise, false. - /// - public bool KeepClean { - get { - return _clean; - } - - internal set { - lock (_sync) { - _clean = value; - - foreach (var host in _hosts.Values) - host.KeepClean = value; - } - } - } - - /// - /// Gets the paths for the WebSocket services. - /// - /// - /// - /// An IEnumerable<string> instance. - /// - /// - /// It provides an enumerator which supports the iteration over - /// the collection of the paths. - /// - /// - public IEnumerable Paths { - get { - lock (_sync) - return _hosts.Keys.ToList (); - } - } - - /// - /// Gets the total number of the sessions in the WebSocket services. - /// - /// - /// An that represents the total number of - /// the sessions in the services. - /// - [Obsolete ("This property will be removed.")] - public int SessionCount { - get { - var cnt = 0; - foreach (var host in Hosts) { - if (_state != ServerState.Start) - break; - - cnt += host.Sessions.Count; - } - - return cnt; - } - } - - /// - /// Gets the wait time for the response to the WebSocket Ping or Close. - /// - /// - /// A that represents the wait time for the response. - /// - public TimeSpan WaitTime { - get { - return _waitTime; - } - - internal set { - lock (_sync) { - _waitTime = value; - - foreach (var host in _hosts.Values) - host.WaitTime = value; - } - } - } - - #endregion - - #region Private Methods - - private void broadcast (Opcode opcode, byte[] data, Action completed) - { - var cache = new Dictionary (); - try { - foreach (var host in Hosts) { - if (_state != ServerState.Start) - break; - - host.Sessions.Broadcast (opcode, data, cache); - } - - if (completed != null) - completed (); - } - catch (Exception ex) { - _log.Error (ex.Message); - _log.Debug (ex.ToString ()); - } - finally { - cache.Clear (); - } - } - - private void broadcast (Opcode opcode, Stream stream, Action completed) - { - var cache = new Dictionary (); - try { - foreach (var host in Hosts) { - if (_state != ServerState.Start) - break; - - host.Sessions.Broadcast (opcode, stream, cache); - } - - if (completed != null) - completed (); - } - catch (Exception ex) { - _log.Error (ex.Message); - _log.Debug (ex.ToString ()); - } - finally { - foreach (var cached in cache.Values) - cached.Dispose (); - - cache.Clear (); - } - } - - private void broadcastAsync (Opcode opcode, byte[] data, Action completed) - { - ThreadPool.QueueUserWorkItem ( - state => broadcast (opcode, data, completed) - ); - } - - private void broadcastAsync (Opcode opcode, Stream stream, Action completed) - { - ThreadPool.QueueUserWorkItem ( - state => broadcast (opcode, stream, completed) - ); - } - - private Dictionary> broadping ( - byte[] frameAsBytes, TimeSpan timeout - ) - { - var ret = new Dictionary> (); - - foreach (var host in Hosts) { - if (_state != ServerState.Start) - break; - - ret.Add (host.Path, host.Sessions.Broadping (frameAsBytes, timeout)); - } - - return ret; - } - - #endregion - - #region Internal Methods - - internal void Add (string path, Func creator) - where TBehavior : WebSocketBehavior - { - path = HttpUtility.UrlDecode (path).TrimSlashFromEnd (); - - lock (_sync) { - WebSocketServiceHost host; - if (_hosts.TryGetValue (path, out host)) - throw new ArgumentException ("Already in use.", "path"); - - host = new WebSocketServiceHost ( - path, creator, null, _log - ); - - if (!_clean) - host.KeepClean = false; - - if (_waitTime != host.WaitTime) - host.WaitTime = _waitTime; - - if (_state == ServerState.Start) - host.Start (); - - _hosts.Add (path, host); - } - } - - internal bool InternalTryGetServiceHost ( - string path, out WebSocketServiceHost host - ) - { - path = HttpUtility.UrlDecode (path).TrimSlashFromEnd (); - - lock (_sync) - return _hosts.TryGetValue (path, out host); - } - - internal void Start () - { - lock (_sync) { - foreach (var host in _hosts.Values) - host.Start (); - - _state = ServerState.Start; - } - } - - internal void Stop (ushort code, string reason) - { - lock (_sync) { - _state = ServerState.ShuttingDown; - - foreach (var host in _hosts.Values) - host.Stop (code, reason); - - _state = ServerState.Stop; - } - } - - #endregion - - #region Public Methods - - /// - /// Adds a WebSocket service with the specified behavior, - /// , and . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// A that represents an absolute path to - /// the service to add. - /// - /// - /// - /// An Action<TBehavior> delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called for initializing - /// a new session instance for the service. - /// - /// - /// - /// The type of the behavior for the service. It must inherit - /// the class and it must have - /// a public parameterless constructor. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - /// -or- - /// - /// - /// is already in use. - /// - /// - public void AddService ( - string path, Action initializer - ) - where TBehavior : WebSocketBehavior, new () - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - path = HttpUtility.UrlDecode (path).TrimSlashFromEnd (); - - lock (_sync) { - WebSocketServiceHost host; - if (_hosts.TryGetValue (path, out host)) - throw new ArgumentException ("Already in use.", "path"); - - host = new WebSocketServiceHost ( - path, () => new TBehavior (), initializer, _log - ); - - if (!_clean) - host.KeepClean = false; - - if (_waitTime != host.WaitTime) - host.WaitTime = _waitTime; - - if (_state == ServerState.Start) - host.Start (); - - _hosts.Add (path, host); - } - } - - /// - /// Sends the specified to - /// every client in the WebSocket services. - /// - /// - /// An array of that represents - /// the binary data to send. - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - [Obsolete ("This method will be removed.")] - public void Broadcast (byte[] data) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - if (data.LongLength <= WebSocket.FragmentLength) - broadcast (Opcode.Binary, data, null); - else - broadcast (Opcode.Binary, new MemoryStream (data), null); - } - - /// - /// Sends the specified to - /// every client in the WebSocket services. - /// - /// - /// A that represents the text data to send. - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - [Obsolete ("This method will be removed.")] - public void Broadcast (string data) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - byte[] bytes; - if (!data.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "data"); - } - - if (bytes.LongLength <= WebSocket.FragmentLength) - broadcast (Opcode.Text, bytes, null); - else - broadcast (Opcode.Text, new MemoryStream (bytes), null); - } - - /// - /// Sends the specified asynchronously to - /// every client in the WebSocket services. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// An array of that represents - /// the binary data to send. - /// - /// - /// - /// An delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called when - /// the send is complete. - /// - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - [Obsolete ("This method will be removed.")] - public void BroadcastAsync (byte[] data, Action completed) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - if (data.LongLength <= WebSocket.FragmentLength) - broadcastAsync (Opcode.Binary, data, completed); - else - broadcastAsync (Opcode.Binary, new MemoryStream (data), completed); - } - - /// - /// Sends the specified asynchronously to - /// every client in the WebSocket services. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// A that represents the text data to send. - /// - /// - /// - /// An delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called when - /// the send is complete. - /// - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - [Obsolete ("This method will be removed.")] - public void BroadcastAsync (string data, Action completed) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - byte[] bytes; - if (!data.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "data"); - } - - if (bytes.LongLength <= WebSocket.FragmentLength) - broadcastAsync (Opcode.Text, bytes, completed); - else - broadcastAsync (Opcode.Text, new MemoryStream (bytes), completed); - } - - /// - /// Sends the specified of data from - /// the specified asynchronously to - /// every client in the WebSocket services. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// A from which to read the binary data to send. - /// - /// - /// An that specifies the number of bytes to - /// read and send. - /// - /// - /// - /// An delegate or - /// if not needed. - /// - /// - /// That delegate invokes the method called when - /// the send is complete. - /// - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - /// - /// - /// cannot be read. - /// - /// - /// -or- - /// - /// - /// is less than 1. - /// - /// - /// -or- - /// - /// - /// No data could be read from . - /// - /// - [Obsolete ("This method will be removed.")] - public void BroadcastAsync (Stream stream, int length, Action completed) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (stream == null) - throw new ArgumentNullException ("stream"); - - if (!stream.CanRead) - throw new ArgumentException ("It cannot be read.", "stream"); - - if (length < 1) - throw new ArgumentException ("It is less than 1.", "length"); - - var bytes = stream.ReadBytes (length); - - var len = bytes.Length; - if (len == 0) { - var msg = "No data could be read from it."; - throw new ArgumentException (msg, "stream"); - } - - if (len < length) { - _log.Warn ( - String.Format ( - "Only {0} byte(s) of data could be read from the specified stream.", - len - ) - ); - } - - if (len <= WebSocket.FragmentLength) - broadcastAsync (Opcode.Binary, bytes, completed); - else - broadcastAsync (Opcode.Binary, new MemoryStream (bytes), completed); - } - - /// - /// Sends a ping to every client in the WebSocket services. - /// - /// - /// - /// A Dictionary<string, Dictionary<string, bool>>. - /// - /// - /// It represents a collection of pairs of a service path and - /// another collection of pairs of a session ID and a value - /// indicating whether a pong has been received within a time - /// from its client. - /// - /// - /// - /// The current state of the manager is not Start. - /// - [Obsolete ("This method will be removed.")] - public Dictionary> Broadping () - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - return broadping (WebSocketFrame.EmptyPingBytes, _waitTime); - } - - /// - /// Sends a ping with the specified to - /// every client in the WebSocket services. - /// - /// - /// - /// A Dictionary<string, Dictionary<string, bool>>. - /// - /// - /// It represents a collection of pairs of a service path and - /// another collection of pairs of a session ID and a value - /// indicating whether a pong has been received within a time - /// from its client. - /// - /// - /// - /// A that represents a message to send. - /// The size must be 125 bytes or less in UTF-8. - /// - /// - /// The current state of the manager is not Start. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - /// - /// The size of is greater than 125 bytes. - /// - [Obsolete ("This method will be removed.")] - public Dictionary> Broadping (string message) - { - if (_state != ServerState.Start) { - var msg = "The current state of the manager is not Start."; - throw new InvalidOperationException (msg); - } - - if (message == null) - throw new ArgumentNullException ("message"); - - byte[] bytes; - if (!message.TryGetUTF8EncodedBytes (out bytes)) { - var msg = "It could not be UTF-8-encoded."; - throw new ArgumentException (msg, "message"); - } - - if (bytes.Length > 125) { - var msg = "Its size is greater than 125 bytes."; - throw new ArgumentOutOfRangeException ("message", msg); - } - - var frame = WebSocketFrame.CreatePingFrame (bytes, false); - return broadping (frame.ToArray (), _waitTime); - } - - /// - /// Removes all WebSocket services managed by the manager. - /// - /// - /// A service is stopped with close status 1001 (going away) - /// if it has already started. - /// - public void Clear () - { - List hosts = null; - - lock (_sync) { - hosts = _hosts.Values.ToList (); - _hosts.Clear (); - } - - foreach (var host in hosts) { - if (host.State == ServerState.Start) - host.Stop (1001, String.Empty); - } - } - - /// - /// Removes a WebSocket service with the specified . - /// - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// The service is stopped with close status 1001 (going away) - /// if it has already started. - /// - /// - /// - /// true if the service is successfully found and removed; - /// otherwise, false. - /// - /// - /// A that represents an absolute path to - /// the service to remove. - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - public bool RemoveService (string path) - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - path = HttpUtility.UrlDecode (path).TrimSlashFromEnd (); - - WebSocketServiceHost host; - lock (_sync) { - if (!_hosts.TryGetValue (path, out host)) - return false; - - _hosts.Remove (path); - } - - if (host.State == ServerState.Start) - host.Stop (1001, String.Empty); - - return true; - } - - /// - /// Tries to get the host instance for a WebSocket service with - /// the specified . - /// - /// - /// is converted to a URL-decoded string and - /// / is trimmed from the end of the converted string if any. - /// - /// - /// true if the service is successfully found; - /// otherwise, false. - /// - /// - /// A that represents an absolute path to - /// the service to find. - /// - /// - /// - /// When this method returns, a - /// instance or if not found. - /// - /// - /// That host instance provides the function to access - /// the information in the service. - /// - /// - /// - /// is . - /// - /// - /// - /// is empty. - /// - /// - /// -or- - /// - /// - /// is not an absolute path. - /// - /// - /// -or- - /// - /// - /// includes either or both - /// query and fragment components. - /// - /// - public bool TryGetServiceHost (string path, out WebSocketServiceHost host) - { - if (path == null) - throw new ArgumentNullException ("path"); - - if (path.Length == 0) - throw new ArgumentException ("An empty string.", "path"); - - if (path[0] != '/') - throw new ArgumentException ("Not an absolute path.", "path"); - - if (path.IndexOfAny (new[] { '?', '#' }) > -1) { - var msg = "It includes either or both query and fragment components."; - throw new ArgumentException (msg, "path"); - } - - return InternalTryGetServiceHost (path, out host); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs.meta deleted file mode 100644 index aaf76a60f..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketServiceManager.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 29334de1dbee6cd4b9f1090e353925b1 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs b/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs deleted file mode 100644 index 872b9b2a3..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs +++ /dev/null @@ -1,870 +0,0 @@ -#region License -/* - * WebSocketSessionManager.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; -using System.Timers; - -namespace WebSocketSharp.Server -{ - /// - /// Manages the sessions in a Websocket service. - /// - public class WebSocketSessionManager - { - #region Private Fields - - private volatile bool _clean; - private object _forSweep; - private Logger _logger; - private Dictionary _sessions; - private volatile ServerState _state; - private volatile bool _sweeping; - private System.Timers.Timer _sweepTimer; - private object _sync; - private TimeSpan _waitTime; - - #endregion - - #region Internal Constructors - - internal WebSocketSessionManager () - : this (new Logger ()) - { - } - - internal WebSocketSessionManager (Logger logger) - { - _logger = logger; - - _clean = true; - _forSweep = new object (); - _sessions = new Dictionary (); - _state = ServerState.Ready; - _sync = ((ICollection) _sessions).SyncRoot; - _waitTime = TimeSpan.FromSeconds (1); - - setSweepTimer (60000); - } - - #endregion - - #region Internal Properties - - internal ServerState State { - get { - return _state; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets the IDs for the active sessions in the Websocket service. - /// - /// - /// An IEnumerable<string> instance that provides an enumerator which - /// supports the iteration over the collection of the IDs for the active sessions. - /// - public IEnumerable ActiveIDs { - get { - foreach (var res in Broadping (WebSocketFrame.EmptyPingBytes, _waitTime)) - if (res.Value) - yield return res.Key; - } - } - - /// - /// Gets the number of the sessions in the Websocket service. - /// - /// - /// An that represents the number of the sessions. - /// - public int Count { - get { - lock (_sync) - return _sessions.Count; - } - } - - /// - /// Gets the IDs for the sessions in the Websocket service. - /// - /// - /// An IEnumerable<string> instance that provides an enumerator which - /// supports the iteration over the collection of the IDs for the sessions. - /// - public IEnumerable IDs { - get { - if (_state == ServerState.ShuttingDown) - return new string[0]; - - lock (_sync) - return _sessions.Keys.ToList (); - } - } - - /// - /// Gets the IDs for the inactive sessions in the Websocket service. - /// - /// - /// An IEnumerable<string> instance that provides an enumerator which - /// supports the iteration over the collection of the IDs for the inactive sessions. - /// - public IEnumerable InactiveIDs { - get { - foreach (var res in Broadping (WebSocketFrame.EmptyPingBytes, _waitTime)) - if (!res.Value) - yield return res.Key; - } - } - - /// - /// Gets the session with the specified . - /// - /// - /// A instance that provides the access to - /// the information in the session, or if it's not found. - /// - /// - /// A that represents the ID of the session to find. - /// - public IWebSocketSession this[string id] { - get { - IWebSocketSession session; - TryGetSession (id, out session); - - return session; - } - } - - /// - /// Gets a value indicating whether the manager cleans up the inactive sessions in - /// the WebSocket service periodically. - /// - /// - /// true if the manager cleans up the inactive sessions every 60 seconds; - /// otherwise, false. - /// - public bool KeepClean { - get { - return _clean; - } - - internal set { - if (!(value ^ _clean)) - return; - - _clean = value; - if (_state == ServerState.Start) - _sweepTimer.Enabled = value; - } - } - - /// - /// Gets the sessions in the Websocket service. - /// - /// - /// An IEnumerable<IWebSocketSession> instance that provides an enumerator - /// which supports the iteration over the collection of the sessions in the service. - /// - public IEnumerable Sessions { - get { - if (_state == ServerState.ShuttingDown) - return new IWebSocketSession[0]; - - lock (_sync) - return _sessions.Values.ToList (); - } - } - - /// - /// Gets the wait time for the response to the WebSocket Ping or Close. - /// - /// - /// A that represents the wait time. - /// - public TimeSpan WaitTime { - get { - return _waitTime; - } - - internal set { - if (value == _waitTime) - return; - - _waitTime = value; - foreach (var session in Sessions) - session.Context.WebSocket.WaitTime = value; - } - } - - #endregion - - #region Private Methods - - private void broadcast (Opcode opcode, byte[] data, Action completed) - { - var cache = new Dictionary (); - try { - Broadcast (opcode, data, cache); - if (completed != null) - completed (); - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - } - finally { - cache.Clear (); - } - } - - private void broadcast (Opcode opcode, Stream stream, Action completed) - { - var cache = new Dictionary (); - try { - Broadcast (opcode, stream, cache); - if (completed != null) - completed (); - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - } - finally { - foreach (var cached in cache.Values) - cached.Dispose (); - - cache.Clear (); - } - } - - private void broadcastAsync (Opcode opcode, byte[] data, Action completed) - { - ThreadPool.QueueUserWorkItem (state => broadcast (opcode, data, completed)); - } - - private void broadcastAsync (Opcode opcode, Stream stream, Action completed) - { - ThreadPool.QueueUserWorkItem (state => broadcast (opcode, stream, completed)); - } - - private static string createID () - { - return Guid.NewGuid ().ToString ("N"); - } - - private void setSweepTimer (double interval) - { - _sweepTimer = new System.Timers.Timer (interval); - _sweepTimer.Elapsed += (sender, e) => Sweep (); - } - - private void stop (PayloadData payloadData, bool send) - { - var bytes = send - ? WebSocketFrame.CreateCloseFrame (payloadData, false).ToArray () - : null; - - lock (_sync) { - _state = ServerState.ShuttingDown; - - _sweepTimer.Enabled = false; - foreach (var session in _sessions.Values.ToList ()) - session.Context.WebSocket.Close (payloadData, bytes); - - _state = ServerState.Stop; - } - } - - private bool tryGetSession (string id, out IWebSocketSession session) - { - bool ret; - lock (_sync) - ret = _sessions.TryGetValue (id, out session); - - if (!ret) - _logger.Error ("A session with the specified ID isn't found:\n ID: " + id); - - return ret; - } - - #endregion - - #region Internal Methods - - internal string Add (IWebSocketSession session) - { - lock (_sync) { - if (_state != ServerState.Start) - return null; - - var id = createID (); - _sessions.Add (id, session); - - return id; - } - } - - internal void Broadcast ( - Opcode opcode, byte[] data, Dictionary cache) - { - foreach (var session in Sessions) { - if (_state != ServerState.Start) - break; - - session.Context.WebSocket.Send (opcode, data, cache); - } - } - - internal void Broadcast ( - Opcode opcode, Stream stream, Dictionary cache) - { - foreach (var session in Sessions) { - if (_state != ServerState.Start) - break; - - session.Context.WebSocket.Send (opcode, stream, cache); - } - } - - internal Dictionary Broadping (byte[] frameAsBytes, TimeSpan timeout) - { - var ret = new Dictionary (); - foreach (var session in Sessions) { - if (_state != ServerState.Start) - break; - - ret.Add (session.ID, session.Context.WebSocket.Ping (frameAsBytes, timeout)); - } - - return ret; - } - - internal bool Remove (string id) - { - lock (_sync) - return _sessions.Remove (id); - } - - internal void Start () - { - lock (_sync) { - _sweepTimer.Enabled = _clean; - _state = ServerState.Start; - } - } - - internal void Stop (ushort code, string reason) - { - if (code == 1005) { // == no status - stop (PayloadData.Empty, true); - return; - } - - stop (new PayloadData (code, reason), !code.IsReserved ()); - } - - #endregion - - #region Public Methods - - /// - /// Sends binary to every client in the WebSocket service. - /// - /// - /// An array of that represents the binary data to send. - /// - public void Broadcast (byte[] data) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckSendParameter (data); - - if (msg != null) { - _logger.Error (msg); - return; - } - - if (data.LongLength <= WebSocket.FragmentLength) - broadcast (Opcode.Binary, data, null); - else - broadcast (Opcode.Binary, new MemoryStream (data), null); - } - - /// - /// Sends text to every client in the WebSocket service. - /// - /// - /// A that represents the text data to send. - /// - public void Broadcast (string data) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckSendParameter (data); - - if (msg != null) { - _logger.Error (msg); - return; - } - - var bytes = data.UTF8Encode (); - if (bytes.LongLength <= WebSocket.FragmentLength) - broadcast (Opcode.Text, bytes, null); - else - broadcast (Opcode.Text, new MemoryStream (bytes), null); - } - - /// - /// Sends binary asynchronously to every client in - /// the WebSocket service. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// An delegate that references the method(s) called when - /// the send is complete. - /// - public void BroadcastAsync (byte[] data, Action completed) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckSendParameter (data); - - if (msg != null) { - _logger.Error (msg); - return; - } - - if (data.LongLength <= WebSocket.FragmentLength) - broadcastAsync (Opcode.Binary, data, completed); - else - broadcastAsync (Opcode.Binary, new MemoryStream (data), completed); - } - - /// - /// Sends text asynchronously to every client in - /// the WebSocket service. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// A that represents the text data to send. - /// - /// - /// An delegate that references the method(s) called when - /// the send is complete. - /// - public void BroadcastAsync (string data, Action completed) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckSendParameter (data); - - if (msg != null) { - _logger.Error (msg); - return; - } - - var bytes = data.UTF8Encode (); - if (bytes.LongLength <= WebSocket.FragmentLength) - broadcastAsync (Opcode.Text, bytes, completed); - else - broadcastAsync (Opcode.Text, new MemoryStream (bytes), completed); - } - - /// - /// Sends binary data from the specified asynchronously to - /// every client in the WebSocket service. - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// A from which contains the binary data to send. - /// - /// - /// An that represents the number of bytes to send. - /// - /// - /// An delegate that references the method(s) called when - /// the send is complete. - /// - public void BroadcastAsync (Stream stream, int length, Action completed) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckSendParameters (stream, length); - - if (msg != null) { - _logger.Error (msg); - return; - } - - stream.ReadBytesAsync ( - length, - data => { - var len = data.Length; - if (len == 0) { - _logger.Error ("The data cannot be read from 'stream'."); - return; - } - - if (len < length) - _logger.Warn ( - String.Format ( - "The data with 'length' cannot be read from 'stream':\n expected: {0}\n actual: {1}", - length, - len)); - - if (len <= WebSocket.FragmentLength) - broadcast (Opcode.Binary, data, completed); - else - broadcast (Opcode.Binary, new MemoryStream (data), completed); - }, - ex => _logger.Fatal (ex.ToString ())); - } - - /// - /// Sends a Ping to every client in the WebSocket service. - /// - /// - /// A Dictionary<string, bool> that contains a collection of pairs of - /// a session ID and a value indicating whether the manager received a Pong from - /// each client in a time. - /// - public Dictionary Broadping () - { - var msg = _state.CheckIfAvailable (false, true, false); - if (msg != null) { - _logger.Error (msg); - return null; - } - - return Broadping (WebSocketFrame.EmptyPingBytes, _waitTime); - } - - /// - /// Sends a Ping with the specified to every client in - /// the WebSocket service. - /// - /// - /// A Dictionary<string, bool> that contains a collection of pairs of - /// a session ID and a value indicating whether the manager received a Pong from - /// each client in a time. - /// - /// - /// A that represents the message to send. - /// - public Dictionary Broadping (string message) - { - if (message == null || message.Length == 0) - return Broadping (); - - byte[] data = null; - var msg = _state.CheckIfAvailable (false, true, false) ?? - WebSocket.CheckPingParameter (message, out data); - - if (msg != null) { - _logger.Error (msg); - return null; - } - - return Broadping (WebSocketFrame.CreatePingFrame (data, false).ToArray (), _waitTime); - } - - /// - /// Closes the session with the specified . - /// - /// - /// A that represents the ID of the session to close. - /// - public void CloseSession (string id) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.Close (); - } - - /// - /// Closes the session with the specified , , - /// and . - /// - /// - /// A that represents the ID of the session to close. - /// - /// - /// A that represents the status code indicating the reason for the close. - /// - /// - /// A that represents the reason for the close. - /// - public void CloseSession (string id, ushort code, string reason) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.Close (code, reason); - } - - /// - /// Closes the session with the specified , , - /// and . - /// - /// - /// A that represents the ID of the session to close. - /// - /// - /// One of the enum values, represents the status code - /// indicating the reason for the close. - /// - /// - /// A that represents the reason for the close. - /// - public void CloseSession (string id, CloseStatusCode code, string reason) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.Close (code, reason); - } - - /// - /// Sends a Ping to the client on the session with the specified . - /// - /// - /// true if the manager receives a Pong from the client in a time; - /// otherwise, false. - /// - /// - /// A that represents the ID of the session to find. - /// - public bool PingTo (string id) - { - IWebSocketSession session; - return TryGetSession (id, out session) && session.Context.WebSocket.Ping (); - } - - /// - /// Sends a Ping with the specified to the client on - /// the session with the specified . - /// - /// - /// true if the manager receives a Pong from the client in a time; - /// otherwise, false. - /// - /// - /// A that represents the message to send. - /// - /// - /// A that represents the ID of the session to find. - /// - public bool PingTo (string message, string id) - { - IWebSocketSession session; - return TryGetSession (id, out session) && session.Context.WebSocket.Ping (message); - } - - /// - /// Sends binary to the client on the session with - /// the specified . - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// A that represents the ID of the session to find. - /// - public void SendTo (byte[] data, string id) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.Send (data); - } - - /// - /// Sends text to the client on the session with - /// the specified . - /// - /// - /// A that represents the text data to send. - /// - /// - /// A that represents the ID of the session to find. - /// - public void SendTo (string data, string id) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.Send (data); - } - - /// - /// Sends binary asynchronously to the client on - /// the session with the specified . - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// A that represents the ID of the session to find. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - public void SendToAsync (byte[] data, string id, Action completed) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.SendAsync (data, completed); - } - - /// - /// Sends text asynchronously to the client on - /// the session with the specified . - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// A that represents the text data to send. - /// - /// - /// A that represents the ID of the session to find. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - public void SendToAsync (string data, string id, Action completed) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.SendAsync (data, completed); - } - - /// - /// Sends binary data from the specified asynchronously to - /// the client on the session with the specified . - /// - /// - /// This method doesn't wait for the send to be complete. - /// - /// - /// A from which contains the binary data to send. - /// - /// - /// An that represents the number of bytes to send. - /// - /// - /// A that represents the ID of the session to find. - /// - /// - /// An Action<bool> delegate that references the method(s) called when - /// the send is complete. A passed to this delegate is true - /// if the send is complete successfully. - /// - public void SendToAsync (Stream stream, int length, string id, Action completed) - { - IWebSocketSession session; - if (TryGetSession (id, out session)) - session.Context.WebSocket.SendAsync (stream, length, completed); - } - - /// - /// Cleans up the inactive sessions in the WebSocket service. - /// - public void Sweep () - { - if (_state != ServerState.Start || _sweeping || Count == 0) - return; - - lock (_forSweep) { - _sweeping = true; - foreach (var id in InactiveIDs) { - if (_state != ServerState.Start) - break; - - lock (_sync) { - IWebSocketSession session; - if (_sessions.TryGetValue (id, out session)) { - var state = session.State; - if (state == WebSocketState.Open) - session.Context.WebSocket.Close (CloseStatusCode.ProtocolError); - else if (state == WebSocketState.Closing) - continue; - else - _sessions.Remove (id); - } - } - } - - _sweeping = false; - } - } - - /// - /// Tries to get the session with the specified . - /// - /// - /// true if the session is successfully found; otherwise, false. - /// - /// - /// A that represents the ID of the session to find. - /// - /// - /// When this method returns, a instance that - /// provides the access to the information in the session, or - /// if it's not found. This parameter is passed uninitialized. - /// - public bool TryGetSession (string id, out IWebSocketSession session) - { - var msg = _state.CheckIfAvailable (false, true, false) ?? id.CheckIfValidSessionID (); - if (msg != null) { - _logger.Error (msg); - session = null; - - return false; - } - - return tryGetSession (id, out session); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs.meta b/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs.meta deleted file mode 100644 index c323dcea0..000000000 --- a/ThirdParty/WebSocketSharp/Server/WebSocketSessionManager.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 43b699475fa8ca44d86aa04714ac2302 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/WebSocket.cs b/ThirdParty/WebSocketSharp/WebSocket.cs deleted file mode 100644 index cddd220c8..000000000 --- a/ThirdParty/WebSocketSharp/WebSocket.cs +++ /dev/null @@ -1,3380 +0,0 @@ -#region License -/* - * WebSocket.cs - * - * A C# implementation of the WebSocket interface. - * - * This code is derived from WebSocket.java - * (http://github.com/adamac/Java-WebSocket-client). - * - * The MIT License - * - * Copyright (c) 2009 Adam MacBeth - * Copyright (c) 2010-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Frank Razenberg - * - David Wood - * - Liryna - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics; -using System.IO; -using System.Net.Security; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Text; -using System.Threading; -using WebSocketSharp.Net; -using WebSocketSharp.Net.WebSockets; - -namespace WebSocketSharp -{ - /// - /// Implements the WebSocket interface. - /// - /// - /// The WebSocket class provides a set of methods and properties for two-way communication using - /// the WebSocket protocol (RFC 6455). - /// - public class WebSocket : IDisposable - { - #region Private Fields - - private AuthenticationChallenge _authChallenge; - private string _base64Key; - private bool _client; - private Action _closeContext; - private CompressionMethod _compression; - private WebSocketContext _context; - private CookieCollection _cookies; - private NetworkCredential _credentials; - private bool _emitOnPing; - private bool _enableRedirection; - private string _extensions; - private bool _extensionsRequested; - private object _forMessageEventQueue; - private object _forPing; - private object _forSend; - private object _forState; - private MemoryStream _fragmentsBuffer; - private bool _fragmentsCompressed; - private Opcode _fragmentsOpcode; - private const string _guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - private Func _handshakeRequestChecker; - private bool _ignoreExtensions; - private bool _inContinuation; - private volatile bool _inMessage; - private volatile Logger _logger; - private static readonly int _maxRetryCountForConnect; - private Action _message; - private Queue _messageEventQueue; - private uint _nonceCount; - private string _origin; - private ManualResetEvent _pongReceived; - private bool _preAuth; - private string _protocol; - private string[] _protocols; - private bool _protocolsRequested; - private NetworkCredential _proxyCredentials; - private Uri _proxyUri; - private volatile WebSocketState _readyState; - private ManualResetEvent _receivingExited; - private int _retryCountForConnect; - private bool _secure; - private ClientSslConfiguration _sslConfig; - private Stream _stream; - private TcpClient _tcpClient; - private Uri _uri; - private const string _version = "13"; - private TimeSpan _waitTime; - - #endregion - - #region Internal Fields - - /// - /// Represents the empty array of used internally. - /// - internal static readonly byte[] EmptyBytes; - - /// - /// Represents the length used to determine whether the data should be fragmented in sending. - /// - /// - /// - /// The data will be fragmented if that length is greater than the value of this field. - /// - /// - /// If you would like to change the value, you must set it to a value between 125 and - /// Int32.MaxValue - 14 inclusive. - /// - /// - internal static readonly int FragmentLength; - - /// - /// Represents the random number generator used internally. - /// - internal static readonly RandomNumberGenerator RandomNumber; - - #endregion - - #region Static Constructor - - static WebSocket () - { - _maxRetryCountForConnect = 10; - EmptyBytes = new byte[0]; - FragmentLength = 1016; - RandomNumber = new RNGCryptoServiceProvider (); - } - - #endregion - - #region Internal Constructors - - // As server - internal WebSocket (HttpListenerWebSocketContext context, string protocol) - { - _context = context; - _protocol = protocol; - - _closeContext = context.Close; - _logger = context.Log; - _message = messages; - _secure = context.IsSecureConnection; - _stream = context.Stream; - _waitTime = TimeSpan.FromSeconds (1); - - init (); - } - - // As server - internal WebSocket (TcpListenerWebSocketContext context, string protocol) - { - _context = context; - _protocol = protocol; - - _closeContext = context.Close; - _logger = context.Log; - _message = messages; - _secure = context.IsSecureConnection; - _stream = context.Stream; - _waitTime = TimeSpan.FromSeconds (1); - - init (); - } - - #endregion - - #region Public Constructors - - /// - /// Initializes a new instance of the class with - /// the specified WebSocket URL and subprotocols. - /// - /// - /// A that represents the WebSocket URL to connect. - /// - /// - /// An array of that contains the WebSocket subprotocols if any. - /// Each value of must be a token defined in - /// RFC 2616. - /// - /// - /// is . - /// - /// - /// - /// is invalid. - /// - /// - /// -or- - /// - /// - /// is invalid. - /// - /// - public WebSocket (string url, params string[] protocols) - { - if (url == null) - throw new ArgumentNullException ("url"); - - if (url.Length == 0) - throw new ArgumentException ("An empty string.", "url"); - - string msg; - if (!url.TryCreateWebSocketUri (out _uri, out msg)) - throw new ArgumentException (msg, "url"); - - if (protocols != null && protocols.Length > 0) { - msg = protocols.CheckIfValidProtocols (); - if (msg != null) - throw new ArgumentException (msg, "protocols"); - - _protocols = protocols; - } - - _base64Key = CreateBase64Key (); - _client = true; - _logger = new Logger (); - _message = messagec; - _secure = _uri.Scheme == "wss"; - _waitTime = TimeSpan.FromSeconds (5); - - init (); - } - - #endregion - - #region Internal Properties - - internal CookieCollection CookieCollection { - get { - return _cookies; - } - } - - // As server - internal Func CustomHandshakeRequestChecker { - get { - return _handshakeRequestChecker; - } - - set { - _handshakeRequestChecker = value; - } - } - - internal bool HasMessage { - get { - lock (_forMessageEventQueue) - return _messageEventQueue.Count > 0; - } - } - - // As server - internal bool IgnoreExtensions { - get { - return _ignoreExtensions; - } - - set { - _ignoreExtensions = value; - } - } - - internal bool IsConnected { - get { - return _readyState == WebSocketState.Open || _readyState == WebSocketState.Closing; - } - } - - #endregion - - #region Public Properties - - /// - /// Gets or sets the compression method used to compress a message on - /// the WebSocket connection. - /// - /// - /// One of the enum values that specifies - /// the compression method used to compress a message. The default value is - /// . - /// - public CompressionMethod Compression { - get { - return _compression; - } - - set { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the compression.", null); - - return; - } - - lock (_forState) { - if (!checkIfAvailable (true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the compression.", null); - - return; - } - - _compression = value; - } - } - } - - /// - /// Gets the HTTP cookies included in the WebSocket handshake request and response. - /// - /// - /// An - /// instance that provides an enumerator which supports the iteration over the collection of - /// the cookies. - /// - public IEnumerable Cookies { - get { - lock (_cookies.SyncRoot) - foreach (Cookie cookie in _cookies) - yield return cookie; - } - } - - /// - /// Gets the credentials for the HTTP authentication (Basic/Digest). - /// - /// - /// A that represents the credentials for - /// the authentication. The default value is . - /// - public NetworkCredential Credentials { - get { - return _credentials; - } - } - - /// - /// Gets or sets a value indicating whether the emits - /// a event when receives a ping. - /// - /// - /// true if the emits a event - /// when receives a ping; otherwise, false. The default value is false. - /// - public bool EmitOnPing { - get { - return _emitOnPing; - } - - set { - _emitOnPing = value; - } - } - - /// - /// Gets or sets a value indicating whether the redirects - /// the handshake request to the new URL located in the handshake response. - /// - /// - /// true if the redirects the handshake request to - /// the new URL; otherwise, false. The default value is false. - /// - public bool EnableRedirection { - get { - return _enableRedirection; - } - - set { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the enable redirection.", null); - - return; - } - - _enableRedirection = value; - } - } - } - - /// - /// Gets the WebSocket extensions selected by the server. - /// - /// - /// A that represents the extensions if any. - /// The default value is . - /// - public string Extensions { - get { - return _extensions ?? String.Empty; - } - } - - /// - /// Gets a value indicating whether the WebSocket connection is alive. - /// - /// - /// true if the connection is alive; otherwise, false. - /// - public bool IsAlive { - get { - return ping (EmptyBytes); - } - } - - /// - /// Gets a value indicating whether the WebSocket connection is secure. - /// - /// - /// true if the connection is secure; otherwise, false. - /// - public bool IsSecure { - get { - return _secure; - } - } - - /// - /// Gets the logging functions. - /// - /// - /// The default logging level is . If you would like to change it, - /// you should set this Log.Level property to any of the enum - /// values. - /// - /// - /// A that provides the logging functions. - /// - public Logger Log { - get { - return _logger; - } - - internal set { - _logger = value; - } - } - - /// - /// Gets or sets the value of the HTTP Origin header to send with - /// the WebSocket handshake request to the server. - /// - /// - /// The sends the Origin header if this property has any. - /// - /// - /// - /// A that represents the value of - /// the Origin header to send. - /// The default value is . - /// - /// - /// The Origin header has the following syntax: - /// <scheme>://<host>[:<port>] - /// - /// - public string Origin { - get { - return _origin; - } - - set { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the origin.", null); - - return; - } - - if (value.IsNullOrEmpty ()) { - _origin = value; - return; - } - - Uri origin; - if (!Uri.TryCreate (value, UriKind.Absolute, out origin) || origin.Segments.Length > 1) { - _logger.Error ("The syntax of an origin must be '://[:]'."); - error ("An error has occurred in setting the origin.", null); - - return; - } - - _origin = value.TrimEnd ('/'); - } - } - } - - /// - /// Gets the WebSocket subprotocol selected by the server. - /// - /// - /// A that represents the subprotocol if any. - /// The default value is . - /// - public string Protocol { - get { - return _protocol ?? String.Empty; - } - - internal set { - _protocol = value; - } - } - - /// - /// Gets the state of the WebSocket connection. - /// - /// - /// One of the enum values that indicates - /// the current state of the connection. The default value is - /// . - /// - public WebSocketState ReadyState { - get { - return _readyState; - } - } - - /// - /// Gets or sets the SSL configuration used to authenticate the server and - /// optionally the client for secure connection. - /// - /// - /// A that represents the configuration used - /// to authenticate the server and optionally the client for secure connection, - /// or if the is used in a server. - /// - public ClientSslConfiguration SslConfiguration { - get { - return _client - ? (_sslConfig ?? (_sslConfig = new ClientSslConfiguration (_uri.DnsSafeHost))) - : null; - } - - set { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the ssl configuration.", null); - - return; - } - - _sslConfig = value; - } - } - } - - /// - /// Gets the WebSocket URL used to connect, or accepted. - /// - /// - /// A that represents the URL used to connect, or accepted. - /// - public Uri Url { - get { - return _client ? _uri : _context.RequestUri; - } - } - - /// - /// Gets or sets the wait time for the response to the Ping or Close. - /// - /// - /// A that represents the wait time. The default value is the same as - /// 5 seconds, or 1 second if the is used in a server. - /// - public TimeSpan WaitTime { - get { - return _waitTime; - } - - set { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, true, true, false, false, true, out msg) - || !value.CheckWaitTime (out msg) - ) { - _logger.Error (msg); - error ("An error has occurred in setting the wait time.", null); - - return; - } - - _waitTime = value; - } - } - } - - #endregion - - #region Public Events - - /// - /// Occurs when the WebSocket connection has been closed. - /// - public event EventHandler OnClose; - - /// - /// Occurs when the gets an error. - /// - public event EventHandler OnError; - - /// - /// Occurs when the receives a message. - /// - public event EventHandler OnMessage; - - /// - /// Occurs when the WebSocket connection has been established. - /// - public event EventHandler OnOpen; - - #endregion - - #region Private Methods - - // As server - private bool accept () - { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, false, false, false, out msg)) { - _logger.Error (msg); - error ("An error has occurred in accepting.", null); - - return false; - } - - try { - if (!acceptHandshake ()) - return false; - - _readyState = WebSocketState.Open; - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - fatal ("An exception has occurred while accepting.", ex); - - return false; - } - - return true; - } - } - - // As server - private bool acceptHandshake () - { - _logger.Debug (String.Format ("A request from {0}:\n{1}", _context.UserEndPoint, _context)); - - string msg; - if (!checkHandshakeRequest (_context, out msg)) { - sendHttpResponse (createHandshakeFailureResponse (HttpStatusCode.BadRequest)); - - _logger.Fatal (msg); - fatal ("An error has occurred while accepting.", CloseStatusCode.ProtocolError); - - return false; - } - - if (!customCheckHandshakeRequest (_context, out msg)) { - sendHttpResponse (createHandshakeFailureResponse (HttpStatusCode.BadRequest)); - - _logger.Fatal (msg); - fatal ("An error has occurred while accepting.", CloseStatusCode.PolicyViolation); - - return false; - } - - _base64Key = _context.Headers["Sec-WebSocket-Key"]; - - if (_protocol != null) - processSecWebSocketProtocolHeader (_context.SecWebSocketProtocols); - - if (!_ignoreExtensions) - processSecWebSocketExtensionsClientHeader (_context.Headers["Sec-WebSocket-Extensions"]); - - return sendHttpResponse (createHandshakeResponse ()); - } - - // As server - private bool checkHandshakeRequest (WebSocketContext context, out string message) - { - message = null; - - if (context.RequestUri == null) { - message = "Specifies an invalid Request-URI."; - return false; - } - - if (!context.IsWebSocketRequest) { - message = "Not a WebSocket handshake request."; - return false; - } - - var headers = context.Headers; - if (!validateSecWebSocketKeyHeader (headers["Sec-WebSocket-Key"])) { - message = "Includes no Sec-WebSocket-Key header, or it has an invalid value."; - return false; - } - - if (!validateSecWebSocketVersionClientHeader (headers["Sec-WebSocket-Version"])) { - message = "Includes no Sec-WebSocket-Version header, or it has an invalid value."; - return false; - } - - if (!validateSecWebSocketProtocolClientHeader (headers["Sec-WebSocket-Protocol"])) { - message = "Includes an invalid Sec-WebSocket-Protocol header."; - return false; - } - - if (!_ignoreExtensions - && !validateSecWebSocketExtensionsClientHeader (headers["Sec-WebSocket-Extensions"]) - ) { - message = "Includes an invalid Sec-WebSocket-Extensions header."; - return false; - } - - return true; - } - - // As client - private bool checkHandshakeResponse (HttpResponse response, out string message) - { - message = null; - - if (response.IsRedirect) { - message = "Indicates the redirection."; - return false; - } - - if (response.IsUnauthorized) { - message = "Requires the authentication."; - return false; - } - - if (!response.IsWebSocketResponse) { - message = "Not a WebSocket handshake response."; - return false; - } - - var headers = response.Headers; - if (!validateSecWebSocketAcceptHeader (headers["Sec-WebSocket-Accept"])) { - message = "Includes no Sec-WebSocket-Accept header, or it has an invalid value."; - return false; - } - - if (!validateSecWebSocketProtocolServerHeader (headers["Sec-WebSocket-Protocol"])) { - message = "Includes no Sec-WebSocket-Protocol header, or it has an invalid value."; - return false; - } - - if (!validateSecWebSocketExtensionsServerHeader (headers["Sec-WebSocket-Extensions"])) { - message = "Includes an invalid Sec-WebSocket-Extensions header."; - return false; - } - - if (!validateSecWebSocketVersionServerHeader (headers["Sec-WebSocket-Version"])) { - message = "Includes an invalid Sec-WebSocket-Version header."; - return false; - } - - return true; - } - - private bool checkIfAvailable ( - bool connecting, bool open, bool closing, bool closed, out string message - ) - { - message = null; - - if (!connecting && _readyState == WebSocketState.Connecting) { - message = "This operation is not available in: connecting"; - return false; - } - - if (!open && _readyState == WebSocketState.Open) { - message = "This operation is not available in: open"; - return false; - } - - if (!closing && _readyState == WebSocketState.Closing) { - message = "This operation is not available in: closing"; - return false; - } - - if (!closed && _readyState == WebSocketState.Closed) { - message = "This operation is not available in: closed"; - return false; - } - - return true; - } - - private bool checkIfAvailable ( - bool client, - bool server, - bool connecting, - bool open, - bool closing, - bool closed, - out string message - ) - { - message = null; - - if (!client && _client) { - message = "This operation is not available in: client"; - return false; - } - - if (!server && !_client) { - message = "This operation is not available in: server"; - return false; - } - - return checkIfAvailable (connecting, open, closing, closed, out message); - } - - private static bool checkParametersForSetCredentials ( - string username, string password, out string message - ) - { - message = null; - - if (username.IsNullOrEmpty ()) - return true; - - if (username.Contains (':') || !username.IsText ()) { - message = "'username' contains an invalid character."; - return false; - } - - if (password.IsNullOrEmpty ()) - return true; - - if (!password.IsText ()) { - message = "'password' contains an invalid character."; - return false; - } - - return true; - } - - private static bool checkParametersForSetProxy ( - string url, string username, string password, out string message - ) - { - message = null; - - if (url.IsNullOrEmpty ()) - return true; - - Uri uri; - if (!Uri.TryCreate (url, UriKind.Absolute, out uri) - || uri.Scheme != "http" - || uri.Segments.Length > 1 - ) { - message = "'url' is an invalid URL."; - return false; - } - - if (username.IsNullOrEmpty ()) - return true; - - if (username.Contains (':') || !username.IsText ()) { - message = "'username' contains an invalid character."; - return false; - } - - if (password.IsNullOrEmpty ()) - return true; - - if (!password.IsText ()) { - message = "'password' contains an invalid character."; - return false; - } - - return true; - } - - private bool checkReceivedFrame (WebSocketFrame frame, out string message) - { - message = null; - - var masked = frame.IsMasked; - if (_client && masked) { - message = "A frame from the server is masked."; - return false; - } - - if (!_client && !masked) { - message = "A frame from a client is not masked."; - return false; - } - - if (_inContinuation && frame.IsData) { - message = "A data frame has been received while receiving continuation frames."; - return false; - } - - if (frame.IsCompressed && _compression == CompressionMethod.None) { - message = "A compressed frame has been received without any agreement for it."; - return false; - } - - if (frame.Rsv2 == Rsv.On) { - message = "The RSV2 of a frame is non-zero without any negotiation for it."; - return false; - } - - if (frame.Rsv3 == Rsv.On) { - message = "The RSV3 of a frame is non-zero without any negotiation for it."; - return false; - } - - return true; - } - - private void close (ushort code, string reason) - { - if (_readyState == WebSocketState.Closing) { - _logger.Info ("The closing is already in progress."); - return; - } - - if (_readyState == WebSocketState.Closed) { - _logger.Info ("The connection has already been closed."); - return; - } - - if (code == 1005) { // == no status - close (PayloadData.Empty, true, true, false); - return; - } - - var send = !code.IsReserved (); - close (new PayloadData (code, reason), send, send, false); - } - - private void close ( - PayloadData payloadData, bool send, bool receive, bool received - ) - { - lock (_forState) { - if (_readyState == WebSocketState.Closing) { - _logger.Info ("The closing is already in progress."); - return; - } - - if (_readyState == WebSocketState.Closed) { - _logger.Info ("The connection has already been closed."); - return; - } - - send = send && _readyState == WebSocketState.Open; - receive = send && receive; - - _readyState = WebSocketState.Closing; - } - - _logger.Trace ("Begin closing the connection."); - - var res = closeHandshake (payloadData, send, receive, received); - releaseResources (); - - _logger.Trace ("End closing the connection."); - - _readyState = WebSocketState.Closed; - - var e = new CloseEventArgs (payloadData); - e.WasClean = res; - - try { - OnClose.Emit (this, e); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ("An error has occurred during the OnClose event.", ex); - } - } - - private void closeAsync (ushort code, string reason) - { - if (_readyState == WebSocketState.Closing) { - _logger.Info ("The closing is already in progress."); - return; - } - - if (_readyState == WebSocketState.Closed) { - _logger.Info ("The connection has already been closed."); - return; - } - - if (code == 1005) { // == no status - closeAsync (PayloadData.Empty, true, true, false); - return; - } - - var send = !code.IsReserved (); - closeAsync (new PayloadData (code, reason), send, send, false); - } - - private void closeAsync ( - PayloadData payloadData, bool send, bool receive, bool received - ) - { - Action closer = close; - closer.BeginInvoke ( - payloadData, send, receive, received, ar => closer.EndInvoke (ar), null - ); - } - - private bool closeHandshake (byte[] frameAsBytes, bool receive, bool received) - { - var sent = frameAsBytes != null && sendBytes (frameAsBytes); - - var wait = !received && sent && receive && _receivingExited != null; - if (wait) - received = _receivingExited.WaitOne (_waitTime); - - var ret = sent && received; - - _logger.Debug ( - String.Format ( - "Was clean?: {0}\n sent: {1}\n received: {2}", ret, sent, received - ) - ); - - return ret; - } - - private bool closeHandshake ( - PayloadData payloadData, bool send, bool receive, bool received - ) - { - var sent = false; - if (send) { - var frame = WebSocketFrame.CreateCloseFrame (payloadData, _client); - sent = sendBytes (frame.ToArray ()); - - if (_client) - frame.Unmask (); - } - - var wait = !received && sent && receive && _receivingExited != null; - if (wait) - received = _receivingExited.WaitOne (_waitTime); - - var ret = sent && received; - - _logger.Debug ( - String.Format ( - "Was clean?: {0}\n sent: {1}\n received: {2}", ret, sent, received - ) - ); - - return ret; - } - - // As client - private bool connect () - { - lock (_forState) { - string msg; - if (!checkIfAvailable (true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in connecting.", null); - - return false; - } - - if (_retryCountForConnect > _maxRetryCountForConnect) { - _retryCountForConnect = 0; - _logger.Fatal ("A series of reconnecting has failed."); - - return false; - } - - _readyState = WebSocketState.Connecting; - - try { - doHandshake (); - } - catch (Exception ex) { - _retryCountForConnect++; - _logger.Fatal (ex.ToString ()); - fatal ("An exception has occurred while connecting.", ex); - - return false; - } - - _retryCountForConnect = 1; - _readyState = WebSocketState.Open; - - return true; - } - } - - // As client - private string createExtensions () - { - var buff = new StringBuilder (80); - - if (_compression != CompressionMethod.None) { - var str = _compression.ToExtensionString ( - "server_no_context_takeover", "client_no_context_takeover"); - - buff.AppendFormat ("{0}, ", str); - } - - var len = buff.Length; - if (len > 2) { - buff.Length = len - 2; - return buff.ToString (); - } - - return null; - } - - // As server - private HttpResponse createHandshakeFailureResponse (HttpStatusCode code) - { - var ret = HttpResponse.CreateCloseResponse (code); - ret.Headers["Sec-WebSocket-Version"] = _version; - - return ret; - } - - // As client - private HttpRequest createHandshakeRequest () - { - var ret = HttpRequest.CreateWebSocketRequest (_uri); - - var headers = ret.Headers; - if (!_origin.IsNullOrEmpty ()) - headers["Origin"] = _origin; - - headers["Sec-WebSocket-Key"] = _base64Key; - - _protocolsRequested = _protocols != null; - if (_protocolsRequested) - headers["Sec-WebSocket-Protocol"] = _protocols.ToString (", "); - - _extensionsRequested = _compression != CompressionMethod.None; - if (_extensionsRequested) - headers["Sec-WebSocket-Extensions"] = createExtensions (); - - headers["Sec-WebSocket-Version"] = _version; - - AuthenticationResponse authRes = null; - if (_authChallenge != null && _credentials != null) { - authRes = new AuthenticationResponse (_authChallenge, _credentials, _nonceCount); - _nonceCount = authRes.NonceCount; - } - else if (_preAuth) { - authRes = new AuthenticationResponse (_credentials); - } - - if (authRes != null) - headers["Authorization"] = authRes.ToString (); - - if (_cookies.Count > 0) - ret.SetCookies (_cookies); - - return ret; - } - - // As server - private HttpResponse createHandshakeResponse () - { - var ret = HttpResponse.CreateWebSocketResponse (); - - var headers = ret.Headers; - headers["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key); - - if (_protocol != null) - headers["Sec-WebSocket-Protocol"] = _protocol; - - if (_extensions != null) - headers["Sec-WebSocket-Extensions"] = _extensions; - - if (_cookies.Count > 0) - ret.SetCookies (_cookies); - - return ret; - } - - // As server - private bool customCheckHandshakeRequest (WebSocketContext context, out string message) - { - message = null; - return _handshakeRequestChecker == null - || (message = _handshakeRequestChecker (context)) == null; - } - - private MessageEventArgs dequeueFromMessageEventQueue () - { - lock (_forMessageEventQueue) - return _messageEventQueue.Count > 0 ? _messageEventQueue.Dequeue () : null; - } - - // As client - private void doHandshake () - { - setClientStream (); - var res = sendHandshakeRequest (); - - string msg; - if (!checkHandshakeResponse (res, out msg)) - throw new WebSocketException (CloseStatusCode.ProtocolError, msg); - - if (_protocolsRequested) - _protocol = res.Headers["Sec-WebSocket-Protocol"]; - - if (_extensionsRequested) - processSecWebSocketExtensionsServerHeader (res.Headers["Sec-WebSocket-Extensions"]); - - processCookies (res.Cookies); - } - - private void enqueueToMessageEventQueue (MessageEventArgs e) - { - lock (_forMessageEventQueue) - _messageEventQueue.Enqueue (e); - } - - private void error (string message, Exception exception) - { - try { - OnError.Emit (this, new ErrorEventArgs (message, exception)); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - } - } - - private void fatal (string message, Exception exception) - { - var code = exception is WebSocketException - ? ((WebSocketException) exception).Code - : CloseStatusCode.Abnormal; - - fatal (message, (ushort) code); - } - - private void fatal (string message, ushort code) - { - var payload = new PayloadData (code, message); - close (payload, !code.IsReserved (), false, false); - } - - private void fatal (string message, CloseStatusCode code) - { - fatal (message, (ushort) code); - } - - private void init () - { - _compression = CompressionMethod.None; - _cookies = new CookieCollection (); - _forPing = new object (); - _forSend = new object (); - _forState = new object (); - _messageEventQueue = new Queue (); - _forMessageEventQueue = ((ICollection) _messageEventQueue).SyncRoot; - _readyState = WebSocketState.Connecting; - } - - private void message () - { - MessageEventArgs e = null; - lock (_forMessageEventQueue) { - if (_inMessage || _messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) - return; - - _inMessage = true; - e = _messageEventQueue.Dequeue (); - } - - _message (e); - } - - private void messagec (MessageEventArgs e) - { - do { - try { - OnMessage.Emit (this, e); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ("An error has occurred during an OnMessage event.", ex); - } - - lock (_forMessageEventQueue) { - if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { - _inMessage = false; - break; - } - - e = _messageEventQueue.Dequeue (); - } - } - while (true); - } - - private void messages (MessageEventArgs e) - { - try { - OnMessage.Emit (this, e); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ("An error has occurred during an OnMessage event.", ex); - } - - lock (_forMessageEventQueue) { - if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { - _inMessage = false; - return; - } - - e = _messageEventQueue.Dequeue (); - } - - ThreadPool.QueueUserWorkItem (state => messages (e)); - } - - private void open () - { - _inMessage = true; - startReceiving (); - try { - OnOpen.Emit (this, EventArgs.Empty); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ("An error has occurred during the OnOpen event.", ex); - } - - MessageEventArgs e = null; - lock (_forMessageEventQueue) { - if (_messageEventQueue.Count == 0 || _readyState != WebSocketState.Open) { - _inMessage = false; - return; - } - - e = _messageEventQueue.Dequeue (); - } - - _message.BeginInvoke (e, ar => _message.EndInvoke (ar), null); - } - - private bool ping (byte[] data) - { - if (_readyState != WebSocketState.Open) - return false; - - var pongReceived = _pongReceived; - if (pongReceived == null) - return false; - - lock (_forPing) { - try { - pongReceived.Reset (); - if (!send (Fin.Final, Opcode.Ping, data, false)) - return false; - - return pongReceived.WaitOne (_waitTime); - } - catch (ObjectDisposedException) { - return false; - } - } - } - - private bool processCloseFrame (WebSocketFrame frame) - { - var payload = frame.PayloadData; - close (payload, !payload.HasReservedCode, false, true); - - return false; - } - - // As client - private void processCookies (CookieCollection cookies) - { - if (cookies.Count == 0) - return; - - _cookies.SetOrRemove (cookies); - } - - private bool processDataFrame (WebSocketFrame frame) - { - enqueueToMessageEventQueue ( - frame.IsCompressed - ? new MessageEventArgs ( - frame.Opcode, frame.PayloadData.ApplicationData.Decompress (_compression)) - : new MessageEventArgs (frame)); - - return true; - } - - private bool processFragmentFrame (WebSocketFrame frame) - { - if (!_inContinuation) { - // Must process first fragment. - if (frame.IsContinuation) - return true; - - _fragmentsOpcode = frame.Opcode; - _fragmentsCompressed = frame.IsCompressed; - _fragmentsBuffer = new MemoryStream (); - _inContinuation = true; - } - - _fragmentsBuffer.WriteBytes (frame.PayloadData.ApplicationData, 1024); - if (frame.IsFinal) { - using (_fragmentsBuffer) { - var data = _fragmentsCompressed - ? _fragmentsBuffer.DecompressToArray (_compression) - : _fragmentsBuffer.ToArray (); - - enqueueToMessageEventQueue (new MessageEventArgs (_fragmentsOpcode, data)); - } - - _fragmentsBuffer = null; - _inContinuation = false; - } - - return true; - } - - private bool processPingFrame (WebSocketFrame frame) - { - var pong = WebSocketFrame.CreatePongFrame (frame.PayloadData, _client); - - lock (_forState) { - if (_readyState != WebSocketState.Open) { - _logger.Error ("The state of the connection has been changed."); - return true; - } - - if (!sendBytes (pong.ToArray ())) - return false; - } - - _logger.Trace ("A pong has been sent to respond to this ping."); - - if (_emitOnPing) { - if (_client) - pong.Unmask (); - - enqueueToMessageEventQueue (new MessageEventArgs (frame)); - } - - return true; - } - - private bool processPongFrame (WebSocketFrame frame) - { - try { - _pongReceived.Set (); - } - catch (NullReferenceException) { - return false; - } - catch (ObjectDisposedException) { - return false; - } - - _logger.Trace ("It has been signaled that a pong was received."); - - return true; - } - - private bool processReceivedFrame (WebSocketFrame frame) - { - string msg; - if (!checkReceivedFrame (frame, out msg)) - throw new WebSocketException (CloseStatusCode.ProtocolError, msg); - - frame.Unmask (); - return frame.IsFragment - ? processFragmentFrame (frame) - : frame.IsData - ? processDataFrame (frame) - : frame.IsPing - ? processPingFrame (frame) - : frame.IsPong - ? processPongFrame (frame) - : frame.IsClose - ? processCloseFrame (frame) - : processUnsupportedFrame (frame); - } - - // As server - private void processSecWebSocketExtensionsClientHeader (string value) - { - if (value == null) - return; - - var buff = new StringBuilder (80); - - var comp = false; - foreach (var e in value.SplitHeaderValue (',')) { - var ext = e.Trim (); - if (!comp && ext.IsCompressionExtension (CompressionMethod.Deflate)) { - _compression = CompressionMethod.Deflate; - buff.AppendFormat ( - "{0}, ", - _compression.ToExtensionString ( - "client_no_context_takeover", "server_no_context_takeover" - ) - ); - - comp = true; - } - } - - var len = buff.Length; - if (len > 2) { - buff.Length = len - 2; - _extensions = buff.ToString (); - } - } - - // As client - private void processSecWebSocketExtensionsServerHeader (string value) - { - if (value == null) { - _compression = CompressionMethod.None; - return; - } - - _extensions = value; - } - - // As server - private void processSecWebSocketProtocolHeader (IEnumerable values) - { - if (values.Contains (p => p == _protocol)) - return; - - _protocol = null; - } - - private bool processUnsupportedFrame (WebSocketFrame frame) - { - _logger.Fatal ("An unsupported frame:" + frame.PrintToString (false)); - fatal ("There is no way to handle it.", CloseStatusCode.PolicyViolation); - - return false; - } - - // As client - private void releaseClientResources () - { - if (_stream != null) { - _stream.Dispose (); - _stream = null; - } - - if (_tcpClient != null) { - _tcpClient.Close (); - _tcpClient = null; - } - } - - private void releaseCommonResources () - { - if (_fragmentsBuffer != null) { - _fragmentsBuffer.Dispose (); - _fragmentsBuffer = null; - _inContinuation = false; - } - - if (_pongReceived != null) { - _pongReceived.Close (); - _pongReceived = null; - } - - if (_receivingExited != null) { - _receivingExited.Close (); - _receivingExited = null; - } - } - - private void releaseResources () - { - if (_client) - releaseClientResources (); - else - releaseServerResources (); - - releaseCommonResources (); - } - - // As server - private void releaseServerResources () - { - if (_closeContext == null) - return; - - _closeContext (); - _closeContext = null; - _stream = null; - _context = null; - } - - private bool send (Opcode opcode, Stream stream) - { - lock (_forSend) { - var src = stream; - var compressed = false; - var sent = false; - try { - if (_compression != CompressionMethod.None) { - stream = stream.Compress (_compression); - compressed = true; - } - - sent = send (opcode, stream, compressed); - if (!sent) - error ("A send has been interrupted.", null); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ("An error has occurred during a send.", ex); - } - finally { - if (compressed) - stream.Dispose (); - - src.Dispose (); - } - - return sent; - } - } - - private bool send (Opcode opcode, Stream stream, bool compressed) - { - var len = stream.Length; - if (len == 0) - return send (Fin.Final, opcode, EmptyBytes, false); - - var quo = len / FragmentLength; - var rem = (int) (len % FragmentLength); - - byte[] buff = null; - if (quo == 0) { - buff = new byte[rem]; - return stream.Read (buff, 0, rem) == rem - && send (Fin.Final, opcode, buff, compressed); - } - - if (quo == 1 && rem == 0) { - buff = new byte[FragmentLength]; - return stream.Read (buff, 0, FragmentLength) == FragmentLength - && send (Fin.Final, opcode, buff, compressed); - } - - /* Send fragments */ - - // Begin - buff = new byte[FragmentLength]; - var sent = stream.Read (buff, 0, FragmentLength) == FragmentLength - && send (Fin.More, opcode, buff, compressed); - - if (!sent) - return false; - - var n = rem == 0 ? quo - 2 : quo - 1; - for (long i = 0; i < n; i++) { - sent = stream.Read (buff, 0, FragmentLength) == FragmentLength - && send (Fin.More, Opcode.Cont, buff, false); - - if (!sent) - return false; - } - - // End - if (rem == 0) - rem = FragmentLength; - else - buff = new byte[rem]; - - return stream.Read (buff, 0, rem) == rem - && send (Fin.Final, Opcode.Cont, buff, false); - } - - private bool send (Fin fin, Opcode opcode, byte[] data, bool compressed) - { - lock (_forState) { - if (_readyState != WebSocketState.Open) { - _logger.Error ("The state of the connection has been changed."); - return false; - } - - var frame = new WebSocketFrame (fin, opcode, data, compressed, _client); - return sendBytes (frame.ToArray ()); - } - } - - private void sendAsync (Opcode opcode, Stream stream, Action completed) - { - Func sender = send; - sender.BeginInvoke ( - opcode, - stream, - ar => { - try { - var sent = sender.EndInvoke (ar); - if (completed != null) - completed (sent); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - error ( - "An error has occurred during the callback for an async send.", - ex - ); - } - }, - null - ); - } - - private bool sendBytes (byte[] bytes) - { - try { - _stream.Write (bytes, 0, bytes.Length); - return true; - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - return false; - } - } - - // As client - private HttpResponse sendHandshakeRequest () - { - var req = createHandshakeRequest (); - var res = sendHttpRequest (req, 90000); - if (res.IsUnauthorized) { - var chal = res.Headers["WWW-Authenticate"]; - _logger.Warn (String.Format ("Received an authentication requirement for '{0}'.", chal)); - if (chal.IsNullOrEmpty ()) { - _logger.Error ("No authentication challenge is specified."); - return res; - } - - _authChallenge = AuthenticationChallenge.Parse (chal); - if (_authChallenge == null) { - _logger.Error ("An invalid authentication challenge is specified."); - return res; - } - - if (_credentials != null && - (!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) { - if (res.HasConnectionClose) { - releaseClientResources (); - setClientStream (); - } - - var authRes = new AuthenticationResponse (_authChallenge, _credentials, _nonceCount); - _nonceCount = authRes.NonceCount; - req.Headers["Authorization"] = authRes.ToString (); - res = sendHttpRequest (req, 15000); - } - } - - if (res.IsRedirect) { - var url = res.Headers["Location"]; - _logger.Warn (String.Format ("Received a redirection to '{0}'.", url)); - if (_enableRedirection) { - if (url.IsNullOrEmpty ()) { - _logger.Error ("No url to redirect is located."); - return res; - } - - Uri uri; - string msg; - if (!url.TryCreateWebSocketUri (out uri, out msg)) { - _logger.Error ("An invalid url to redirect is located: " + msg); - return res; - } - - releaseClientResources (); - - _uri = uri; - _secure = uri.Scheme == "wss"; - - setClientStream (); - return sendHandshakeRequest (); - } - } - - return res; - } - - // As client - private HttpResponse sendHttpRequest (HttpRequest request, int millisecondsTimeout) - { - _logger.Debug ("A request to the server:\n" + request.ToString ()); - var res = request.GetResponse (_stream, millisecondsTimeout); - _logger.Debug ("A response to this request:\n" + res.ToString ()); - - return res; - } - - // As server - private bool sendHttpResponse (HttpResponse response) - { - _logger.Debug ("A response to this request:\n" + response.ToString ()); - return sendBytes (response.ToByteArray ()); - } - - // As client - private void sendProxyConnectRequest () - { - var req = HttpRequest.CreateConnectRequest (_uri); - var res = sendHttpRequest (req, 90000); - if (res.IsProxyAuthenticationRequired) { - var chal = res.Headers["Proxy-Authenticate"]; - _logger.Warn ( - String.Format ("Received a proxy authentication requirement for '{0}'.", chal)); - - if (chal.IsNullOrEmpty ()) - throw new WebSocketException ("No proxy authentication challenge is specified."); - - var authChal = AuthenticationChallenge.Parse (chal); - if (authChal == null) - throw new WebSocketException ("An invalid proxy authentication challenge is specified."); - - if (_proxyCredentials != null) { - if (res.HasConnectionClose) { - releaseClientResources (); - _tcpClient = new TcpClient (_proxyUri.DnsSafeHost, _proxyUri.Port); - _stream = _tcpClient.GetStream (); - } - - var authRes = new AuthenticationResponse (authChal, _proxyCredentials, 0); - req.Headers["Proxy-Authorization"] = authRes.ToString (); - res = sendHttpRequest (req, 15000); - } - - if (res.IsProxyAuthenticationRequired) - throw new WebSocketException ("A proxy authentication is required."); - } - - if (res.StatusCode[0] != '2') - throw new WebSocketException ( - "The proxy has failed a connection to the requested host and port."); - } - - // As client - private void setClientStream () - { - if (_proxyUri != null) { - _tcpClient = new TcpClient (_proxyUri.DnsSafeHost, _proxyUri.Port); - _stream = _tcpClient.GetStream (); - sendProxyConnectRequest (); - } - else { - _tcpClient = new TcpClient (_uri.DnsSafeHost, _uri.Port); - _stream = _tcpClient.GetStream (); - } - - if (_secure) { - var conf = SslConfiguration; - var host = conf.TargetHost; - if (host != _uri.DnsSafeHost) - throw new WebSocketException ( - CloseStatusCode.TlsHandshakeFailure, "An invalid host name is specified."); - - try { - var sslStream = new SslStream ( - _stream, - false, - conf.ServerCertificateValidationCallback, - conf.ClientCertificateSelectionCallback); - - sslStream.AuthenticateAsClient ( - host, - conf.ClientCertificates, - conf.EnabledSslProtocols, - conf.CheckCertificateRevocation); - - _stream = sslStream; - } - catch (Exception ex) { - throw new WebSocketException (CloseStatusCode.TlsHandshakeFailure, ex); - } - } - } - - private void startReceiving () - { - if (_messageEventQueue.Count > 0) - _messageEventQueue.Clear (); - - _pongReceived = new ManualResetEvent (false); - _receivingExited = new ManualResetEvent (false); - - Action receive = null; - receive = - () => - WebSocketFrame.ReadFrameAsync ( - _stream, - false, - frame => { - if (!processReceivedFrame (frame) || _readyState == WebSocketState.Closed) { - var exited = _receivingExited; - if (exited != null) - exited.Set (); - - return; - } - - // Receive next asap because the Ping or Close needs a response to it. - receive (); - - if (_inMessage || !HasMessage || _readyState != WebSocketState.Open) - return; - - message (); - }, - ex => { - _logger.Fatal (ex.ToString ()); - fatal ("An exception has occurred while receiving.", ex); - } - ); - - receive (); - } - - // As client - private bool validateSecWebSocketAcceptHeader (string value) - { - return value != null && value == CreateResponseKey (_base64Key); - } - - // As server - private bool validateSecWebSocketExtensionsClientHeader (string value) - { - return value == null || value.Length > 0; - } - - // As client - private bool validateSecWebSocketExtensionsServerHeader (string value) - { - if (value == null) - return true; - - if (value.Length == 0) - return false; - - if (!_extensionsRequested) - return false; - - var comp = _compression != CompressionMethod.None; - foreach (var e in value.SplitHeaderValue (',')) { - var ext = e.Trim (); - if (comp && ext.IsCompressionExtension (_compression)) { - if (!ext.Contains ("server_no_context_takeover")) { - _logger.Error ("The server hasn't sent back 'server_no_context_takeover'."); - return false; - } - - if (!ext.Contains ("client_no_context_takeover")) - _logger.Warn ("The server hasn't sent back 'client_no_context_takeover'."); - - var method = _compression.ToExtensionString (); - var invalid = - ext.SplitHeaderValue (';').Contains ( - t => { - t = t.Trim (); - return t != method - && t != "server_no_context_takeover" - && t != "client_no_context_takeover"; - } - ); - - if (invalid) - return false; - } - else { - return false; - } - } - - return true; - } - - // As server - private bool validateSecWebSocketKeyHeader (string value) - { - return value != null && value.Length > 0; - } - - // As server - private bool validateSecWebSocketProtocolClientHeader (string value) - { - return value == null || value.Length > 0; - } - - // As client - private bool validateSecWebSocketProtocolServerHeader (string value) - { - if (value == null) - return !_protocolsRequested; - - if (value.Length == 0) - return false; - - return _protocolsRequested && _protocols.Contains (p => p == value); - } - - // As server - private bool validateSecWebSocketVersionClientHeader (string value) - { - return value != null && value == _version; - } - - // As client - private bool validateSecWebSocketVersionServerHeader (string value) - { - return value == null || value == _version; - } - - #endregion - - #region Internal Methods - - internal static bool CheckParametersForClose ( - ushort code, string reason, bool client, out string message - ) - { - message = null; - - if (!code.IsCloseStatusCode ()) { - message = "'code' is an invalid status code."; - return false; - } - - if (code == (ushort) CloseStatusCode.NoStatus && !reason.IsNullOrEmpty ()) { - message = "'code' cannot have a reason."; - return false; - } - - if (code == (ushort) CloseStatusCode.MandatoryExtension && !client) { - message = "'code' cannot be used by a server."; - return false; - } - - if (code == (ushort) CloseStatusCode.ServerError && client) { - message = "'code' cannot be used by a client."; - return false; - } - - if (!reason.IsNullOrEmpty () && reason.UTF8Encode ().Length > 123) { - message = "The size of 'reason' is greater than the allowable max size."; - return false; - } - - return true; - } - - internal static bool CheckParametersForClose ( - CloseStatusCode code, string reason, bool client, out string message - ) - { - message = null; - - if (code == CloseStatusCode.NoStatus && !reason.IsNullOrEmpty ()) { - message = "'code' cannot have a reason."; - return false; - } - - if (code == CloseStatusCode.MandatoryExtension && !client) { - message = "'code' cannot be used by a server."; - return false; - } - - if (code == CloseStatusCode.ServerError && client) { - message = "'code' cannot be used by a client."; - return false; - } - - if (!reason.IsNullOrEmpty () && reason.UTF8Encode ().Length > 123) { - message = "The size of 'reason' is greater than the allowable max size."; - return false; - } - - return true; - } - - internal static string CheckPingParameter (string message, out byte[] bytes) - { - bytes = message.UTF8Encode (); - return bytes.Length > 125 ? "A message has greater than the allowable max size." : null; - } - - internal static string CheckSendParameter (byte[] data) - { - return data == null ? "'data' is null." : null; - } - - internal static string CheckSendParameter (FileInfo file) - { - return file == null ? "'file' is null." : null; - } - - internal static string CheckSendParameter (string data) - { - return data == null ? "'data' is null." : null; - } - - internal static string CheckSendParameters (Stream stream, int length) - { - return stream == null - ? "'stream' is null." - : !stream.CanRead - ? "'stream' cannot be read." - : length < 1 - ? "'length' is less than 1." - : null; - } - - // As server - internal void Close (HttpResponse response) - { - _readyState = WebSocketState.Closing; - - sendHttpResponse (response); - releaseServerResources (); - - _readyState = WebSocketState.Closed; - } - - // As server - internal void Close (HttpStatusCode code) - { - Close (createHandshakeFailureResponse (code)); - } - - // As server - internal void Close (PayloadData payloadData, byte[] frameAsBytes) - { - lock (_forState) { - if (_readyState == WebSocketState.Closing) { - _logger.Info ("The closing is already in progress."); - return; - } - - if (_readyState == WebSocketState.Closed) { - _logger.Info ("The connection has already been closed."); - return; - } - - _readyState = WebSocketState.Closing; - } - - _logger.Trace ("Begin closing the connection."); - - var sent = frameAsBytes != null && sendBytes (frameAsBytes); - var received = sent && _receivingExited != null - ? _receivingExited.WaitOne (_waitTime) - : false; - - var res = sent && received; - - _logger.Debug ( - String.Format ( - "Was clean?: {0}\n sent: {1}\n received: {2}", res, sent, received - ) - ); - - releaseServerResources (); - releaseCommonResources (); - - _logger.Trace ("End closing the connection."); - - _readyState = WebSocketState.Closed; - - var e = new CloseEventArgs (payloadData); - e.WasClean = res; - - try { - OnClose.Emit (this, e); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - } - } - - // As client - internal static string CreateBase64Key () - { - var src = new byte[16]; - RandomNumber.GetBytes (src); - - return Convert.ToBase64String (src); - } - - internal static string CreateResponseKey (string base64Key) - { - var buff = new StringBuilder (base64Key, 64); - buff.Append (_guid); - SHA1 sha1 = new SHA1CryptoServiceProvider (); - var src = sha1.ComputeHash (buff.ToString ().UTF8Encode ()); - - return Convert.ToBase64String (src); - } - - // As server - internal void InternalAccept () - { - try { - if (!acceptHandshake ()) - return; - - _readyState = WebSocketState.Open; - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - fatal ("An exception has occurred while accepting.", ex); - - return; - } - - open (); - } - - internal bool Ping (byte[] frameAsBytes, TimeSpan timeout) - { - if (_readyState != WebSocketState.Open) - return false; - - var pongReceived = _pongReceived; - if (pongReceived == null) - return false; - - lock (_forPing) { - try { - pongReceived.Reset (); - - lock (_forState) { - if (_readyState != WebSocketState.Open) { - _logger.Error ("The state of the connection has been changed."); - return false; - } - - if (!sendBytes (frameAsBytes)) - return false; - } - - return pongReceived.WaitOne (timeout); - } - catch (ObjectDisposedException) { - return false; - } - } - } - - // As server, used to broadcast - internal void Send ( - Opcode opcode, byte[] data, Dictionary cache - ) - { - lock (_forSend) { - lock (_forState) { - if (_readyState != WebSocketState.Open) { - _logger.Error ("The state of the connection has been changed."); - return; - } - - try { - byte[] found; - if (!cache.TryGetValue (_compression, out found)) { - found = - new WebSocketFrame ( - Fin.Final, - opcode, - data.Compress (_compression), - _compression != CompressionMethod.None, - false - ) - .ToArray (); - - cache.Add (_compression, found); - } - - sendBytes (found); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - } - } - } - } - - // As server, used to broadcast - internal void Send ( - Opcode opcode, Stream stream, Dictionary cache - ) - { - lock (_forSend) { - try { - Stream found; - if (!cache.TryGetValue (_compression, out found)) { - found = stream.Compress (_compression); - cache.Add (_compression, found); - } - else { - found.Position = 0; - } - - send (opcode, found, _compression != CompressionMethod.None); - } - catch (Exception ex) { - _logger.Error (ex.ToString ()); - } - } - } - - #endregion - - #region Public Methods - - /// - /// Accepts the WebSocket handshake request. - /// - /// - /// This method is not available in a client. - /// - public void Accept () - { - string msg; - if (!checkIfAvailable (false, true, true, false, false, false, out msg)) { - _logger.Error (msg); - error ("An error has occurred in accepting.", null); - - return; - } - - if (accept ()) - open (); - } - - /// - /// Accepts the WebSocket handshake request asynchronously. - /// - /// - /// - /// This method does not wait for the accept to be complete. - /// - /// - /// This method is not available in a client. - /// - /// - public void AcceptAsync () - { - string msg; - if (!checkIfAvailable (false, true, true, false, false, false, out msg)) { - _logger.Error (msg); - error ("An error has occurred in accepting.", null); - - return; - } - - Func acceptor = accept; - acceptor.BeginInvoke ( - ar => { - if (acceptor.EndInvoke (ar)) - open (); - }, - null - ); - } - - /// - /// Closes the WebSocket connection, and releases all associated resources. - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - public void Close () - { - close (1005, String.Empty); - } - - /// - /// Closes the WebSocket connection with the specified , - /// and releases all associated resources. - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// A that represents the status code indicating - /// the reason for the close. The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - public void Close (ushort code) - { - string msg; - if (!CheckParametersForClose (code, null, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - close (code, String.Empty); - } - - /// - /// Closes the WebSocket connection with the specified , - /// and releases all associated resources. - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// One of the enum values that represents - /// the status code indicating the reason for the close. - /// - public void Close (CloseStatusCode code) - { - string msg; - if (!CheckParametersForClose (code, null, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - close ((ushort) code, String.Empty); - } - - /// - /// Closes the WebSocket connection with the specified and - /// , and releases all associated resources. - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// A that represents the status code indicating - /// the reason for the close. The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less. - /// - public void Close (ushort code, string reason) - { - string msg; - if (!CheckParametersForClose (code, reason, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - close (code, reason); - } - - /// - /// Closes the WebSocket connection with the specified and - /// , and releases all associated resources. - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// One of the enum values that represents - /// the status code indicating the reason for the close. - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less. - /// - public void Close (CloseStatusCode code, string reason) - { - string msg; - if (!CheckParametersForClose (code, reason, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - close ((ushort) code, reason); - } - - /// - /// Closes the WebSocket connection asynchronously, and releases - /// all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method does not wait for the close to be complete. - /// - /// - public void CloseAsync () - { - closeAsync (1005, String.Empty); - } - - /// - /// Closes the WebSocket connection asynchronously with the specified - /// , and releases all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method does not wait for the close to be complete. - /// - /// - /// - /// A that represents the status code indicating - /// the reason for the close. The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - public void CloseAsync (ushort code) - { - string msg; - if (!CheckParametersForClose (code, null, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - closeAsync (code, String.Empty); - } - - /// - /// Closes the WebSocket connection asynchronously with the specified - /// , and releases all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method does not wait for the close to be complete. - /// - /// - /// - /// One of the enum values that represents - /// the status code indicating the reason for the close. - /// - public void CloseAsync (CloseStatusCode code) - { - string msg; - if (!CheckParametersForClose (code, null, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - closeAsync ((ushort) code, String.Empty); - } - - /// - /// Closes the WebSocket connection asynchronously with the specified - /// and , and releases - /// all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method does not wait for the close to be complete. - /// - /// - /// - /// A that represents the status code indicating - /// the reason for the close. The status codes are defined in - /// - /// Section 7.4 of RFC 6455. - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less. - /// - public void CloseAsync (ushort code, string reason) - { - string msg; - if (!CheckParametersForClose (code, reason, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - closeAsync (code, reason); - } - - /// - /// Closes the WebSocket connection asynchronously with the specified - /// and , and releases - /// all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method does not wait for the close to be complete. - /// - /// - /// - /// One of the enum values that represents - /// the status code indicating the reason for the close. - /// - /// - /// A that represents the reason for the close. - /// The size must be 123 bytes or less. - /// - public void CloseAsync (CloseStatusCode code, string reason) - { - string msg; - if (!CheckParametersForClose (code, reason, _client, out msg)) { - _logger.Error (msg); - error ("An error has occurred in closing the connection.", null); - - return; - } - - closeAsync ((ushort) code, reason); - } - - /// - /// Establishes a WebSocket connection. - /// - /// - /// This method is not available in a server. - /// - public void Connect () - { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in connecting.", null); - - return; - } - - if (connect ()) - open (); - } - - /// - /// Establishes a WebSocket connection asynchronously. - /// - /// - /// - /// This method does not wait for the connect to be complete. - /// - /// - /// This method is not available in a server. - /// - /// - public void ConnectAsync () - { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in connecting.", null); - - return; - } - - Func connector = connect; - connector.BeginInvoke ( - ar => { - if (connector.EndInvoke (ar)) - open (); - }, - null - ); - } - - /// - /// Sends a ping using the WebSocket connection. - /// - /// - /// true if the sending a ping has done with no error and - /// a pong has been received within a time; otherwise, false. - /// - public bool Ping () - { - return ping (EmptyBytes); - } - - /// - /// Sends a ping with the specified using - /// the WebSocket connection. - /// - /// - /// true if the sending a ping has done with no error and - /// a pong has been received within a time; otherwise, false. - /// - /// - /// A that represents the message to send. - /// The size must be 125 bytes or less in UTF-8. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - /// - /// The size of is greater than 125 bytes. - /// - public bool Ping (string message) - { - if (message == null) - throw new ArgumentNullException ("message"); - - byte[] bytes; - if (!message.TryGetUTF8EncodedBytes (out bytes)) - throw new ArgumentException ("It could not be UTF-8-encoded.", "message"); - - if (bytes.Length > 125) { - var msg = "Its size is greater than 125 bytes."; - throw new ArgumentOutOfRangeException ("message", msg); - } - - return ping (bytes); - } - - /// - /// Sends the specified using the WebSocket connection. - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - public void Send (byte[] data) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - send (Opcode.Binary, new MemoryStream (data)); - } - - /// - /// Sends the specified file as the binary data using the WebSocket connection. - /// - /// - /// A that specifies a file to send. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// - /// The file does not exist. - /// - /// - /// -or- - /// - /// - /// The file could not be opened. - /// - /// - public void Send (FileInfo fileInfo) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (fileInfo == null) - throw new ArgumentNullException ("fileInfo"); - - if (!fileInfo.Exists) - throw new ArgumentException ("The file does not exist.", "fileInfo"); - - FileStream stream; - if (!fileInfo.TryOpenRead (out stream)) - throw new ArgumentException ("The file could not be opened.", "fileInfo"); - - send (Opcode.Binary, stream); - } - - /// - /// Sends the specified using the WebSocket connection. - /// - /// - /// A that represents the text data to send. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - public void Send (string data) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - byte[] bytes; - if (!data.TryGetUTF8EncodedBytes (out bytes)) - throw new ArgumentException ("It could not be UTF-8-encoded.", "data"); - - send (Opcode.Text, new MemoryStream (bytes)); - } - - /// - /// Sends the specified of data from - /// the specified using the WebSocket - /// connection. - /// - /// - /// A from which reads the binary data to send. - /// - /// - /// An that specifies the number of bytes to read and send. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// - /// cannot be read. - /// - /// - /// -or- - /// - /// - /// is less than 1. - /// - /// - /// -or- - /// - /// - /// No data could be read from . - /// - /// - public void Send (Stream stream, int length) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (stream == null) - throw new ArgumentNullException ("stream"); - - if (!stream.CanRead) - throw new ArgumentException ("It cannot be read.", "stream"); - - if (length < 1) - throw new ArgumentException ("It is less than 1.", "length"); - - var bytes = stream.ReadBytes (length); - - var len = bytes.Length; - if (len == 0) - throw new ArgumentException ("No data could be read from it.", "stream"); - - if (len < length) { - _logger.Warn ( - String.Format ( - "Only {0} byte(s) of data could be read from the specified stream.", - len - ) - ); - } - - send (Opcode.Binary, new MemoryStream (bytes)); - } - - /// - /// Sends the specified asynchronously using - /// the WebSocket connection. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// An array of that represents the binary data to send. - /// - /// - /// An Action<bool> delegate that invokes the method called when - /// the send is complete. A passed to this delegate will be - /// true if the send has done with no error. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - public void SendAsync (byte[] data, Action completed) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - sendAsync (Opcode.Binary, new MemoryStream (data), completed); - } - - /// - /// Sends the specified file as the binary data asynchronously using - /// the WebSocket connection. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// A that specifies a file to send. - /// - /// - /// An Action<bool> delegate that invokes the method called when - /// the send is complete. A passed to this delegate will be - /// true if the send has done with no error. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// - /// The file does not exist. - /// - /// - /// -or- - /// - /// - /// The file could not be opened. - /// - /// - public void SendAsync (FileInfo fileInfo, Action completed) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (fileInfo == null) - throw new ArgumentNullException ("fileInfo"); - - if (!fileInfo.Exists) - throw new ArgumentException ("The file does not exist.", "fileInfo"); - - FileStream stream; - if (!fileInfo.TryOpenRead (out stream)) - throw new ArgumentException ("The file could not be opened.", "fileInfo"); - - sendAsync (Opcode.Binary, stream, completed); - } - - /// - /// Sends the specified asynchronously using - /// the WebSocket connection. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// A that represents the text data to send. - /// - /// - /// An Action<bool> delegate that invokes the method called when - /// the send is complete. A passed to this delegate will be - /// true if the send has done with no error. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// could not be UTF-8-encoded. - /// - public void SendAsync (string data, Action completed) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (data == null) - throw new ArgumentNullException ("data"); - - byte[] bytes; - if (!data.TryGetUTF8EncodedBytes (out bytes)) - throw new ArgumentException ("It could not be UTF-8-encoded.", "data"); - - sendAsync (Opcode.Text, new MemoryStream (bytes), completed); - } - - /// - /// Sends the specified of data from - /// the specified asynchronously using - /// the WebSocket connection. - /// - /// - /// This method does not wait for the send to be complete. - /// - /// - /// A from which reads the binary data to send. - /// - /// - /// An that specifies the number of bytes to read and send. - /// - /// - /// An Action<bool> delegate that invokes the method called when - /// the send is complete. A passed to this delegate will be - /// true if the send has done with no error. - /// - /// - /// The current state of the connection is not Open. - /// - /// - /// is . - /// - /// - /// - /// cannot be read. - /// - /// - /// -or- - /// - /// - /// is less than 1. - /// - /// - /// -or- - /// - /// - /// No data could be read from . - /// - /// - public void SendAsync (Stream stream, int length, Action completed) - { - if (_readyState != WebSocketState.Open) { - var msg = "The current state of the connection is not Open."; - throw new InvalidOperationException (msg); - } - - if (stream == null) - throw new ArgumentNullException ("stream"); - - if (!stream.CanRead) - throw new ArgumentException ("It cannot be read.", "stream"); - - if (length < 1) - throw new ArgumentException ("It is less than 1.", "length"); - - var bytes = stream.ReadBytes (length); - - var len = bytes.Length; - if (len == 0) - throw new ArgumentException ("No data could be read from it.", "stream"); - - if (len < length) { - _logger.Warn ( - String.Format ( - "Only {0} byte(s) of data could be read from the specified stream.", - len - ) - ); - } - - sendAsync (Opcode.Binary, new MemoryStream (bytes), completed); - } - - /// - /// Sets an HTTP to send with - /// the WebSocket handshake request to the server. - /// - /// - /// This method is not available in a server. - /// - /// - /// A that represents a cookie to send. - /// - public void SetCookie (Cookie cookie) - { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting a cookie.", null); - - return; - } - - if (cookie == null) { - _logger.Error ("'cookie' is null."); - error ("An error has occurred in setting a cookie.", null); - - return; - } - - lock (_forState) { - if (!checkIfAvailable (true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting a cookie.", null); - - return; - } - - lock (_cookies.SyncRoot) - _cookies.SetOrRemove (cookie); - } - } - - /// - /// Sets a pair of and for - /// the HTTP authentication (Basic/Digest). - /// - /// - /// This method is not available in a server. - /// - /// - /// - /// A that represents the user name used to authenticate. - /// - /// - /// If is or empty, - /// the credentials will be initialized and not be sent. - /// - /// - /// - /// A that represents the password for - /// used to authenticate. - /// - /// - /// true if the sends the credentials for - /// the Basic authentication with the first handshake request to the server; - /// otherwise, false. - /// - public void SetCredentials (string username, string password, bool preAuth) - { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the credentials.", null); - - return; - } - - if (!checkParametersForSetCredentials (username, password, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the credentials.", null); - - return; - } - - lock (_forState) { - if (!checkIfAvailable (true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the credentials.", null); - - return; - } - - if (username.IsNullOrEmpty ()) { - _logger.Warn ("The credentials are initialized."); - _credentials = null; - _preAuth = false; - - return; - } - - _credentials = new NetworkCredential (username, password, _uri.PathAndQuery); - _preAuth = preAuth; - } - } - - /// - /// Sets the HTTP proxy server URL to connect through, and if necessary, - /// a pair of and for - /// the proxy server authentication (Basic/Digest). - /// - /// - /// This method is not available in a server. - /// - /// - /// - /// A that represents the HTTP proxy server URL to - /// connect through. The syntax must be http://<host>[:<port>]. - /// - /// - /// If is or empty, - /// the url and credentials for the proxy will be initialized, - /// and the will not use the proxy to - /// connect through. - /// - /// - /// - /// - /// A that represents the user name used to authenticate. - /// - /// - /// If is or empty, - /// the credentials for the proxy will be initialized and not be sent. - /// - /// - /// - /// A that represents the password for - /// used to authenticate. - /// - public void SetProxy (string url, string username, string password) - { - string msg; - if (!checkIfAvailable (true, false, true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the proxy.", null); - - return; - } - - if (!checkParametersForSetProxy (url, username, password, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the proxy.", null); - - return; - } - - lock (_forState) { - if (!checkIfAvailable (true, false, false, true, out msg)) { - _logger.Error (msg); - error ("An error has occurred in setting the proxy.", null); - - return; - } - - if (url.IsNullOrEmpty ()) { - _logger.Warn ("The url and credentials for the proxy are initialized."); - _proxyUri = null; - _proxyCredentials = null; - - return; - } - - _proxyUri = new Uri (url); - - if (username.IsNullOrEmpty ()) { - _logger.Warn ("The credentials for the proxy are initialized."); - _proxyCredentials = null; - - return; - } - - _proxyCredentials = - new NetworkCredential ( - username, password, String.Format ("{0}:{1}", _uri.DnsSafeHost, _uri.Port) - ); - } - } - - #endregion - - #region Explicit Interface Implementations - - /// - /// Closes the WebSocket connection, and releases all associated resources. - /// - /// - /// - /// This method does nothing if the current state of the connection is - /// Closing or Closed. - /// - /// - /// This method closes the connection with status code 1001 (going away). - /// - /// - void IDisposable.Dispose () - { - close (1001, String.Empty); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/WebSocket.cs.meta b/ThirdParty/WebSocketSharp/WebSocket.cs.meta deleted file mode 100644 index 7b1d21ca3..000000000 --- a/ThirdParty/WebSocketSharp/WebSocket.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: fd99d958b35307043b8a7921c10ec095 -timeCreated: 1499973983 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/WebSocketException.cs b/ThirdParty/WebSocketSharp/WebSocketException.cs deleted file mode 100644 index 81d7c8081..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketException.cs +++ /dev/null @@ -1,109 +0,0 @@ -#region License -/* - * WebSocketException.cs - * - * The MIT License - * - * Copyright (c) 2012-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// The exception that is thrown when a fatal error occurs in - /// the WebSocket communication. - /// - public class WebSocketException : Exception - { - #region Private Fields - - private CloseStatusCode _code; - - #endregion - - #region Internal Constructors - - internal WebSocketException () - : this (CloseStatusCode.Abnormal, null, null) - { - } - - internal WebSocketException (Exception innerException) - : this (CloseStatusCode.Abnormal, null, innerException) - { - } - - internal WebSocketException (string message) - : this (CloseStatusCode.Abnormal, message, null) - { - } - - internal WebSocketException (CloseStatusCode code) - : this (code, null, null) - { - } - - internal WebSocketException (string message, Exception innerException) - : this (CloseStatusCode.Abnormal, message, innerException) - { - } - - internal WebSocketException (CloseStatusCode code, Exception innerException) - : this (code, null, innerException) - { - } - - internal WebSocketException (CloseStatusCode code, string message) - : this (code, message, null) - { - } - - internal WebSocketException ( - CloseStatusCode code, string message, Exception innerException - ) - : base (message ?? code.GetMessage (), innerException) - { - _code = code; - } - - #endregion - - #region Public Properties - - /// - /// Gets the status code indicating the cause of the exception. - /// - /// - /// One of the enum values that represents - /// the status code indicating the cause of the exception. - /// - public CloseStatusCode Code { - get { - return _code; - } - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/WebSocketException.cs.meta b/ThirdParty/WebSocketSharp/WebSocketException.cs.meta deleted file mode 100644 index d8aaa8823..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketException.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: e419b0719fd2ef64f9a9f76ac59283ea -timeCreated: 1499973982 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/WebSocketFrame.cs b/ThirdParty/WebSocketSharp/WebSocketFrame.cs deleted file mode 100644 index 3be6300fe..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketFrame.cs +++ /dev/null @@ -1,797 +0,0 @@ -#region License -/* - * WebSocketFrame.cs - * - * The MIT License - * - * Copyright (c) 2012-2015 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -#region Contributors -/* - * Contributors: - * - Chris Swiedler - */ -#endregion - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace WebSocketSharp -{ - internal class WebSocketFrame : IEnumerable - { - #region Private Fields - - private byte[] _extPayloadLength; - private Fin _fin; - private Mask _mask; - private byte[] _maskingKey; - private Opcode _opcode; - private PayloadData _payloadData; - private byte _payloadLength; - private Rsv _rsv1; - private Rsv _rsv2; - private Rsv _rsv3; - - #endregion - - #region Internal Fields - - /// - /// Represents the ping frame without the payload data as an array of . - /// - /// - /// The value of this field is created from a non masked frame, so it can only be used to - /// send a ping from a server. - /// - internal static readonly byte[] EmptyPingBytes; - - #endregion - - #region Static Constructor - - static WebSocketFrame () - { - EmptyPingBytes = CreatePingFrame (false).ToArray (); - } - - #endregion - - #region Private Constructors - - private WebSocketFrame () - { - } - - #endregion - - #region Internal Constructors - - internal WebSocketFrame (Opcode opcode, PayloadData payloadData, bool mask) - : this (Fin.Final, opcode, payloadData, false, mask) - { - } - - internal WebSocketFrame (Fin fin, Opcode opcode, byte[] data, bool compressed, bool mask) - : this (fin, opcode, new PayloadData (data), compressed, mask) - { - } - - internal WebSocketFrame ( - Fin fin, Opcode opcode, PayloadData payloadData, bool compressed, bool mask) - { - _fin = fin; - _rsv1 = opcode.IsData () && compressed ? Rsv.On : Rsv.Off; - _rsv2 = Rsv.Off; - _rsv3 = Rsv.Off; - _opcode = opcode; - - var len = payloadData.Length; - if (len < 126) { - _payloadLength = (byte) len; - _extPayloadLength = WebSocket.EmptyBytes; - } - else if (len < 0x010000) { - _payloadLength = (byte) 126; - _extPayloadLength = ((ushort) len).InternalToByteArray (ByteOrder.Big); - } - else { - _payloadLength = (byte) 127; - _extPayloadLength = len.InternalToByteArray (ByteOrder.Big); - } - - if (mask) { - _mask = Mask.On; - _maskingKey = createMaskingKey (); - payloadData.Mask (_maskingKey); - } - else { - _mask = Mask.Off; - _maskingKey = WebSocket.EmptyBytes; - } - - _payloadData = payloadData; - } - - #endregion - - #region Internal Properties - - internal int ExtendedPayloadLengthCount { - get { - return _payloadLength < 126 ? 0 : (_payloadLength == 126 ? 2 : 8); - } - } - - internal ulong FullPayloadLength { - get { - return _payloadLength < 126 - ? _payloadLength - : _payloadLength == 126 - ? _extPayloadLength.ToUInt16 (ByteOrder.Big) - : _extPayloadLength.ToUInt64 (ByteOrder.Big); - } - } - - #endregion - - #region Public Properties - - public byte[] ExtendedPayloadLength { - get { - return _extPayloadLength; - } - } - - public Fin Fin { - get { - return _fin; - } - } - - public bool IsBinary { - get { - return _opcode == Opcode.Binary; - } - } - - public bool IsClose { - get { - return _opcode == Opcode.Close; - } - } - - public bool IsCompressed { - get { - return _rsv1 == Rsv.On; - } - } - - public bool IsContinuation { - get { - return _opcode == Opcode.Cont; - } - } - - public bool IsControl { - get { - return _opcode >= Opcode.Close; - } - } - - public bool IsData { - get { - return _opcode == Opcode.Text || _opcode == Opcode.Binary; - } - } - - public bool IsFinal { - get { - return _fin == Fin.Final; - } - } - - public bool IsFragment { - get { - return _fin == Fin.More || _opcode == Opcode.Cont; - } - } - - public bool IsMasked { - get { - return _mask == Mask.On; - } - } - - public bool IsPing { - get { - return _opcode == Opcode.Ping; - } - } - - public bool IsPong { - get { - return _opcode == Opcode.Pong; - } - } - - public bool IsText { - get { - return _opcode == Opcode.Text; - } - } - - public ulong Length { - get { - return 2 + (ulong) (_extPayloadLength.Length + _maskingKey.Length) + _payloadData.Length; - } - } - - public Mask Mask { - get { - return _mask; - } - } - - public byte[] MaskingKey { - get { - return _maskingKey; - } - } - - public Opcode Opcode { - get { - return _opcode; - } - } - - public PayloadData PayloadData { - get { - return _payloadData; - } - } - - public byte PayloadLength { - get { - return _payloadLength; - } - } - - public Rsv Rsv1 { - get { - return _rsv1; - } - } - - public Rsv Rsv2 { - get { - return _rsv2; - } - } - - public Rsv Rsv3 { - get { - return _rsv3; - } - } - - #endregion - - #region Private Methods - - private static byte[] createMaskingKey () - { - var key = new byte[4]; - WebSocket.RandomNumber.GetBytes (key); - - return key; - } - - private static string dump (WebSocketFrame frame) - { - var len = frame.Length; - var cnt = (long) (len / 4); - var rem = (int) (len % 4); - - int cntDigit; - string cntFmt; - if (cnt < 10000) { - cntDigit = 4; - cntFmt = "{0,4}"; - } - else if (cnt < 0x010000) { - cntDigit = 4; - cntFmt = "{0,4:X}"; - } - else if (cnt < 0x0100000000) { - cntDigit = 8; - cntFmt = "{0,8:X}"; - } - else { - cntDigit = 16; - cntFmt = "{0,16:X}"; - } - - var spFmt = String.Format ("{{0,{0}}}", cntDigit); - var headerFmt = String.Format (@" -{0} 01234567 89ABCDEF 01234567 89ABCDEF -{0}+--------+--------+--------+--------+\n", spFmt); - var lineFmt = String.Format ("{0}|{{1,8}} {{2,8}} {{3,8}} {{4,8}}|\n", cntFmt); - var footerFmt = String.Format ("{0}+--------+--------+--------+--------+", spFmt); - - var output = new StringBuilder (64); - Func> linePrinter = () => { - long lineCnt = 0; - return (arg1, arg2, arg3, arg4) => - output.AppendFormat (lineFmt, ++lineCnt, arg1, arg2, arg3, arg4); - }; - var printLine = linePrinter (); - - output.AppendFormat (headerFmt, String.Empty); - - var bytes = frame.ToArray (); - for (long i = 0; i <= cnt; i++) { - var j = i * 4; - if (i < cnt) { - printLine ( - Convert.ToString (bytes[j], 2).PadLeft (8, '0'), - Convert.ToString (bytes[j + 1], 2).PadLeft (8, '0'), - Convert.ToString (bytes[j + 2], 2).PadLeft (8, '0'), - Convert.ToString (bytes[j + 3], 2).PadLeft (8, '0')); - - continue; - } - - if (rem > 0) - printLine ( - Convert.ToString (bytes[j], 2).PadLeft (8, '0'), - rem >= 2 ? Convert.ToString (bytes[j + 1], 2).PadLeft (8, '0') : String.Empty, - rem == 3 ? Convert.ToString (bytes[j + 2], 2).PadLeft (8, '0') : String.Empty, - String.Empty); - } - - output.AppendFormat (footerFmt, String.Empty); - return output.ToString (); - } - - private static string print (WebSocketFrame frame) - { - // Payload Length - var payloadLen = frame._payloadLength; - - // Extended Payload Length - var extPayloadLen = payloadLen > 125 ? frame.FullPayloadLength.ToString () : String.Empty; - - // Masking Key - var maskingKey = BitConverter.ToString (frame._maskingKey); - - // Payload Data - var payload = payloadLen == 0 - ? String.Empty - : payloadLen > 125 - ? "---" - : frame.IsText && !(frame.IsFragment || frame.IsMasked || frame.IsCompressed) - ? frame._payloadData.ApplicationData.UTF8Decode () - : frame._payloadData.ToString (); - - var fmt = @" - FIN: {0} - RSV1: {1} - RSV2: {2} - RSV3: {3} - Opcode: {4} - MASK: {5} - Payload Length: {6} -Extended Payload Length: {7} - Masking Key: {8} - Payload Data: {9}"; - - return String.Format ( - fmt, - frame._fin, - frame._rsv1, - frame._rsv2, - frame._rsv3, - frame._opcode, - frame._mask, - payloadLen, - extPayloadLen, - maskingKey, - payload); - } - - private static WebSocketFrame processHeader (byte[] header) - { - if (header.Length != 2) - throw new WebSocketException ("The header of a frame cannot be read from the stream."); - - // FIN - var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; - - // RSV1 - var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; - - // RSV2 - var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; - - // RSV3 - var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; - - // Opcode - var opcode = (byte) (header[0] & 0x0f); - - // MASK - var mask = (header[1] & 0x80) == 0x80 ? Mask.On : Mask.Off; - - // Payload Length - var payloadLen = (byte) (header[1] & 0x7f); - - var err = !opcode.IsSupported () - ? "An unsupported opcode." - : !opcode.IsData () && rsv1 == Rsv.On - ? "A non data frame is compressed." - : opcode.IsControl () && fin == Fin.More - ? "A control frame is fragmented." - : opcode.IsControl () && payloadLen > 125 - ? "A control frame has a long payload length." - : null; - - if (err != null) - throw new WebSocketException (CloseStatusCode.ProtocolError, err); - - var frame = new WebSocketFrame (); - frame._fin = fin; - frame._rsv1 = rsv1; - frame._rsv2 = rsv2; - frame._rsv3 = rsv3; - frame._opcode = (Opcode) opcode; - frame._mask = mask; - frame._payloadLength = payloadLen; - - return frame; - } - - private static WebSocketFrame readExtendedPayloadLength (Stream stream, WebSocketFrame frame) - { - var len = frame.ExtendedPayloadLengthCount; - if (len == 0) { - frame._extPayloadLength = WebSocket.EmptyBytes; - return frame; - } - - var bytes = stream.ReadBytes (len); - if (bytes.Length != len) - throw new WebSocketException ( - "The extended payload length of a frame cannot be read from the stream."); - - frame._extPayloadLength = bytes; - return frame; - } - - private static void readExtendedPayloadLengthAsync ( - Stream stream, - WebSocketFrame frame, - Action completed, - Action error) - { - var len = frame.ExtendedPayloadLengthCount; - if (len == 0) { - frame._extPayloadLength = WebSocket.EmptyBytes; - completed (frame); - - return; - } - - stream.ReadBytesAsync ( - len, - bytes => { - if (bytes.Length != len) - throw new WebSocketException ( - "The extended payload length of a frame cannot be read from the stream."); - - frame._extPayloadLength = bytes; - completed (frame); - }, - error); - } - - private static WebSocketFrame readHeader (Stream stream) - { - return processHeader (stream.ReadBytes (2)); - } - - private static void readHeaderAsync ( - Stream stream, Action completed, Action error) - { - stream.ReadBytesAsync (2, bytes => completed (processHeader (bytes)), error); - } - - private static WebSocketFrame readMaskingKey (Stream stream, WebSocketFrame frame) - { - var len = frame.IsMasked ? 4 : 0; - if (len == 0) { - frame._maskingKey = WebSocket.EmptyBytes; - return frame; - } - - var bytes = stream.ReadBytes (len); - if (bytes.Length != len) - throw new WebSocketException ("The masking key of a frame cannot be read from the stream."); - - frame._maskingKey = bytes; - return frame; - } - - private static void readMaskingKeyAsync ( - Stream stream, - WebSocketFrame frame, - Action completed, - Action error) - { - var len = frame.IsMasked ? 4 : 0; - if (len == 0) { - frame._maskingKey = WebSocket.EmptyBytes; - completed (frame); - - return; - } - - stream.ReadBytesAsync ( - len, - bytes => { - if (bytes.Length != len) - throw new WebSocketException ( - "The masking key of a frame cannot be read from the stream."); - - frame._maskingKey = bytes; - completed (frame); - }, - error); - } - - private static WebSocketFrame readPayloadData (Stream stream, WebSocketFrame frame) - { - var len = frame.FullPayloadLength; - if (len == 0) { - frame._payloadData = PayloadData.Empty; - return frame; - } - - if (len > PayloadData.MaxLength) - throw new WebSocketException (CloseStatusCode.TooBig, "A frame has a long payload length."); - - var llen = (long) len; - var bytes = frame._payloadLength < 127 - ? stream.ReadBytes ((int) len) - : stream.ReadBytes (llen, 1024); - - if (bytes.LongLength != llen) - throw new WebSocketException ( - "The payload data of a frame cannot be read from the stream."); - - frame._payloadData = new PayloadData (bytes, llen); - return frame; - } - - private static void readPayloadDataAsync ( - Stream stream, - WebSocketFrame frame, - Action completed, - Action error) - { - var len = frame.FullPayloadLength; - if (len == 0) { - frame._payloadData = PayloadData.Empty; - completed (frame); - - return; - } - - if (len > PayloadData.MaxLength) - throw new WebSocketException (CloseStatusCode.TooBig, "A frame has a long payload length."); - - var llen = (long) len; - Action compl = bytes => { - if (bytes.LongLength != llen) - throw new WebSocketException ( - "The payload data of a frame cannot be read from the stream."); - - frame._payloadData = new PayloadData (bytes, llen); - completed (frame); - }; - - if (frame._payloadLength < 127) { - stream.ReadBytesAsync ((int) len, compl, error); - return; - } - - stream.ReadBytesAsync (llen, 1024, compl, error); - } - - #endregion - - #region Internal Methods - - internal static WebSocketFrame CreateCloseFrame ( - PayloadData payloadData, bool mask - ) - { - return new WebSocketFrame ( - Fin.Final, Opcode.Close, payloadData, false, mask - ); - } - - internal static WebSocketFrame CreatePingFrame (bool mask) - { - return new WebSocketFrame ( - Fin.Final, Opcode.Ping, PayloadData.Empty, false, mask - ); - } - - internal static WebSocketFrame CreatePingFrame (byte[] data, bool mask) - { - return new WebSocketFrame ( - Fin.Final, Opcode.Ping, new PayloadData (data), false, mask - ); - } - - internal static WebSocketFrame CreatePongFrame ( - PayloadData payloadData, bool mask - ) - { - return new WebSocketFrame ( - Fin.Final, Opcode.Pong, payloadData, false, mask - ); - } - - internal static WebSocketFrame ReadFrame (Stream stream, bool unmask) - { - var frame = readHeader (stream); - readExtendedPayloadLength (stream, frame); - readMaskingKey (stream, frame); - readPayloadData (stream, frame); - - if (unmask) - frame.Unmask (); - - return frame; - } - - internal static void ReadFrameAsync ( - Stream stream, - bool unmask, - Action completed, - Action error - ) - { - readHeaderAsync ( - stream, - frame => - readExtendedPayloadLengthAsync ( - stream, - frame, - frame1 => - readMaskingKeyAsync ( - stream, - frame1, - frame2 => - readPayloadDataAsync ( - stream, - frame2, - frame3 => { - if (unmask) - frame3.Unmask (); - - completed (frame3); - }, - error - ), - error - ), - error - ), - error - ); - } - - internal void Unmask () - { - if (_mask == Mask.Off) - return; - - _mask = Mask.Off; - _payloadData.Mask (_maskingKey); - _maskingKey = WebSocket.EmptyBytes; - } - - #endregion - - #region Public Methods - - public IEnumerator GetEnumerator () - { - foreach (var b in ToArray ()) - yield return b; - } - - public void Print (bool dumped) - { - Console.WriteLine (dumped ? dump (this) : print (this)); - } - - public string PrintToString (bool dumped) - { - return dumped ? dump (this) : print (this); - } - - public byte[] ToArray () - { - using (var buff = new MemoryStream ()) { - var header = (int) _fin; - header = (header << 1) + (int) _rsv1; - header = (header << 1) + (int) _rsv2; - header = (header << 1) + (int) _rsv3; - header = (header << 4) + (int) _opcode; - header = (header << 1) + (int) _mask; - header = (header << 7) + (int) _payloadLength; - buff.Write (((ushort) header).InternalToByteArray (ByteOrder.Big), 0, 2); - - if (_payloadLength > 125) - buff.Write (_extPayloadLength, 0, _payloadLength == 126 ? 2 : 8); - - if (_mask == Mask.On) - buff.Write (_maskingKey, 0, 4); - - if (_payloadLength > 0) { - var bytes = _payloadData.ToArray (); - if (_payloadLength < 127) - buff.Write (bytes, 0, bytes.Length); - else - buff.WriteBytes (bytes, 1024); - } - - buff.Close (); - return buff.ToArray (); - } - } - - public override string ToString () - { - return BitConverter.ToString (ToArray ()); - } - - #endregion - - #region Explicit Interface Implementations - - IEnumerator IEnumerable.GetEnumerator () - { - return GetEnumerator (); - } - - #endregion - } -} diff --git a/ThirdParty/WebSocketSharp/WebSocketFrame.cs.meta b/ThirdParty/WebSocketSharp/WebSocketFrame.cs.meta deleted file mode 100644 index 4b686be2d..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketFrame.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 27fa1feda4d5cd347b2e23b1e8e59ad3 -timeCreated: 1499973980 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/WebSocketState.cs b/ThirdParty/WebSocketSharp/WebSocketState.cs deleted file mode 100644 index 2cbcd688d..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketState.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region License -/* - * WebSocketState.cs - * - * The MIT License - * - * Copyright (c) 2010-2016 sta.blockhead - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#endregion - -using System; - -namespace WebSocketSharp -{ - /// - /// Indicates the state of a WebSocket connection. - /// - /// - /// The values of this enumeration are defined in - /// - /// The WebSocket API. - /// - public enum WebSocketState : ushort - { - /// - /// Equivalent to numeric value 0. Indicates that the connection has not - /// yet been established. - /// - Connecting = 0, - /// - /// Equivalent to numeric value 1. Indicates that the connection has - /// been established, and the communication is possible. - /// - Open = 1, - /// - /// Equivalent to numeric value 2. Indicates that the connection is - /// going through the closing handshake, or the close method has - /// been invoked. - /// - Closing = 2, - /// - /// Equivalent to numeric value 3. Indicates that the connection has - /// been closed or could not be established. - /// - Closed = 3 - } -} diff --git a/ThirdParty/WebSocketSharp/WebSocketState.cs.meta b/ThirdParty/WebSocketSharp/WebSocketState.cs.meta deleted file mode 100644 index d4886474c..000000000 --- a/ThirdParty/WebSocketSharp/WebSocketState.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 88dfa9f958fa24d4d9846b6e8307b186 -timeCreated: 1499973981 -licenseType: Free -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/doc.meta b/ThirdParty/WebSocketSharp/doc.meta deleted file mode 100644 index 48949d131..000000000 --- a/ThirdParty/WebSocketSharp/doc.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 405587617c54db1488239d71fa8a7dde -folderAsset: yes -timeCreated: 1443712075 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/doc/.gitignore b/ThirdParty/WebSocketSharp/doc/.gitignore deleted file mode 100644 index 7b744c39d..000000000 --- a/ThirdParty/WebSocketSharp/doc/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -## Ignore MonoDevelop build results. - -html -mdoc diff --git a/ThirdParty/WebSocketSharp/doc/doc.sh b/ThirdParty/WebSocketSharp/doc/doc.sh deleted file mode 100644 index e4f3fa6b3..000000000 --- a/ThirdParty/WebSocketSharp/doc/doc.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# @(#) doc.sh ver.0.0.2 2013.01.24 -# -# Usage: -# doc.sh -# -# Description: -# Creating documentation for websocket-sharp. -# -########################################################################### - -SRC_DIR="../bin/Release_Ubuntu" -XML="${SRC_DIR}/websocket-sharp.xml" -DLL="${SRC_DIR}/websocket-sharp.dll" - -DOC_DIR="." -MDOC_DIR="${DOC_DIR}/mdoc" -HTML_DIR="${DOC_DIR}/html" - -createDir() { - if [ ! -d $1 ]; then - mkdir -p $1 - fi -} - -set -e -createDir ${MDOC_DIR} -createDir ${HTML_DIR} -mdoc update --delete -fno-assembly-versions -i ${XML} -o ${MDOC_DIR}/ ${DLL} -mdoc export-html -o ${HTML_DIR}/ ${MDOC_DIR}/ diff --git a/ThirdParty/WebSocketSharp/doc/doc.sh.meta b/ThirdParty/WebSocketSharp/doc/doc.sh.meta deleted file mode 100644 index c9b5f305f..000000000 --- a/ThirdParty/WebSocketSharp/doc/doc.sh.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 762014148555a094c88a93de6a30b57c -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.snk b/ThirdParty/WebSocketSharp/websocket-sharp.snk deleted file mode 100644 index a2546f385ff1c28221f1071dd2fbc1870d728eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONaL0000f7yF6+!;$wZ%ZuV+(mw^0ZDpvQV{)eT z)hzOzAo>fyaBB95ev6PlIrVnPNZ`ABvU}~*5T_asaF`E&^h;9-(xvYSmgrHTIc_N+d4!r0J+k@O7F^N!rZ!?-v-48IrNAb7!} z-N_==YbBhM_zb%3vcPBeECpwQOr<(i6$!ynrQ~`QXjiMFwVBazO>@JrfgI51ivGl6 zRjei2J2>~wP7}hz?AO{)>lh*();UW|5NUR0!Ji$O!OQ_E@UT|!^m$J!!@8AkltT%j z@^-wS`8NxnHzsxMW{zi$Sgj3%PBZ_5qAu2Olh=Q!lDnQk=0}kkW2jUYzmul4bgJIL zlK?W_`r?N;Z(!Kc`z;*hfOxrjI{zF803Sg&r~jaQ?Y?Fa8?Az+3a++ht8(mR9-o|j zE@`6|n4@2Af4?zHoP|-_#;rVGqar>7nH%|Nigv24jWsE z$LIC>T!MfxCrw6m*qpp=DPHF19B*63GF@WFjU6vWTmP4b`Oq(FIRY0(-TN1xl?|1D z-Sj2XD0j7$83O-B-{7UHg(P)vanCZOjten@X*^b4ZsM;$Wnsvy271`V8$NH_bgN{j zPL(SOf2I?l4(?fnuwJ_P05C5xZ~dI4vhml_=<z#%yL*k|m=6 diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.snk.meta b/ThirdParty/WebSocketSharp/websocket-sharp.snk.meta deleted file mode 100644 index 1a90d32cb..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.snk.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e6369fe8073c5cd488ea921f01688e82 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From 5609c0bc9945c3b41eaacc59e9dab0b71f74c42e Mon Sep 17 00:00:00 2001 From: kimberlysiva Date: Thu, 12 Oct 2017 14:52:19 -0400 Subject: [PATCH 004/100] conditional changes for .NET Core compatibility --- Scripts/Connection/WSConnector.cs | 125 +++++++++++++++++- Scripts/Logging/Logger.cs | 14 +- .../v1/DocumentConversion.cs | 8 ++ Scripts/UnitTests/UnitTestManager.cs | 2 + Scripts/Utilities/AudioClipUtil.cs | 4 + Scripts/Utilities/SerializedDelegate.cs | 8 ++ Scripts/Utilities/Singleton.cs | 3 + Scripts/Utilities/Utility.cs | 23 ++++ Scripts/Utilities/WaveFile.cs | 16 +++ Scripts/Widgets/Widget.cs | 18 +++ Travis/TravisIntegrationTests.cs | 2 + 11 files changed, 220 insertions(+), 3 deletions(-) diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 305b08ed4..9ce3d2af5 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -23,8 +23,16 @@ using System.Collections; using System.Collections.Generic; using System.Threading; -using WebSocketSharp; +#if !NETFX_CORE +using WebSocketSharp; +#else +using System; +using System.Threading.Tasks; +using Windows.Networking.Sockets; +using Windows.Security.Credentials; +using Windows.Storage.Streams; +#endif namespace IBM.Watson.DeveloperCloud.Connection { @@ -147,7 +155,11 @@ public TextMessage(string text) #region Private Data private ConnectionState _connectionState = ConnectionState.CLOSED; +#if !NETFX_CORE private Thread _sendThread = null; +#else + private Task _sendTask = null; +#endif private AutoResetEvent _sendEvent = new AutoResetEvent(false); private Queue _sendQueue = new Queue(); private AutoResetEvent _receiveEvent = new AutoResetEvent(false); @@ -206,6 +218,7 @@ public void Send(Message msg, bool queue = false) _sendEvent.Set(); } +#if !NETFX_CORE if (!queue && _sendThread == null) { _connectionState = ConnectionState.CONNECTING; @@ -215,6 +228,13 @@ public void Send(Message msg, bool queue = false) _sendThread = new Thread(SendMessages); _sendThread.Start(); } +#else + if (!queue && _sendTask == null) + { + _connectionState = ConnectionState.CONNECTING; + _sendTask = Task.Run(() => SendMessagesAsync()); + } +#endif // Run our receiver as a co-routine so it can invoke functions // on the main thread. @@ -267,6 +287,7 @@ private IEnumerator ProcessReceiveQueue() #region Threaded Functions // NOTE: ALl functions in this region are operating in a background thread, do NOT call any Unity functions! +#if !NETFX_CORE private void SendMessages() { try @@ -340,6 +361,108 @@ private void OnWSError(object sender, ErrorEventArgs e) { _connectionState = ConnectionState.DISCONNECTED; } +#else + private async Task SendMessagesAsync() + { + try + { + MessageWebSocket webSocket = new MessageWebSocket(); + + if (Authentication != null) + { + PasswordCredential credential = new PasswordCredential(Authentication.Url, Authentication.Username, Authentication.Password); + webSocket.Control.ServerCredential = credential; + } + + webSocket.MessageReceived += WebSocket_MessageReceived; + webSocket.Closed += WebSocket_Closed; + + DataWriter messageWriter = new DataWriter(webSocket.OutputStream); + + await webSocket.ConnectAsync(new Uri(URL)); + + _connectionState = ConnectionState.CONNECTED; + + while (_connectionState == ConnectionState.CONNECTED) + { + _sendEvent.WaitOne(500); + + Message msg = null; + lock (_sendQueue) + { + if (_sendQueue.Count > 0) + msg = _sendQueue.Dequeue(); + } + + if (msg == null) + continue; + + if (msg is TextMessage) + { + webSocket.Control.MessageType = SocketMessageType.Utf8; + messageWriter.WriteString(((TextMessage)msg).Text); + await messageWriter.StoreAsync(); + } + else if (msg is BinaryMessage) + { + webSocket.Control.MessageType = SocketMessageType.Binary; + messageWriter.WriteBytes(((BinaryMessage)msg).Data); + await messageWriter.StoreAsync(); + } + } + + webSocket.Close(1000, "Complete"); + } + catch (System.Exception e) + { + _connectionState = ConnectionState.DISCONNECTED; + Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + } + } + + private void WebSocket_Closed(IWebSocket sender, WebSocketClosedEventArgs args) + { + _connectionState = (args.Code == 1000) ? ConnectionState.CLOSED : ConnectionState.DISCONNECTED; + } + + private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) + { + try + { + Message msg = null; + if (args.MessageType == SocketMessageType.Utf8) + { + using (var dataReader = args.GetDataReader()) + { + dataReader.UnicodeEncoding = UnicodeEncoding.Utf8; + string data = dataReader.ReadString(dataReader.UnconsumedBufferLength); + msg = new TextMessage(data); + } + } + else if (args.MessageType == SocketMessageType.Binary) + { + using (var dataReader = args.GetDataReader()) + { + uint length = dataReader.UnconsumedBufferLength; + if (length > 0) + { + byte[] data = new byte[length]; + dataReader.ReadBytes(data); + msg = new BinaryMessage(data); + } + } + } + + lock (_receiveQueue) + _receiveQueue.Enqueue(msg); + _receiveEvent.Set(); + } + catch (System.Exception e) + { + Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + } + } +#endif #endregion } } diff --git a/Scripts/Logging/Logger.cs b/Scripts/Logging/Logger.cs index 5e849f4b6..fe4aee047 100644 --- a/Scripts/Logging/Logger.cs +++ b/Scripts/Logging/Logger.cs @@ -138,7 +138,7 @@ public static void InstallDefaultReactors(int logHistory = 2, LogLevel logLevelF { // install the default reactors... _bInstalledDefaultReactors = true; -#if UNITY_EDITOR || UNITY_IOS || UNITY_ANDROID +#if UNITY_EDITOR || UNITY_IOS || UNITY_ANDROID || NETFX_CORE LogSystem.Instance.InstallReactor(new DebugReactor()); #endif @@ -210,11 +210,13 @@ public static class Log /// Name of the subsystem. /// Message with formatting. /// Formatting arguments. -#if UNITY_EDITOR +#if UNITY_EDITOR || NETFX_CORE public static void Debug(string subSystem, string messageFmt, params object[] args) { LogSystem.Instance.ProcessLog(new LogRecord(LogLevel.DEBUG, subSystem, messageFmt, args)); +#if !NETFX_CORE System.Console.WriteLine("[{0}][{1}]: {2}", LogLevel.DEBUG, subSystem, string.Format(messageFmt, args)); +#endif } #else // We compile out Log.Debug() functions in release builds. @@ -231,7 +233,9 @@ public static void Debug(string subSystem, string messageFmt, params object[] ar public static void Status(string subSystem, string messageFmt, params object[] args) { LogSystem.Instance.ProcessLog(new LogRecord(LogLevel.STATUS, subSystem, messageFmt, args)); +#if !NETFX_CORE System.Console.WriteLine("[{0}][{1}]: {2}", LogLevel.STATUS, subSystem, string.Format(messageFmt, args)); +#endif } /// /// Log a WARNING level message. @@ -242,7 +246,9 @@ public static void Status(string subSystem, string messageFmt, params object[] a public static void Warning(string subSystem, string messageFmt, params object[] args) { LogSystem.Instance.ProcessLog(new LogRecord(LogLevel.WARNING, subSystem, messageFmt, args)); +#if !NETFX_CORE System.Console.WriteLine("[{0}][{1}]: {2}", LogLevel.WARNING, subSystem, string.Format(messageFmt, args)); +#endif } /// /// Log a ERROR level message. @@ -253,7 +259,9 @@ public static void Warning(string subSystem, string messageFmt, params object[] public static void Error(string subSystem, string messageFmt, params object[] args) { LogSystem.Instance.ProcessLog(new LogRecord(LogLevel.ERROR, subSystem, messageFmt, args)); +#if !NETFX_CORE System.Console.WriteLine("[{0}][{1}]: {2}", LogLevel.ERROR, subSystem, string.Format(messageFmt, args)); +#endif } /// /// Log a CRITICAL level message. @@ -264,7 +272,9 @@ public static void Error(string subSystem, string messageFmt, params object[] ar public static void Critical(string subSystem, string messageFmt, params object[] args) { LogSystem.Instance.ProcessLog(new LogRecord(LogLevel.CRITICAL, subSystem, messageFmt, args)); +#if !NETFX_CORE System.Console.WriteLine("[{0}][{1}]: {2}", LogLevel.CRITICAL, subSystem, string.Format(messageFmt, args)); +#endif } } } diff --git a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs index 7bdd56fd6..47b7ed0ee 100644 --- a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs +++ b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs @@ -197,11 +197,19 @@ private void ConvertDocumentResponse(RESTConnector.Request req, RESTConnector.Re } else if ((req as ConvertDocumentRequest).ConversionTarget == ConversionTarget.NormalizedHtml) { +#if NETFX_CORE + response.htmlContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); +#else response.htmlContent = System.Text.Encoding.Default.GetString(resp.Data); +#endif } else if ((req as ConvertDocumentRequest).ConversionTarget == ConversionTarget.NormalizedText) { +#if NETFX_CORE + response.textContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); +#else response.textContent = System.Text.Encoding.Default.GetString(resp.Data); +#endif } } diff --git a/Scripts/UnitTests/UnitTestManager.cs b/Scripts/UnitTests/UnitTestManager.cs index 4de113440..3d0cd6768 100644 --- a/Scripts/UnitTests/UnitTestManager.cs +++ b/Scripts/UnitTests/UnitTestManager.cs @@ -235,6 +235,7 @@ static public void All() Runnable.EnableRunnableInEditor(); #endif string ProjectToTest = ""; +#if !NETFX_CORE string[] args = Environment.GetCommandLineArgs(); for (int i = 0; i < args.Length; ++i) { @@ -256,6 +257,7 @@ static public void All() } } } +#endif IBM.Watson.DeveloperCloud.Editor.UnitTestManager.ProjectToTest = ProjectToTest; IBM.Watson.DeveloperCloud.Editor.UnitTestManager instance = IBM.Watson.DeveloperCloud.Editor.UnitTestManager.Instance; diff --git a/Scripts/Utilities/AudioClipUtil.cs b/Scripts/Utilities/AudioClipUtil.cs index 3623cf448..989ca16ff 100644 --- a/Scripts/Utilities/AudioClipUtil.cs +++ b/Scripts/Utilities/AudioClipUtil.cs @@ -100,10 +100,14 @@ public static byte[] GetL16(AudioClip clip) for (int i = 0; i < samples.Length; ++i) writer.Write((short)(samples[i] * divisor)); +#if NETFX_CORE + return stream.ToArray(); +#else byte[] data = new byte[samples.Length * 2]; Array.Copy(stream.GetBuffer(), data, data.Length); return data; +#endif } } } diff --git a/Scripts/Utilities/SerializedDelegate.cs b/Scripts/Utilities/SerializedDelegate.cs index 8895b5102..871d63a76 100644 --- a/Scripts/Utilities/SerializedDelegate.cs +++ b/Scripts/Utilities/SerializedDelegate.cs @@ -66,11 +66,19 @@ public Delegate ResolveDelegate() Component component = _target.GetComponent(_component); if (component == null) return null; +#if NETFX_CORE + MethodInfo info = component.GetType().GetMethod(_method, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); + if (info == null) + return null; + + return info.CreateDelegate(DelegateType, component); +#else MethodInfo info = component.GetType().GetMethod(_method, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod); if (info == null) return null; return Delegate.CreateDelegate(DelegateType, component, info); +#endif } } } diff --git a/Scripts/Utilities/Singleton.cs b/Scripts/Utilities/Singleton.cs index 92dd95c53..d0c9ee929 100644 --- a/Scripts/Utilities/Singleton.cs +++ b/Scripts/Utilities/Singleton.cs @@ -19,6 +19,9 @@ using UnityEngine; using System; +#if NETFX_CORE +using System.Reflection; +#endif namespace IBM.Watson.DeveloperCloud.Utilities { diff --git a/Scripts/Utilities/Utility.cs b/Scripts/Utilities/Utility.cs index 5c149c56f..964a7d364 100644 --- a/Scripts/Utilities/Utility.cs +++ b/Scripts/Utilities/Utility.cs @@ -27,6 +27,9 @@ using System.Text.RegularExpressions; using System.Runtime.InteropServices; using IBM.Watson.DeveloperCloud.Connection; +#if NETFX_CORE +using System.Reflection; +#endif namespace IBM.Watson.DeveloperCloud.Utilities { @@ -46,6 +49,15 @@ static public class Utility public static Type[] FindAllDerivedTypes(Type type) { List types = new List(); +#if NETFX_CORE + foreach (var t in type.GetTypeInfo().Assembly.GetTypes()) + { + if (t == type || t.GetTypeInfo().IsAbstract) + continue; + if (type.IsAssignableFrom(t)) + types.Add(t); + } +#else foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var t in assembly.GetTypes()) @@ -56,6 +68,7 @@ public static Type[] FindAllDerivedTypes(Type type) types.Add(t); } } +#endif return types.ToArray(); } @@ -207,7 +220,11 @@ public static string GetMD5(string s) return string.Empty; MD5 md5 = new MD5CryptoServiceProvider(); +#if NETFX_CORE + byte[] data = Encoding.GetEncoding(0).GetBytes(s); +#else byte[] data = Encoding.Default.GetBytes(s); +#endif byte[] result = md5.ComputeHash(data); StringBuilder output = new StringBuilder(); @@ -325,6 +342,7 @@ public static string MacAddress { get { +#if !NETFX_CORE if (string.IsNullOrEmpty(_macAddress)) { foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) @@ -340,6 +358,7 @@ public static string MacAddress } } } +#endif return _macAddress; } @@ -355,7 +374,11 @@ public static byte[] Color32ArrayToByteArray(Color32[] colors) if (colors == null || colors.Length == 0) return null; +#if NETFX_CORE + int lengthOfColor32 = Marshal.SizeOf(); +#else int lengthOfColor32 = Marshal.SizeOf(typeof(Color32)); +#endif int length = lengthOfColor32 * colors.Length; byte[] bytes = new byte[length]; diff --git a/Scripts/Utilities/WaveFile.cs b/Scripts/Utilities/WaveFile.cs index acd899afd..3d585d577 100644 --- a/Scripts/Utilities/WaveFile.cs +++ b/Scripts/Utilities/WaveFile.cs @@ -60,11 +60,19 @@ struct WAV_PCM #region Private Functions private static T ReadType(BinaryReader reader) { +#if NETFX_CORE + byte[] bytes = reader.ReadBytes(Marshal.SizeOf()); + + GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject()); + handle.Free(); +#else byte[] bytes = reader.ReadBytes(Marshal.SizeOf(typeof(T))); GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); handle.Free(); +#endif return theStructure; } @@ -254,7 +262,15 @@ public static byte[] CreateWAV(AudioClip clip, int bps = 16) writer.Seek(0, SeekOrigin.Begin); WriteType(writer, form); +#if NETFX_CORE + ArraySegment bytes; + if (stream.TryGetBuffer(out bytes)) + return bytes.Array; + else + return null; +#else return stream.GetBuffer(); +#endif } #endregion } diff --git a/Scripts/Widgets/Widget.cs b/Scripts/Widgets/Widget.cs index 068e2ef4f..a5fdb5151 100644 --- a/Scripts/Widgets/Widget.cs +++ b/Scripts/Widgets/Widget.cs @@ -200,6 +200,18 @@ public virtual void Start(Widget owner) if (!string.IsNullOrEmpty(ReceiverFunction)) { +#if NETFX_CORE + MethodInfo info = Owner.GetType().GetMethod(ReceiverFunction, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | + BindingFlags.NonPublic | BindingFlags.Static); + if (info != null) + { + DataReceiver = info.CreateDelegate(typeof(OnReceiveData), Owner) as OnReceiveData; + if (DataReceiver == null) + Log.Error("Widget", "CreateDelegate failed for function {0}", ReceiverFunction); + } + else + Log.Error("Widget", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); +#else MethodInfo info = Owner.GetType().GetMethod(ReceiverFunction, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod); if (info != null) @@ -210,6 +222,7 @@ public virtual void Start(Widget owner) } else Log.Error("Widget", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); +#endif } } @@ -611,8 +624,13 @@ private T[] GetMembersByType() where T : class { List inputs = new List(); +#if NETFX_CORE + MemberInfo[] members = GetType().GetMembers(BindingFlags.Instance + | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public); +#else MemberInfo[] members = GetType().GetMembers(BindingFlags.Instance | BindingFlags.GetField | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public); +#endif foreach (MemberInfo info in members) { FieldInfo field = info as FieldInfo; diff --git a/Travis/TravisIntegrationTests.cs b/Travis/TravisIntegrationTests.cs index d3e439ffd..208fc08f9 100644 --- a/Travis/TravisIntegrationTests.cs +++ b/Travis/TravisIntegrationTests.cs @@ -36,6 +36,7 @@ public static void RunTests() Runnable.EnableRunnableInEditor(); #endif string ProjectToTest = ""; +#if !NETFX_CORE string[] args = Environment.GetCommandLineArgs(); for (int i = 0; i < args.Length; ++i) { @@ -57,6 +58,7 @@ public static void RunTests() } } } +#endif UnitTestManager.ProjectToTest = ProjectToTest; UnitTestManager instance = UnitTestManager.Instance; From da2be12e6c64aea6fa0f1daed56916d9b3172d3f Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 12 Oct 2017 17:48:21 -0500 Subject: [PATCH 005/100] temporarily sending loaded audio file to keep alive --- .../Scripts/ExampleStreaming.cs | 2 +- Resources/highHat.wav | Bin 0 -> 25296 bytes Resources/highHat.wav.meta | 23 ++++++++++++++++++ .../Services/SpeechToText/v1/SpeechToText.cs | 15 ++++++------ 4 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 Resources/highHat.wav create mode 100644 Resources/highHat.wav.meta diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index d0ad82a69..e36326165 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -60,7 +60,7 @@ public bool Active _speechToText.DetectSilence = true; _speechToText.EnableWordConfidence = false; _speechToText.EnableTimestamps = false; - _speechToText.SilenceThreshold = 0.03f; + _speechToText.SilenceThreshold = 0.00f; _speechToText.MaxAlternatives = 1; _speechToText.EnableContinousRecognition = true; _speechToText.EnableInterimResults = true; diff --git a/Resources/highHat.wav b/Resources/highHat.wav new file mode 100644 index 0000000000000000000000000000000000000000..9bf5d98a2cb1ad6ba5b70ea1db3e8bc068fde6e2 GIT binary patch literal 25296 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 WsKeepAliveInterval) { - Dictionary nop = new Dictionary(); - nop["action"] = "no-op"; + // Temporary clip to use for KeepAlive + // TODO: Generate small sound clip to send to the service to keep alive. + AudioClip _keepAliveClip = Resources.Load("highHat"); #if ENABLE_DEBUGGING Log.Debug("SpeechToText", "Sending keep alive."); #endif - _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(nop))); - AudioClip clip = AudioClip.Create("silence", 44100, 1, 44100, false); - _listenSocket.Send(new WSConnector.BinaryMessage(WaveFile.CreateWAV(clip))); + _listenSocket.Send(new WSConnector.BinaryMessage(AudioClipUtil.GetL16(_keepAliveClip))); + _keepAliveClip = null; + _lastKeepAlive = DateTime.Now; } } From 196985c36ba892485b91b32b9d6cf9aa61cf2380 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 13 Oct 2017 10:04:10 -0500 Subject: [PATCH 006/100] remove deprecated continuous parameter, change smallFormatting to smartFormatting --- .../Scripts/ExampleStreaming.cs | 1 - .../Services/SpeechToText/v1/SpeechToText.cs | 23 +++++++------------ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index e36326165..4aa608100 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -62,7 +62,6 @@ public bool Active _speechToText.EnableTimestamps = false; _speechToText.SilenceThreshold = 0.00f; _speechToText.MaxAlternatives = 1; - _speechToText.EnableContinousRecognition = true; _speechToText.EnableInterimResults = true; _speechToText.OnError = OnError; _speechToText.StartListening(OnRecognize); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index d22460ba7..52ac7d4ee 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -96,12 +96,12 @@ public class SpeechToText : IWatsonService private float _keywordsThreshold = 0.5f; private float _wordAlternativesThreshold = 0.5f; private bool _profanityFilter = true; - private bool _smallFormatting = false; + private bool _smartFormatting = false; private bool _speakerLabels = false; private bool _timestamps = false; private bool _wordConfidence = false; private bool _detectSilence = true; // If true, then we will try not to record silence. - private float _silenceThreshold = 0.03f; // If the audio level is below this value, then it's considered silent. + private float _silenceThreshold = 0.0f; // If the audio level is below this value, then it's considered silent. private int _recordingHZ = -1; private int _inactivityTimeout = 60; private fsSerializer _serializer = new fsSerializer(); @@ -150,10 +150,6 @@ public string RecognizeModel /// public bool EnableWordConfidence { get { return _wordConfidence; } set { _wordConfidence = value; } } /// - /// If true, then we will try to continuously recognize speech. - /// - public bool EnableContinousRecognition { get; set; } - /// /// If true, then we will get interim results while recognizing. The user will then need to check /// the Final flag on the results. /// @@ -212,7 +208,7 @@ public Credentials Credentials /// /// NON-MULTIPART ONLY: If true, converts dates, times, series of digits and numbers, phone numbers, currency values, and Internet addresses into more readable, conventional representations in the final transcript of a recognition request. If false (the default), no formatting is performed. Applies to US English transcription only. /// - public bool SmallFormatting { get { return _smallFormatting; } set { _smallFormatting = value; } } + public bool SmartFormatting { get { return _smartFormatting; } set { _smartFormatting = value; } } /// /// NON-MULTIPART ONLY: Indicates whether labels that identify which words were spoken by which participants in a multi-person exchange are to be included in the response. If true, speaker labels are returned; if false (the default), they are not. Speaker labels can be returned only for the following language models: en-US_NarrowbandModel, en-US_BroadbandModel, es-ES_NarrowbandModel, es-ES_BroadbandModel, ja-JP_NarrowbandModel, and ja-JP_BroadbandModel. Setting speaker_labels to true forces the timestamps parameter to be true, regardless of whether you specify false for the parameter. /// @@ -520,13 +516,12 @@ private void SendStart() Dictionary start = new Dictionary(); start["action"] = "start"; start["content-type"] = "audio/l16;rate=" + _recordingHZ.ToString() + ";channels=1;"; - start["continuous"] = EnableContinousRecognition; start["max_alternatives"] = _maxAlternatives; start["interim_results"] = EnableInterimResults; start["word_confidence"] = _wordConfidence; start["timestamps"] = _timestamps; start["speaker_labels"] = SpeakerLabels; - start["small_formatting"] = SmallFormatting; + start["smart_formatting"] = SmartFormatting; start["profanity_filter"] = ProfanityFilter; start["word_alternatives_threshold"] = WordAlternativesThreshold; start["keywords_threshold"] = KeywordsThreshold; @@ -591,10 +586,9 @@ private void OnListenMessage(WSConnector.Message msg) SpeechRecognitionEvent results = ParseRecognizeResponse(json); if (results != null) { - // when we get results, start listening for the next block .. - // if continuous is true, then we don't need to do this.. - if (!EnableContinousRecognition && results.HasFinalResult()) - SendStart(); + //// when we get results, start listening for the next block .. + //if (results.HasFinalResult()) + // SendStart(); if (_listenCallback != null) _listenCallback(results); @@ -701,12 +695,11 @@ public bool Recognize(AudioClip clip, OnRecognize callback) return false; } req.Parameters["model"] = _recognizeModel; - req.Parameters["continuous"] = "false"; req.Parameters["max_alternatives"] = _maxAlternatives.ToString(); req.Parameters["timestamps"] = _timestamps ? "true" : "false"; req.Parameters["word_confidence"] = _wordConfidence ? "true" : "false"; req.Parameters["speaker_labels"] = SpeakerLabels; - req.Parameters["small_formatting"] = SmallFormatting; + req.Parameters["smart_formatting"] = SmartFormatting; req.Parameters["profanity_filter"] = ProfanityFilter; req.Parameters["word_alternatives_threshold"] = WordAlternativesThreshold; req.Parameters["keywords_threshold"] = KeywordsThreshold; From c768443246ae57cc0c9cc4f20850b07b2c8c9359 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 13 Oct 2017 10:18:02 -0500 Subject: [PATCH 007/100] getter and setter for _inactivityTimeout, Log inactivity timeout when creating socket --- .../ServiceExamples/Scripts/ExampleStreaming.cs | 1 + Scripts/Services/SpeechToText/v1/SpeechToText.cs | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 4aa608100..2a2b23e51 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -64,6 +64,7 @@ public bool Active _speechToText.MaxAlternatives = 1; _speechToText.EnableInterimResults = true; _speechToText.OnError = OnError; + _speechToText.InactivityTimeout = -1; _speechToText.StartListening(OnRecognize); List keywords = new List(); keywords.Add("hello"); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 52ac7d4ee..39aa7f94f 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -213,6 +213,10 @@ public Credentials Credentials /// NON-MULTIPART ONLY: Indicates whether labels that identify which words were spoken by which participants in a multi-person exchange are to be included in the response. If true, speaker labels are returned; if false (the default), they are not. Speaker labels can be returned only for the following language models: en-US_NarrowbandModel, en-US_BroadbandModel, es-ES_NarrowbandModel, es-ES_BroadbandModel, ja-JP_NarrowbandModel, and ja-JP_BroadbandModel. Setting speaker_labels to true forces the timestamps parameter to be true, regardless of whether you specify false for the parameter. /// public bool SpeakerLabels { get { return _speakerLabels; } set { _speakerLabels = value; } } + /// + /// NON-MULTIPART ONLY: The time in seconds after which, if only silence (no speech) is detected in submitted audio, the connection is closed with a 400 error. Useful for stopping audio submission from a live microphone when a user simply walks away. Use -1 for infinity. + /// + public int InactivityTimeout { get { return _inactivityTimeout; } set { _inactivityTimeout = value; } } #endregion #region Constructor @@ -488,9 +492,17 @@ private bool CreateListenConnector() { if (_listenSocket == null) { - _listenSocket = WSConnector.CreateConnector(Credentials, Url, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel) + "&inactivity_timeout=" + _inactivityTimeout); + _listenSocket = WSConnector.CreateConnector(Credentials, Url, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel) + "&inactivity_timeout=" + InactivityTimeout); if (_listenSocket == null) + { return false; + } + else + { +#if ENABLE_DEBUGGING + Log.Debug("SpeechToText", "Created listen socket. Model: {0}, Inactivity Timeout: {1}", WWW.EscapeURL(_recognizeModel), InactivityTimeout); +#endif + } _listenSocket.OnMessage = OnListenMessage; _listenSocket.OnClose = OnListenClosed; From f948cbd2b032d954c48deacd1bfc639201190ed0 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Mon, 16 Oct 2017 10:47:49 -0500 Subject: [PATCH 008/100] remove prefabs directory --- Prefabs/ActivateWidget.prefab | 154 - Prefabs/ActivateWidget.prefab.meta | 8 - Prefabs/ClassDisplayWidget.prefab | 585 ---- Prefabs/ClassDisplayWidget.prefab.meta | 8 - Prefabs/ClassifierWidget.prefab | 157 - Prefabs/ClassifierWidget.prefab.meta | 8 - Prefabs/DebugConsole.prefab | 718 ----- Prefabs/DebugConsole.prefab.meta | 8 - Prefabs/Elements.meta | 9 - Prefabs/Elements/Background.prefab | 152 - Prefabs/Elements/Background.prefab.meta | 8 - Prefabs/LanguageTranslatorWidget.prefab | 2864 ----------------- Prefabs/LanguageTranslatorWidget.prefab.meta | 8 - Prefabs/MicWidget.prefab | 177 - Prefabs/MicWidget.prefab.meta | 8 - .../NaturalLanguageClassifierWidget.prefab | 383 --- ...aturalLanguageClassifierWidget.prefab.meta | 8 - Prefabs/SpeechDisplayWidget.prefab | 617 ---- Prefabs/SpeechDisplayWidget.prefab.meta | 8 - Prefabs/SpeechToTextWidget.prefab | 74 - Prefabs/SpeechToTextWidget.prefab.meta | 8 - Prefabs/TextToSpeechWidget.prefab | 153 - Prefabs/TextToSpeechWidget.prefab.meta | 8 - Prefabs/Touch Hit Watson.prefab | 98 - Prefabs/Touch Hit Watson.prefab.meta | 8 - Prefabs/Touch Visualizer Watson.prefab | 110 - Prefabs/Touch Visualizer Watson.prefab.meta | 8 - Prefabs/TouchManager.prefab | 482 --- Prefabs/TouchManager.prefab.meta | 8 - 29 files changed, 6845 deletions(-) delete mode 100644 Prefabs/ActivateWidget.prefab delete mode 100644 Prefabs/ActivateWidget.prefab.meta delete mode 100644 Prefabs/ClassDisplayWidget.prefab delete mode 100644 Prefabs/ClassDisplayWidget.prefab.meta delete mode 100644 Prefabs/ClassifierWidget.prefab delete mode 100644 Prefabs/ClassifierWidget.prefab.meta delete mode 100644 Prefabs/DebugConsole.prefab delete mode 100644 Prefabs/DebugConsole.prefab.meta delete mode 100644 Prefabs/Elements.meta delete mode 100644 Prefabs/Elements/Background.prefab delete mode 100644 Prefabs/Elements/Background.prefab.meta delete mode 100644 Prefabs/LanguageTranslatorWidget.prefab delete mode 100644 Prefabs/LanguageTranslatorWidget.prefab.meta delete mode 100644 Prefabs/MicWidget.prefab delete mode 100644 Prefabs/MicWidget.prefab.meta delete mode 100644 Prefabs/NaturalLanguageClassifierWidget.prefab delete mode 100644 Prefabs/NaturalLanguageClassifierWidget.prefab.meta delete mode 100644 Prefabs/SpeechDisplayWidget.prefab delete mode 100644 Prefabs/SpeechDisplayWidget.prefab.meta delete mode 100644 Prefabs/SpeechToTextWidget.prefab delete mode 100644 Prefabs/SpeechToTextWidget.prefab.meta delete mode 100644 Prefabs/TextToSpeechWidget.prefab delete mode 100644 Prefabs/TextToSpeechWidget.prefab.meta delete mode 100644 Prefabs/Touch Hit Watson.prefab delete mode 100644 Prefabs/Touch Hit Watson.prefab.meta delete mode 100644 Prefabs/Touch Visualizer Watson.prefab delete mode 100644 Prefabs/Touch Visualizer Watson.prefab.meta delete mode 100644 Prefabs/TouchManager.prefab delete mode 100644 Prefabs/TouchManager.prefab.meta diff --git a/Prefabs/ActivateWidget.prefab b/Prefabs/ActivateWidget.prefab deleted file mode 100644 index 71682d4e8..000000000 --- a/Prefabs/ActivateWidget.prefab +++ /dev/null @@ -1,154 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &189564 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22413654} - - 222: {fileID: 22222476} - - 114: {fileID: 11484328} - - 114: {fileID: 11425004} - - 114: {fileID: 11404122} - m_Layer: 0 - m_Name: ActivateWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11404122 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189564} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4165488f5e7ebeb498a09a163f8be77c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ActivateOutput: - m_TargetObject: {fileID: 0} - m_TargetConnection: - m_SendValue: 1 ---- !u!114 &11425004 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189564} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: .926470578, g: .926470578, b: .926470578, a: 1} - m_HighlightedColor: {r: 1, g: 1, b: 1, a: 1} - m_PressedColor: {r: .784313738, g: .784313738, b: .784313738, a: 1} - m_DisabledColor: {r: .262975812, g: .276011229, b: .279411793, a: .501960814} - m_ColorMultiplier: 1 - m_FadeDuration: .100000001 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11484328} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 11404122} - m_MethodName: OnButton - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11484328 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189564} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 49650407db276411784727c02c68f0d7, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22222476 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189564} ---- !u!224 &22413654 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 189564} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: .5, y: .5} - m_AnchorMax: {x: .5, y: .5} - m_AnchoredPosition: {x: -.5, y: -2} - m_SizeDelta: {x: 99, y: 96} - m_Pivot: {x: .5, y: .5} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_AutoConnected - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 189564} - m_IsPrefabParent: 1 diff --git a/Prefabs/ActivateWidget.prefab.meta b/Prefabs/ActivateWidget.prefab.meta deleted file mode 100644 index ef6e4d8c2..000000000 --- a/Prefabs/ActivateWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0a46b43b4a924b445a68009477b7ddef -timeCreated: 1446580866 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/ClassDisplayWidget.prefab b/Prefabs/ClassDisplayWidget.prefab deleted file mode 100644 index c5e9d1f91..000000000 --- a/Prefabs/ClassDisplayWidget.prefab +++ /dev/null @@ -1,585 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &101322 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22426924} - - 114: {fileID: 11409742} - - 222: {fileID: 22263644} - - 223: {fileID: 22313366} - - 114: {fileID: 11414172} - - 114: {fileID: 11475506} - m_Layer: 0 - m_Name: ClassDisplayWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &121004 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22454320} - - 222: {fileID: 22248680} - - 114: {fileID: 11456860} - m_Layer: 5 - m_Name: Line - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &138378 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22454764} - - 222: {fileID: 22225374} - - 114: {fileID: 11439230} - m_Layer: 0 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &183048 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22413050} - - 222: {fileID: 22297768} - - 114: {fileID: 11465330} - m_Layer: 0 - m_Name: Text_IBM_Watson_TestNLC - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &192260 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22430634} - - 222: {fileID: 22252252} - - 114: {fileID: 11463846} - m_Layer: 5 - m_Name: Watson_Logo - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &194520 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22430298} - - 222: {fileID: 22296762} - - 114: {fileID: 11477458} - m_Layer: 5 - m_Name: Banner_Upper_Element - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &199076 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22410384} - - 222: {fileID: 22288496} - - 114: {fileID: 11408132} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11408132 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 199076} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 11b8cc94d1829440d972e9e699902f64, type: 3} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11409742 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5aac7ee12bf0cba4cbb0a79077a20224, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ClassDisplay: {fileID: 11439230} ---- !u!114 &11414172 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 640, y: 960} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!114 &11439230 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138378} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11456860 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121004} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11463846 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192260} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: dcc763001129146f0bd779f1a3f3cee2, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11465330 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183048} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9558824, g: 0.9558824, b: 0.9558824, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 2 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: TEST NATURAL LANGUAGE CLASSIFIER ---- !u!114 &11475506 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &11477458 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194520} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 1eaeb3a02e12744e5a25a4169c3474a7, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22225374 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138378} ---- !u!222 &22248680 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121004} ---- !u!222 &22252252 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192260} ---- !u!222 &22263644 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} ---- !u!222 &22288496 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 199076} ---- !u!222 &22296762 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194520} ---- !u!222 &22297768 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183048} ---- !u!223 &22313366 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &22410384 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 199076} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22430634} - - {fileID: 22430298} - - {fileID: 22454320} - m_Father: {fileID: 22426924} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22413050 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183048} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22426924} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -112} - m_SizeDelta: {x: -25, y: 30} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22426924 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 101322} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 22410384} - - {fileID: 22413050} - - {fileID: 22454764} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!224 &22430298 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194520} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22410384} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 80} - m_Pivot: {x: 0.99, y: 1.1} ---- !u!224 &22430634 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192260} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22410384} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000061035156, y: 0} - m_SizeDelta: {x: 0, y: 35} - m_Pivot: {x: 0.05, y: 2.1} ---- !u!224 &22454320 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121004} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22410384} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0.00000023841858, y: -100} - m_SizeDelta: {x: -10, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22454764 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138378} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22426924} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_Color.r - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Color.g - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Color.b - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.y - value: 960 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_SizeDelta.x - value: 640 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_SizeDelta.y - value: 960 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 101322} - m_IsPrefabParent: 1 diff --git a/Prefabs/ClassDisplayWidget.prefab.meta b/Prefabs/ClassDisplayWidget.prefab.meta deleted file mode 100644 index 6cfd703c1..000000000 --- a/Prefabs/ClassDisplayWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 02764976d9eda044cb357b17fa3dd9bd -timeCreated: 1446580464 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/ClassifierWidget.prefab b/Prefabs/ClassifierWidget.prefab deleted file mode 100644 index b296e6f73..000000000 --- a/Prefabs/ClassifierWidget.prefab +++ /dev/null @@ -1,157 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &102180 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 4: {fileID: 403114} - - 114: {fileID: 11488116} - m_Layer: 0 - m_Name: ClassifierWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &403114 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 102180} - m_LocalRotation: {x: 0, y: -.819152117, z: 0, w: .573576331} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 ---- !u!114 &11488116 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 102180} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 632a64e2426c0fb48a6ca1df6ee58939, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_Mappings: [] - m_ClassifyOutput: - m_TargetObject: {fileID: 0} - m_TargetConnection: ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_Mappings.Array.size - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Class - value: question - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Callback.m_Method - value: OnQuestion - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Exclusive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Class - value: dialog - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Callback.m_Method - value: OnDialog - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Exclusive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[2].m_Class - value: wakeup - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[2].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[2].m_Callback.m_Method - value: OnWakeup - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[2].m_Exclusive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[3].m_Class - value: sleep - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[3].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[3].m_Callback.m_Method - value: OnSleep - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[3].m_Exclusive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[4].m_Class - value: debug_on - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[4].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[4].m_Callback.m_Method - value: OnDebugOn - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[4].m_Exclusive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[5].m_Class - value: debug_off - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[5].m_Callback.m_Component - value: AvatarWidget - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[5].m_Callback.m_Method - value: OnDebugOff - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[5].m_Exclusive - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 102180} - m_IsPrefabParent: 1 diff --git a/Prefabs/ClassifierWidget.prefab.meta b/Prefabs/ClassifierWidget.prefab.meta deleted file mode 100644 index f8274d783..000000000 --- a/Prefabs/ClassifierWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f2ab43b05a2fb1a4294f804839258ee9 -timeCreated: 1446590479 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/DebugConsole.prefab b/Prefabs/DebugConsole.prefab deleted file mode 100644 index 93c28cf5c..000000000 --- a/Prefabs/DebugConsole.prefab +++ /dev/null @@ -1,718 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &103040 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22434704} - m_Layer: 5 - m_Name: Root_Output - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &111478 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22492444} - - 222: {fileID: 22207422} - - 114: {fileID: 11491956} - - 114: {fileID: 11400172} - m_Layer: 5 - m_Name: FramerateCounter - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &112050 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22481580} - - 222: {fileID: 22289266} - - 114: {fileID: 11443046} - - 114: {fileID: 11484934} - m_Layer: 5 - m_Name: InputField - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &117918 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22454254} - - 222: {fileID: 22292530} - - 114: {fileID: 11488580} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &138316 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22477790} - - 223: {fileID: 22323322} - - 114: {fileID: 11411102} - - 114: {fileID: 11477586} - - 114: {fileID: 11440920} - - 114: {fileID: 11416178} - m_Layer: 5 - m_Name: DebugConsole - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &142910 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22483952} - m_Layer: 5 - m_Name: Root_Input - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &165974 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22408174} - - 114: {fileID: 11420940} - m_Layer: 5 - m_Name: MessageLayout - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &184268 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22446100} - - 222: {fileID: 22259388} - - 114: {fileID: 11400202} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &192894 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22413656} - - 114: {fileID: 11411602} - m_Layer: 5 - m_Name: InfoLayout - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11400172 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111478} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5723c7cc52c9fe14e937c93992b9bbd0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Text: {fileID: 11491956} ---- !u!114 &11400202 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 184268} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 201 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11411102 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1024, y: 1024} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!114 &11411602 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192894} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 6 - m_Spacing: 0 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 ---- !u!114 &11416178 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2caaa605d8a57402baa0b494d548f244, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &11420940 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 165974} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 30 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 0 - m_ChildForceExpandWidth: 0 - m_ChildForceExpandHeight: 0 ---- !u!114 &11440920 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8861d830a65c85f4f82b5336dd6c2b53, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ActiveOutput: 0 - m_ActiveInput: 0 - m_RootOutput: {fileID: 103040} - m_RootInput: {fileID: 142910} - m_MessageLayout: {fileID: 11420940} - m_MessagePrefab: {fileID: 11410738, guid: 3e2c8217c2abaf0458a6dd960b99bbeb, type: 2} - m_CommandInput: {fileID: 11484934} - m_DebugInfoLayout: {fileID: 11411602} - m_DebugInfoPrefab: {fileID: 11433596, guid: 7eeb8ecccabf13b4184d663fe3aa20ca, type: 2} ---- !u!114 &11443046 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112050} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.42647058, g: 0.41706315, b: 0.41706315, a: 0.172} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11477586 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &11484934 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112050} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 575553740, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11443046} - m_TextComponent: {fileID: 11400202} - m_Placeholder: {fileID: 11488580} - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_CharacterValidation: 0 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 11440920} - m_MethodName: OnEndEdit - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 - m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 ---- !u!114 &11488580 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117918} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.88235295, g: 0.8369377, b: 0.8369377, a: 0.516} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 2 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Enter text... ---- !u!114 &11491956 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111478} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.61764705, g: 0.61764705, b: 0.61764705, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: 'FPS - -' ---- !u!222 &22207422 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111478} ---- !u!222 &22259388 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 184268} ---- !u!222 &22289266 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112050} ---- !u!222 &22292530 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117918} ---- !u!223 &22323322 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &22408174 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 165974} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22434704} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22413656 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192894} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22434704} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -252.71016, y: 0} - m_SizeDelta: {x: -504.56, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22434704 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 103040} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22492444} - - {fileID: 22413656} - - {fileID: 22408174} - m_Father: {fileID: 22477790} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22446100 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 184268} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22481580} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -8, y: -8} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22454254 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117918} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22481580} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -8, y: -8} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22477790 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 138316} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 22434704} - - {fileID: 22483952} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!224 &22481580 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112050} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22454254} - - {fileID: 22446100} - m_Father: {fileID: 22483952} - m_RootOrder: 0 - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -5} - m_SizeDelta: {x: 660, y: 40} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &22483952 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 142910} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22481580} - m_Father: {fileID: 22477790} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0.000030517578, y: 0.000015258789} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22492444 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111478} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22434704} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 80.27969, y: 0} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 1} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_Mappings.Array.size - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.x - value: 1024 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.y - value: 1024 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Key - value: 96 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[0].m_Event - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Key - value: 13 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Mappings.Array.data[1].m_Event - value: 2 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 138316} - m_IsPrefabParent: 1 diff --git a/Prefabs/DebugConsole.prefab.meta b/Prefabs/DebugConsole.prefab.meta deleted file mode 100644 index 6a538c130..000000000 --- a/Prefabs/DebugConsole.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 89e4faba658e44f1e89230da4f7e3a29 -timeCreated: 1445021845 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/Elements.meta b/Prefabs/Elements.meta deleted file mode 100644 index 9641a3cb6..000000000 --- a/Prefabs/Elements.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: bb4fedf85bb07954a91d9fb4d5ea06b4 -folderAsset: yes -timeCreated: 1449505535 -licenseType: Pro -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/Elements/Background.prefab b/Prefabs/Elements/Background.prefab deleted file mode 100644 index d3130ba23..000000000 --- a/Prefabs/Elements/Background.prefab +++ /dev/null @@ -1,152 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &135966 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22488302} - - 222: {fileID: 22285768} - - 114: {fileID: 11424074} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &194422 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22413050} - - 222: {fileID: 22276162} - - 114: {fileID: 11463816} - m_Layer: 5 - m_Name: Banner - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11424074 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135966} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 11b8cc94d1829440d972e9e699902f64, type: 3} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11463816 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194422} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 1eaeb3a02e12744e5a25a4169c3474a7, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22276162 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194422} ---- !u!222 &22285768 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135966} ---- !u!224 &22413050 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 194422} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22488302} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.49999696, y: -39.99997} - m_SizeDelta: {x: 1, y: 80} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22488302 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135966} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22413050} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_PreserveAspect - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 135966} - m_IsPrefabParent: 1 diff --git a/Prefabs/Elements/Background.prefab.meta b/Prefabs/Elements/Background.prefab.meta deleted file mode 100644 index 91d920ee1..000000000 --- a/Prefabs/Elements/Background.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dbc1183f7ae389f4399c05a3bf9d776e -timeCreated: 1449527559 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/LanguageTranslatorWidget.prefab b/Prefabs/LanguageTranslatorWidget.prefab deleted file mode 100644 index 9a2289b90..000000000 --- a/Prefabs/LanguageTranslatorWidget.prefab +++ /dev/null @@ -1,2864 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &110226 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22429332} - - 114: {fileID: 11491872} - m_Layer: 0 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &110902 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22459598} - - 222: {fileID: 22265542} - - 114: {fileID: 11495550} - m_Layer: 5 - m_Name: Output - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &111420 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22489976} - - 222: {fileID: 22258410} - - 114: {fileID: 11415522} - m_Layer: 0 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &111806 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22495942} - - 222: {fileID: 22255052} - - 114: {fileID: 11427828} - m_Layer: 0 - m_Name: Text_IBM_Watson_Translation - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &112714 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22419224} - - 114: {fileID: 11403216} - - 222: {fileID: 22223724} - - 114: {fileID: 11471116} - m_Layer: 0 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &113404 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22477610} - - 222: {fileID: 22267788} - - 114: {fileID: 11440718} - m_Layer: 5 - m_Name: Line - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &114120 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22420674} - - 222: {fileID: 22235198} - - 114: {fileID: 11469790} - - 114: {fileID: 11487390} - m_Layer: 0 - m_Name: DropDownTargetLanguage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &114432 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22468852} - - 222: {fileID: 22229230} - - 114: {fileID: 11435332} - - 114: {fileID: 11408344} - m_Layer: 0 - m_Name: DropDownSourceLanguage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &116226 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22445932} - - 222: {fileID: 22268652} - - 114: {fileID: 11452356} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &117036 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22497034} - - 222: {fileID: 22260828} - - 114: {fileID: 11447842} - m_Layer: 0 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &124004 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22410210} - - 114: {fileID: 11485934} - - 223: {fileID: 22314768} - - 114: {fileID: 11410204} - - 114: {fileID: 11489172} - m_Layer: 0 - m_Name: LanguageTranslatorWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &124454 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22449246} - - 222: {fileID: 22232106} - - 114: {fileID: 11471438} - - 114: {fileID: 11451374} - m_Layer: 0 - m_Name: Scrollbar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &129956 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22442856} - - 222: {fileID: 22283836} - - 114: {fileID: 11444566} - m_Layer: 5 - m_Name: Banner_Upper_Element - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &130134 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22469206} - - 222: {fileID: 22281602} - - 114: {fileID: 11486174} - m_Layer: 0 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &135502 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22411628} - - 222: {fileID: 22207016} - - 114: {fileID: 11443606} - m_Layer: 0 - m_Name: Item Checkmark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &137118 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22468048} - m_Layer: 0 - m_Name: UI - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &137698 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22483592} - - 222: {fileID: 22232530} - - 114: {fileID: 11430496} - m_Layer: 0 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &144248 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22478042} - m_Layer: 0 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &144578 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22441140} - - 222: {fileID: 22248748} - - 114: {fileID: 11437518} - m_Layer: 0 - m_Name: Item Checkmark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &144622 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22449278} - - 222: {fileID: 22269184} - - 114: {fileID: 11485716} - m_Layer: 0 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &147292 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22415772} - - 222: {fileID: 22223464} - - 114: {fileID: 11427928} - - 114: {fileID: 11421994} - m_Layer: 0 - m_Name: Scrollbar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &148532 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22423780} - - 222: {fileID: 22294488} - - 114: {fileID: 11472046} - m_Layer: 0 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &150698 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22459678} - - 222: {fileID: 22277972} - - 114: {fileID: 11495248} - m_Layer: 0 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &151954 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22408012} - - 114: {fileID: 11481480} - - 222: {fileID: 22242840} - - 114: {fileID: 11450832} - m_Layer: 0 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &154000 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22479414} - m_Layer: 0 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &156698 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22415334} - - 114: {fileID: 11447868} - m_Layer: 0 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &157196 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22413044} - - 222: {fileID: 22224278} - - 114: {fileID: 11430616} - - 114: {fileID: 11433540} - m_Layer: 0 - m_Name: TextSourceTranslation - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &160572 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22446766} - m_Layer: 0 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &161770 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22460064} - - 222: {fileID: 22237000} - - 114: {fileID: 11467032} - - 114: {fileID: 11440956} - m_Layer: 0 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!1 &166978 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22479518} - - 222: {fileID: 22253832} - - 114: {fileID: 11491350} - m_Layer: 0 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &167720 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22489796} - - 222: {fileID: 22209176} - - 114: {fileID: 11499900} - m_Layer: 0 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &175310 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22435402} - m_Layer: 0 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &178308 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22432190} - - 222: {fileID: 22228016} - - 114: {fileID: 11445510} - m_Layer: 0 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &182060 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22468306} - - 222: {fileID: 22237040} - - 114: {fileID: 11412800} - - 114: {fileID: 11477418} - m_Layer: 0 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!1 &191016 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22447386} - - 222: {fileID: 22296612} - - 114: {fileID: 11453996} - m_Layer: 0 - m_Name: TextTargetTranslation - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &192066 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22440724} - - 222: {fileID: 22244818} - - 114: {fileID: 11438250} - m_Layer: 5 - m_Name: Watson_Logo - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &198242 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22422044} - - 222: {fileID: 22213574} - - 114: {fileID: 11435216} - m_Layer: 0 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11403216 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112714} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -1200242548, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!114 &11408344 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114432} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 853051423, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11435332} - m_Template: {fileID: 22460064} - m_CaptionText: {fileID: 11447842} - m_CaptionImage: {fileID: 0} - m_ItemText: {fileID: 11485716} - m_ItemImage: {fileID: 0} - m_Value: -1 - m_Options: - m_Options: - - m_Text: Loading - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Dropdown+DropdownEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11410204 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124004} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 640, y: 960} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!114 &11412800 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 182060} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11415522 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111420} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11421994 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 147292} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -2061169968, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11415522} - m_HandleRect: {fileID: 22489976} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Scrollbar+ScrollEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11427828 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111806} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.83823526, g: 0.83823526, b: 0.83823526, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 2 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: TRANSLATION ---- !u!114 &11427928 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 147292} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11430496 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 137698} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11430616 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 157196} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11433540 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 157196} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 575553740, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11430616} - m_TextComponent: {fileID: 11495550} - m_Placeholder: {fileID: 0} - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 1 - m_HideMobileInput: 0 - m_CharacterValidation: 0 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.InputField+SubmitEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.InputField+OnChangeEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 ---- !u!114 &11435216 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 198242} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11435332 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114432} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11437518 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144578} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11438250 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: dcc763001129146f0bd779f1a3f3cee2, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11440718 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 113404} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11440956 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 161770} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1367256648, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 22435402} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 22419224} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 11421994} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11443606 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135502} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11444566 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 129956} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 1eaeb3a02e12744e5a25a4169c3474a7, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11445510 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 178308} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11447842 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117036} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Loading ---- !u!114 &11447868 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 156698} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 2109663825, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11499900} - toggleTransition: 1 - graphic: {fileID: 11437518} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_IsOn: 1 ---- !u!114 &11450832 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 151954} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11451374 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124454} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -2061169968, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11445510} - m_HandleRect: {fileID: 22432190} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Scrollbar+ScrollEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11452356 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 116226} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 11b8cc94d1829440d972e9e699902f64, type: 3} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11453996 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 191016} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.45588237, g: 0.45588237, b: 0.45588237, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11467032 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 161770} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11469790 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114120} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11471116 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112714} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11471438 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124454} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11472046 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 148532} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11477418 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 182060} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1367256648, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 22479414} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 22408012} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 11451374} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.ScrollRect+ScrollRectEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11481480 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 151954} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -1200242548, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!114 &11485716 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144622} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Option A ---- !u!114 &11485934 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124004} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c45b7eb3f0ab3485ea7c10d6ba554116, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_RecognizeLanguageOutput: - m_Connections: [] - m_SpeechOutput: - m_Connections: [] - m_VoiceOutput: - m_Connections: [] - m_SourceLanguage: - m_TargetLanguage: es - m_Input: {fileID: 11433540} - m_Output: {fileID: 11486174} - m_DropDownSourceLanguage: {fileID: 11408344} - m_DropDownTargetLanguage: {fileID: 11487390} - m_DefaultDomainToUse: conversational - m_DetectLanguageName: Detect Language ---- !u!114 &11486174 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 130134} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11487390 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114120} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 853051423, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11469790} - m_Template: {fileID: 22468306} - m_CaptionText: {fileID: 11491350} - m_CaptionImage: {fileID: 0} - m_ItemText: {fileID: 11495248} - m_ItemImage: {fileID: 0} - m_Value: -1 - m_Options: - m_Options: - - m_Text: Loading - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Dropdown+DropdownEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &11489172 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124004} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &11491350 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 166978} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Loading ---- !u!114 &11491872 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 110226} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 2109663825, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 11435216} - toggleTransition: 1 - graphic: {fileID: 11443606} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null - m_IsOn: 1 ---- !u!114 &11495248 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 150698} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 3 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Option A ---- !u!114 &11495550 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 110902} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 0 - m_AlignByGeometry: 0 - m_RichText: 0 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11499900 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 167720} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22207016 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135502} ---- !u!222 &22209176 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 167720} ---- !u!222 &22213574 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 198242} ---- !u!222 &22223464 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 147292} ---- !u!222 &22223724 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112714} ---- !u!222 &22224278 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 157196} ---- !u!222 &22228016 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 178308} ---- !u!222 &22229230 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114432} ---- !u!222 &22232106 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124454} ---- !u!222 &22232530 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 137698} ---- !u!222 &22235198 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114120} ---- !u!222 &22237000 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 161770} ---- !u!222 &22237040 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 182060} ---- !u!222 &22242840 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 151954} ---- !u!222 &22244818 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192066} ---- !u!222 &22248748 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144578} ---- !u!222 &22253832 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 166978} ---- !u!222 &22255052 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111806} ---- !u!222 &22258410 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111420} ---- !u!222 &22260828 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117036} ---- !u!222 &22265542 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 110902} ---- !u!222 &22267788 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 113404} ---- !u!222 &22268652 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 116226} ---- !u!222 &22269184 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144622} ---- !u!222 &22277972 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 150698} ---- !u!222 &22281602 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 130134} ---- !u!222 &22283836 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 129956} ---- !u!222 &22294488 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 148532} ---- !u!222 &22296612 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 191016} ---- !u!223 &22314768 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124004} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &22408012 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 151954} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22479414} - m_Father: {fileID: 22468306} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -18, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22410210 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124004} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 22468048} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!224 &22411628 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 135502} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22429332} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22413044 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 157196} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22459598} - m_Father: {fileID: 22468048} - m_RootOrder: 3 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 7.1000996, y: -280} - m_SizeDelta: {x: -54, y: 200} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22415334 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 156698} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22489796} - - {fileID: 22441140} - - {fileID: 22459678} - m_Father: {fileID: 22479414} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22415772 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 147292} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22446766} - m_Father: {fileID: 22460064} - m_RootOrder: 1 - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!224 &22419224 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 112714} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22435402} - m_Father: {fileID: 22460064} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -18, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22420674 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114120} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22479518} - - {fileID: 22483592} - - {fileID: 22468306} - m_Father: {fileID: 22468048} - m_RootOrder: 4 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 34.1, y: -426} - m_SizeDelta: {x: 185, y: 30} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22422044 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 198242} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22429332} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22423780 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 148532} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22468852} - m_RootOrder: 1 - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22429332 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 110226} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22422044} - - {fileID: 22411628} - - {fileID: 22449278} - m_Father: {fileID: 22435402} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22432190 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 178308} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22478042} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22435402 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 175310} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22429332} - m_Father: {fileID: 22419224} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &22440724 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 192066} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22445932} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000061035156, y: 0} - m_SizeDelta: {x: 0, y: 35} - m_Pivot: {x: 0.05, y: 2.1} ---- !u!224 &22441140 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144578} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22415334} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22442856 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 129956} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22445932} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 80} - m_Pivot: {x: 0.99, y: 1.1} ---- !u!224 &22445932 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 116226} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22440724} - - {fileID: 22442856} - - {fileID: 22477610} - m_Father: {fileID: 22468048} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22446766 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 160572} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22489976} - m_Father: {fileID: 22415772} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22447386 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 191016} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22469206} - m_Father: {fileID: 22468048} - m_RootOrder: 5 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 7.1001, y: -568} - m_SizeDelta: {x: -54, y: 200} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22449246 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 124454} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22478042} - m_Father: {fileID: 22468306} - m_RootOrder: 1 - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!224 &22449278 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144622} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22429332} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22459598 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 110902} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22413044} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1, y: 2} - m_SizeDelta: {x: -17, y: -15} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22459678 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 150698} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22415334} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22460064 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 161770} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22419224} - - {fileID: 22415772} - m_Father: {fileID: 22468852} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &22468048 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 137118} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22445932} - - {fileID: 22495942} - - {fileID: 22468852} - - {fileID: 22413044} - - {fileID: 22420674} - - {fileID: 22447386} - m_Father: {fileID: 22410210} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22468306 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 182060} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22408012} - - {fileID: 22449246} - m_Father: {fileID: 22420674} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &22468852 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 114432} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22497034} - - {fileID: 22423780} - - {fileID: 22460064} - m_Father: {fileID: 22468048} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 34.1, y: -142} - m_SizeDelta: {x: 185, y: 30} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22469206 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 130134} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22447386} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1, y: 0} - m_SizeDelta: {x: -14, y: -12} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22477610 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 113404} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22445932} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0.00000023841858, y: -100} - m_SizeDelta: {x: -10, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22478042 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 144248} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22432190} - m_Father: {fileID: 22449246} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22479414 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 154000} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22415334} - m_Father: {fileID: 22408012} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &22479518 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 166978} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22420674} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22483592 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 137698} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22420674} - m_RootOrder: 1 - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22489796 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 167720} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22415334} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22489976 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111420} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22446766} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22495942 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 111806} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22468048} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -112} - m_SizeDelta: {x: -25, y: 30} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22497034 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 117036} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22468852} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_RenderMode - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_UiScaleMode - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.x - value: 640 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.y - value: 960 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_MatchWidthOrHeight - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LocalScale.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LocalScale.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LocalScale.z - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 124004} - m_IsPrefabParent: 1 diff --git a/Prefabs/LanguageTranslatorWidget.prefab.meta b/Prefabs/LanguageTranslatorWidget.prefab.meta deleted file mode 100644 index bf048d2bf..000000000 --- a/Prefabs/LanguageTranslatorWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 630a670501e57d04a852432b899c7671 -timeCreated: 1449519818 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/MicWidget.prefab b/Prefabs/MicWidget.prefab deleted file mode 100644 index 9b30f62e3..000000000 --- a/Prefabs/MicWidget.prefab +++ /dev/null @@ -1,177 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &121396 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 4: {fileID: 495394} - - 114: {fileID: 11406180} - - 82: {fileID: 8230626} - m_Layer: 0 - m_Name: MicWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &495394 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121396} - m_LocalRotation: {x: 0, y: -0.8191521, z: 0, w: 0.57357633} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 ---- !u!82 &8230626 -AudioSource: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121396} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 0} - m_PlayOnAwake: 1 - m_Volume: 1 - m_Pitch: 1 - Loop: 0 - Mute: 0 - Spatialize: 0 - Priority: 128 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 0 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 0 ---- !u!114 &11406180 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 121396} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 131721b15c8a68d438d5b7163a1c05df, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ActivateOnStart: 1 - m_AudioOutput: - m_TargetObject: {fileID: 0} - m_TargetConnection: - m_LevelOutput: - m_TargetObject: {fileID: 0} - m_TargetConnection: - m_ActivateOutput: - m_TargetObject: {fileID: 0} - m_TargetConnection: - m_RecordingBufferSize: 2 - m_RecordingHZ: 16000 - m_MicrophoneID: - m_LevelOutputInterval: 0.05 - m_LevelOutputModifier: 16 - m_PlaybackRecording: 0 - m_StatusText: {fileID: 0} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_AutoConnect - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LevelOutput.m_TargetConnection - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AudioOutput.m_TargetConnection - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_PlaybackRecording - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LevelOutputModifier - value: 16 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: panLevelCustomCurve.m_RotationOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: reverbZoneMixCustomCurve.m_RotationOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_RecordingHZ - value: 16000 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 121396} - m_IsPrefabParent: 1 diff --git a/Prefabs/MicWidget.prefab.meta b/Prefabs/MicWidget.prefab.meta deleted file mode 100644 index 9ac54cade..000000000 --- a/Prefabs/MicWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 337eda4d7be18aa45bc090ad9cc57644 -timeCreated: 1445540183 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/NaturalLanguageClassifierWidget.prefab b/Prefabs/NaturalLanguageClassifierWidget.prefab deleted file mode 100644 index d6a7aad06..000000000 --- a/Prefabs/NaturalLanguageClassifierWidget.prefab +++ /dev/null @@ -1,383 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &150770 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 4: {fileID: 434176} - - 114: {fileID: 11489316} - m_Layer: 0 - m_Name: NaturalLanguageClassifierWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &434176 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 150770} - m_LocalRotation: {x: 0, y: -0.8191521, z: 0, w: 0.57357633} - m_LocalPosition: {x: -207.60638, y: 418, z: 570.3934} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 ---- !u!114 &11489316 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 150770} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7cef7f2b9e6b24041a94bde309b342ae, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ClassifyOutput: - m_Connections: [] - m_ClassifierName: ${NLC_CLASSIFIER_NAME} - m_ClassifierId: ${NLC_CLASSIFIER_ID} - m_MinWordConfidence: 0 - m_IgnoreWordConfidence: 0 - m_MinClassEventConfidence: 0 - m_Language: en - m_ClassEventList: [] - m_TopClassText: {fileID: 0} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.size - value: 49 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassifierId - value: ${NLC_CLASSIFIER_ID} - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[3].m_Event - value: 402 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AutoConnect - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[0].m_Event - value: 403 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[5].m_Event - value: 406 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[13].m_Class - value: question-thunderstone - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[13].m_Event - value: 401 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[14].m_Class - value: question-woodside - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[14].m_Event - value: 401 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[15].m_Class - value: question-numerati_woodside - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[2].m_Class - value: cancel - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[2].m_Event - value: 422 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[16].m_Class - value: pan_left - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[16].m_Event - value: 309 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[17].m_Class - value: pan_right - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[17].m_Event - value: 310 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[18].m_Class - value: pan_up - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[19].m_Class - value: pan_down - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[18].m_Event - value: 311 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[19].m_Event - value: 312 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[20].m_Class - value: zoom_in - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[21].m_Class - value: zoom_out - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[20].m_Event - value: 307 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[21].m_Event - value: 308 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[22].m_Class - value: show_next_passage - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[23].m_Class - value: show_next_answer - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[24].m_Class - value: show_next - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[25].m_Class - value: show_previous_passage - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[26].m_Class - value: show_previous_answer - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[27].m_Class - value: show_previous - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[28].m_Class - value: scroll_up - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[29].m_Class - value: scroll_down - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[30].m_Class - value: repeat_last_action - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[30].m_Event - value: 419 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[29].m_Event - value: 418 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[28].m_Event - value: 417 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[27].m_Event - value: 416 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[22].m_Event - value: 415 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[23].m_Event - value: 415 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[24].m_Event - value: 415 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[25].m_Event - value: 416 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[26].m_Event - value: 416 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassifierName - value: ${NLC_CLASSIFIER_NAME} - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[31].m_Class - value: personnel - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[31].m_Event - value: 423 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[32].m_Class - value: confirm_update - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[33].m_Class - value: cancel_update - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[32].m_Event - value: 700 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[33].m_Event - value: 701 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_MinWordConfidence - value: 0.3 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_MinClassEventConfidence - value: 0.4 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[34].m_Event - value: 902 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[34].m_Class - value: close_caption_on - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[35].m_Event - value: 903 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[35].m_Class - value: close_caption_off - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[36].m_Event - value: 900 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[36].m_Class - value: log_out - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[37].m_Event - value: 510 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[37].m_Class - value: virtual_keyboard_show - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[38].m_Class - value: show_first - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[38].m_Event - value: 420 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[39].m_Class - value: show_first_answer - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[40].m_Class - value: show_first_passage - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[41].m_Class - value: show_last - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[41].m_Event - value: 421 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[42].m_Class - value: show_last_answer - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[43].m_Class - value: show_last_passage - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[44].m_Class - value: health_panel_show - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[44].m_Event - value: 905 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[45].m_Class - value: log_panel_show - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[45].m_Event - value: 906 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[46].m_Class - value: about_xray - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[46].m_Event - value: 907 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[47].m_Class - value: ship_tracking - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[47].m_Event - value: 424 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[48].m_Class - value: procurement - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[48].m_Event - value: 425 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[49].m_Class - value: about_xray - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ClassEventList.Array.data[49].m_Event - value: 907 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 150770} - m_IsPrefabParent: 1 diff --git a/Prefabs/NaturalLanguageClassifierWidget.prefab.meta b/Prefabs/NaturalLanguageClassifierWidget.prefab.meta deleted file mode 100644 index 7187a69d9..000000000 --- a/Prefabs/NaturalLanguageClassifierWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d82e765678923254584e439593116ca4 -timeCreated: 1446569949 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/SpeechDisplayWidget.prefab b/Prefabs/SpeechDisplayWidget.prefab deleted file mode 100644 index ddcdf5064..000000000 --- a/Prefabs/SpeechDisplayWidget.prefab +++ /dev/null @@ -1,617 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &107516 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22459950} - - 222: {fileID: 22287508} - - 114: {fileID: 11487890} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &123470 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22408870} - - 222: {fileID: 22290654} - - 114: {fileID: 11419116} - m_Layer: 5 - m_Name: Line - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &140820 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22400084} - - 222: {fileID: 22288394} - - 114: {fileID: 11425622} - - 223: {fileID: 22366024} - - 114: {fileID: 11490848} - - 114: {fileID: 11450080} - m_Layer: 0 - m_Name: SpeechDisplayWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &152684 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22478762} - - 222: {fileID: 22221478} - - 114: {fileID: 11480282} - m_Layer: 5 - m_Name: Output - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &159140 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22485144} - - 222: {fileID: 22245066} - - 114: {fileID: 11415010} - m_Layer: 0 - m_Name: Text_IBM_Watson_TestSTT - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &160518 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22499404} - - 222: {fileID: 22218008} - - 114: {fileID: 11498260} - m_Layer: 5 - m_Name: Watson_Logo - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &171682 -GameObject: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22443654} - - 222: {fileID: 22283762} - - 114: {fileID: 11474642} - m_Layer: 5 - m_Name: Banner_Upper_Element - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11415010 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 159140} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9558824, g: 0.9558824, b: 0.9558824, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 18 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 2 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: TEST SPEECH TO TEXT ---- !u!114 &11419116 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 123470} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11425622 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c8b737d01278d454a8f5d1b443e00bb9, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ContinuousText: 0 - m_Output: {fileID: 11480282} - m_OutputAsInputField: {fileID: 0} - m_OutputStatus: {fileID: 0} - m_MinConfidenceToShow: 0.5 ---- !u!114 &11450080 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &11474642 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 171682} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 1eaeb3a02e12744e5a25a4169c3474a7, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11480282 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152684} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 1 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!114 &11487890 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 107516} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 11b8cc94d1829440d972e9e699902f64, type: 3} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!114 &11490848 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 640, y: 960} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 ---- !u!114 &11498260 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 160518} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: dcc763001129146f0bd779f1a3f3cee2, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22218008 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 160518} ---- !u!222 &22221478 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152684} ---- !u!222 &22245066 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 159140} ---- !u!222 &22283762 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 171682} ---- !u!222 &22287508 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 107516} ---- !u!222 &22288394 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} ---- !u!222 &22290654 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 123470} ---- !u!223 &22366024 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &22400084 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 140820} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 22459950} - - {fileID: 22485144} - - {fileID: 22478762} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!224 &22408870 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 123470} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22459950} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0.00000023841858, y: -100} - m_SizeDelta: {x: -10, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22443654 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 171682} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22459950} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 80} - m_Pivot: {x: 0.99, y: 1.1} ---- !u!224 &22459950 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 107516} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 22499404} - - {fileID: 22443654} - - {fileID: 22408870} - m_Father: {fileID: 22400084} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0.000055277123, y: 0} - m_SizeDelta: {x: 0.00012207031, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22478762 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 152684} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22400084} - m_RootOrder: 2 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -0.5000229} - m_SizeDelta: {x: 0, y: 1.0001} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &22485144 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 159140} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22400084} - m_RootOrder: 1 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -112} - m_SizeDelta: {x: -25, y: 30} - m_Pivot: {x: 0, y: 1} ---- !u!224 &22499404 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 160518} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 22459950} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0.000061035156, y: 0} - m_SizeDelta: {x: 0, y: 35} - m_Pivot: {x: 0.05, y: 2.1} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_AutoConnect - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Color.r - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Color.g - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Color.b - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_RenderMode - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_UiScaleMode - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.x - value: 640 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReferenceResolution.y - value: 960 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_MatchWidthOrHeight - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 140820} - m_IsPrefabParent: 1 diff --git a/Prefabs/SpeechDisplayWidget.prefab.meta b/Prefabs/SpeechDisplayWidget.prefab.meta deleted file mode 100644 index 20a274d40..000000000 --- a/Prefabs/SpeechDisplayWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e562557e1257089438af1756928fd82c -timeCreated: 1446587107 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/SpeechToTextWidget.prefab b/Prefabs/SpeechToTextWidget.prefab deleted file mode 100644 index 739fc269c..000000000 --- a/Prefabs/SpeechToTextWidget.prefab +++ /dev/null @@ -1,74 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &175116 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 4: {fileID: 404560} - - 114: {fileID: 11443366} - m_Layer: 0 - m_Name: SpeechToTextWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &404560 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 175116} - m_LocalRotation: {x: 0, y: -0.8191521, z: 0, w: 0.57357633} - m_LocalPosition: {x: -207.60638, y: 418, z: 570.3934} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 ---- !u!114 &11443366 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 175116} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0ba780a4e1f9a824895da80178f4406c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_ResultOutput: - m_Connections: [] - m_StatusText: {fileID: 0} - m_DetectSilence: 1 - m_SilenceThreshold: 0.03 - m_WordConfidence: 0 - m_TimeStamps: 0 - m_MaxAlternatives: 1 - m_EnableContinous: 1 - m_EnableInterimResults: 1 - m_Transcript: {fileID: 0} - m_Language: en-US - m_LogResult: 1 ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_AutoConnect - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LogResult - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 175116} - m_IsPrefabParent: 1 diff --git a/Prefabs/SpeechToTextWidget.prefab.meta b/Prefabs/SpeechToTextWidget.prefab.meta deleted file mode 100644 index 1d261599a..000000000 --- a/Prefabs/SpeechToTextWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9a2ef11f904aaee419cdda40a956943c -timeCreated: 1446569467 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/TextToSpeechWidget.prefab b/Prefabs/TextToSpeechWidget.prefab deleted file mode 100644 index 29dde13af..000000000 --- a/Prefabs/TextToSpeechWidget.prefab +++ /dev/null @@ -1,153 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &122206 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 4: {fileID: 487028} - - 82: {fileID: 8229950} - - 114: {fileID: 11419508} - m_Layer: 0 - m_Name: TextToSpeechWidget - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &487028 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 122206} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 607, y: 418, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 ---- !u!82 &8229950 -AudioSource: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 122206} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 0} - m_PlayOnAwake: 1 - m_Volume: 1 - m_Pitch: 1 - Loop: 0 - Mute: 0 - Spatialize: 0 - Priority: 128 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 0 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 0 ---- !u!114 &11419508 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 122206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 19bbf0e483a3ecb4b88d5144d66059e4, type: 3} - m_Name: - m_EditorClassIdentifier: - m_AutoConnect: 1 - m_Speaking: - m_Connections: [] - m_DisableMic: - m_Connections: [] - m_LevelOut: - m_Connections: [] - m_LevelOutInterval: 0.05 - m_LevelOutputModifier: 12 - m_TextToSpeechButton: {fileID: 0} - m_Input: {fileID: 0} - m_StatusText: {fileID: 0} - m_Voice: 3 - m_UsePost: 0 ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_AutoConnect - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LevelOut.m_TargetConnection - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LevelOutputModifier - value: 12 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 122206} - m_IsPrefabParent: 1 diff --git a/Prefabs/TextToSpeechWidget.prefab.meta b/Prefabs/TextToSpeechWidget.prefab.meta deleted file mode 100644 index 2adccaa91..000000000 --- a/Prefabs/TextToSpeechWidget.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2f1b2c8996342c64f9853650319be032 -timeCreated: 1446569742 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/Touch Hit Watson.prefab b/Prefabs/Touch Hit Watson.prefab deleted file mode 100644 index 5782fb27c..000000000 --- a/Prefabs/Touch Hit Watson.prefab +++ /dev/null @@ -1,98 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &183852 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22471328} - - 222: {fileID: 22246154} - - 114: {fileID: 11454912} - - 114: {fileID: 11425240} - m_Layer: 0 - m_Name: Touch Hit Watson - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &11425240 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7cb960f8e83f447beb42da7d064d77e2, type: 3} - m_Name: - m_EditorClassIdentifier: - Text: {fileID: 0} ---- !u!114 &11454912 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 21300000, guid: 22829b69db79e467b9df2b6db9bccdf3, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &22246154 -CanvasRenderer: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} ---- !u!224 &22471328 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 183852} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 472, y: 378} - m_SizeDelta: {x: 64, y: 64} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: m_Sprite - value: - objectReference: {fileID: 21300000, guid: 1ca5291cdab0c7440bf75a4a7a4a3282, - type: 3} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 183852} - m_IsPrefabParent: 1 diff --git a/Prefabs/Touch Hit Watson.prefab.meta b/Prefabs/Touch Hit Watson.prefab.meta deleted file mode 100644 index 63763efb7..000000000 --- a/Prefabs/Touch Hit Watson.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a4bbcb7dfeb4c1d4bb6557cd44ac80da -timeCreated: 1451329839 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/Touch Visualizer Watson.prefab b/Prefabs/Touch Visualizer Watson.prefab deleted file mode 100644 index af4db9b96..000000000 --- a/Prefabs/Touch Visualizer Watson.prefab +++ /dev/null @@ -1,110 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &100000 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 4 - m_Component: - - 224: {fileID: 22401058} - - 114: {fileID: 11400000} - - 223: {fileID: 22341586} - m_Layer: 0 - m_Name: Touch Visualizer Watson - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1002 &100001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!1002 &400001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!1002 &2000001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!1002 &8100001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!1002 &9200001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 100000} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 75324aa372886435faa21a4145210f8e, type: 3} - m_Name: - m_EditorClassIdentifier: - touchProxy: {fileID: 11425240, guid: a4bbcb7dfeb4c1d4bb6557cd44ac80da, type: 2} - showTouchId: 1 - showTags: 1 - useDPI: 1 - touchSize: 1 ---- !u!1002 &11400001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!1002 &12400001 -EditorExtensionImpl: - serializedVersion: 6 ---- !u!223 &22341586 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 100000} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingLayerID: 0 - m_SortingOrder: 9000 - m_TargetDisplay: 0 ---- !u!224 &22401058 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 100000} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: touchProxy - value: - objectReference: {fileID: 11425240, guid: a4bbcb7dfeb4c1d4bb6557cd44ac80da, - type: 2} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 100000} - m_IsPrefabParent: 1 ---- !u!1002 &100100001 -EditorExtensionImpl: - serializedVersion: 6 diff --git a/Prefabs/Touch Visualizer Watson.prefab.meta b/Prefabs/Touch Visualizer Watson.prefab.meta deleted file mode 100644 index 0d4f19e93..000000000 --- a/Prefabs/Touch Visualizer Watson.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1acd07626e252754da8a96f00b099b12 -timeCreated: 1451330005 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Prefabs/TouchManager.prefab b/Prefabs/TouchManager.prefab deleted file mode 100644 index f81604ef4..000000000 --- a/Prefabs/TouchManager.prefab +++ /dev/null @@ -1,482 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &109220 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 5 - m_Component: - - component: {fileID: 456440} - - component: {fileID: 11447296} - - component: {fileID: 11482954} - - component: {fileID: 11437114} - - component: {fileID: 11479124} - - component: {fileID: 11457544} - - component: {fileID: 11469728} - - component: {fileID: 11459306} - - component: {fileID: 11461230} - - component: {fileID: 11479102} - - component: {fileID: 11417566} - - component: {fileID: 11495534} - m_Layer: 0 - m_Name: TouchManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &132064 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 5 - m_Component: - - component: {fileID: 438902} - - component: {fileID: 11412284} - m_Layer: 0 - m_Name: Inputs - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &196872 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - serializedVersion: 5 - m_Component: - - component: {fileID: 22440388} - - component: {fileID: 11455964} - - component: {fileID: 22308338} - m_Layer: 0 - m_Name: Touch Visualizer Watson - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &438902 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 132064} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 456440} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &456440 -Transform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 438902} - - {fileID: 22440388} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &11412284 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 132064} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e276ccba4f7314d9988af19f9b3a611b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - TouchTags: - tagList: - - Touch - MouseTags: - tagList: - - Mouse - PenTags: - tagList: - - Pen - Windows8Touch: 0 - Windows7Touch: 0 - WebPlayerTouch: 1 - WebGLTouch: 1 - Windows8Mouse: 1 - Windows7Mouse: 1 - UniversalWindowsMouse: 1 ---- !u!114 &11417566 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: - - {fileID: 11461230} - - {fileID: 11479102} - numberOfTapsRequired: 3 - timeLimit: 0.7 - distanceLimit: 0.3 ---- !u!114 &11437114 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bc7fd33c57d694994b0ab9f33fcdcbea, type: 3} - m_Name: - m_EditorClassIdentifier: - Name: Global Fullscreen - type: 2 - _camera: {fileID: 0} ---- !u!114 &11447296 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1ce6f84be69c24efc9afd3dac982cdfd, type: 3} - m_Name: - m_EditorClassIdentifier: - m_TapGesture: {fileID: 11461230} - m_DoubleTapGesture: {fileID: 11479102} - m_ThreeTapGesture: {fileID: 11417566} - m_OneFingerMoveGesture: {fileID: 11479124} - m_TwoFingerMoveGesture: {fileID: 11457544} - m_PressGesture: {fileID: 11469728} - m_ReleaseGesture: {fileID: 11459306} - m_LongPressGesture: {fileID: 11495534} ---- !u!114 &11455964 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 196872} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 75324aa372886435faa21a4145210f8e, type: 3} - m_Name: - m_EditorClassIdentifier: - touchProxy: {fileID: 11425240, guid: a4bbcb7dfeb4c1d4bb6557cd44ac80da, type: 2} - showTouchId: 1 - showTags: 1 - useDPI: 1 - touchSize: 1 ---- !u!114 &11457544 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 2 - maxTouches: 2 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - type: 7 - minScreenPointsDistance: 0.5 - screenTransformThreshold: 0.1 ---- !u!114 &11459306 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 141e75b9b7edb42df80a22a14f03ae4b, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - ignoreChildren: 0 ---- !u!114 &11461230 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: - - {fileID: 11417566} - - {fileID: 11479102} - numberOfTapsRequired: 1 - timeLimit: Infinity - distanceLimit: Infinity ---- !u!114 &11469728 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c6be551879cd14d739b0188844ef2c60, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - ignoreChildren: 0 ---- !u!114 &11479102 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7a878a6ff128243dfb1d89ca0273f059, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 0 - maxTouches: 0 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: - - {fileID: 11461230} - - {fileID: 11417566} - numberOfTapsRequired: 2 - timeLimit: 0.7 - distanceLimit: 0.3 ---- !u!114 &11479124 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 74ae431eff8434b0897d3f7f1cff4311, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 1 - maxTouches: 1 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - type: 1 - minScreenPointsDistance: 0.5 - screenTransformThreshold: 0.1 ---- !u!114 &11482954 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0dd4c394fe06f4ea49e03aaa5e7a8190, type: 3} - m_Name: - m_EditorClassIdentifier: - displayDevice: {fileID: 0} - shouldCreateCameraLayer: 1 - shouldCreateStandardInput: 1 - useSendMessage: 0 - sendMessageEvents: 60 - sendMessageTarget: {fileID: 0} - layers: - - {fileID: 0} ---- !u!114 &11495534 -MonoBehaviour: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 109220} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 65c8d97aff62a473e888feae3bec54cd, type: 3} - m_Name: - m_EditorClassIdentifier: - advancedProps: 0 - minTouches: 1 - maxTouches: 1 - combineTouches: 0 - combineTouchesInterval: 0.3 - useSendMessage: 0 - sendStateChangeMessages: 0 - sendMessageTarget: {fileID: 0} - requireGestureToFail: {fileID: 0} - friendlyGestures: [] - timeToPress: 1 - distanceLimit: 1 ---- !u!223 &22308338 -Canvas: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 196872} - m_Enabled: 1 - serializedVersion: 2 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_SortingLayerID: 0 - m_SortingOrder: 9000 - m_TargetDisplay: 0 ---- !u!224 &22440388 -RectTransform: - m_ObjectHideFlags: 1 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 196872} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: [] - m_Father: {fileID: 456440} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 0} - propertyPath: layers.Array.size - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: friendlyGestures.Array.size - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: layers.Array.data[0] - value: - objectReference: {fileID: 11437114} - - target: {fileID: 0} - propertyPath: maxTouches - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_PressGesture - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ReleaseGesture - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: numberOfTapsRequired - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: distanceLimit - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: timeLimit - value: .699999988 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_ThreeTapGesture - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: friendlyGestures.Array.data[0] - value: - objectReference: {fileID: 0} - - target: {fileID: 0} - propertyPath: m_LongPressGesture - value: - objectReference: {fileID: 11495534} - - target: {fileID: 0} - propertyPath: minTouches - value: 1 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_ParentPrefab: {fileID: 0} - m_RootGameObject: {fileID: 109220} - m_IsPrefabParent: 1 diff --git a/Prefabs/TouchManager.prefab.meta b/Prefabs/TouchManager.prefab.meta deleted file mode 100644 index df3d2a70d..000000000 --- a/Prefabs/TouchManager.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 18d6f509dac7d89419df972e1daa5d9b -timeCreated: 1446578807 -licenseType: Pro -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: From bb36eccf01817f0a5a96c96a08dbedeffc21d1fa Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Tue, 17 Oct 2017 14:41:42 -0500 Subject: [PATCH 009/100] added filename and mimetype to AddCustomCorpus method, added AddCustomCorpusString method, added new testData --- .../TestData/test-stt-corpus.txt | 58 ------------------- .../TestData/theJabberwocky-utf8.txt | 36 ++++++++++++ ....txt.meta => theJabberwocky-utf8.txt.meta} | 6 +- .../TestData/theJabberwocky.txt | 36 ++++++++++++ .../TestData/theJabberwocky.txt.meta | 8 +++ .../Services/SpeechToText/v1/SpeechToText.cs | 47 ++++++++++++++- Scripts/UnitTests/TestSpeechToText.cs | 13 ++++- .../websocket-sharp.csproj.meta | 8 +++ 8 files changed, 145 insertions(+), 67 deletions(-) delete mode 100644 Examples/ServiceExamples/TestData/test-stt-corpus.txt create mode 100644 Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt rename Examples/ServiceExamples/TestData/{test-stt-corpus.txt.meta => theJabberwocky-utf8.txt.meta} (54%) create mode 100644 Examples/ServiceExamples/TestData/theJabberwocky.txt create mode 100644 Examples/ServiceExamples/TestData/theJabberwocky.txt.meta create mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Examples/ServiceExamples/TestData/test-stt-corpus.txt b/Examples/ServiceExamples/TestData/test-stt-corpus.txt deleted file mode 100644 index d3ea99b59..000000000 --- a/Examples/ServiceExamples/TestData/test-stt-corpus.txt +++ /dev/null @@ -1,58 +0,0 @@ -Adds a single corpus text file of new training data to the custom language model. -Use multiple requests to submit multiple corpus text files. -Only the owner of a custom model can use this method to add a corpus to the model. - -Submit a plain text file that contains sample sentences from the domain of interest to enable the service to extract words in context. -The more sentences you add that represent the context in which speakers use words from the domain, the better the service's recognition accuracy. -Adding a corpus does not affect the custom model until you train the model for the new data by using the Train a custom model method. - -Use the following guidelines to prepare a corpus text file: - -Provide a plain text file that is encoded in UTF-8 if it contains non-ASCII characters. -The service assumes UTF-8 encoding if it encounters such characters. - -Include each sentence of the corpus on its own line, terminating each line with a carriage return. -Including multiple sentences on the same line can degrade accuracy. - -Use consistent capitalization for words in the corpus. -The words resource is case-sensitive; mix upper- and lowercase letters and use capitalization only when intended. - -Beware of typographical errors. -The service assumes that typos are new words; unless you correct them before training the model, the service adds them to the model's vocabulary. - -The service automatically does the following: - -Converts numbers to their equivalent words. -For example, 500 becomes five hundred, and 0.15 becomes zero point fifteen. - -Removes the following punctuation and special characters: - -! @ # $ % ^ & * - + = ~ _ . , ; : ( ) < > [ ] { } - -Ignores phrases enclosed in ( ) (parentheses), < > (angle brackets), [ ] (square brackets), and { } (curly braces). - -Converts tokens that include certain symbols to meaningful strings. -For example, the service - -Converts a $ (dollar sign) followed by a number to its string representation. -For example, $100 becomes one hundred dollars. - -Converts a % (percent sign) preceded by a number to its string representation. -For example, 100% becomes one hundred percent. - -This list is not exhaustive; the service makes similar adjustments for other characters as needed. - -The call returns an HTTP 201 response code if the corpus is valid. It then asynchronously pre-processes the contents of the corpus and automatically extracts new words that it finds. -This can take on the order of a minute or two to complete depending on the total number of words and the number of new words in the corpus, as well as the current load on the service. -You cannot submit requests to add additional corpora or words to the custom model, or to train the model, until the service's analysis of the corpus for the current request completes. -Use the List corpora method to check the status of the analysis. - -The service auto-populates the model's words resource with any word that is not found in its base vocabulary; these are referred to as out-of-vocabulary (OOV) words. -You can use the List custom words method to examine the words resource, using other words method to eliminate typos and modify how words are pronounced as needed. - -To add a corpus file that has the same name as an existing corpus, set the allow_overwrite query parameter to true; otherwise, the request fails. -Overwriting an existing corpus causes the service to process the corpus text file and extract OOV words anew. -Before doing so, it removes any OOV words associated with the existing corpus from the model's words resource unless they were also added by another corpus or they have been modified in some way with the Add custom words or Add a custom word method. - -The service limits the overall amount of data that you can add to a custom model to a maximum of 10 million total words from all corpora combined. -Also, you can add no more than 30 thousand new words to a model; this includes words that the service extracts from corpora and words that you add directly. \ No newline at end of file diff --git a/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt new file mode 100644 index 000000000..0317a5b17 --- /dev/null +++ b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt @@ -0,0 +1,36 @@ +no title +'Twas brillig, and the slithy toves +Did gyre and gimble in the wabe +All mimsy were the borogoves, +And the mome raths outgrabe. +"Beware the Jabberwock, my son! +The jaws that bite, the claws that catch! +Beware the Jubjub bird, and shun + + +The frumious Bandersnatch!" +He took his vorpal sword in hand; +Long time the manxome foe he sought- +So rested he by the Tumtum tree + + +And stood awhile in thought. +And, as in uffish thought he stood, +The Jabberwock, with eyes of flame, +Came whiffling through the tulgey wood, +And burbled as it came! +One, two! One, two! And through and through +The vorpal blade went snicker-snack! +He left it dead, and with its head +He went galumphing back. +"And hast thou slain the Jabberwock? +Come to my arms, my beamish boy! +O frabjous day! Callooh! Callay!" +He chortled in his joy. +'Twas brillig, and the slithy toves + +Did gyre and gimble in the wabe +All mimsy were the borogoves, + + +And the mome raths outgrabe. diff --git a/Examples/ServiceExamples/TestData/test-stt-corpus.txt.meta b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt.meta similarity index 54% rename from Examples/ServiceExamples/TestData/test-stt-corpus.txt.meta rename to Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt.meta index b9d4c9893..51ec00bf0 100644 --- a/Examples/ServiceExamples/TestData/test-stt-corpus.txt.meta +++ b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 91ef033de03807e4d8649447da53809a -timeCreated: 1475787453 -licenseType: Pro +guid: 19fcee496f92fe4408f24737534651cc +timeCreated: 1508268671 +licenseType: Free TextScriptImporter: userData: assetBundleName: diff --git a/Examples/ServiceExamples/TestData/theJabberwocky.txt b/Examples/ServiceExamples/TestData/theJabberwocky.txt new file mode 100644 index 000000000..9f20ae535 --- /dev/null +++ b/Examples/ServiceExamples/TestData/theJabberwocky.txt @@ -0,0 +1,36 @@ +no title +'Twas brillig, and the slithy toves +Did gyre and gimble in the wabe +All mimsy were the borogoves, +And the mome raths outgrabe. +"Beware the Jabberwock, my son! +The jaws that bite, the claws that catch! +Beware the Jubjub bird, and shun + + +The frumious Bandersnatch!" +He took his vorpal sword in hand; +Long time the manxome foe he sought- +So rested he by the Tumtum tree + + +And stood awhile in thought. +And, as in uffish thought he stood, +The Jabberwock, with eyes of flame, +Came whiffling through the tulgey wood, +And burbled as it came! +One, two! One, two! And through and through +The vorpal blade went snicker-snack! +He left it dead, and with its head +He went galumphing back. +"And hast thou slain the Jabberwock? +Come to my arms, my beamish boy! +O frabjous day! Callooh! Callay!" +He chortled in his joy. +'Twas brillig, and the slithy toves + +Did gyre and gimble in the wabe +All mimsy were the borogoves, + + +And the mome raths outgrabe. \ No newline at end of file diff --git a/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta b/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta new file mode 100644 index 000000000..4a0486fcf --- /dev/null +++ b/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 591912f3b7070df47b0ae7ea23ad925b +timeCreated: 1508268671 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9b762e173..f024e4a7f 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -1627,7 +1627,7 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R Log.Error("SpeechToText", "Failed to upload {0}!", trainingPath); } - return AddCustomCorpus(callback, customizationID, corpusName, allowOverwrite, trainingDataBytes); + return AddCustomCorpus(callback, customizationID, corpusName, allowOverwrite, trainingDataBytes, Path.GetFileName(trainingPath)); } /// @@ -1639,7 +1639,7 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R /// Allow overwriting of corpus data. /// ByteArray data for training data. /// Optional customization data. - public bool AddCustomCorpus(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, byte[] trainingData, string customData = default(string)) + public bool AddCustomCorpus(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, byte[] trainingData, string filename, string customData = default(string)) { if (callback == null) throw new ArgumentNullException("callback"); @@ -1649,6 +1649,8 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R throw new ArgumentNullException("A corpusName is requried for AddCustomCorpus."); if (trainingData == default(byte[])) throw new ArgumentNullException("Training data is required for AddCustomCorpus."); + if (string.IsNullOrEmpty(filename)) + throw new ArgumentNullException("Filename is required for AddCustomCorpus."); AddCustomCorpusRequest req = new AddCustomCorpusRequest(); req.Callback = callback; @@ -1659,7 +1661,46 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R req.Headers["Accept"] = "application/json"; req.Parameters["allow_overwrite"] = allowOverwrite.ToString(); req.Forms = new Dictionary(); - req.Forms["body"] = new RESTConnector.Form(trainingData, "trainingData.txt", "text/plain"); + req.Forms["body"] = new RESTConnector.Form(trainingData, filename, Utility.GetMimeType(Path.GetExtension(filename))); + req.OnResponse = OnAddCustomCorpusResp; + + string service = "/v1/customizations/{0}/corpora/{1}"; + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID, corpusName)); + if (connector == null) + return false; + + return connector.Send(req); + } + + /// + /// Overload method for AddCustomCorpus that takes string training data. + /// + /// The callback. + /// The customization ID with the corpus to be deleted. + /// The corpus name to be deleted. + /// Allow overwriting of corpus data. + /// String data for training data. + /// Optional customization data. + public bool AddCustomCorpusString(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, string trainingData, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationID)) + throw new ArgumentNullException("A customizationID is required for AddCustomCorpus."); + if (string.IsNullOrEmpty(corpusName)) + throw new ArgumentNullException("A corpusName is requried for AddCustomCorpus."); + if (string.IsNullOrEmpty(trainingData)) + throw new ArgumentNullException("Training data is required for AddCustomCorpus."); + + AddCustomCorpusRequest req = new AddCustomCorpusRequest(); + req.Callback = callback; + req.CustomizationID = customizationID; + req.CorpusName = corpusName; + req.Data = customData; + req.Headers["Content-Type"] = "application/x-www-form-urlencoded"; + req.Headers["Accept"] = "application/json"; + req.Parameters["allow_overwrite"] = allowOverwrite.ToString(); + req.Send = Encoding.UTF8.GetBytes(trainingData); req.OnResponse = OnAddCustomCorpusResp; string service = "/v1/customizations/{0}/corpora/{1}"; diff --git a/Scripts/UnitTests/TestSpeechToText.cs b/Scripts/UnitTests/TestSpeechToText.cs index 0fd496eaa..f470d3bee 100644 --- a/Scripts/UnitTests/TestSpeechToText.cs +++ b/Scripts/UnitTests/TestSpeechToText.cs @@ -118,7 +118,7 @@ public override IEnumerator RunTest() //}; _speechToText = new SpeechToText(credentials); - _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-corpus.txt"; + _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt"; _customWordsFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-words.json"; _wavFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-audio.wav"; _audioClip = WaveFile.ParseWAV("testClip", File.ReadAllBytes(_wavFilePath)); @@ -164,9 +164,16 @@ public override IEnumerator RunTest() while (!_getCustomCorporaTested) yield return null; - // Add custom corpus + //// Add custom corpus + //Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + //_speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, _customCorpusFilePath); + //while (!_addCustomCorpusTested) + // yield return null; + + // Add custom corpus string Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, _customCorpusFilePath); + string corpusData = File.ReadAllText(_customCorpusFilePath); + _speechToText.AddCustomCorpusString(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta new file mode 100644 index 000000000..a7e986208 --- /dev/null +++ b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0fbe68503a01cc440bbbf2f8130640f2 +timeCreated: 1499973980 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: From e2840429d6817900ed624126c5c2821b74bc8539 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 17 Oct 2017 15:33:01 -0500 Subject: [PATCH 010/100] remove null check for input text, added tests for empty string to start conversation --- .../Services/Conversation/v1/Conversation.cs | 4 ---- Scripts/UnitTests/TestConversation.cs | 17 +++++++++++++++++ .../WebSocketSharp/websocket-sharp.csproj.meta | 8 ++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Scripts/Services/Conversation/v1/Conversation.cs b/Scripts/Services/Conversation/v1/Conversation.cs index f5c294a24..f74ad7a33 100644 --- a/Scripts/Services/Conversation/v1/Conversation.cs +++ b/Scripts/Services/Conversation/v1/Conversation.cs @@ -118,8 +118,6 @@ public Conversation(Credentials credentials) { if (string.IsNullOrEmpty(workspaceID)) throw new ArgumentNullException("workspaceId"); - if (string.IsNullOrEmpty(input)) - throw new ArgumentNullException("input"); if (callback == null) throw new ArgumentNullException("callback"); @@ -155,8 +153,6 @@ public Conversation(Credentials credentials) { if (string.IsNullOrEmpty(workspaceID)) throw new ArgumentNullException("workspaceId"); - if (string.IsNullOrEmpty(messageRequest.input["text"] as string)) - throw new ArgumentNullException("messageRequest.input.text"); if (callback == null) throw new ArgumentNullException("callback"); diff --git a/Scripts/UnitTests/TestConversation.cs b/Scripts/UnitTests/TestConversation.cs index 8ff0e15ed..47381c202 100644 --- a/Scripts/UnitTests/TestConversation.cs +++ b/Scripts/UnitTests/TestConversation.cs @@ -88,6 +88,23 @@ public override IEnumerator RunTest() _conversation = new Conversation(credentials); _conversation.VersionDate = _conversationVersionDate; + // Test initate with empty string + if (!_conversation.Message(OnMessage, _workspaceId, "")) + Log.Debug("ExampleConversation", "Failed to message!"); + + // Test initiate with empty string message object + MessageRequest messageRequest = new MessageRequest() + { + input = new Dictionary() + { + { "text", "" } + }, + context = _context + }; + + if (!_conversation.Message(OnMessage, _workspaceId, messageRequest)) + Log.Debug("ExampleConversation", "Failed to message!"); + if (!_conversation.Message(OnMessage, _workspaceId, "hello")) Log.Debug("ExampleConversation", "Failed to message!"); diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta new file mode 100644 index 000000000..a7e986208 --- /dev/null +++ b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0fbe68503a01cc440bbbf2f8130640f2 +timeCreated: 1499973980 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: From 4eed9a4f3308a735dab89610fd94edb9250592eb Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 18 Oct 2017 10:49:25 -0500 Subject: [PATCH 011/100] removed multipart operations for adding custom corpus --- .../Scripts/ExampleSpeechToText.cs | 7 +- .../Services/SpeechToText/v1/SpeechToText.cs | 85 +------------------ Scripts/UnitTests/TestSpeechToText.cs | 12 +-- .../websocket-sharp.csproj.meta | 8 -- 4 files changed, 8 insertions(+), 104 deletions(-) delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index fc9188144..a605ad46b 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -34,7 +34,7 @@ public class ExampleSpeechToText : MonoBehaviour private string _modelNameToGet; private string _createdCustomizationID; - private string _createdCorpusName = "unity-corpus"; + private string _createdCorpusName = "the-jabberwocky-corpus"; private string _customCorpusFilePath; private string _customWordsFilePath; private string _wavFilePath; @@ -71,7 +71,7 @@ void Start() Credentials credentials = new Credentials(_username, _password, _url); _speechToText = new SpeechToText(credentials); - _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-corpus.txt"; + _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt"; _customWordsFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-words.json"; _wavFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-audio.wav"; _audioClip = WaveFile.ParseWAV("testClip", File.ReadAllBytes(_wavFilePath)); @@ -129,7 +129,8 @@ private IEnumerator Examples() // Add custom corpus Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, _customCorpusFilePath); + string corpusData = File.ReadAllText(_customCorpusFilePath); + _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index f024e4a7f..2c2852927 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -1589,89 +1589,6 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R /// /// The service limits the overall amount of data that you can add to a custom model to a maximum of 10 million total words from all corpora combined.Also, you can add no more than 30 thousand new words to a model; this includes words that the service extracts from corpora and words that you add directly. /// Note: This method is currently a beta release that is available for US English only - /// - /// The callback. - /// The customization ID with the corpus to be deleted. - /// The corpus name to be deleted. - /// Allow overwriting of corpus data. - /// A file path to plain text training data. - /// Optional customization data. - /// - public bool AddCustomCorpus(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, string trainingPath, string customData = default(string)) - { - if (callback == null) - throw new ArgumentNullException("callback"); - if (string.IsNullOrEmpty(customizationID)) - throw new ArgumentNullException("A customizationID is required for AddCustomCorpus."); - if (string.IsNullOrEmpty(corpusName)) - throw new ArgumentNullException("A corpusName is required to AddCustomCorpus."); - if (string.IsNullOrEmpty(trainingPath)) - throw new ArgumentNullException("A path to training data is required to AddCustomCorpus"); - - byte[] trainingDataBytes = null; - - if (!string.IsNullOrEmpty(trainingPath)) - { - if (LoadFile != null) - { - trainingDataBytes = LoadFile(trainingPath); - } - else - { -#if !UNITY_WEBPLAYER - trainingDataBytes = File.ReadAllBytes(trainingPath); -#endif - } - - if (trainingDataBytes == null) - Log.Error("SpeechToText", "Failed to upload {0}!", trainingPath); - } - - return AddCustomCorpus(callback, customizationID, corpusName, allowOverwrite, trainingDataBytes, Path.GetFileName(trainingPath)); - } - - /// - /// Overload method for AddCustomCorpus that takes byteArray training data. - /// - /// The callback. - /// The customization ID with the corpus to be deleted. - /// The corpus name to be deleted. - /// Allow overwriting of corpus data. - /// ByteArray data for training data. - /// Optional customization data. - public bool AddCustomCorpus(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, byte[] trainingData, string filename, string customData = default(string)) - { - if (callback == null) - throw new ArgumentNullException("callback"); - if (string.IsNullOrEmpty(customizationID)) - throw new ArgumentNullException("A customizationID is required for AddCustomCorpus."); - if (string.IsNullOrEmpty(corpusName)) - throw new ArgumentNullException("A corpusName is requried for AddCustomCorpus."); - if (trainingData == default(byte[])) - throw new ArgumentNullException("Training data is required for AddCustomCorpus."); - if (string.IsNullOrEmpty(filename)) - throw new ArgumentNullException("Filename is required for AddCustomCorpus."); - - AddCustomCorpusRequest req = new AddCustomCorpusRequest(); - req.Callback = callback; - req.CustomizationID = customizationID; - req.CorpusName = corpusName; - req.Data = customData; - req.Headers["Content-Type"] = "application/x-www-form-urlencoded"; - req.Headers["Accept"] = "application/json"; - req.Parameters["allow_overwrite"] = allowOverwrite.ToString(); - req.Forms = new Dictionary(); - req.Forms["body"] = new RESTConnector.Form(trainingData, filename, Utility.GetMimeType(Path.GetExtension(filename))); - req.OnResponse = OnAddCustomCorpusResp; - - string service = "/v1/customizations/{0}/corpora/{1}"; - RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID, corpusName)); - if (connector == null) - return false; - - return connector.Send(req); - } - /// /// Overload method for AddCustomCorpus that takes string training data. /// @@ -1681,7 +1598,7 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R /// Allow overwriting of corpus data. /// String data for training data. /// Optional customization data. - public bool AddCustomCorpusString(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, string trainingData, string customData = default(string)) + public bool AddCustomCorpus(OnAddCustomCorpusCallback callback, string customizationID, string corpusName, bool allowOverwrite, string trainingData, string customData = default(string)) { if (callback == null) throw new ArgumentNullException("callback"); diff --git a/Scripts/UnitTests/TestSpeechToText.cs b/Scripts/UnitTests/TestSpeechToText.cs index f470d3bee..8c161e293 100644 --- a/Scripts/UnitTests/TestSpeechToText.cs +++ b/Scripts/UnitTests/TestSpeechToText.cs @@ -40,7 +40,7 @@ public class TestSpeechToText : UnitTest private string _modelNameToGet; private string _createdCustomizationID; - private string _createdCorpusName = "unity-corpus"; + private string _createdCorpusName = "the-jabberwocky-corpus"; private string _customCorpusFilePath; private string _customWordsFilePath; private string _wavFilePath; @@ -164,16 +164,10 @@ public override IEnumerator RunTest() while (!_getCustomCorporaTested) yield return null; - //// Add custom corpus - //Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - //_speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, _customCorpusFilePath); - //while (!_addCustomCorpusTested) - // yield return null; - - // Add custom corpus string + // Add custom corpus Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); string corpusData = File.ReadAllText(_customCorpusFilePath); - _speechToText.AddCustomCorpusString(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); + _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta deleted file mode 100644 index a7e986208..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0fbe68503a01cc440bbbf2f8130640f2 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From 661fa429264711539219d44750e9f22f7a1a23a5 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 18 Oct 2017 10:52:16 -0500 Subject: [PATCH 012/100] removed non-utf8 jabberwocky example file --- .../TestData/theJabberwocky-utf8.txt | 2 +- .../TestData/theJabberwocky.txt | 36 ------------------- .../TestData/theJabberwocky.txt.meta | 8 ----- 3 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 Examples/ServiceExamples/TestData/theJabberwocky.txt delete mode 100644 Examples/ServiceExamples/TestData/theJabberwocky.txt.meta diff --git a/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt index 0317a5b17..8517ee324 100644 --- a/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt +++ b/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt @@ -1,4 +1,4 @@ -no title +The Jabberwocky 'Twas brillig, and the slithy toves Did gyre and gimble in the wabe All mimsy were the borogoves, diff --git a/Examples/ServiceExamples/TestData/theJabberwocky.txt b/Examples/ServiceExamples/TestData/theJabberwocky.txt deleted file mode 100644 index 9f20ae535..000000000 --- a/Examples/ServiceExamples/TestData/theJabberwocky.txt +++ /dev/null @@ -1,36 +0,0 @@ -no title -'Twas brillig, and the slithy toves -Did gyre and gimble in the wabe -All mimsy were the borogoves, -And the mome raths outgrabe. -"Beware the Jabberwock, my son! -The jaws that bite, the claws that catch! -Beware the Jubjub bird, and shun - - -The frumious Bandersnatch!" -He took his vorpal sword in hand; -Long time the manxome foe he sought- -So rested he by the Tumtum tree - - -And stood awhile in thought. -And, as in uffish thought he stood, -The Jabberwock, with eyes of flame, -Came whiffling through the tulgey wood, -And burbled as it came! -One, two! One, two! And through and through -The vorpal blade went snicker-snack! -He left it dead, and with its head -He went galumphing back. -"And hast thou slain the Jabberwock? -Come to my arms, my beamish boy! -O frabjous day! Callooh! Callay!" -He chortled in his joy. -'Twas brillig, and the slithy toves - -Did gyre and gimble in the wabe -All mimsy were the borogoves, - - -And the mome raths outgrabe. \ No newline at end of file diff --git a/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta b/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta deleted file mode 100644 index 4a0486fcf..000000000 --- a/Examples/ServiceExamples/TestData/theJabberwocky.txt.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 591912f3b7070df47b0ae7ea23ad925b -timeCreated: 1508268671 -licenseType: Free -TextScriptImporter: - userData: - assetBundleName: - assetBundleVariant: From 0b788013c540a279020626bec8e648891ebd8ca7 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 18 Oct 2017 14:03:52 -0500 Subject: [PATCH 013/100] take absolute value of samples as the maxlevel --- Examples/ServiceExamples/Scripts/ExampleStreaming.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index d0ad82a69..8b7e10551 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -139,7 +139,7 @@ private IEnumerator RecordingHandler() _recording.GetData(samples, bFirstBlock ? 0 : midPoint); AudioData record = new AudioData(); - record.MaxLevel = Mathf.Max(samples); + record.MaxLevel = Mathf.Abs(Mathf.Max(samples)); record.Clip = AudioClip.Create("Recording", midPoint, _recording.channels, _recordingHZ, false); record.Clip.SetData(samples, 0); From 8b79c03da0ecd29299df82324ada71238411463e Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 18 Oct 2017 14:22:07 -0500 Subject: [PATCH 014/100] checking for silence threshold values --- .../Services/SpeechToText/v1/SpeechToText.cs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9b762e173..60faa5544 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -163,10 +163,30 @@ public string RecognizeModel /// public bool DetectSilence { get { return _detectSilence; } set { _detectSilence = value; } } /// - /// A value from 1.0 to 0.0 that determines what is considered silence. If the audio level is below this value - /// then we consider it silence. + /// A value from 1.0 to 0.0 that determines what is considered silence. If the absolute value of the + /// audio level is below this value then we consider it silence. /// - public float SilenceThreshold { get { return _silenceThreshold; } set { _silenceThreshold = value; } } + public float SilenceThreshold + { + get { return _silenceThreshold; } + set + { + if (value < 0) + { + Log.Warning("SpeechToText", "Silence threshold should be between 0.0f and 1.0f. Setting threshold to 0.0f"); + _silenceThreshold = 0f; + } + else if (value > 1) + { + Log.Warning("SpeechToText", "Silence threshold should be between 0.0f and 1.0f. Setting threshold to 1.0f"); + _silenceThreshold = 1f; + } + else + { + _silenceThreshold = value; + } + } + } /// /// Gets and sets the endpoint URL for the service. /// From 6f3d08ad92348df380201608620d50bbf10ce42b Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 18 Oct 2017 14:25:50 -0500 Subject: [PATCH 015/100] throw exception if silence threshold is out of range --- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 60faa5544..8942502b3 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -171,15 +171,9 @@ public float SilenceThreshold get { return _silenceThreshold; } set { - if (value < 0) + if (value < 0f || value > 1f) { - Log.Warning("SpeechToText", "Silence threshold should be between 0.0f and 1.0f. Setting threshold to 0.0f"); - _silenceThreshold = 0f; - } - else if (value > 1) - { - Log.Warning("SpeechToText", "Silence threshold should be between 0.0f and 1.0f. Setting threshold to 1.0f"); - _silenceThreshold = 1f; + throw new ArgumentOutOfRangeException("Silence threshold should be between 0.0f and 1.0f"); } else { From b538eabf3a4d0cb316350f53d0044d4456ba9fbc Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Thu, 19 Oct 2017 11:49:38 -0500 Subject: [PATCH 016/100] introduce delay before deleteing custom VR classifier because of known issue --- .../Scripts/ExampleVisualRecognition.cs | 45 ++++++++++++++----- Scripts/UnitTests/TestVisualRecognition.cs | 44 +++++++++++++----- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs index 00f82a096..365b722c8 100644 --- a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs +++ b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs @@ -34,7 +34,7 @@ public class ExampleVisualRecognition : MonoBehaviour private VisualRecognition _visualRecognition; private string _visualRecognitionVersionDate = "2016-05-20"; - private string _classifierID = "swiftsdkunittestcarstrucks_128487308"; + private string _classifierID = ""; private string _imageURL = "https://upload.wikimedia.org/wikipedia/commons/e/e9/Official_portrait_of_Barack_Obama.jpg"; //private string _imageTextURL = "http://i.stack.imgur.com/ZS6nH.png"; @@ -102,16 +102,6 @@ private IEnumerator Examples() yield return null; #endif -#if DELETE_TRAINED_CLASSIFIER - // Delete classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); - if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) - Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); -#endif - - while (!_deleteClassifierTested) - yield return null; - // Classify get Log.Debug("ExampleVisualRecognition", "Attempting to get classify via URL"); if (!_visualRecognition.Classify(OnClassifyGet, _imageURL)) @@ -165,6 +155,23 @@ private IEnumerator Examples() //while (!_recognizeTextPostTested) // yield return null; + +#if DELETE_TRAINED_CLASSIFIER + #region Delay + Runnable.Run(Delay(_delayTime)); + while (_isWaitingForDelay) + yield return null; + #endregion + + // Delete classifier by ID + Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); + if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) + Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); + + while (!_deleteClassifierTested) + yield return null; +#endif + Log.Debug("ExampleVisualRecognition", "Visual Recogition tests complete"); } @@ -197,6 +204,7 @@ private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, st #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; #endif + _classifierID = classifier.classifier_id; _trainClassifierTested = true; } #endif @@ -237,4 +245,19 @@ private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextPost Response: {0}", data); // _recognizeTextPostTested = true; //} + + #region Delay + // Introducing a delay because of a known issue with Visual Recognition where newly created classifiers + // will disappear without being deleted if a delete is attempted less than ~10 seconds after creation. + private float _delayTime = 15f; + private bool _isWaitingForDelay = false; + + private IEnumerator Delay(float delayTime) + { + _isWaitingForDelay = true; + Log.Debug("TestVisualRecognition", "Delaying for {0} seconds....", delayTime); + yield return new WaitForSeconds(delayTime); + _isWaitingForDelay = false; + } + #endregion } diff --git a/Scripts/UnitTests/TestVisualRecognition.cs b/Scripts/UnitTests/TestVisualRecognition.cs index fddaf3ebd..4160156c6 100644 --- a/Scripts/UnitTests/TestVisualRecognition.cs +++ b/Scripts/UnitTests/TestVisualRecognition.cs @@ -40,7 +40,7 @@ public class TestVisualRecognition : UnitTest private VisualRecognition _visualRecognition; private string _visualRecognitionVersionDate = "2016-05-20"; - private string _classifierID = "swiftsdkunittestcarstrucks_128487308"; + private string _classifierID = ""; private string _imageURL = "https://upload.wikimedia.org/wikipedia/commons/e/e9/Official_portrait_of_Barack_Obama.jpg"; //private string _imageTextURL = "http://i.stack.imgur.com/ZS6nH.png"; @@ -137,16 +137,6 @@ public override IEnumerator RunTest() yield return null; #endif -#if DELETE_TRAINED_CLASSIFIER - // Delete classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); - if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) - Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); -#endif - - while (!_deleteClassifierTested) - yield return null; - // Classify get Log.Debug("ExampleVisualRecognition", "Attempting to get classify via URL"); if (!_visualRecognition.Classify(OnClassifyGet, _imageURL)) @@ -200,6 +190,22 @@ public override IEnumerator RunTest() //while (!_recognizeTextPostTested) // yield return null; +#if DELETE_TRAINED_CLASSIFIER + #region Delay + Runnable.Run(Delay(_delayTime)); + while (_isWaitingForDelay) + yield return null; + #endregion + + // Delete classifier by ID + Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); + if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) + Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); + + while (!_deleteClassifierTested) + yield return null; +#endif + Log.Debug("ExampleVisualRecognition", "Visual Recogition tests complete"); yield break; } @@ -235,6 +241,7 @@ private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, st #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; #endif + _classifierID = classifier.classifier_id; Test(classifier != null); _trainClassifierTested = true; } @@ -280,5 +287,20 @@ private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextPost Response: {0}", data); // _recognizeTextPostTested = true; //} + + #region Delay + // Introducing a delay because of a known issue with Visual Recognition where newly created classifiers + // will disappear without being deleted if a delete is attempted less than ~10 seconds after creation. + private float _delayTime = 15f; + private bool _isWaitingForDelay = false; + + private IEnumerator Delay(float delayTime) + { + _isWaitingForDelay = true; + Log.Debug("TestVisualRecognition", "Delaying for {0} seconds....", delayTime); + yield return new WaitForSeconds(delayTime); + _isWaitingForDelay = false; + } + #endregion } } From 570fea3f60f7950af428a983cc92218edadac75c Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 14:02:44 -0500 Subject: [PATCH 017/100] removed inactivity timeout from query, added watson-token --- Scripts/Connection/WSConnector.cs | 16 ++++++++++++++-- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 305b08ed4..36f294139 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -177,11 +177,23 @@ public static string FixupURL(string URL) /// The name of the function to connect. /// Additional function arguments. /// The WSConnector object or null or error. - public static WSConnector CreateConnector(Credentials credentials, string url, string function, string args) + public static WSConnector CreateConnector(Credentials credentials, string function, string args) { WSConnector connector = new WSConnector(); + if (credentials.HasAuthorizationToken()) + { + args += "&watson-token=" + credentials.AuthenticationToken; + } + else if (credentials.HasCredentials()) + { + connector.Authentication = credentials; + } + else + { + Log.Error("WSConnector", "Failed to find credentials or authorization token."); + } + connector.URL = FixupURL(credentials.Url) + function + args; - connector.Authentication = credentials; return connector; } diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 942cdb537..9155cdc8e 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -506,7 +506,7 @@ private bool CreateListenConnector() { if (_listenSocket == null) { - _listenSocket = WSConnector.CreateConnector(Credentials, Url, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel) + "&inactivity_timeout=" + InactivityTimeout); + _listenSocket = WSConnector.CreateConnector(Credentials, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel)); if (_listenSocket == null) { return false; @@ -514,7 +514,7 @@ private bool CreateListenConnector() else { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Created listen socket. Model: {0}, Inactivity Timeout: {1}", WWW.EscapeURL(_recognizeModel), InactivityTimeout); + Log.Debug("SpeechToText", "Created listen socket. Model: {0}, Inactivity Timeout: {1}", WWW.EscapeURL(_recognizeModel)); #endif } From 531d333f31a37943c552bd0e2ee3d8b7a19ddd31 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 14:27:36 -0500 Subject: [PATCH 018/100] added support for customizationid, acousticCustomizationId and customizationWeight through wss queryParams --- Scripts/Connection/WSConnector.cs | 4 --- .../Services/SpeechToText/v1/SpeechToText.cs | 33 ++++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 36f294139..71a9d61aa 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -188,10 +188,6 @@ public static WSConnector CreateConnector(Credentials credentials, string functi { connector.Authentication = credentials; } - else - { - Log.Error("WSConnector", "Failed to find credentials or authorization token."); - } connector.URL = FixupURL(credentials.Url) + function + args; diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9155cdc8e..8d6fc6580 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -104,6 +104,10 @@ public class SpeechToText : IWatsonService private float _silenceThreshold = 0.0f; // If the audio level is below this value, then it's considered silent. private int _recordingHZ = -1; private int _inactivityTimeout = 60; + private string _customization_id = null; + private string _acoustic_customization_id = null; + public float _customization_weight = 0.3f; + private fsSerializer _serializer = new fsSerializer(); private Credentials _credentials = null; private string _url = "https://stream.watsonplatform.net/speech-to-text/api"; @@ -231,6 +235,18 @@ public Credentials Credentials /// NON-MULTIPART ONLY: The time in seconds after which, if only silence (no speech) is detected in submitted audio, the connection is closed with a 400 error. Useful for stopping audio submission from a live microphone when a user simply walks away. Use -1 for infinity. /// public int InactivityTimeout { get { return _inactivityTimeout; } set { _inactivityTimeout = value; } } + /// + /// Specifies the Globally Unique Identifier (GUID) of a custom language model that is to be used for all requests sent over the connection. The base model of the custom language model must match the value of the model parameter. By default, no custom language model is used. For more information, see https://console.bluemix.net/docs/services/speech-to-text/custom.html. + /// + public string CustomizationId { get { return _customization_id; } set { _customization_id = value; } } + /// + /// Specifies the Globally Unique Identifier (GUID) of a custom acoustic model that is to be used for all requests sent over the connection. The base model of the custom acoustic model must match the value of the model parameter. By default, no custom acoustic model is used. For more information, see https://console.bluemix.net/docs/services/speech-to-text/custom.html. + /// + public string AcousticCustomizationId { get { return _acoustic_customization_id; } set { _acoustic_customization_id = value; } } + /// + /// Specifies the weight the service gives to words from a specified custom language model compared to those from the base model for all requests sent over the connection. Specify a value between 0.0 and 1.0; the default value is 0.3. For more information, see https://console.bluemix.net/docs/services/speech-to-text/language-use.html#weight. + /// + public float CustomizationWeight { get { return _customization_weight; } set { _customization_weight = value; } } #endregion #region Constructor @@ -506,7 +522,22 @@ private bool CreateListenConnector() { if (_listenSocket == null) { - _listenSocket = WSConnector.CreateConnector(Credentials, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel)); + Dictionary queryParams = new Dictionary(); + if (!string.IsNullOrEmpty(CustomizationId)) + queryParams["customization_id"] = CustomizationId; + if (!string.IsNullOrEmpty(AcousticCustomizationId)) + queryParams["acoustic_customization_id"] = AcousticCustomizationId; + if (!string.IsNullOrEmpty(CustomizationId)) + queryParams["customization_weight"] = CustomizationWeight.ToString(); + + string parsedParams = ""; + + foreach(KeyValuePair kvp in queryParams) + { + parsedParams += string.Format("&{0}={1}", kvp.Key, kvp.Value); + } + + _listenSocket = WSConnector.CreateConnector(Credentials, "/v1/recognize", "?model=" + WWW.EscapeURL(_recognizeModel) + parsedParams); if (_listenSocket == null) { return false; From 85ba864c794b3311ed2da341c9e70468b9b0c013 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 14:48:38 -0500 Subject: [PATCH 019/100] add inactivityTimeout and sort sendStart options --- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 8d6fc6580..da016e77d 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -573,16 +573,17 @@ private void SendStart() Dictionary start = new Dictionary(); start["action"] = "start"; start["content-type"] = "audio/l16;rate=" + _recordingHZ.ToString() + ";channels=1;"; - start["max_alternatives"] = _maxAlternatives; + start["inactivity_timeout"] = InactivityTimeout; start["interim_results"] = EnableInterimResults; - start["word_confidence"] = _wordConfidence; - start["timestamps"] = _timestamps; - start["speaker_labels"] = SpeakerLabels; - start["smart_formatting"] = SmartFormatting; + start["keywords"] = Keywords; + start["keywords_threshold"] = KeywordsThreshold; + start["max_alternatives"] = MaxAlternatives; start["profanity_filter"] = ProfanityFilter; + start["smart_formatting"] = SmartFormatting; + start["speaker_labels"] = SpeakerLabels; + start["timestamps"] = _timestamps; start["word_alternatives_threshold"] = WordAlternativesThreshold; - start["keywords_threshold"] = KeywordsThreshold; - start["keywords"] = Keywords; + start["word_confidence"] = EnableWordConfidence; _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); _lastStartSent = DateTime.Now; From 828242156e89cea691458cfec17bff1499e2098d Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 15:05:09 -0500 Subject: [PATCH 020/100] log query params and SendStart --- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index da016e77d..aa99a23ff 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -545,7 +545,7 @@ private bool CreateListenConnector() else { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Created listen socket. Model: {0}, Inactivity Timeout: {1}", WWW.EscapeURL(_recognizeModel)); + Log.Debug("SpeechToText", "Created listen socket. Model: {0}, parsedParams: {1}", WWW.EscapeURL(_recognizeModel), parsedParams); #endif } @@ -586,6 +586,9 @@ private void SendStart() start["word_confidence"] = EnableWordConfidence; _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); +#if ENABLE_DEBUGGING + Log.Debug("SpeechToText", "SendStart() with the following params: {0}", Json.Serialize(start)); +#endif _lastStartSent = DateTime.Now; } From 2db924c74b0234b68b0e75d0d81f43033cc845a8 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 15:32:49 -0500 Subject: [PATCH 021/100] revise multipart recognize parameters --- .../Services/SpeechToText/v1/SpeechToText.cs | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index aa99a23ff..7fe59ab07 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -107,6 +107,7 @@ public class SpeechToText : IWatsonService private string _customization_id = null; private string _acoustic_customization_id = null; public float _customization_weight = 0.3f; + public bool _streamMultipart = false; // If true sets `Transfer-Encoding` header of multipart request to `chunked`. private fsSerializer _serializer = new fsSerializer(); private Credentials _credentials = null; @@ -168,7 +169,7 @@ public string RecognizeModel /// audio level is below this value then we consider it silence. /// public float SilenceThreshold - { + { get { return _silenceThreshold; } set { @@ -247,6 +248,10 @@ public Credentials Credentials /// Specifies the weight the service gives to words from a specified custom language model compared to those from the base model for all requests sent over the connection. Specify a value between 0.0 and 1.0; the default value is 0.3. For more information, see https://console.bluemix.net/docs/services/speech-to-text/language-use.html#weight. /// public float CustomizationWeight { get { return _customization_weight; } set { _customization_weight = value; } } + /// + /// If true sets `Transfer-Encoding` request header to `chunked` causing the audio to be streamed to the service. By default, audio is sent all at once as a one-shot delivery. See https://console.bluemix.net/docs/services/speech-to-text/input.html#transmission. + /// + public bool StreamMultipart { get { return _streamMultipart; } set { _streamMultipart = value; } } #endregion #region Constructor @@ -532,7 +537,7 @@ private bool CreateListenConnector() string parsedParams = ""; - foreach(KeyValuePair kvp in queryParams) + foreach (KeyValuePair kvp in queryParams) { parsedParams += string.Format("&{0}={1}", kvp.Key, kvp.Value); } @@ -626,7 +631,7 @@ private IEnumerator KeepAlive() #endif _listenSocket.Send(new WSConnector.BinaryMessage(AudioClipUtil.GetL16(_keepAliveClip))); _keepAliveClip = null; - + _lastKeepAlive = DateTime.Now; } } @@ -749,22 +754,31 @@ public bool Recognize(AudioClip clip, OnRecognize callback) req.Callback = callback; req.Headers["Content-Type"] = "audio/wav"; + if (StreamMultipart) + req.Headers["Transfer-Encoding"] = "chunked"; + req.Send = WaveFile.CreateWAV(clip); if (req.Send.Length > MaxRecognizeClipSize) { Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); return false; } - req.Parameters["model"] = _recognizeModel; - req.Parameters["max_alternatives"] = _maxAlternatives.ToString(); - req.Parameters["timestamps"] = _timestamps ? "true" : "false"; - req.Parameters["word_confidence"] = _wordConfidence ? "true" : "false"; - req.Parameters["speaker_labels"] = SpeakerLabels; - req.Parameters["smart_formatting"] = SmartFormatting; + req.Parameters["acoustic_customization_id"] = AcousticCustomizationId; + req.Parameters["customization_id"] = CustomizationId; + req.Parameters["customization_weight"] = CustomizationWeight; + req.Parameters["inactivity_timeout"] = InactivityTimeout; + req.Parameters["keywords"] = string.Join(",", Keywords); + req.Parameters["keywords_threshold"] = KeywordsThreshold; + req.Parameters["max_alternatives"] = MaxAlternatives.ToString(); + req.Parameters["model"] = RecognizeModel; req.Parameters["profanity_filter"] = ProfanityFilter; + req.Parameters["smart_formatting"] = SmartFormatting; + req.Parameters["speaker_labels"] = SpeakerLabels; + req.Parameters["timestamps"] = EnableTimestamps ? "true" : "false"; + if (Credentials.HasAuthorizationToken()) + req.Parameters["watson-token"] = Credentials.AuthenticationToken; req.Parameters["word_alternatives_threshold"] = WordAlternativesThreshold; - req.Parameters["keywords_threshold"] = KeywordsThreshold; - req.Parameters["keywords"] = string.Join(",", Keywords); + req.Parameters["word_confidence"] = EnableWordConfidence ? "true" : "false"; req.OnResponse = OnRecognizeResponse; @@ -899,7 +913,7 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) alternatives.Add(alternative); } - + IDictionary iKeywords = iresult["keywords_result"] as IDictionary; if (iKeywords != null) { From 64f2073010cebfa5e5334083277aa4d40ad33e55 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Mon, 23 Oct 2017 18:31:23 -0500 Subject: [PATCH 022/100] abstract acoustic customizations and custom audio resources, WIP Examples --- .../Scripts/ExampleSpeechToText.cs | 461 +++++++++---- .../ServiceExamples/ServiceExamples.unity | 25 +- .../Services/SpeechToText/v1/DataModels.cs | 161 +++++ .../Services/SpeechToText/v1/SpeechToText.cs | 640 ++++++++++++++++++ 4 files changed, 1135 insertions(+), 152 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index a605ad46b..8003ed5e5 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -38,6 +38,9 @@ public class ExampleSpeechToText : MonoBehaviour private string _customCorpusFilePath; private string _customWordsFilePath; private string _wavFilePath; + private string _createdAcousticModelId; + private string _acousticResourceName = "unity acoustic resource"; + private string _createdAcousticModelName = "unity example acoustic model"; private bool _recognizeTested = false; private bool _getModelsTested = false; @@ -59,7 +62,20 @@ public class ExampleSpeechToText : MonoBehaviour private bool _deleteCustomWordTested = false; private bool _deleteCustomCorpusTested = false; + private bool _getAcousticCustomizationsTested = false; + private bool _createAcousticCustomizationsTested = false; + private bool _deleteAcousticCustomizationsTested = false; + private bool _getAcousticCustomizationTested = false; + private bool _trainAcousticCustomizationsTested = false; + private bool _resetAcousticCustomizationsTested = false; + + private bool _getAcousticResourcesTested = false; + private bool _deleteAcousticResourcesTested = false; + private bool _getAcousticResourceTested = false; + private bool _addAcousticResourcesTested = false; + private bool _isCustomizationReady = false; + private bool _isAcousticCustomizationReady = false; private bool _readyToContinue = false; private float _delayTimeInSeconds = 10f; @@ -81,164 +97,244 @@ void Start() private IEnumerator Examples() { - // Recognize - Log.Debug("ExampleSpeechToText", "Attempting to recognize"); - List keywords = new List(); - keywords.Add("speech"); - _speechToText.KeywordsThreshold = 0.5f; - _speechToText.Keywords = keywords.ToArray(); - _speechToText.Recognize(_audioClip, HandleOnRecognize); - while (!_recognizeTested) - yield return null; + //// Recognize + //Log.Debug("ExampleSpeechToText", "Attempting to recognize"); + //List keywords = new List(); + //keywords.Add("speech"); + //_speechToText.KeywordsThreshold = 0.5f; + //_speechToText.Keywords = keywords.ToArray(); + //_speechToText.Recognize(_audioClip, HandleOnRecognize); + //while (!_recognizeTested) + // yield return null; - // Get models - Log.Debug("ExampleSpeechToText", "Attempting to get models"); - _speechToText.GetModels(HandleGetModels); - while (!_getModelsTested) - yield return null; + //// Get models + //Log.Debug("ExampleSpeechToText", "Attempting to get models"); + //_speechToText.GetModels(HandleGetModels); + //while (!_getModelsTested) + // yield return null; - // Get model - Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); - _speechToText.GetModel(HandleGetModel, _modelNameToGet); - while (!_getModelTested) - yield return null; + //// Get model + //Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); + //_speechToText.GetModel(HandleGetModel, _modelNameToGet); + //while (!_getModelTested) + // yield return null; - // Get customizations - Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); - _speechToText.GetCustomizations(HandleGetCustomizations); - while (!_getCustomizationsTested) - yield return null; + //// Get customizations + //Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); + //_speechToText.GetCustomizations(HandleGetCustomizations); + //while (!_getCustomizationsTested) + // yield return null; - // Create customization - Log.Debug("ExampleSpeechToText", "Attempting create customization"); - _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); - while (!_createCustomizationsTested) - yield return null; + //// Create customization + //Log.Debug("ExampleSpeechToText", "Attempting create customization"); + //_speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); + //while (!_createCustomizationsTested) + // yield return null; - // Get customization - Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); - _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); - while (!_getCustomizationTested) - yield return null; + //// Get customization + //Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + //_speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); + //while (!_getCustomizationTested) + // yield return null; - // Get custom corpora - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); - _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); - while (!_getCustomCorporaTested) - yield return null; + //// Get custom corpora + //Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + //_speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); + //while (!_getCustomCorporaTested) + // yield return null; - // Add custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - string corpusData = File.ReadAllText(_customCorpusFilePath); - _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); - while (!_addCustomCorpusTested) - yield return null; + //// Add custom corpus + //Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + //string corpusData = File.ReadAllText(_customCorpusFilePath); + //_speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); + //while (!_addCustomCorpusTested) + // yield return null; - // Get custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); - while (!_getCustomCorpusTested) - yield return null; + //// Get custom corpus + //Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + //_speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); + //while (!_getCustomCorpusTested) + // yield return null; - // Wait for customization - Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - while (!_isCustomizationReady) - yield return null; + //// Wait for customization + //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + //while (!_isCustomizationReady) + // yield return null; - // Get custom words - Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); - _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); - while (!_getCustomWordsTested) - yield return null; + //// Get custom words + //Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); + //_speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); + //while (!_getCustomWordsTested) + // yield return null; - // Add custom words from path - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); - string customWords = File.ReadAllText(_customWordsFilePath); - _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); - while (!_addCustomWordsFromPathTested) - yield return null; + //// Add custom words from path + //Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + //string customWords = File.ReadAllText(_customWordsFilePath); + //_speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); + //while (!_addCustomWordsFromPathTested) + // yield return null; - // Wait for customization - _isCustomizationReady = false; - Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - while (!_isCustomizationReady) + //// Wait for customization + //_isCustomizationReady = false; + //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + //while (!_isCustomizationReady) + // yield return null; + + //// Add custom words from object + //Words words = new Words(); + //Word w0 = new Word(); + //List wordList = new List(); + //w0.word = "mikey"; + //w0.sounds_like = new string[1]; + //w0.sounds_like[0] = "my key"; + //w0.display_as = "Mikey"; + //wordList.Add(w0); + //Word w1 = new Word(); + //w1.word = "charlie"; + //w1.sounds_like = new string[1]; + //w1.sounds_like[0] = "char lee"; + //w1.display_as = "Charlie"; + //wordList.Add(w1); + //Word w2 = new Word(); + //w2.word = "bijou"; + //w2.sounds_like = new string[1]; + //w2.sounds_like[0] = "be joo"; + //w2.display_as = "Bijou"; + //wordList.Add(w2); + //words.words = wordList.ToArray(); + + //Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + //_speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); + //while (!_addCustomWordsFromObjectTested) + // yield return null; + + //// Wait for customization + //_isCustomizationReady = false; + //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + //while (!_isCustomizationReady) + // yield return null; + + //// Get custom word + //Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + //_speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); + //while (!_getCustomWordTested) + // yield return null; + + //// Train customization + //Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + //_speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); + //while (!_trainCustomizationTested) + // yield return null; + + //// Wait for customization + //_isCustomizationReady = false; + //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + //while (!_isCustomizationReady) + // yield return null; + + //// Upgrade customization - not currently implemented in service + ////Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + ////_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); + ////while (!_upgradeCustomizationTested) + //// yield return null; + + //// Delete custom word + //Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + //_speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); + //while (!_deleteCustomWordTested) + // yield return null; + + //// Delay + //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + //Runnable.Run(Delay(_delayTimeInSeconds)); + //while (!_readyToContinue) + // yield return null; + + //_readyToContinue = false; + //// Delete custom corpus + //Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + //_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); + //while (!_deleteCustomCorpusTested) + // yield return null; + + //// Delay + //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + //Runnable.Run(Delay(_delayTimeInSeconds)); + //while (!_readyToContinue) + // yield return null; + + //_readyToContinue = false; + //// Reset customization + //Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + //_speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); + //while (!_resetCustomizationTested) + // yield return null; + + //// Delay + //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + //Runnable.Run(Delay(_delayTimeInSeconds)); + //while (!_readyToContinue) + // yield return null; + + //_readyToContinue = false; + //// Delete customization + //Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + //_speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); + //while (!_deleteCustomizationsTested) + // yield return null; + + // List acoustic customizations + Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customizations"); + _speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels); + while (!_getAcousticCustomizationsTested) yield return null; - // Add custom words from object - Words words = new Words(); - Word w0 = new Word(); - List wordList = new List(); - w0.word = "mikey"; - w0.sounds_like = new string[1]; - w0.sounds_like[0] = "my key"; - w0.display_as = "Mikey"; - wordList.Add(w0); - Word w1 = new Word(); - w1.word = "charlie"; - w1.sounds_like = new string[1]; - w1.sounds_like[0] = "char lee"; - w1.display_as = "Charlie"; - wordList.Add(w1); - Word w2 = new Word(); - w2.word = "bijou"; - w2.sounds_like = new string[1]; - w2.sounds_like[0] = "be joo"; - w2.display_as = "Bijou"; - wordList.Add(w2); - words.words = wordList.ToArray(); - - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); - _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); - while (!_addCustomWordsFromObjectTested) + // Create acoustic customization + Log.Debug("ExampleSpeechToText", "Attempting to create acoustic customization"); + _speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, _createdAcousticModelName); + while (!_createAcousticCustomizationsTested) yield return null; - // Wait for customization - _isCustomizationReady = false; - Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - while (!_isCustomizationReady) + // Get acoustic customization + Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customization {0}", _createdAcousticModelId); + _speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, _createdAcousticModelId); + while (!_getAcousticCustomizationTested) yield return null; - // Get custom word - Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); - _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); - while (!_getCustomWordTested) + // List acoustic resources + Log.Debug("ExampleSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); + while (!_getAcousticResourcesTested) yield return null; - // Train customization - Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); - _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); - while (!_trainCustomizationTested) + // Create acoustic resource + Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdCustomizationID, _acousticResourceName); + _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, "audio/wav", "audio/wav", true, File.ReadAllBytes(_wavFilePath)); + while (!_addAcousticResourcesTested) yield return null; // Wait for customization - _isCustomizationReady = false; - Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - while (!_isCustomizationReady) + _isAcousticCustomizationReady = false; + Runnable.Run(CheckAcousticCustomizationStatus(_createdAcousticModelId)); + while (!_isAcousticCustomizationReady) yield return null; - // Upgrade customization - not currently implemented in service - //Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); - //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); - //while (!_upgradeCustomizationTested) - // yield return null; - - // Delete custom word - Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); - _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); - while (!_deleteCustomWordTested) + // Train acoustic customization + Log.Debug("ExampleSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); + _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId); + while (!_trainAcousticCustomizationsTested) yield return null; - - // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); - Runnable.Run(Delay(_delayTimeInSeconds)); - while (!_readyToContinue) + + // Get acoustic resource + Log.Debug("ExampleSpeechToText", "Attempting to get audio resource {1} from {0}", _createdCustomizationID, _acousticResourceName); + _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); + while (!_getAcousticResourceTested) yield return null; - _readyToContinue = false; - // Delete custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); - while (!_deleteCustomCorpusTested) + // Reset acoustic customization + Log.Debug("ExampleSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); + _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); + while (!_resetAcousticCustomizationsTested) yield return null; // Delay @@ -247,11 +343,10 @@ private IEnumerator Examples() while (!_readyToContinue) yield return null; - _readyToContinue = false; - // Reset customization - Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); - _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); - while (!_resetCustomizationTested) + // Delete acoustic resource + Log.Debug("ExampleSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); + while (!_deleteAcousticResourcesTested) yield return null; // Delay @@ -260,11 +355,10 @@ private IEnumerator Examples() while (!_readyToContinue) yield return null; - _readyToContinue = false; - // Delete customization - Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); - _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); - while (!_deleteCustomizationsTested) + // Delete acoustic customization + Log.Debug("ExampleSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); + while (!_deleteAcousticCustomizationsTested) yield return null; Log.Debug("ExampleSpeechToText", "Speech to Text examples complete."); @@ -344,7 +438,6 @@ private void HandleDeleteCustomization(bool success, string customData) _deleteCustomizationsTested = true; } - private void HandleTrainCustomization(bool success, string customData) { if (success) @@ -481,6 +574,67 @@ private void HandleGetCustomWord(WordData word, string customData) _getCustomWordTested = true; } + private void HandleGetCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) + { + Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); + _getAcousticCustomizationsTested = true; + } + + private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) + { + Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); + _createdAcousticModelId = customizationID.customization_id; + _createAcousticCustomizationsTested = true; + } + + private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) + { + Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); + _getAcousticCustomizationTested = true; + } + + private void HandleTrainAcousticCustomization(bool success, string customData) + { + Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); + _trainAcousticCustomizationsTested = true; + } + + private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) + { + Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); + _getAcousticResourcesTested = true; + } + + private void HandleAddAcousticResource(string customData) + { + Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); + _addAcousticResourcesTested = true; + } + + private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) + { + Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); + _getAcousticResourceTested = true; + } + + private void HandleResetAcousticCustomization(bool success, string customData) + { + Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); + _resetAcousticCustomizationsTested = true; + } + + private void HandleDeleteAcousticResource(bool success, string customData) + { + Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); + _deleteAcousticResourcesTested = true; + } + + private void HandleDeleteAcousticCustomization(bool success, string customData) + { + Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); + _deleteAcousticCustomizationsTested = true; + } + private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) { Log.Debug("TestSpeechToText", "Checking customization status in {0} seconds...", delay.ToString()); @@ -506,6 +660,31 @@ private void OnCheckCustomizationStatus(Customization customization, string cust } } + private IEnumerator CheckAcousticCustomizationStatus(string customizationID, float delay = 0.1f) + { + Log.Debug("TestSpeechToText", "Checking acoustic customization status in {0} seconds...", delay.ToString()); + yield return new WaitForSeconds(delay); + + // passing customizationID in custom data + _speechToText.GetCustomAcousticModel(OnCheckAcousticCustomizationStatus, customizationID, customizationID); + } + + private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCustomization, string customData) + { + if (acousticCustomization != null) + { + Log.Debug("TestSpeechToText", "Acoustic customization status: {0}", acousticCustomization.status); + if (acousticCustomization.status != "ready" && acousticCustomization.status != "available") + Runnable.Run(CheckAcousticCustomizationStatus(customData, 5f)); + else + _isAcousticCustomizationReady = true; + } + else + { + Log.Debug("TestSpeechToText", "Check acoustic customization status failed!"); + } + } + private IEnumerator Delay(float delayTime) { yield return new WaitForSeconds(delayTime); diff --git a/Examples/ServiceExamples/ServiceExamples.unity b/Examples/ServiceExamples/ServiceExamples.unity index 908803cb7..1b891141f 100644 --- a/Examples/ServiceExamples/ServiceExamples.unity +++ b/Examples/ServiceExamples/ServiceExamples.unity @@ -38,11 +38,11 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_IndirectSpecularColor: {r: 0.37311926, g: 0.38073996, b: 0.35872692, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 11 m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 @@ -54,7 +54,7 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: - serializedVersion: 8 + serializedVersion: 9 m_Resolution: 2 m_BakeResolution: 40 m_TextureWidth: 1024 @@ -77,17 +77,19 @@ LightmapSettings: m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 - m_PVRFiltering: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 m_PVRFilteringMode: 1 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousColorSigma: 1 - m_PVRFilteringAtrousNormalSigma: 1 - m_PVRFilteringAtrousPositionSigma: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 m_LightingDataAsset: {fileID: 0} - m_ShadowMaskMode: 2 + m_UseShadowmask: 1 --- !u!196 &4 NavMeshSettings: serializedVersion: 2 @@ -107,6 +109,8 @@ NavMeshSettings: manualTileSize: 0 tileSize: 256 accuratePlacement: 0 + debug: + m_Flags: 0 m_NavMeshData: {fileID: 0} --- !u!1 &85803340 GameObject: @@ -343,7 +347,6 @@ Camera: m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 - m_StereoMirrorMode: 0 --- !u!4 &725710372 Transform: m_ObjectHideFlags: 0 @@ -452,7 +455,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &859102723 MonoBehaviour: m_ObjectHideFlags: 0 @@ -572,7 +575,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &1160237479 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Scripts/Services/SpeechToText/v1/DataModels.cs b/Scripts/Services/SpeechToText/v1/DataModels.cs index c37baeeb8..710421093 100644 --- a/Scripts/Services/SpeechToText/v1/DataModels.cs +++ b/Scripts/Services/SpeechToText/v1/DataModels.cs @@ -502,6 +502,7 @@ public class Customization /// /// This data class contains information about the language model customization identifier. /// + [fsObject] public class CustomizationID { /// @@ -678,4 +679,164 @@ public class Word public string display_as { get; set; } } #endregion + + #region Custom Acoustic Models + /// + /// The Acoustic Customizations object. + /// + [fsObject] + public class AcousticCustomizations + { + /// + /// An array of AcousticCustomization objects that provides information about each available custom acoustic model. The array is empty if the requesting service credentials own no custom acoustic models (if no language is specified) or own no custom acoustic models for the specified language. + /// + public AcousticCustomization[] customizations { get; set; } + } + + /// + /// The Acoustic Customization object. + /// + [fsObject] + public class AcousticCustomization + { + /// + /// The GUID of the custom acoustic model. + /// + public string customization_id { get; set; } + /// + /// The date and time in Coordinated Universal Time (UTC) at which the custom acoustic model was created. The value is provided in full ISO 8601 format (YYYY-MM-DDThh:mm:ss.sTZD). + /// + public string created { get; set; } + /// + /// The language identifier of the custom acoustic model (for example, `en-US`). + /// + public string language { get; set; } + /// + /// The GUID of the service credentials for the instance of the service that owns the custom acoustic model. + /// + public string owner { get; set; } + /// + /// The name of the custom acoustic model. + /// + public string name { get; set; } + /// + /// The description of the custom acoustic model. + /// + public string description { get; set; } + /// + /// The name of the language model for which the custom acoustic model was created. + /// + public string base_model_name { get; set; } + /// + /// The current status of the custom acoustic model. `pending` indicates that the model was created but is waiting either for training data to be added or for the service to finish analyzing added data. `ready` indicates that the model contains data and is ready to be trained. `training` indicates that the model is currently being trained. `available` indicates that the model is trained and ready to use. `failed` indicates that training of the model failed. + /// + public string status { get; set; } + /// + /// A percentage that indicates the progress of the model's current training. A value of `100` means that the model is fully trained. Note: The `progress` field does not currently reflect the progress of the training; the field changes from `0` to `100` when training is complete. + /// + public int progress { get; set; } + /// + /// If the request included unknown query parameters, the following message: `Unexpected query parameter(s) ['parameters'] detected`, where `parameters` is a list that includes a quoted string for each unknown parameter. + /// + public string warnings { get; set; } + } + #endregion + + #region Custom Audio Resouces + /// + /// The Audio Resources object. + /// + [fsObject] + public class AudioResources + { + /// + /// The total seconds of accumulated audio summed over all of the valid audio resources for the custom acoustic model. You can use this value to determine whether the custom model has too little or too much audio to begin training. + /// + public float total_minutes_of_audio { get; set; } + /// + /// An array of `AudioResource` objects that provides information about the audio resources of the custom acoustic model. The array is empty if the custom model has no audio resources + /// + public AudioResource[] audio { get; set; } + } + + /// + /// The Audio Resource object. + /// + [fsObject] + public class AudioResource + { + /// + /// The total seconds of audio in the audio resource. + /// + public float duration { get; set; } + /// + /// The name of the audio resource. + /// + public string name { get; set; } + /// + /// An `AudioDetails` object that provides detailed information about the audio resource. The object is empty until the service finishes processing the audio. + /// + public AudioDetails details { get; set; } + /// + /// The status of the audio resource. `ok` indicates that the service has successfully analyzed the audio data. The data can be used to train the custom model. `being_processed` indicates that the service is still analyzing the audio data.The service cannot accept requests to add new audio resources or to train the custom model until its analysis is complete. `invalid` indicates that the audio data is not valid for training the custom model(possibly because it has the wrong format or sampling rate, or because it is corrupted). For an archive file, the entire archive is invalid if any of its audio files are invalid. + /// + public string status { get; set; } + } + + /// + /// The Audio Details object. + /// + [fsObject] + public class AudioDetails + { + /// + /// The type of the audio resource. `audio` for an individual audio file. `archive` for an archive(.zip or .tar.gz) file that contains audio files + /// + public string type { get; set; } + /// + /// For an audio-type resource, the codec in which the audio is encoded. Omitted for an archive-type resource. + /// + public string codec { get; set; } + /// + /// For an audio-type resource, the sampling rate of the audio in Hertz (samples per second). Omitted for an archive-type resource. + /// + public int frequency { get; set; } + /// + /// For an archive-type resource, the format of the compressed archive. `zip` for a .zip file. `gzip` for a.tar.gz file + /// + public string compression { get; set; } + } + + /// + /// The AudioListing object. + /// + [fsObject] + public class AudioListing + { + /// + /// The total seconds of audio in the audio resource. + /// + public float duration { get; set; } + /// + /// The name of the audio resource. + /// + public string name { get; set; } + /// + /// An AudioDetails object that provides detailed information about the audio resource. The object is empty until the service finishes processing the audio. + /// + public AudioDetails details { get; set; } + /// + /// The status of the audio resource. `ok` indicates that the service has successfully analyzed the audio data. The data can be used to train the custom model. `being_processed` indicates that the service is still analyzing the audio data.The service cannot accept requests to add new audio resources or to train the custom model until its analysis is complete. `invalid` indicates that the audio data is not valid for training the custom model(possibly because it has the wrong format or sampling rate, or because it is corrupted). For an archive file, the entire archive is invalid if any of its audio files are invalid. + /// + public string status { get; set; } + /// + /// For an archive-type resource, an object of type AudioResource that provides information about the resource. Omitted for an audio-type resource. + /// + public AudioResource container { get; set; } + /// + /// For an archive-type resource, an array of AudioResource objects that provides information about the audio-type resources that are contained in the resource. Omitted for an audio-type resource. + /// + public AudioResource[] audio { get; set; } + } + #endregion } diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 7fe59ab07..3004a72a7 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -2030,6 +2030,646 @@ private void OnGetCustomWordResp(RESTConnector.Request req, RESTConnector.Respon } #endregion + #region Get Custom Acoustic Models + /// + /// This callback is used by the GetCustomAcousticModels() function. + /// + /// The acoustic customizations + /// Optional custom data. + public delegate void GetCustomAcousticModelsCallback(AcousticCustomizations acousticCustomizations, string customData); + + /// + /// Lists information about all custom acoustic models. + /// + /// The callback. + /// The identifier of the language for which custom acoustic models are to be returned (for example, `en-US`). Omit the parameter to see all custom acoustic models owned by the requesting service credentials. + /// Optional custom data. + /// + public bool GetCustomAcousticModels(GetCustomAcousticModelsCallback callback, string language = null, string customData = default(string)) + { + GetCustomAcousticModelsReq req = new GetCustomAcousticModelsReq(); + req.Callback = callback; + req.Data = customData; + if(!string.IsNullOrEmpty(language)) + req.Parameters["language"] = language; + req.OnResponse = OnGetCustomAcousticModelsResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v1/acoustic_customizations/")); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class GetCustomAcousticModelsReq : RESTConnector.Request + { + public GetCustomAcousticModelsCallback Callback { get; set; } + public string Data { get; set; } + } + + private void OnGetCustomAcousticModelsResp(RESTConnector.Request req, RESTConnector.Response resp) + { + AcousticCustomizations acousticCustomizations = new AcousticCustomizations(); + fsData data = null; + + if (resp.Success) + { + try + { + fsResult r = fsJsonParser.Parse(Encoding.UTF8.GetString(resp.Data), out data); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + + object obj = acousticCustomizations; + r = _serializer.TryDeserialize(data, obj.GetType(), ref obj); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + } + catch (Exception e) + { + Log.Error("Speech To Text", "OnGetCustomAcousticModelsResp Exception: {0}", e.ToString()); + resp.Success = false; + } + } + + string customData = ((GetCustomAcousticModelsReq)req).Data; + if (((GetCustomAcousticModelsReq)req).Callback != null) + ((GetCustomAcousticModelsReq)req).Callback(resp.Success ? acousticCustomizations : null, !string.IsNullOrEmpty(customData) ? customData : data.ToString()); + } + #endregion + + #region Create Custom Acoustic Model + /// + /// Thid callback is used by the CreateAcousticCustomization() function. + /// + /// The customizationID. + /// Optional custom data. + public delegate void CreateAcousticCustomizationCallback(CustomizationID customizationID, string customData); + + /// + /// Creates a custom acoustic model. + /// + /// The callback. + /// The custom model name. + /// The base model name - only en-US_BroadbandModel is currently supported. + /// Descripotion of the custom model. + /// Optional custom data. + /// + public bool CreateAcousticCustomization(CreateAcousticCustomizationCallback callback, string name, string base_model_name = "en-US_BroadbandModel", string description = default(string), string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(name)) + throw new ArgumentNullException("A name is required to create a custom language model."); + + CustomLanguage customLanguage = new CustomLanguage(); + customLanguage.name = name; + customLanguage.base_model_name = base_model_name; + customLanguage.description = string.IsNullOrEmpty(description) ? name : description; + + fsData data; + _serializer.TrySerialize(customLanguage.GetType(), customLanguage, out data).AssertSuccessWithoutWarnings(); + string customizationJson = fsJsonPrinter.CompressedJson(data); + + CreateAcousticCustomizationRequest req = new CreateAcousticCustomizationRequest(); + req.Callback = callback; + req.CustomLanguage = customLanguage; + req.Data = customData; + req.Headers["Content-Type"] = "application/json"; + req.Headers["Accept"] = "application/json"; + req.Send = Encoding.UTF8.GetBytes(customizationJson); + req.OnResponse = OnCreateAcousticCustomizationResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, "/v1/acoustic_customizations"); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class CreateAcousticCustomizationRequest : RESTConnector.Request + { + public CreateAcousticCustomizationCallback Callback { get; set; } + public CustomLanguage CustomLanguage { get; set; } + public string Data { get; set; } + } + + private void OnCreateAcousticCustomizationResp(RESTConnector.Request req, RESTConnector.Response resp) + { + CustomizationID customizationID = new CustomizationID(); + fsData data = null; + + if (resp.Success) + { + try + { + fsResult r = fsJsonParser.Parse(Encoding.UTF8.GetString(resp.Data), out data); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + + object obj = customizationID; + r = _serializer.TryDeserialize(data, obj.GetType(), ref obj); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + } + catch (Exception e) + { + Log.Error("Speech To Text", "OnCreateAcousticCustomizationResp Exception: {0}", e.ToString()); + resp.Success = false; + } + } + + string customData = ((CreateAcousticCustomizationRequest)req).Data; + if (((CreateAcousticCustomizationRequest)req).Callback != null) + ((CreateAcousticCustomizationRequest)req).Callback(resp.Success ? customizationID : null, !string.IsNullOrEmpty(customData) ? customData : data.ToString()); + } + #endregion + + #region Delete Custom Acoustic Model + /// + /// This callback is used by the DeleteAcousticCustomization() function. + /// + /// + /// + public delegate void OnDeleteAcousticCustomizationCallback(bool success, string customData); + /// + /// Deletes a custom acoustic model. + /// + /// The callback. + /// The acoustic customization ID to be deleted. + /// Optional custom data. + /// + public bool DeleteAcousticCustomization(OnDeleteAcousticCustomizationCallback callback, string customizationID, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationID)) + throw new ArgumentNullException("A customizationID to delete is required for DeleteAcousticCustomization"); + + DeleteAcousticCustomizationRequest req = new DeleteAcousticCustomizationRequest(); + req.Callback = callback; + req.CustomizationID = customizationID; + req.Data = customData; + req.Delete = true; + req.OnResponse = OnDeleteAcousticCustomizationResp; + + string service = "/v1/acoustic_customizations/{0}"; + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class DeleteAcousticCustomizationRequest : RESTConnector.Request + { + public OnDeleteAcousticCustomizationCallback Callback { get; set; } + public string CustomizationID { get; set; } + public string Data { get; set; } + } + + private void OnDeleteAcousticCustomizationResp(RESTConnector.Request req, RESTConnector.Response resp) + { + if (((DeleteAcousticCustomizationRequest)req).Callback != null) + ((DeleteAcousticCustomizationRequest)req).Callback(resp.Success, ((DeleteAcousticCustomizationRequest)req).Data); + } + #endregion + + #region Get Custom Acoustic Model + /// + /// This callback is used by the GetCustomAcousticModel() function. + /// + /// The acoustic customization + /// Optional custom data. + public delegate void GetCustomAcousticModelCallback(AcousticCustomization acousticCustomization, string customData); + + /// + /// Lists information about a custom acoustic model. + /// + /// The callback. + /// The GUID of the custom acoustic model for which information is to be returned. You must make the request with service credentials created for the instance of the service that owns the custom model. + /// Optional custom data. + /// + public bool GetCustomAcousticModel(GetCustomAcousticModelCallback callback, string customizationId, string customData = default(string)) + { + if (string.IsNullOrEmpty(customizationId)) + throw new ArgumentNullException("customizationId"); + + GetCustomAcousticModelReq req = new GetCustomAcousticModelReq(); + req.Callback = callback; + req.Data = customData; + req.OnResponse = OnGetCustomAcousticModelResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v1/acoustic_customizations/{0}", customizationId)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class GetCustomAcousticModelReq : RESTConnector.Request + { + public GetCustomAcousticModelCallback Callback { get; set; } + public string Data { get; set; } + } + + private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnector.Response resp) + { + AcousticCustomization acousticCustomization = new AcousticCustomization(); + fsData data = null; + + if (resp.Success) + { + try + { + fsResult r = fsJsonParser.Parse(Encoding.UTF8.GetString(resp.Data), out data); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + + object obj = acousticCustomization; + r = _serializer.TryDeserialize(data, obj.GetType(), ref obj); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + } + catch (Exception e) + { + Log.Error("Speech To Text", "OnGetCustomAcousticModelResp Exception: {0}", e.ToString()); + resp.Success = false; + } + } + + string customData = ((GetCustomAcousticModelReq)req).Data; + if (((GetCustomAcousticModelReq)req).Callback != null) + ((GetCustomAcousticModelReq)req).Callback(resp.Success ? acousticCustomization : null, !string.IsNullOrEmpty(customData) ? customData : data.ToString()); + } + #endregion + + #region Train Custom Acoustic Model + /// + /// This callback is used by the TrainAcousticCustomization() function. + /// + /// The success of the call. + /// Optional custom data. + public delegate void TrainAcousticCustomizationCallback(bool success, string customData); + /// + /// Trains a custom acoustic model. + /// + public bool TrainAcousticCustomization(TrainAcousticCustomizationCallback callback, string customizationID, string customLanguageModelId = null, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationID)) + throw new ArgumentNullException("A customizationID to train a custom acoustic language model."); + + TrainAcousticCustomizationRequest req = new TrainAcousticCustomizationRequest(); + req.Callback = callback; + req.CustomizationID = customizationID; + req.Data = customData; + if(!string.IsNullOrEmpty(customLanguageModelId)) + req.Parameters["custom_language_model_id"] = customLanguageModelId; + req.Headers["Content-Type"] = "application/json"; + req.Headers["Accept"] = "application/json"; + req.Send = Encoding.UTF8.GetBytes("{}"); + req.OnResponse = OnTrainAcousticCustomizationResp; + + string service = "/v1/acoustic_customizations/{0}/train"; + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class TrainAcousticCustomizationRequest : RESTConnector.Request + { + public TrainAcousticCustomizationCallback Callback { get; set; } + public string CustomizationID { get; set; } + public string Data { get; set; } + } + + private void OnTrainAcousticCustomizationResp(RESTConnector.Request req, RESTConnector.Response resp) + { + if (((TrainAcousticCustomizationRequest)req).Callback != null) + ((TrainAcousticCustomizationRequest)req).Callback(resp.Success, ((TrainAcousticCustomizationRequest)req).Data); + } + #endregion + + #region Reset Custom Acoustic Model + /// + /// This callback is used by the ResetAcousticCustomization() function. + /// + /// The success of the call. + /// Optional custom data. + public delegate void ResetAcousticCustomizationCallback(bool success, string customData); + /// + /// Resets a custom acoustic model. + /// + public bool ResetAcousticCustomization(ResetAcousticCustomizationCallback callback, string customizationID, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationID)) + throw new ArgumentNullException("A customizationID to reset a custom acoustic language model."); + + ResetAcousticCustomizationRequest req = new ResetAcousticCustomizationRequest(); + req.Callback = callback; + req.CustomizationID = customizationID; + req.Data = customData; + req.Headers["Content-Type"] = "application/json"; + req.Headers["Accept"] = "application/json"; + req.Send = Encoding.UTF8.GetBytes("{}"); + req.OnResponse = OnResetAcousticCustomizationResp; + + string service = "/v1/acoustic_customizations/{0}/reset"; + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class ResetAcousticCustomizationRequest : RESTConnector.Request + { + public ResetAcousticCustomizationCallback Callback { get; set; } + public string CustomizationID { get; set; } + public string Data { get; set; } + } + + private void OnResetAcousticCustomizationResp(RESTConnector.Request req, RESTConnector.Response resp) + { + if (((ResetAcousticCustomizationRequest)req).Callback != null) + ((ResetAcousticCustomizationRequest)req).Callback(resp.Success, ((ResetAcousticCustomizationRequest)req).Data); + } + #endregion + + #region Get Custom Acoustic Resource + /// + /// This callback is used by the GetCustomAcousticResource() function. + /// + /// The acoustic customization + /// Optional custom data. + public delegate void GetCustomAcousticResourcesCallback(AudioResources audioResources, string customData); + + /// + /// Lists information about all audio resources for a custom acoustic model. + /// + /// The callback. + /// The GUID of the custom acoustic model for which audio resources are to be listed. You must make the request with service credentials created for the instance of the service that. + /// Optional custom data. + /// + public bool GetCustomAcousticResources(GetCustomAcousticResourcesCallback callback, string customizationId, string customData = default(string)) + { + if (string.IsNullOrEmpty(customizationId)) + throw new ArgumentNullException("customizationId"); + + GetCustomAcousticResourcesReq req = new GetCustomAcousticResourcesReq(); + req.Callback = callback; + req.Data = customData; + req.OnResponse = OnGetCustomAcousticResourcesResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v1/acoustic_customizations/{0}/audio", customizationId)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class GetCustomAcousticResourcesReq : RESTConnector.Request + { + public GetCustomAcousticResourcesCallback Callback { get; set; } + public string Data { get; set; } + } + + private void OnGetCustomAcousticResourcesResp(RESTConnector.Request req, RESTConnector.Response resp) + { + AudioResources audioResources = new AudioResources(); + fsData data = null; + + if (resp.Success) + { + try + { + fsResult r = fsJsonParser.Parse(Encoding.UTF8.GetString(resp.Data), out data); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + + object obj = audioResources; + r = _serializer.TryDeserialize(data, obj.GetType(), ref obj); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + } + catch (Exception e) + { + Log.Error("Speech To Text", "OnGetCustomAcousticResourcesResp Exception: {0}", e.ToString()); + resp.Success = false; + } + } + + string customData = ((GetCustomAcousticResourcesReq)req).Data; + if (((GetCustomAcousticResourcesReq)req).Callback != null) + ((GetCustomAcousticResourcesReq)req).Callback(resp.Success ? audioResources : null, !string.IsNullOrEmpty(customData) ? customData : data.ToString()); + } + #endregion + + #region Delete Audio Resource + /// + /// This callback is used by the DeleteAcousticCustomization() function. + /// + /// + /// + public delegate void OnDeleteAcousticResourceCallback(bool success, string customData); + /// + /// Deletes an audio resource from a custom acoustic model. + /// + /// The callback. + /// The GUID of the custom acoustic model from which an audio resource is to be deleted. You must make the request with service credentials created for the instance of the service that owns the custom model. + /// The name of the audio resource that is to be deleted from the custom acoustic model. + /// Optional custom data. + /// + public bool DeleteAcousticResource(OnDeleteAcousticCustomizationCallback callback, string customizationID, string audioName, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationID)) + throw new ArgumentNullException("A customizationID to delete is required for DeleteAcousticResource"); + if (string.IsNullOrEmpty(audioName)) + throw new ArgumentNullException("An audioName to delete is required for DeleteAcousticResource"); + + DeleteAcousticResourceRequest req = new DeleteAcousticResourceRequest(); + req.Callback = callback; + req.CustomizationID = customizationID; + req.AudioName = audioName; + req.Data = customData; + req.Delete = true; + req.OnResponse = OnDeleteAcousticResourceResp; + + string service = "/v1/acoustic_customizations/{0}/audio/{1}"; + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID, audioName)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class DeleteAcousticResourceRequest : RESTConnector.Request + { + public OnDeleteAcousticCustomizationCallback Callback { get; set; } + public string CustomizationID { get; set; } + public string AudioName { get; set; } + public string Data { get; set; } + } + + private void OnDeleteAcousticResourceResp(RESTConnector.Request req, RESTConnector.Response resp) + { + if (((DeleteAcousticResourceRequest)req).Callback != null) + ((DeleteAcousticResourceRequest)req).Callback(resp.Success, ((DeleteAcousticResourceRequest)req).Data); + } + #endregion + + #region Get Custom Acoustic Resource + /// + /// This callback is used by the GetCustomAcousticResource() function. + /// + /// The acoustic resource + /// Optional custom data. + public delegate void GetCustomAcousticResourceCallback(AudioListing audioListing, string customData); + + /// + /// Lists information about an audio resource for a custom acoustic model. + /// + /// The callback. + /// The GUID of the custom acoustic model for which an audio resource is to be listed. You must make the request with service credentials created for the instance of the service that owns the custom model. + /// The name of the audio resource about which information is to be listed. + /// Optional custom data. + /// + public bool GetCustomAcousticResource(GetCustomAcousticResourceCallback callback, string customizationId, string audioName, string customData = default(string)) + { + if (string.IsNullOrEmpty(customizationId)) + throw new ArgumentNullException("customizationId"); + if (string.IsNullOrEmpty(audioName)) + throw new ArgumentNullException("audioName"); + + GetCustomAcousticResourceReq req = new GetCustomAcousticResourceReq(); + req.Callback = callback; + req.Data = customData; + req.OnResponse = OnGetCustomAcousticResourceResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v1/acoustic_customizations/{0}/audio/{1}", customizationId, audioName)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class GetCustomAcousticResourceReq : RESTConnector.Request + { + public GetCustomAcousticResourceCallback Callback { get; set; } + public string Data { get; set; } + } + + private void OnGetCustomAcousticResourceResp(RESTConnector.Request req, RESTConnector.Response resp) + { + AudioListing audioListing = new AudioListing(); + fsData data = null; + + if (resp.Success) + { + try + { + fsResult r = fsJsonParser.Parse(Encoding.UTF8.GetString(resp.Data), out data); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + + object obj = audioListing; + r = _serializer.TryDeserialize(data, obj.GetType(), ref obj); + if (!r.Succeeded) + throw new WatsonException(r.FormattedMessages); + } + catch (Exception e) + { + Log.Error("Speech To Text", "OnGetCustomAcousticResourceResp Exception: {0}", e.ToString()); + resp.Success = false; + } + } + + string customData = ((GetCustomAcousticResourceReq)req).Data; + if (((GetCustomAcousticResourceReq)req).Callback != null) + ((GetCustomAcousticResourceReq)req).Callback(resp.Success ? audioListing : null, !string.IsNullOrEmpty(customData) ? customData : data.ToString()); + } + #endregion + + #region Add Custom Acoustic Resource + /// + /// This callback is used by the AddAcousticResource() function. + /// + /// Optional custom data. + public delegate void AddAcousticResourceCallback(string customData); + + /// + /// Adds an audio resource to a custom acoustic model. + /// + /// The callback. + /// The custom model name. + /// The base model name - only en-US_BroadbandModel is currently supported. + /// Descripotion of the custom model. + /// Optional custom data. + /// + public bool AddAcousticResource(AddAcousticResourceCallback callback, string customizationId, string audioName, string contentType, string containedContentType, bool allowOverwrite, byte[] audioResource, string customData = default(string)) + { + if (callback == null) + throw new ArgumentNullException("callback"); + if (string.IsNullOrEmpty(customizationId)) + throw new ArgumentNullException("customizationId"); + if (string.IsNullOrEmpty(audioName)) + throw new ArgumentNullException("audioName"); + if (string.IsNullOrEmpty(contentType)) + throw new ArgumentNullException("contentType"); + if (string.IsNullOrEmpty(containedContentType)) + throw new ArgumentNullException("containedContentType"); + if (audioResource == null) + throw new ArgumentNullException("audioResource"); + + AddAcousticResourceRequest req = new AddAcousticResourceRequest(); + req.Callback = callback; + req.CustomizationId = customizationId; + req.AudioName = audioName; + req.ContentType = contentType; + req.ContainedContentType = containedContentType; + req.AllowOverwrite = allowOverwrite; + req.AudioResource = audioResource; + req.Data = customData; + req.Headers["Content-Type"] = contentType; + req.Headers["Accept"] = "application/json"; + req.Send = audioResource; + req.OnResponse = OnAddAcousticResourceResp; + + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format("/v1/acoustic_customizations/{0}/audio/{1}", customizationId, audioName)); + if (connector == null) + return false; + + return connector.Send(req); + } + + private class AddAcousticResourceRequest : RESTConnector.Request + { + public AddAcousticResourceCallback Callback { get; set; } + public string CustomizationId { get; set; } + public string AudioName { get; set; } + public string ContentType { get; set; } + public string ContainedContentType { get; set; } + public bool AllowOverwrite{ get; set; } + public byte[] AudioResource { get; set; } + public string Data { get; set; } + } + + private void OnAddAcousticResourceResp(RESTConnector.Request req, RESTConnector.Response resp) + { + string customData = ((AddAcousticResourceRequest)req).Data; + if (((AddAcousticResourceRequest)req).Callback != null) + ((AddAcousticResourceRequest)req).Callback(!string.IsNullOrEmpty(customData) ? customData : "success"); + } + #endregion + #region IWatsonService interface /// public string GetServiceID() From e67556fd71ead93c8a4de6c229ef9767cbbb564d Mon Sep 17 00:00:00 2001 From: Amara Keller Date: Tue, 24 Oct 2017 14:52:05 -0700 Subject: [PATCH 023/100] Marked deprecated Watson Services in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 71bba4322..f93eeb896 100755 --- a/README.md +++ b/README.md @@ -86,12 +86,12 @@ To get started with the Watson Services in Unity, click on each service below to * [Alchemy Language](/Scripts/Services/AlchemyAPI/v1) * [Conversation](/Scripts/Services/Conversation/v1) * [Discovery](/Scripts/Services/Discovery/v1) -* [Document Conversion](/Scripts/Services/DocumentConversion/v1) +* [Document Conversion](/Scripts/Services/DocumentConversion/v1) **Deprecated** * [Language Translator](/Scripts/Services/LanguageTranslator/v2) * [Natural Language Classifier](/Scripts/Services/NaturalLanguageClassifier/v2) * [Natural Language Understanding](/Scripts/Services/NaturalLanguageUnderstanding/v1) * [Personality Insights](/Scripts/Services/PersonalityInsights/v3) -* [Retrieve and Rank](/Scripts/Services/RetrieveAndRank/v1) +* [Retrieve and Rank](/Scripts/Services/RetrieveAndRank/v1) **Deprecated** * [Speech to Text](/Scripts/Services/SpeechToText/v1) * [Text to Speech](/Scripts/Services/TextToSpeech/v1) * [Tone Analyzer](/Scripts/Services/ToneAnalyzer/v3) From 8cec2f515e5bf3910974c239db624ef5d2af6ad2 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Tue, 24 Oct 2017 17:39:53 -0500 Subject: [PATCH 024/100] word alternatives and speaker recognition when sent outside of recognitionEvent --- .../Scripts/ExampleStreaming.cs | 38 +++++- .../Services/SpeechToText/v1/DataModels.cs | 53 +++++++- .../Services/SpeechToText/v1/SpeechToText.cs | 113 +++++++++++++++++- 3 files changed, 188 insertions(+), 16 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index a11d9f6ee..20661e215 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -58,18 +58,24 @@ public bool Active if (value && !_speechToText.IsListening) { _speechToText.DetectSilence = true; - _speechToText.EnableWordConfidence = false; - _speechToText.EnableTimestamps = false; - _speechToText.SilenceThreshold = 0.00f; - _speechToText.MaxAlternatives = 1; + _speechToText.EnableWordConfidence = true; + _speechToText.EnableTimestamps = true; + _speechToText.SilenceThreshold = 0.1f; + _speechToText.MaxAlternatives = 5; _speechToText.EnableInterimResults = true; _speechToText.OnError = OnError; _speechToText.InactivityTimeout = -1; - _speechToText.StartListening(OnRecognize); + _speechToText.ProfanityFilter = true; + _speechToText.SmartFormatting = true; + _speechToText.SpeakerLabels = true; + _speechToText.WordAlternativesThreshold = 0.1f; List keywords = new List(); keywords.Add("hello"); + keywords.Add("testing"); + keywords.Add("watson"); _speechToText.KeywordsThreshold = 0.5f; _speechToText.Keywords = keywords.ToArray(); + _speechToText.StartListening(OnRecognize, OnRecognizeSpeaker); } else if (!value && _speechToText.IsListening) { @@ -181,7 +187,29 @@ private void OnRecognize(SpeechRecognitionEvent result) Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } + + if (res.word_alternatives != null) + { + foreach (var wordAlternative in res.word_alternatives) + { + Log.Debug("ExampleSpeechToText", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); + foreach(var alternative in wordAlternative.alternatives) + Log.Debug("ExampleSpeechToText", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); + } + } } } } + + private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) + { + if (result != null) + { + foreach (SpeakerLabelsResult labelResult in result.speaker_labels) + { + Log.Debug("ExampleStreaming", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); + } + } + + } } \ No newline at end of file diff --git a/Scripts/Services/SpeechToText/v1/DataModels.cs b/Scripts/Services/SpeechToText/v1/DataModels.cs index 710421093..d650a69e1 100644 --- a/Scripts/Services/SpeechToText/v1/DataModels.cs +++ b/Scripts/Services/SpeechToText/v1/DataModels.cs @@ -127,6 +127,10 @@ public class SpeechRecognitionEvent /// public int result_index { get; set; } /// + /// An array that identifies which words were spoken by which speakers in a multi-person exchange. Returned in the response only if `speaker_labels` is `true`. + /// + public SpeakerLabelsResult[] speaker_labels { get; set; } + /// /// An array of warning messages about invalid query parameters or JSON fields included with the request. Each warning includes a descriptive message and a list of invalid argument strings. For example, a message such as "Unknown arguments:" or "Unknown url query arguments:" followed by a list of the form "invalid_arg_1, invalid_arg_2." The request succeeds despite the warnings. /// public string[] warnings { get; set; } @@ -157,6 +161,18 @@ public bool HasFinalResult() } } + /// + /// This data object contains data for the speakerRecognitionEvent if speaker data comes separately from the speechRecognitionEvent. + /// + [fsObject] + public class SpeakerRecognitionEvent + { + /// + /// An array that identifies which words were spoken by which speakers in a multi-person exchange. Returned in the response only if `speaker_labels` is `true`. + /// + public SpeakerLabelsResult[] speaker_labels { get; set; } + } + /// /// The speech recognition result. /// @@ -178,7 +194,7 @@ public class SpeechRecognitionResult /// /// Array of word alternative hypotheses found for words of the input audio if word_alternatives_threshold is not null. /// - public WordAlternativeResults word_alternatives { get; set; } + public WordAlternativeResults[] word_alternatives { get; set; } } /// @@ -191,7 +207,6 @@ public class SpeechRecognitionAlternative /// Transcription of the audio. /// public string transcript { get; set; } - /// /// Confidence score of the transcript in the range of 0 to 1. Available only for the best alternative and only in results marked as final. /// @@ -246,6 +261,34 @@ public class WordAlternativeResults public WordAlternativeResult[] alternatives { get; set; } } + /// + /// This class holds Speaker Labels Result. + /// + [fsObject] + public class SpeakerLabelsResult + { + /// + /// The start time of a word from the transcript. The value matches the start time of a word from the `timestamps` array. + /// + public double from { get; set; } + /// + /// The end time of a word from the transcript. The value matches the end time of a word from the `timestamps` array. + /// + public double to { get; set; } + /// + /// The numeric identifier that the service assigns to a speaker from the audio. Speaker IDs begin at `0` initially but can evolve and change across interim results (if supported by the method) and between interim and final results as the service processes the audio. They are not guaranteed to be sequential, contiguous, or ordered. + /// + public Int64 speaker { get; set; } + /// + /// A score that indicates how confident the service is in its identification of the speaker in the range of 0 to 1. + /// + public double confidence { get; set; } + /// + /// An indication of whether the service might further change word and speaker-label results. A value of `true` means that the service guarantees not to send any further updates for the current or any preceding results; `false` means that the service might send further updates to the results. + /// + public bool final { get; set; } + } + /// /// This class holds a Keyword Result. /// @@ -752,7 +795,7 @@ public class AudioResources /// /// The total seconds of accumulated audio summed over all of the valid audio resources for the custom acoustic model. You can use this value to determine whether the custom model has too little or too much audio to begin training. /// - public float total_minutes_of_audio { get; set; } + public double total_minutes_of_audio { get; set; } /// /// An array of `AudioResource` objects that provides information about the audio resources of the custom acoustic model. The array is empty if the custom model has no audio resources /// @@ -768,7 +811,7 @@ public class AudioResource /// /// The total seconds of audio in the audio resource. /// - public float duration { get; set; } + public double duration { get; set; } /// /// The name of the audio resource. /// @@ -816,7 +859,7 @@ public class AudioListing /// /// The total seconds of audio in the audio resource. /// - public float duration { get; set; } + public double duration { get; set; } /// /// The name of the audio resource. /// diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 3004a72a7..51b07611d 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -81,7 +81,8 @@ public class SpeechToText : IWatsonService #endregion #region Private Data - private OnRecognize _listenCallback = null; // Callback is set by StartListening() + private OnRecognize _listenCallback = null; // Callback is set by StartListening() + private OnRecognizeSpeaker _speakerLabelCallback = null; private WSConnector _listenSocket = null; // WebSocket object used when StartListening() is invoked private bool _listenActive = false; private bool _audioSent = false; @@ -415,14 +416,21 @@ private void OnGetModelResponse(RESTConnector.Request req, RESTConnector.Respons /// The ResultList object containing the results. public delegate void OnRecognize(SpeechRecognitionEvent results); + /// + /// This callback object is used by the RecognizeSpeaker() method. + /// + /// Array of speaker label results. + public delegate void OnRecognizeSpeaker(SpeakerRecognitionEvent speakerRecognitionEvent); + /// /// This starts the service listening and it will invoke the callback for any recognized speech. /// OnListen() must be called by the user to queue audio data to send to the service. /// StopListening() should be called when you want to stop listening. /// /// All recognize results are passed to this callback. + /// Speaker label goes through this callback if it arrives separately from recognize result. /// Returns true on success, false on failure. - public bool StartListening(OnRecognize callback) + public bool StartListening(OnRecognize callback, OnRecognizeSpeaker speakerLabelCallback = null) { if (callback == null) throw new ArgumentNullException("callback"); @@ -433,6 +441,8 @@ public bool StartListening(OnRecognize callback) _isListening = true; _listenCallback = callback; + if (speakerLabelCallback != null) + _speakerLabelCallback = speakerLabelCallback; _keepAliveRoutine = Runnable.Run(KeepAlive()); _lastKeepAlive = DateTime.Now; @@ -586,7 +596,7 @@ private void SendStart() start["profanity_filter"] = ProfanityFilter; start["smart_formatting"] = SmartFormatting; start["speaker_labels"] = SpeakerLabels; - start["timestamps"] = _timestamps; + start["timestamps"] = EnableTimestamps; start["word_alternatives_threshold"] = WordAlternativesThreshold; start["word_confidence"] = EnableWordConfidence; @@ -653,10 +663,11 @@ private void OnListenMessage(WSConnector.Message msg) if (results != null) { //// when we get results, start listening for the next block .. - //if (results.HasFinalResult()) - // SendStart(); + if (results.HasFinalResult()) + Log.Debug("SpeechToText", "final json response: {0}", tm.Text); + // SendStart(); - if (_listenCallback != null) + if (_listenCallback != null) _listenCallback(results); else StopListening(); // automatically stop listening if our callback is destroyed. @@ -691,6 +702,14 @@ private void OnListenMessage(WSConnector.Message msg) } } + else if(json.Contains("speaker_labels")) + { + SpeakerRecognitionEvent speakerRecognitionEvent = ParseSpeakerRecognitionResponse(json); + if (speakerRecognitionEvent != null) + { + _speakerLabelCallback(speakerRecognitionEvent); + } + } else if (json.Contains("error")) { string error = (string)json["error"]; @@ -834,6 +853,45 @@ private SpeechRecognitionEvent ParseRecognizeResponse(byte[] json) return ParseRecognizeResponse(resp); } + private SpeakerRecognitionEvent ParseSpeakerRecognitionResponse(IDictionary resp) + { + if (resp == null) + return null; + + try + { + List results = new List(); + IList iresults = resp["speaker_labels"] as IList; + + if (iresults == null) + return null; + + foreach (var r in iresults) + { + IDictionary iresult = r as IDictionary; + if (iresult == null) + continue; + + SpeakerLabelsResult result = new SpeakerLabelsResult(); + result.confidence = (double)iresult["confidence"]; + result.final = (bool)iresult["final"]; + result.from = (double)iresult["from"]; + result.to = (double)iresult["to"]; + result.speaker = (Int64)iresult["speaker"]; + + results.Add(result); + } + SpeakerRecognitionEvent speakerRecognitionEvent = new SpeakerRecognitionEvent(); + speakerRecognitionEvent.speaker_labels = results.ToArray(); + return (speakerRecognitionEvent); + } + catch(Exception e) + { + Log.Error("SpeechToText", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); + return null; + } + } + private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) { if (resp == null) @@ -855,6 +913,49 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) SpeechRecognitionResult result = new SpeechRecognitionResult(); result.final = (bool)iresult["final"]; + + IList iwordAlternatives = iresult["word_alternatives"] as IList; + if (iwordAlternatives == null) + continue; + + List wordAlternatives = new List(); + foreach(var w in iwordAlternatives) + { + IDictionary iwordAlternative = w as IDictionary; + if (iwordAlternative == null) + continue; + + WordAlternativeResults wordAlternativeResults = new WordAlternativeResults(); + if (iwordAlternative.Contains("start_time")) + wordAlternativeResults.start_time = (double)iwordAlternative["start_time"]; + if (iwordAlternative.Contains("end_time")) + wordAlternativeResults.end_time = (double)iwordAlternative["end_time"]; + if(iwordAlternative.Contains("alternatives")) + { + List wordAlternativeResultList = new List(); + IList iwordAlternativeResult = iwordAlternative["alternatives"] as IList; + if (iwordAlternativeResult == null) + continue; + + foreach (var a in iwordAlternativeResult) + { + WordAlternativeResult wordAlternativeResult = new WordAlternativeResult(); + IDictionary ialternative = a as IDictionary; + if (ialternative.Contains("word")) + wordAlternativeResult.word = (string)ialternative["word"]; + if (ialternative.Contains("confidence")) + wordAlternativeResult.confidence = (double)ialternative["confidence"]; + wordAlternativeResultList.Add(wordAlternativeResult); + } + + wordAlternativeResults.alternatives = wordAlternativeResultList.ToArray(); + } + + wordAlternatives.Add(wordAlternativeResults); + } + + result.word_alternatives = wordAlternatives.ToArray(); + IList ialternatives = iresult["alternatives"] as IList; if (ialternatives == null) continue; From b32f98e6dc3835e758a3941f6b29a48a0d320ee6 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 25 Oct 2017 11:38:41 -0500 Subject: [PATCH 025/100] don't continue if null alternatives or word_alternatives --- .../Services/SpeechToText/v1/SpeechToText.cs | 166 +++++++++--------- 1 file changed, 84 insertions(+), 82 deletions(-) diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 51b07611d..d901d37d9 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -665,9 +665,9 @@ private void OnListenMessage(WSConnector.Message msg) //// when we get results, start listening for the next block .. if (results.HasFinalResult()) Log.Debug("SpeechToText", "final json response: {0}", tm.Text); - // SendStart(); + // SendStart(); - if (_listenCallback != null) + if (_listenCallback != null) _listenCallback(results); else StopListening(); // automatically stop listening if our callback is destroyed. @@ -702,7 +702,7 @@ private void OnListenMessage(WSConnector.Message msg) } } - else if(json.Contains("speaker_labels")) + else if (json.Contains("speaker_labels")) { SpeakerRecognitionEvent speakerRecognitionEvent = ParseSpeakerRecognitionResponse(json); if (speakerRecognitionEvent != null) @@ -885,7 +885,7 @@ private SpeakerRecognitionEvent ParseSpeakerRecognitionResponse(IDictionary resp speakerRecognitionEvent.speaker_labels = results.ToArray(); return (speakerRecognitionEvent); } - catch(Exception e) + catch (Exception e) { Log.Error("SpeechToText", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); return null; @@ -912,107 +912,110 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) SpeechRecognitionResult result = new SpeechRecognitionResult(); result.final = (bool)iresult["final"]; - IList iwordAlternatives = iresult["word_alternatives"] as IList; - if (iwordAlternatives == null) - continue; - - List wordAlternatives = new List(); - foreach(var w in iwordAlternatives) + if (iwordAlternatives != null) { - IDictionary iwordAlternative = w as IDictionary; - if (iwordAlternative == null) - continue; - - WordAlternativeResults wordAlternativeResults = new WordAlternativeResults(); - if (iwordAlternative.Contains("start_time")) - wordAlternativeResults.start_time = (double)iwordAlternative["start_time"]; - if (iwordAlternative.Contains("end_time")) - wordAlternativeResults.end_time = (double)iwordAlternative["end_time"]; - if(iwordAlternative.Contains("alternatives")) + + List wordAlternatives = new List(); + foreach (var w in iwordAlternatives) { - List wordAlternativeResultList = new List(); - IList iwordAlternativeResult = iwordAlternative["alternatives"] as IList; - if (iwordAlternativeResult == null) + IDictionary iwordAlternative = w as IDictionary; + if (iwordAlternative == null) continue; - foreach (var a in iwordAlternativeResult) + WordAlternativeResults wordAlternativeResults = new WordAlternativeResults(); + if (iwordAlternative.Contains("start_time")) + wordAlternativeResults.start_time = (double)iwordAlternative["start_time"]; + if (iwordAlternative.Contains("end_time")) + wordAlternativeResults.end_time = (double)iwordAlternative["end_time"]; + if (iwordAlternative.Contains("alternatives")) { - WordAlternativeResult wordAlternativeResult = new WordAlternativeResult(); - IDictionary ialternative = a as IDictionary; - if (ialternative.Contains("word")) - wordAlternativeResult.word = (string)ialternative["word"]; - if (ialternative.Contains("confidence")) - wordAlternativeResult.confidence = (double)ialternative["confidence"]; - wordAlternativeResultList.Add(wordAlternativeResult); + List wordAlternativeResultList = new List(); + IList iwordAlternativeResult = iwordAlternative["alternatives"] as IList; + if (iwordAlternativeResult == null) + continue; + + foreach (var a in iwordAlternativeResult) + { + WordAlternativeResult wordAlternativeResult = new WordAlternativeResult(); + IDictionary ialternative = a as IDictionary; + if (ialternative.Contains("word")) + wordAlternativeResult.word = (string)ialternative["word"]; + if (ialternative.Contains("confidence")) + wordAlternativeResult.confidence = (double)ialternative["confidence"]; + wordAlternativeResultList.Add(wordAlternativeResult); + } + + wordAlternativeResults.alternatives = wordAlternativeResultList.ToArray(); } - wordAlternativeResults.alternatives = wordAlternativeResultList.ToArray(); + wordAlternatives.Add(wordAlternativeResults); } - wordAlternatives.Add(wordAlternativeResults); + result.word_alternatives = wordAlternatives.ToArray(); } - result.word_alternatives = wordAlternatives.ToArray(); - IList ialternatives = iresult["alternatives"] as IList; - if (ialternatives == null) - continue; - - List alternatives = new List(); - foreach (var a in ialternatives) + if (ialternatives != null) { - IDictionary ialternative = a as IDictionary; - if (ialternative == null) - continue; - - SpeechRecognitionAlternative alternative = new SpeechRecognitionAlternative(); - alternative.transcript = (string)ialternative["transcript"]; - if (ialternative.Contains("confidence")) - alternative.confidence = (double)ialternative["confidence"]; - if (ialternative.Contains("timestamps")) + List alternatives = new List(); + foreach (var a in ialternatives) { - IList itimestamps = ialternative["timestamps"] as IList; + IDictionary ialternative = a as IDictionary; + if (ialternative == null) + continue; - TimeStamp[] timestamps = new TimeStamp[itimestamps.Count]; - for (int i = 0; i < itimestamps.Count; ++i) - { - IList itimestamp = itimestamps[i] as IList; - if (itimestamp == null) - continue; + SpeechRecognitionAlternative alternative = new SpeechRecognitionAlternative(); + alternative.transcript = (string)ialternative["transcript"]; + if (ialternative.Contains("confidence")) + alternative.confidence = (double)ialternative["confidence"]; - TimeStamp ts = new TimeStamp(); - ts.Word = (string)itimestamp[0]; - ts.Start = (double)itimestamp[1]; - ts.End = (double)itimestamp[2]; - timestamps[i] = ts; - } + if (ialternative.Contains("timestamps")) + { + IList itimestamps = ialternative["timestamps"] as IList; - alternative.Timestamps = timestamps; - } - if (ialternative.Contains("word_confidence")) - { - IList iconfidence = ialternative["word_confidence"] as IList; + TimeStamp[] timestamps = new TimeStamp[itimestamps.Count]; + for (int i = 0; i < itimestamps.Count; ++i) + { + IList itimestamp = itimestamps[i] as IList; + if (itimestamp == null) + continue; + + TimeStamp ts = new TimeStamp(); + ts.Word = (string)itimestamp[0]; + ts.Start = (double)itimestamp[1]; + ts.End = (double)itimestamp[2]; + timestamps[i] = ts; + } - WordConfidence[] confidence = new WordConfidence[iconfidence.Count]; - for (int i = 0; i < iconfidence.Count; ++i) + alternative.Timestamps = timestamps; + } + if (ialternative.Contains("word_confidence")) { - IList iwordconf = iconfidence[i] as IList; - if (iwordconf == null) - continue; + IList iconfidence = ialternative["word_confidence"] as IList; - WordConfidence wc = new WordConfidence(); - wc.Word = (string)iwordconf[0]; - wc.Confidence = (double)iwordconf[1]; - confidence[i] = wc; + WordConfidence[] confidence = new WordConfidence[iconfidence.Count]; + for (int i = 0; i < iconfidence.Count; ++i) + { + IList iwordconf = iconfidence[i] as IList; + if (iwordconf == null) + continue; + + WordConfidence wc = new WordConfidence(); + wc.Word = (string)iwordconf[0]; + wc.Confidence = (double)iwordconf[1]; + confidence[i] = wc; + } + + alternative.WordConfidence = confidence; } - alternative.WordConfidence = confidence; + alternatives.Add(alternative); } - alternatives.Add(alternative); + result.alternatives = alternatives.ToArray(); } IDictionary iKeywords = iresult["keywords_result"] as IDictionary; @@ -1043,7 +1046,6 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) result.keywords_result.keyword = keywordResults.ToArray(); } - result.alternatives = alternatives.ToArray(); results.Add(result); } @@ -2151,7 +2153,7 @@ private void OnGetCustomWordResp(RESTConnector.Request req, RESTConnector.Respon GetCustomAcousticModelsReq req = new GetCustomAcousticModelsReq(); req.Callback = callback; req.Data = customData; - if(!string.IsNullOrEmpty(language)) + if (!string.IsNullOrEmpty(language)) req.Parameters["language"] = language; req.OnResponse = OnGetCustomAcousticModelsResp; @@ -2426,7 +2428,7 @@ private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnect req.Callback = callback; req.CustomizationID = customizationID; req.Data = customData; - if(!string.IsNullOrEmpty(customLanguageModelId)) + if (!string.IsNullOrEmpty(customLanguageModelId)) req.Parameters["custom_language_model_id"] = customLanguageModelId; req.Headers["Content-Type"] = "application/json"; req.Headers["Accept"] = "application/json"; @@ -2758,7 +2760,7 @@ private class AddAcousticResourceRequest : RESTConnector.Request public string AudioName { get; set; } public string ContentType { get; set; } public string ContainedContentType { get; set; } - public bool AllowOverwrite{ get; set; } + public bool AllowOverwrite { get; set; } public byte[] AudioResource { get; set; } public string Data { get; set; } } From c4fd5e49c1c6f474b9218a567c3124e1e37661c0 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 25 Oct 2017 11:44:13 -0500 Subject: [PATCH 026/100] default WordAlternativesThreshold to 0 in service abstraction, set value to 0.5f for the example --- Examples/ServiceExamples/Scripts/ExampleStreaming.cs | 2 +- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 20661e215..730f0b9b7 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -68,7 +68,7 @@ public bool Active _speechToText.ProfanityFilter = true; _speechToText.SmartFormatting = true; _speechToText.SpeakerLabels = true; - _speechToText.WordAlternativesThreshold = 0.1f; + _speechToText.WordAlternativesThreshold = 0.5f; List keywords = new List(); keywords.Add("hello"); keywords.Add("testing"); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index d901d37d9..61b9043e6 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -95,7 +95,7 @@ public class SpeechToText : IWatsonService private int _maxAlternatives = 1; // maximum number of alternatives to return. private string[] _keywords = { "" }; private float _keywordsThreshold = 0.5f; - private float _wordAlternativesThreshold = 0.5f; + private float _wordAlternativesThreshold = 0.0f; private bool _profanityFilter = true; private bool _smartFormatting = false; private bool _speakerLabels = false; From 7146b64f24fc6ab9ee726774959dd2dcc166ee70 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 25 Oct 2017 13:14:07 -0500 Subject: [PATCH 027/100] wordAlternativeThreshold is nullable and is omitted by default --- Examples/ServiceExamples/Scripts/ExampleStreaming.cs | 2 +- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 730f0b9b7..21a88537a 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -68,7 +68,7 @@ public bool Active _speechToText.ProfanityFilter = true; _speechToText.SmartFormatting = true; _speechToText.SpeakerLabels = true; - _speechToText.WordAlternativesThreshold = 0.5f; + _speechToText.WordAlternativesThreshold = null; List keywords = new List(); keywords.Add("hello"); keywords.Add("testing"); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 61b9043e6..596968b68 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -95,7 +95,7 @@ public class SpeechToText : IWatsonService private int _maxAlternatives = 1; // maximum number of alternatives to return. private string[] _keywords = { "" }; private float _keywordsThreshold = 0.5f; - private float _wordAlternativesThreshold = 0.0f; + private float? _wordAlternativesThreshold = null; private bool _profanityFilter = true; private bool _smartFormatting = false; private bool _speakerLabels = false; @@ -220,7 +220,7 @@ public Credentials Credentials /// /// NON-MULTIPART ONLY: Confidence value that is the lower bound for identifying a hypothesis as a possible word alternative (also known as "Confusion Networks"). An alternative word is considered if its confidence is greater than or equal to the threshold. Specify a probability between 0 and 1 inclusive. No alternative words are computed if you omit the parameter. /// - public float WordAlternativesThreshold { get { return _wordAlternativesThreshold; } set { _wordAlternativesThreshold = value; } } + public float? WordAlternativesThreshold { get { return _wordAlternativesThreshold; } set { _wordAlternativesThreshold = value; } } /// /// NON-MULTIPART ONLY: If true (the default), filters profanity from all output except for keyword results by replacing inappropriate words with a series of asterisks. Set the parameter to false to return results with no censoring. Applies to US English transcription only. /// @@ -597,7 +597,8 @@ private void SendStart() start["smart_formatting"] = SmartFormatting; start["speaker_labels"] = SpeakerLabels; start["timestamps"] = EnableTimestamps; - start["word_alternatives_threshold"] = WordAlternativesThreshold; + if(WordAlternativesThreshold != null) + start["word_alternatives_threshold"] = WordAlternativesThreshold; start["word_confidence"] = EnableWordConfidence; _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); @@ -796,7 +797,8 @@ public bool Recognize(AudioClip clip, OnRecognize callback) req.Parameters["timestamps"] = EnableTimestamps ? "true" : "false"; if (Credentials.HasAuthorizationToken()) req.Parameters["watson-token"] = Credentials.AuthenticationToken; - req.Parameters["word_alternatives_threshold"] = WordAlternativesThreshold; + if(WordAlternativesThreshold != null) + req.Parameters["word_alternatives_threshold"] = WordAlternativesThreshold; req.Parameters["word_confidence"] = EnableWordConfidence ? "true" : "false"; req.OnResponse = OnRecognizeResponse; From 6b4d61c00a52b5413ad2d966c62bf7f39aa6f03f Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 25 Oct 2017 16:12:10 -0500 Subject: [PATCH 028/100] stt enable all examples, update tests, add force param to train acoustic model --- .../Scripts/ExampleSpeechToText.cs | 411 ++++++++++-------- .../Services/SpeechToText/v1/SpeechToText.cs | 19 +- Scripts/UnitTests/TestSpeechToText.cs | 335 +++++++++++--- 3 files changed, 515 insertions(+), 250 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index 8003ed5e5..8dfb5d6f7 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -37,10 +37,12 @@ public class ExampleSpeechToText : MonoBehaviour private string _createdCorpusName = "the-jabberwocky-corpus"; private string _customCorpusFilePath; private string _customWordsFilePath; - private string _wavFilePath; + private string _acousticResourceUrl = "https://ia802302.us.archive.org/10/items/Greatest_Speeches_of_the_20th_Century/TheFirstAmericaninEarthOrbit.mp3"; + private bool _isAudioLoaded = false; private string _createdAcousticModelId; - private string _acousticResourceName = "unity acoustic resource"; - private string _createdAcousticModelName = "unity example acoustic model"; + private string _acousticResourceName = "unity-acoustic-resource"; + private string _createdAcousticModelName = "unity-example-acoustic-model"; + private byte[] _acousticResourceData; private bool _recognizeTested = false; private bool _getModelsTested = false; @@ -61,19 +63,15 @@ public class ExampleSpeechToText : MonoBehaviour private bool _getCustomWordTested = false; private bool _deleteCustomWordTested = false; private bool _deleteCustomCorpusTested = false; - private bool _getAcousticCustomizationsTested = false; private bool _createAcousticCustomizationsTested = false; private bool _deleteAcousticCustomizationsTested = false; private bool _getAcousticCustomizationTested = false; private bool _trainAcousticCustomizationsTested = false; private bool _resetAcousticCustomizationsTested = false; - private bool _getAcousticResourcesTested = false; - private bool _deleteAcousticResourcesTested = false; private bool _getAcousticResourceTested = false; private bool _addAcousticResourcesTested = false; - private bool _isCustomizationReady = false; private bool _isAcousticCustomizationReady = false; private bool _readyToContinue = false; @@ -89,199 +87,199 @@ void Start() _speechToText = new SpeechToText(credentials); _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt"; _customWordsFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-words.json"; - _wavFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-audio.wav"; - _audioClip = WaveFile.ParseWAV("testClip", File.ReadAllBytes(_wavFilePath)); Runnable.Run(Examples()); } private IEnumerator Examples() { - //// Recognize - //Log.Debug("ExampleSpeechToText", "Attempting to recognize"); - //List keywords = new List(); - //keywords.Add("speech"); - //_speechToText.KeywordsThreshold = 0.5f; - //_speechToText.Keywords = keywords.ToArray(); - //_speechToText.Recognize(_audioClip, HandleOnRecognize); - //while (!_recognizeTested) - // yield return null; + Runnable.Run(DownloadAcousticResource()); - //// Get models - //Log.Debug("ExampleSpeechToText", "Attempting to get models"); - //_speechToText.GetModels(HandleGetModels); - //while (!_getModelsTested) - // yield return null; + // Recognize + Log.Debug("ExampleSpeechToText", "Attempting to recognize"); + List keywords = new List(); + keywords.Add("speech"); + _speechToText.KeywordsThreshold = 0.5f; + _speechToText.Keywords = keywords.ToArray(); + _speechToText.Recognize(_audioClip, HandleOnRecognize); + while (!_recognizeTested) + yield return null; - //// Get model - //Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); - //_speechToText.GetModel(HandleGetModel, _modelNameToGet); - //while (!_getModelTested) - // yield return null; + // Get models + Log.Debug("ExampleSpeechToText", "Attempting to get models"); + _speechToText.GetModels(HandleGetModels); + while (!_getModelsTested) + yield return null; - //// Get customizations - //Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); - //_speechToText.GetCustomizations(HandleGetCustomizations); - //while (!_getCustomizationsTested) - // yield return null; + // Get model + Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); + _speechToText.GetModel(HandleGetModel, _modelNameToGet); + while (!_getModelTested) + yield return null; - //// Create customization - //Log.Debug("ExampleSpeechToText", "Attempting create customization"); - //_speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); - //while (!_createCustomizationsTested) - // yield return null; + // Get customizations + Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); + _speechToText.GetCustomizations(HandleGetCustomizations); + while (!_getCustomizationsTested) + yield return null; - //// Get customization - //Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); - //_speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); - //while (!_getCustomizationTested) - // yield return null; + // Create customization + Log.Debug("ExampleSpeechToText", "Attempting create customization"); + _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); + while (!_createCustomizationsTested) + yield return null; - //// Get custom corpora - //Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); - //_speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); - //while (!_getCustomCorporaTested) - // yield return null; + // Get customization + Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); + while (!_getCustomizationTested) + yield return null; - //// Add custom corpus - //Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - //string corpusData = File.ReadAllText(_customCorpusFilePath); - //_speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); - //while (!_addCustomCorpusTested) - // yield return null; + // Get custom corpora + Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); + while (!_getCustomCorporaTested) + yield return null; - //// Get custom corpus - //Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - //_speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); - //while (!_getCustomCorpusTested) - // yield return null; + // Add custom corpus + Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + string corpusData = File.ReadAllText(_customCorpusFilePath); + _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); + while (!_addCustomCorpusTested) + yield return null; - //// Wait for customization - //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - //while (!_isCustomizationReady) - // yield return null; + // Get custom corpus + Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); + while (!_getCustomCorpusTested) + yield return null; - //// Get custom words - //Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); - //_speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); - //while (!_getCustomWordsTested) - // yield return null; + // Wait for customization + Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + while (!_isCustomizationReady) + yield return null; - //// Add custom words from path - //Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); - //string customWords = File.ReadAllText(_customWordsFilePath); - //_speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); - //while (!_addCustomWordsFromPathTested) - // yield return null; + // Get custom words + Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); + _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); + while (!_getCustomWordsTested) + yield return null; - //// Wait for customization - //_isCustomizationReady = false; - //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - //while (!_isCustomizationReady) - // yield return null; + // Add custom words from path + Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + string customWords = File.ReadAllText(_customWordsFilePath); + _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); + while (!_addCustomWordsFromPathTested) + yield return null; - //// Add custom words from object - //Words words = new Words(); - //Word w0 = new Word(); - //List wordList = new List(); - //w0.word = "mikey"; - //w0.sounds_like = new string[1]; - //w0.sounds_like[0] = "my key"; - //w0.display_as = "Mikey"; - //wordList.Add(w0); - //Word w1 = new Word(); - //w1.word = "charlie"; - //w1.sounds_like = new string[1]; - //w1.sounds_like[0] = "char lee"; - //w1.display_as = "Charlie"; - //wordList.Add(w1); - //Word w2 = new Word(); - //w2.word = "bijou"; - //w2.sounds_like = new string[1]; - //w2.sounds_like[0] = "be joo"; - //w2.display_as = "Bijou"; - //wordList.Add(w2); - //words.words = wordList.ToArray(); - - //Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); - //_speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); - //while (!_addCustomWordsFromObjectTested) - // yield return null; + // Wait for customization + _isCustomizationReady = false; + Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + while (!_isCustomizationReady) + yield return null; - //// Wait for customization - //_isCustomizationReady = false; - //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - //while (!_isCustomizationReady) - // yield return null; + // Add custom words from object + Words words = new Words(); + Word w0 = new Word(); + List wordList = new List(); + w0.word = "mikey"; + w0.sounds_like = new string[1]; + w0.sounds_like[0] = "my key"; + w0.display_as = "Mikey"; + wordList.Add(w0); + Word w1 = new Word(); + w1.word = "charlie"; + w1.sounds_like = new string[1]; + w1.sounds_like[0] = "char lee"; + w1.display_as = "Charlie"; + wordList.Add(w1); + Word w2 = new Word(); + w2.word = "bijou"; + w2.sounds_like = new string[1]; + w2.sounds_like[0] = "be joo"; + w2.display_as = "Bijou"; + wordList.Add(w2); + words.words = wordList.ToArray(); + + Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); + while (!_addCustomWordsFromObjectTested) + yield return null; - //// Get custom word - //Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); - //_speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); - //while (!_getCustomWordTested) - // yield return null; + // Wait for customization + _isCustomizationReady = false; + Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + while (!_isCustomizationReady) + yield return null; - //// Train customization - //Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); - //_speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); - //while (!_trainCustomizationTested) - // yield return null; + // Get custom word + Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); + while (!_getCustomWordTested) + yield return null; - //// Wait for customization - //_isCustomizationReady = false; - //Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); - //while (!_isCustomizationReady) - // yield return null; + // Train customization + Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); + while (!_trainCustomizationTested) + yield return null; - //// Upgrade customization - not currently implemented in service - ////Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); - ////_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); - ////while (!_upgradeCustomizationTested) - //// yield return null; + // Wait for customization + _isCustomizationReady = false; + Runnable.Run(CheckCustomizationStatus(_createdCustomizationID)); + while (!_isCustomizationReady) + yield return null; - //// Delete custom word - //Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); - //_speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); - //while (!_deleteCustomWordTested) + // Upgrade customization - not currently implemented in service + //Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); + //while (!_upgradeCustomizationTested) // yield return null; - //// Delay - //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); - //Runnable.Run(Delay(_delayTimeInSeconds)); - //while (!_readyToContinue) - // yield return null; + // Delete custom word + Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); + while (!_deleteCustomWordTested) + yield return null; - //_readyToContinue = false; - //// Delete custom corpus - //Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); - //_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); - //while (!_deleteCustomCorpusTested) - // yield return null; + // Delay + Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; - //// Delay - //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); - //Runnable.Run(Delay(_delayTimeInSeconds)); - //while (!_readyToContinue) - // yield return null; + _readyToContinue = false; + // Delete custom corpus + Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); + while (!_deleteCustomCorpusTested) + yield return null; - //_readyToContinue = false; - //// Reset customization - //Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); - //_speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); - //while (!_resetCustomizationTested) - // yield return null; - - //// Delay - //Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); - //Runnable.Run(Delay(_delayTimeInSeconds)); - //while (!_readyToContinue) - // yield return null; + // Delay + Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; - //_readyToContinue = false; - //// Delete customization - //Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); - //_speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); - //while (!_deleteCustomizationsTested) - // yield return null; + _readyToContinue = false; + // Reset customization + Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); + while (!_resetCustomizationTested) + yield return null; + + // Delay + Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; + + _readyToContinue = false; + // Delete customization + Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); + while (!_deleteCustomizationsTested) + yield return null; // List acoustic customizations Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customizations"); @@ -301,15 +299,13 @@ private IEnumerator Examples() while (!_getAcousticCustomizationTested) yield return null; - // List acoustic resources - Log.Debug("ExampleSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); - _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); - while (!_getAcousticResourcesTested) + while (!_isAudioLoaded) yield return null; // Create acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdCustomizationID, _acousticResourceName); - _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, "audio/wav", "audio/wav", true, File.ReadAllBytes(_wavFilePath)); + Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); + string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); + _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); while (!_addAcousticResourcesTested) yield return null; @@ -319,18 +315,30 @@ private IEnumerator Examples() while (!_isAcousticCustomizationReady) yield return null; + // List acoustic resources + Log.Debug("ExampleSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); + while (!_getAcousticResourcesTested) + yield return null; + // Train acoustic customization Log.Debug("ExampleSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); - _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId); + _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId, null, true); while (!_trainAcousticCustomizationsTested) yield return null; - + // Get acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to get audio resource {1} from {0}", _createdCustomizationID, _acousticResourceName); + Log.Debug("ExampleSpeechToText", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); while (!_getAcousticResourceTested) yield return null; + // Wait for customization + _isAcousticCustomizationReady = false; + Runnable.Run(CheckAcousticCustomizationStatus(_createdAcousticModelId)); + while (!_isAcousticCustomizationReady) + yield return null; + // Reset acoustic customization Log.Debug("ExampleSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); @@ -338,32 +346,46 @@ private IEnumerator Examples() yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; // Delete acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); - _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); - while (!_deleteAcousticResourcesTested) - yield return null; + DeleteAcousticResource(); // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; // Delete acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); - _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); + DeleteAcousticCustomization(); while (!_deleteAcousticCustomizationsTested) yield return null; + // Delay + Log.Debug("ExampleSpeechToText", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; + Log.Debug("ExampleSpeechToText", "Speech to Text examples complete."); } + private void DeleteAcousticResource() + { + Log.Debug("ExampleSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); + } + + private void DeleteAcousticCustomization() + { + Log.Debug("ExampleSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); + } + private void HandleGetModels(ModelSet result, string customData) { @@ -626,13 +648,15 @@ private void HandleResetAcousticCustomization(bool success, string customData) private void HandleDeleteAcousticResource(bool success, string customData) { Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); - _deleteAcousticResourcesTested = true; } private void HandleDeleteAcousticCustomization(bool success, string customData) { Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); - _deleteAcousticCustomizationsTested = true; + if (success) + _deleteAcousticCustomizationsTested = true; + else + DeleteAcousticCustomization(); } private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) @@ -690,4 +714,15 @@ private IEnumerator Delay(float delayTime) yield return new WaitForSeconds(delayTime); _readyToContinue = true; } + + private IEnumerator DownloadAcousticResource() + { + Log.Debug("ExampleSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); + WWW www = new WWW(_acousticResourceUrl); + yield return www; + + Log.Debug("ExampleSpeechToText", "acoustic resource downloaded"); + _acousticResourceData = www.bytes; + _isAudioLoaded = true; + } } \ No newline at end of file diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 596968b68..6fd47a1fa 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -783,9 +783,13 @@ public bool Recognize(AudioClip clip, OnRecognize callback) Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); return false; } - req.Parameters["acoustic_customization_id"] = AcousticCustomizationId; - req.Parameters["customization_id"] = CustomizationId; - req.Parameters["customization_weight"] = CustomizationWeight; + if(!string.IsNullOrEmpty(AcousticCustomizationId)) + req.Parameters["acoustic_customization_id"] = AcousticCustomizationId; + if (!string.IsNullOrEmpty(CustomizationId)) + { + req.Parameters["customization_id"] = CustomizationId; + req.Parameters["customization_weight"] = CustomizationWeight; + } req.Parameters["inactivity_timeout"] = InactivityTimeout; req.Parameters["keywords"] = string.Join(",", Keywords); req.Parameters["keywords_threshold"] = KeywordsThreshold; @@ -2316,6 +2320,7 @@ private void OnCreateAcousticCustomizationResp(RESTConnector.Request req, RESTCo req.CustomizationID = customizationID; req.Data = customData; req.Delete = true; + req.Timeout = 10f; req.OnResponse = OnDeleteAcousticCustomizationResp; string service = "/v1/acoustic_customizations/{0}"; @@ -2414,12 +2419,13 @@ private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnect /// This callback is used by the TrainAcousticCustomization() function. /// /// The success of the call. + /// Force training with an acoustic resource with a length less than 10 minutes. /// Optional custom data. public delegate void TrainAcousticCustomizationCallback(bool success, string customData); /// /// Trains a custom acoustic model. /// - public bool TrainAcousticCustomization(TrainAcousticCustomizationCallback callback, string customizationID, string customLanguageModelId = null, string customData = default(string)) + public bool TrainAcousticCustomization(TrainAcousticCustomizationCallback callback, string customizationID, string customLanguageModelId = null, bool force = false, string customData = default(string)) { if (callback == null) throw new ArgumentNullException("callback"); @@ -2434,6 +2440,8 @@ private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnect req.Parameters["custom_language_model_id"] = customLanguageModelId; req.Headers["Content-Type"] = "application/json"; req.Headers["Accept"] = "application/json"; + if (force != false) + req.Parameters["force"] = "true"; req.Send = Encoding.UTF8.GetBytes("{}"); req.OnResponse = OnTrainAcousticCustomizationResp; @@ -2606,10 +2614,11 @@ private void OnGetCustomAcousticResourcesResp(RESTConnector.Request req, RESTCon req.AudioName = audioName; req.Data = customData; req.Delete = true; + req.Timeout = 10f; req.OnResponse = OnDeleteAcousticResourceResp; string service = "/v1/acoustic_customizations/{0}/audio/{1}"; - RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID, audioName)); + RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(service, customizationID, WWW.EscapeURL(audioName))); if (connector == null) return false; diff --git a/Scripts/UnitTests/TestSpeechToText.cs b/Scripts/UnitTests/TestSpeechToText.cs index 8c161e293..150801d8c 100644 --- a/Scripts/UnitTests/TestSpeechToText.cs +++ b/Scripts/UnitTests/TestSpeechToText.cs @@ -44,6 +44,12 @@ public class TestSpeechToText : UnitTest private string _customCorpusFilePath; private string _customWordsFilePath; private string _wavFilePath; + private string _acousticResourceUrl = "https://ia802302.us.archive.org/10/items/Greatest_Speeches_of_the_20th_Century/TheFirstAmericaninEarthOrbit.mp3"; + private bool _isAudioLoaded = false; + private string _createdAcousticModelId; + private string _acousticResourceName = "unity-acoustic-resource"; + private string _createdAcousticModelName = "unity-example-acoustic-model"; + private byte[] _acousticResourceData; private bool _recognizeTested = false; private bool _getModelsTested = false; @@ -51,7 +57,6 @@ public class TestSpeechToText : UnitTest private bool _getCustomizationsTested = false; private bool _createCustomizationsTested = false; private bool _getCustomizationTested = false; - private bool _deleteCustomizationsTested = false; private bool _trainCustomizationTested = false; //private bool _upgradeCustomizationTested = false; private bool _resetCustomizationTested = false; @@ -64,8 +69,16 @@ public class TestSpeechToText : UnitTest private bool _getCustomWordTested = false; private bool _deleteCustomWordTested = false; private bool _deleteCustomCorpusTested = false; - + private bool _getAcousticCustomizationsTested = false; + private bool _createAcousticCustomizationsTested = false; + private bool _getAcousticCustomizationTested = false; + private bool _trainAcousticCustomizationsTested = false; + private bool _resetAcousticCustomizationsTested = false; + private bool _getAcousticResourcesTested = false; + private bool _getAcousticResourceTested = false; + private bool _addAcousticResourcesTested = false; private bool _isCustomizationReady = false; + private bool _isAcousticCustomizationReady = false; private bool _readyToContinue = false; private float _delayTimeInSeconds = 10f; @@ -123,56 +136,58 @@ public override IEnumerator RunTest() _wavFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-audio.wav"; _audioClip = WaveFile.ParseWAV("testClip", File.ReadAllBytes(_wavFilePath)); - Log.Debug("ExampleSpeechToText", "Attempting to recognize"); + Runnable.Run(DownloadAcousticResource()); + + Log.Debug("TestSpeechToText", "Attempting to recognize"); _speechToText.Recognize(_audioClip, HandleOnRecognize); while (!_recognizeTested) yield return null; // Get models - Log.Debug("ExampleSpeechToText", "Attempting to get models"); + Log.Debug("TestSpeechToText", "Attempting to get models"); _speechToText.GetModels(HandleGetModels); while (!_getModelsTested) yield return null; // Get model - Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); + Log.Debug("TestSpeechToText", "Attempting to get model {0}", _modelNameToGet); _speechToText.GetModel(HandleGetModel, _modelNameToGet); while (!_getModelTested) yield return null; // Get customizations - Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); + Log.Debug("TestSpeechToText", "Attempting to get customizations"); _speechToText.GetCustomizations(HandleGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create customization - Log.Debug("ExampleSpeechToText", "Attempting create customization"); + Log.Debug("TestSpeechToText", "Attempting create customization"); _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); while (!_createCustomizationsTested) yield return null; // Get customization - Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); while (!_getCustomizationTested) yield return null; // Get custom corpora - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); while (!_getCustomCorporaTested) yield return null; // Add custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); string corpusData = File.ReadAllText(_customCorpusFilePath); _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; // Get custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_getCustomCorpusTested) yield return null; @@ -183,13 +198,13 @@ public override IEnumerator RunTest() yield return null; // Get custom words - Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); + Log.Debug("TestSpeechToText", "Attempting to get custom words."); _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); while (!_getCustomWordsTested) yield return null; // Add custom words from path - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + Log.Debug("TestSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); string customWords = File.ReadAllText(_customWordsFilePath); _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); while (!_addCustomWordsFromPathTested) @@ -224,7 +239,7 @@ public override IEnumerator RunTest() wordList.Add(w2); words.words = wordList.ToArray(); - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); while (!_addCustomWordsFromObjectTested) yield return null; @@ -236,13 +251,13 @@ public override IEnumerator RunTest() yield return null; // Get custom word - Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + Log.Debug("TestSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); while (!_getCustomWordTested) yield return null; // Train customization - Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); while (!_trainCustomizationTested) yield return null; @@ -254,57 +269,151 @@ public override IEnumerator RunTest() yield return null; // Upgrade customization - not currently implemented in service - //Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + //Log.Debug("TestSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); //while (!_upgradeCustomizationTested) // yield return null; // Delete custom word - Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + Log.Debug("TestSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); while (!_deleteCustomWordTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_deleteCustomCorpusTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Reset customization - Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); while (!_resetCustomizationTested) yield return null; + + // Delay + Log.Debug("TestSpeechToText", string.Format("Delaying continue for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; + + _readyToContinue = false; + + // List acoustic customizations + Log.Debug("TestSpeechToText", "Attempting to get acoustic customizations"); + _speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels); + while (!_getAcousticCustomizationsTested) + yield return null; + + // Create acoustic customization + Log.Debug("TestSpeechToText", "Attempting to create acoustic customization"); + _speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, _createdAcousticModelName); + while (!_createAcousticCustomizationsTested) + yield return null; + + // Get acoustic customization + Log.Debug("TestSpeechToText", "Attempting to get acoustic customization {0}", _createdAcousticModelId); + _speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, _createdAcousticModelId); + while (!_getAcousticCustomizationTested) + yield return null; + + while (!_isAudioLoaded) + yield return null; + + // Create acoustic resource + Log.Debug("TestSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); + string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); + _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); + while (!_addAcousticResourcesTested) + yield return null; + + // Wait for customization + _isAcousticCustomizationReady = false; + Runnable.Run(CheckAcousticCustomizationStatus(_createdAcousticModelId)); + while (!_isAcousticCustomizationReady) + yield return null; + + // List acoustic resources + Log.Debug("TestSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); + while (!_getAcousticResourcesTested) + yield return null; + + // Train acoustic customization + Log.Debug("TestSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); + _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId, null, true); + while (!_trainAcousticCustomizationsTested) + yield return null; + + // Get acoustic resource + Log.Debug("TestSpeechToText", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); + while (!_getAcousticResourceTested) + yield return null; + + // Wait for customization + _isAcousticCustomizationReady = false; + Runnable.Run(CheckAcousticCustomizationStatus(_createdAcousticModelId)); + while (!_isAcousticCustomizationReady) + yield return null; + + // Reset acoustic customization + Log.Debug("TestSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); + _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); + while (!_resetAcousticCustomizationsTested) + yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; + + // Delete acoustic resource + DeleteAcousticResource(); + + // Delay + Log.Debug("TestSpeechToText", string.Format("Delaying delete customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete customization - Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); - while (!_deleteCustomizationsTested) + + // Delay + Log.Debug("TestSpeechToText", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) + yield return null; + + // Delete acoustic customization + DeleteAcousticCustomization(); + + // Delay + Log.Debug("TestSpeechToText", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); + Runnable.Run(Delay(_delayTimeInSeconds)); + while (!_readyToContinue) yield return null; - Log.Debug("ExampleSpeechToText", "Speech to Text examples complete."); + Log.Debug("TestSpeechToText", "Speech to Text examples complete."); yield break; } @@ -312,7 +421,7 @@ public override IEnumerator RunTest() private void HandleGetModels(ModelSet result, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get models response: {0}", customData); _modelNameToGet = (result.models[UnityEngine.Random.Range(0, result.models.Length - 1)] as Model).name; Test(result != null); _getModelsTested = true; @@ -320,7 +429,7 @@ private void HandleGetModels(ModelSet result, string customData) private void HandleGetModel(Model model, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get model response: {0}", customData); Test(model != null); _getModelTested = true; } @@ -334,7 +443,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("TestSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -347,14 +456,14 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) private void HandleGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get customizations response: {0}", customData); Test(customizations != null); _getCustomizationsTested = true; } private void HandleCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Create customization response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Create customization response: {0}", customData); _createdCustomizationID = customizationID.customization_id; Test(customizationID != null); _createCustomizationsTested = true; @@ -362,7 +471,7 @@ private void HandleCreateCustomization(CustomizationID customizationID, string c private void HandleGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get customization response: {0}", customData); Test(customization != null); _getCustomizationTested = true; } @@ -371,16 +480,13 @@ private void HandleDeleteCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); _createdCustomizationID = default(string); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete customization!"); + Log.Debug("TestSpeechToText", "Failed to delete customization!"); } - Test(success); - - _deleteCustomizationsTested = true; } @@ -388,11 +494,11 @@ private void HandleTrainCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Trained customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Trained customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to train customization!"); + Log.Debug("TestSpeechToText", "Failed to train customization!"); } Test(success); @@ -403,11 +509,11 @@ private void HandleTrainCustomization(bool success, string customData) //{ // if (success) // { - // Log.Debug("ExampleSpeechToText", "Upgrade customization {0}!", _createdCustomizationID); + // Log.Debug("TestSpeechToText", "Upgrade customization {0}!", _createdCustomizationID); // } // else // { - // Log.Debug("ExampleSpeechToText", "Failed to upgrade customization!"); + // Log.Debug("TestSpeechToText", "Failed to upgrade customization!"); // } //Test(success); @@ -418,11 +524,11 @@ private void HandleResetCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Reset customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText", "Reset customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to reset customization!"); + Log.Debug("TestSpeechToText", "Failed to reset customization!"); } Test(success); @@ -431,7 +537,7 @@ private void HandleResetCustomization(bool success, string customData) private void HandleGetCustomCorpora(Corpora corpora, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get custom corpora response: {0}", customData); Test(corpora != null); _getCustomCorporaTested = true; } @@ -440,11 +546,11 @@ private void HandleDeleteCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - delete custom coprus response: succeeded!"); + Log.Debug("TestSpeechToText", "Speech to Text - delete custom coprus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus!"); + Log.Debug("TestSpeechToText", "Failed to delete custom corpus!"); } Test(success); @@ -455,11 +561,11 @@ private void HandleAddCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: succeeded!"); + Log.Debug("TestSpeechToText", "Speech to Text - Add custom corpus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to add custom corpus!"); + Log.Debug("TestSpeechToText", "Failed to add custom corpus!"); } Test(success); @@ -468,14 +574,14 @@ private void HandleAddCustomCorpus(bool success, string customData) private void HandleGetCustomCorpus(Corpus corpus, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get custom corpus response: {0}", customData); Test(corpus != null); _getCustomCorpusTested = true; } private void HandleGetCustomWords(WordsList wordList, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get custom words response: {0}", customData); Test(wordList != null); _getCustomWordsTested = true; } @@ -484,11 +590,11 @@ private void HandleAddCustomWordsFromPath(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from path response: succeeded!"); + Log.Debug("TestSpeechToText", "Speech to Text - Add custom words from path response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText", "Failed to delete custom word!"); } Test(success); @@ -499,11 +605,11 @@ private void HandleAddCustomWordsFromObject(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from object response: succeeded!"); + Log.Debug("TestSpeechToText", "Speech to Text - Add custom words from object response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText", "Failed to delete custom word!"); } Test(success); @@ -514,11 +620,11 @@ private void HandleDeleteCustomWord(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: succeeded!"); + Log.Debug("TestSpeechToText", "Speech to Text - Delete custom word response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText", "Failed to delete custom word!"); } Test(success); @@ -527,10 +633,77 @@ private void HandleDeleteCustomWord(bool success, string customData) private void HandleGetCustomWord(WordData word, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("TestSpeechToText", "Speech to Text - Get custom word response: {0}", customData); Test(word != null); _getCustomWordTested = true; } + + private void HandleGetCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) + { + Log.Debug("TestSpeechToText", "acousticCustomizations: {0}", customData); + Test(acousticCustomizations != null); + _getAcousticCustomizationsTested = true; + } + + private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) + { + Log.Debug("TestSpeechToText", "customizationId: {0}", customData); + _createdAcousticModelId = customizationID.customization_id; + Test(!string.IsNullOrEmpty(_createdAcousticModelId)); + _createAcousticCustomizationsTested = true; + } + + private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) + { + Log.Debug("TestSpeechToText", "acousticCustomization: {0}", customData); + Test(acousticCustomization != null); + _getAcousticCustomizationTested = true; + } + + private void HandleTrainAcousticCustomization(bool success, string customData) + { + Log.Debug("TestSpeechToText", "train customization success: {0}", success); + Test(success); + _trainAcousticCustomizationsTested = true; + } + + private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) + { + Log.Debug("TestSpeechToText", "audioResources: {0}", customData); + Test(audioResources != null); + _getAcousticResourcesTested = true; + } + + private void HandleAddAcousticResource(string customData) + { + Log.Debug("TestSpeechToText", "added acoustic resource: {0}", customData); + Test(!string.IsNullOrEmpty(customData)); + _addAcousticResourcesTested = true; + } + + private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) + { + Log.Debug("TestSpeechToText", "audioListing: {0}", customData); + Test(audioListing != null); + _getAcousticResourceTested = true; + } + + private void HandleResetAcousticCustomization(bool success, string customData) + { + Log.Debug("TestSpeechToText", "reset customization success: {0}", success); + Test(success); + _resetAcousticCustomizationsTested = true; + } + + private void HandleDeleteAcousticResource(bool success, string customData) + { + Log.Debug("TestSpeechToText", "deleted acoustic resource: {0}", success); + } + + private void HandleDeleteAcousticCustomization(bool success, string customData) + { + Log.Debug("TestSpeechToText", "deleted acoustic customization: {0}", success); + } private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) { @@ -557,10 +730,58 @@ private void OnCheckCustomizationStatus(Customization customization, string cust } } + private IEnumerator CheckAcousticCustomizationStatus(string customizationID, float delay = 0.1f) + { + Log.Debug("TestSpeechToText", "Checking acoustic customization status in {0} seconds...", delay.ToString()); + yield return new WaitForSeconds(delay); + + // passing customizationID in custom data + _speechToText.GetCustomAcousticModel(OnCheckAcousticCustomizationStatus, customizationID, customizationID); + } + + private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCustomization, string customData) + { + if (acousticCustomization != null) + { + Log.Debug("TestSpeechToText", "Acoustic customization status: {0}", acousticCustomization.status); + if (acousticCustomization.status != "ready" && acousticCustomization.status != "available") + Runnable.Run(CheckAcousticCustomizationStatus(customData, 5f)); + else + _isAcousticCustomizationReady = true; + } + else + { + Log.Debug("TestSpeechToText", "Check acoustic customization status failed!"); + } + } + private IEnumerator Delay(float delayTime) { yield return new WaitForSeconds(delayTime); _readyToContinue = true; } + + private IEnumerator DownloadAcousticResource() + { + Log.Debug("TestSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); + WWW www = new WWW(_acousticResourceUrl); + yield return www; + + Log.Debug("TestSpeechToText", "acoustic resource downloaded"); + _acousticResourceData = www.bytes; + _isAudioLoaded = true; + } + + private void DeleteAcousticResource() + { + Log.Debug("TestSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); + } + + private void DeleteAcousticCustomization() + { + Log.Debug("TestSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); + } } } From 4b2dc5828c12e541e605477a05a5349f3d721034 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Wed, 25 Oct 2017 16:53:05 -0500 Subject: [PATCH 029/100] update stt readme --- Scripts/Services/SpeechToText/v1/README.md | 223 +++++++++++++++++++++ 1 file changed, 223 insertions(+) diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md index 4354f1cc3..693bba898 100755 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -476,4 +476,227 @@ private void HandleDeleteCustomWord(bool success, string customData) } ``` + + +### List custom acoustic models +Lists information about all custom acoustic models that are owned by an instance of the service. Use the `language` parameter to see all custom acoustic models for the specified language; omit the parameter to see all custom acoustic models for all languages. You must use credentials for the instance of the service that owns a model to list information about it. +```cs +private void ListCustomAcousticModels() +{ + if(!_speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels)) + Log.Debug("ExampleSpeechToText", "Failed to list custom acoustic models"); +} + +private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) +{ + Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); +} +``` + + + + +### Create custom acoustic model +Creates a new custom acoustic model for a specified base model. The custom acoustic model can be used only with the base model for which it is created. The model is owned by the instance of the service whose credentials are used to create it. +```cs +private void CreateAcousticCustomization() +{ + if(!_speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, "")) + Log.Debug("ExampleSpeechToText", "Failed to create acoustic customization"); +} + +private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) +{ + Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); +} + +``` + + + + + +### Delete custom acoustic model +Deletes an existing custom acoustic model. The custom model cannot be deleted if another request, such as adding an audio resource to the model, is currently being processed. You must use credentials for the instance of the service that owns a model to delete it. +```cs +private void DeleteAcousticCustomization() +{ + if(!_speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, "")) + Log.Debug("ExampleSpeechToText", "Failed to delete acoustic customization"); +} + +private void HandleDeleteAcousticCustomization(bool success, string customData) +{ + Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); +} +``` + + + + + +### Get details about a custom acoustic model +Lists information about a specified custom acoustic model. You must use credentials for the instance of the service that owns a model to list information about it. +```cs +private void GetCustomAcousticModel() +{ + if(!_speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, "")) + Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic model"); +} + +private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) +{ + Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); +} +``` + + + + + +### Train a custom acoustic model +Initiates the training of a custom acoustic model with new or changed audio resources. After adding or deleting audio resources for a custom acoustic model, use this method to begin the actual training of the model on the latest audio data. The custom acoustic model does not reflect its changed data until you train it. You must use credentials for the instance of the service that owns a model to train it. + +The training method is asynchronous. It can take on the order of minutes or hours to complete depending on the total amount of audio data on which the model is being trained and the current load on the service. Typically, training takes approximately twice the length of the total audio contained in the custom model. The method returns an HTTP 200 response code to indicate that the training process has begun. + +You can monitor the status of the training by using the `GET /v1/acoustic_customizations/{customization_id}` method to poll the model's status. Use a loop to check the status once a minute. The method returns an `AcousticCustomization` object that includes `status` and `progress` fields. A status of `available` indicates that the custom model is trained and ready to use. The service cannot accept subsequent training requests, or requests to add new audio resources, until the existing request completes. + +You can use the optional `custom_language_model_id` query parameter to specify the GUID of a separately created custom language model that is to be used during training. Specify a custom language model if you have verbatim transcriptions of the audio files that you have added to the custom model or you have either corpora (text files) or a list of words that are relevant to the contents of the audio files. For information about creating a separate custom language model, see [Creating a custom language model][creating-a-custom-language-model]. + +Training can fail to start for the following reasons: +* The service is currently handling another request for the custom model, such as another training request or a request to add audio resources to the model. +* The custom model contains less than 10 minutes or more than 50 hours of audio data. +* One or more of the custom model's audio resources is invalid. +```cs +private void TrainAcousticCustomization() +{ + if(!_speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, "", "", "")) + Log.Debug("ExampleSpeechToText", "Failed to train acoustic customization"); +} + +private void HandleTrainAcousticCustomization(bool success, string customData) +{ + Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); +} +``` + + + + + +### Reset a custom acoustic model +Resets a custom acoustic model by removing all audio resources from the model. Resetting a custom acoustic model initializes the model to its state when it was first created. Metadata such as the name and language of the model are preserved, but the model's audio resources are removed and must be re-created. You must use credentials for the instance of the service that owns a model to reset it. +```cs +private void ResetAcousticCustomization() +{ + if(!_speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, "")) + Log.Debug("ExampleSpeechToText", "Failed to reset acoustic customizations"); +} + +private void HandleResetAcousticCustomization(bool success, string customData) +{ + Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); +} +``` + + + + + +### List information about a custom acoustic model's audio resources +Lists information about all audio resources from a custom acoustic model. The information includes the name of the resource and information about its audio data, such as its duration. It also includes the status of the audio resource, which is important for checking the service's analysis of the resource in response to a request to add it to the custom acoustic model. You must use credentials for the instance of the service that owns a model to list its audio resources. +```cs +private void GetCustomAcousticResources() +{ + if(!_speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, "")) + Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resources"); +} + +private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) +{ + Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); +} +``` + + + + + +### Delete an audio resource from a custom acoustic model +Deletes an existing audio resource from a custom acoustic model. Deleting an archive-type audio resource removes the entire archive of files; the current interface does not allow deletion of individual files from an archive resource. Removing an audio resource does not affect the custom model until you train the model on its updated data by using the `POST /v1/acoustic_customizations/{customization_id}/train` method. You must use credentials for the instance of the service that owns a model to delete its audio resources. +```cs +private void DeleteAcousticResource() +{ + if(!_speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, "", "")) + Log.Debug("ExampleSpeechToText", "Failed to delete acoustic resource"); +} + +private void HandleDeleteAcousticResource(bool success, string customData) +{ + Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); +} +``` + + + + + +### Get information about an audio resource associated with a custom acoustic model +Lists information about an audio resource from a custom acoustic model. The method returns an `AudioListing` object whose fields depend on the type of audio resource you specify with the method's `audio_name` parameter: +For an audio-type resource, the object's fields match those of an `AudioResource` object: `duration`, `name`, `details`, and `status`. + +For an archive-type resource, the object includes a `container` field whose fields match those of an `AudioResource` object. It also includes an `audio` field, which contains an array of `AudioResource` objects that provides information about the audio files that are contained in the archive. + +The information includes the status of the specified audio resource, which is important for checking the service's analysis of the resource in response to a request to add it to the custom model. You must use credentials for the instance of the service that owns a model to list its audio resources. +```cs +private void GetCustomAcousticResource() +{ + if(!_speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, "", "")) + Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resource"); +} + +private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) +{ + Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); +} +``` + + + + + +### Add an audio resource to a custom acoustic model +Adds an audio resource to a custom acoustic model. Add audio content that reflects the acoustic characteristics of the audio that you plan to transcribe. You must use credentials for the instance of the service that owns a model to add an audio resource to it. Adding audio data does not affect the custom acoustic model until you train the model for the new data by using the `POST /v1/acoustic_customizations/{customization_id}/train` method. + +You can add individual audio files or an archive file that contains multiple audio files. Adding multiple audio files via a single archive file is significantly more efficient than adding each file individually. +You can add an individual audio file in any format that the service supports for speech recognition. Use the `Content-Type` header to specify the format of the audio file. + +You can add an archive file (**.zip** or **.tar.gz** file) that contains audio files in any format that the service supports for speech recognition. All audio files added with the same archive file must have the same audio format. Use the `Content-Type` header to specify the archive type, `application/zip` or `application/gzip`. Use the `Contained-Content-Type` header to specify the format of the contained audio files; the default format is `audio/wav`. + +You can use this method to add any number of audio resources to a custom model by calling the method once for each audio or archive file. But the addition of one audio resource must be fully complete before you can add another. You must add a minimum of 10 minutes and a maximum of 50 hours of audio that includes speech, not just silence, to a custom acoustic model before you can train it. No audio resource, audio- or archive-type, can be larger than 100 MB. + +The method is asynchronous. It can take several seconds to complete depending on the duration of the audio and, in the case of an archive file, the total number of audio files being processed. The service returns a 201 response code if the audio is valid. It then asynchronously analyzes the contents of the audio file or files and automatically extracts information about the audio such as its length, sampling rate, and encoding. You cannot submit requests to add additional audio resources to a custom acoustic model, or to train the model, until the service's analysis of all audio files for the current request completes. + +To determine the status of the service's analysis of the audio, use the `GET /v1/acoustic_customizations/{customization_id}/audio/{audio_name}` method to poll the status of the audio. The method accepts the GUID of the custom model and the name of the audio resource, and it returns the status of the resource. Use a loop to check the status of the audio every few seconds until it becomes `ok`. + +**Note:** The sampling rate of an audio file must match the sampling rate of the base model for the custom model: for broadband models, at least 16 kHz; for narrowband models, at least 8 kHz. If the sampling rate of the audio is higher than the minimum required rate, the service down-samples the audio to the appropriate rate. If the sampling rate of the audio is lower than the minimum required rate, the service labels the audio file as `invalid`. +```cs +private void AddAcousticResource() +{ + string mimeType = Utility.GetMimeType(Path.GetExtension("")); + if(!_speechToText.AddAcousticResource(HandleAddAcousticResource, "", "", mimeType, mimeType, true, "") + Log.Debug("ExampleSpeechToText", "Failed to add acoustic resource"); +} + +private void HandleAddAcousticResource(string customData) +{ + Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); +} +``` + + + + + [speech-to-text]: https://console.bluemix.net/docs/services/speech-to-text/index.html +[creating-a-custom-language-model]: https://console.bluemix.net/docs/services/speech-to-text/language-create.html \ No newline at end of file From 0eaaf21806a31aea4765d6cee96b956c670ed12e Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Sat, 28 Oct 2017 08:57:54 -0500 Subject: [PATCH 030/100] changed Debug.Log to Log.Debug in ExampleLanguageTranslation and Runnable --- .../ServiceExamples/Scripts/ExampleLanguageTranslation.cs | 5 +++-- Scripts/Utilities/Runnable.cs | 4 ++-- ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta | 8 -------- 3 files changed, 5 insertions(+), 12 deletions(-) delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs index 81dbcd414..eb5b4b35d 100644 --- a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs +++ b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs @@ -18,6 +18,7 @@ using UnityEngine; using IBM.Watson.DeveloperCloud.Services.LanguageTranslation.v2; using IBM.Watson.DeveloperCloud.Utilities; +using IBM.Watson.DeveloperCloud.Logging; public class ExampleLanguageTranslation : MonoBehaviour { @@ -33,13 +34,13 @@ void Start() Credentials credentials = new Credentials(_username, _password, _url); _languageTranslation = new LanguageTranslation(credentials); - Debug.Log("English Phrase to translate: " + _pharseToTranslate); + Log.Debug("ExampleLangaugeTranslation", "English Phrase to translate: " + _pharseToTranslate); _languageTranslation.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation); } private void OnGetTranslation(Translations translation, string customData) { if (translation != null && translation.translations.Length > 0) - Debug.Log("Spanish Translation: " + translation.translations[0].translation); + Log.Debug("ExampleLangaugeTranslation", "Spanish Translation: " + translation.translations[0].translation); } } diff --git a/Scripts/Utilities/Runnable.cs b/Scripts/Utilities/Runnable.cs index bbc1c2a6c..7bc2e111e 100644 --- a/Scripts/Utilities/Runnable.cs +++ b/Scripts/Utilities/Runnable.cs @@ -117,7 +117,7 @@ public Routine(IEnumerator a_enumerator) Runnable.Instance._routines[ID] = this; #if ENABLE_RUNNABLE_DEBUGGING - Debug.Log( string.Format("Coroutine {0} started.", ID ) ); + Log.Debug("Runnable", "Coroutine {0} started.", ID ); #endif } @@ -133,7 +133,7 @@ public bool MoveNext() { Runnable.Instance._routines.Remove(ID); // remove from the mapping #if ENABLE_RUNNABLE_DEBUGGING - Debug.Log( string.Format("Coroutine {0} stopped.", ID ) ); + Log.Debug("Runnable", "Coroutine {0} stopped.", ID ); #endif } diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta deleted file mode 100644 index a7e986208..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0fbe68503a01cc440bbbf2f8130640f2 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From 09b7810ae671b97435c45a090c8d22816968d52f Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Sat, 28 Oct 2017 09:06:01 -0500 Subject: [PATCH 031/100] standardize log subsystems in readme --- Scripts/Services/AlchemyAPI/v1/README.md | 2 +- Scripts/Services/Discovery/v1/README.md | 56 +++++++++---------- .../Services/LanguageTranslation/v2/README.md | 28 +++++----- .../Services/LanguageTranslator/v2/README.md | 28 +++++----- .../NaturalLanguageUnderstanding/v1/README.md | 12 ++-- 5 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Scripts/Services/AlchemyAPI/v1/README.md b/Scripts/Services/AlchemyAPI/v1/README.md index ebb005e9b..f88b93810 100644 --- a/Scripts/Services/AlchemyAPI/v1/README.md +++ b/Scripts/Services/AlchemyAPI/v1/README.md @@ -22,7 +22,7 @@ You can extract Authors from a URL or HTML source. private void GetAuthors() { if(!_alchemyApi.GetAuthors(OnGetAuthors, )) - Log.Debug("Failed to get authors"); + Log.Debug("ExampleAlchemyLanguage", "Failed to get authors"); } private void OnGetAuthors(AuthorsData authors, string data) diff --git a/Scripts/Services/Discovery/v1/README.md b/Scripts/Services/Discovery/v1/README.md index 5b0dcb04c..daf810f35 100755 --- a/Scripts/Services/Discovery/v1/README.md +++ b/Scripts/Services/Discovery/v1/README.md @@ -27,12 +27,12 @@ Creates an environment for the service instance. Note: You can create only one e private void CreateEnvironment() { if (!_discovery.AddEnvironment(OnAddEnvironment, , , )) - Log.Debug("ExampleDiscoveryV1", "Failed to add environment"); + Log.Debug("ExampleDiscovery", "Failed to add environment"); } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - AddEnvironment Response: {0}", data); } ``` @@ -47,12 +47,12 @@ List existing environments for the service instance. private void GetEnvironments() { if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environments"); + Log.Debug("ExampleDiscovery", "Failed to get environments"); } private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - GetEnvironments Response: {0}", data); } ``` @@ -67,12 +67,12 @@ Gets detailed information about the specified environment. private void GetEnvironment() { if (!_discovery.GetEnvironment(OnGetEnvironment, )) - Log.Debug("ExampleDiscoveryV1", "Failed to get environment"); + Log.Debug("ExampleDiscovery", "Failed to get environment"); } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - GetEnvironment Response: {0}", data); } ``` @@ -88,12 +88,12 @@ Deletes an existing environment. private void DeleteEnvironment() { if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, )) - Log.Debug("ExampleDiscoveryV1", "Failed to delete environment"); + Log.Debug("ExampleDiscovery", "Failed to delete environment"); } private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteEnvironment Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery", "Discovery - DeleteEnvironment Response: deleted:{0}", success); } ``` @@ -108,12 +108,12 @@ Adds a configuration to the service instance. private void AddConfiguration() { if (!_discovery.AddConfiguration(OnAddConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to add configuration"); + Log.Debug("ExampleDiscovery", "Failed to add configuration"); } private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - AddConfiguration Response: {0}", data); } ``` @@ -128,12 +128,12 @@ Lists existing configurations for the service instance. private void GetConfigurations() { if (!_discovery.GetConfigurations(OnGetConfigurations, )) - Log.Debug("ExampleDiscoveryV1", "Failed to get configurations"); + Log.Debug("ExampleDiscovery", "Failed to get configurations"); } private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - GetConfigurations Response: {0}", data); } ``` @@ -148,12 +148,12 @@ Get information about the specified configuration. private void GetConfiguration() { if (!_discovery.GetConfiguration(OnGetConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to get configuration"); + Log.Debug("ExampleDiscovery", "Failed to get configuration"); } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - GetConfiguration Response: {0}", data); } ``` @@ -168,12 +168,12 @@ Runs a sample document through the default or your configuration and returns dia private void PreviewConfiguration() { if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, , , null, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to preview configuration"); + Log.Debug("ExampleDiscovery", "Failed to preview configuration"); } private void OnPreviewConfiguration(TestDocument resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Preview configuration Response: {0}", data); } ``` @@ -190,12 +190,12 @@ The delete operation is performed unconditionally. A delete request succeeds eve private void DeleteConfiguration() { if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to delete configuration"); + Log.Debug("ExampleDiscovery", "Failed to delete configuration"); } private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteConfiguration Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery", "Discovery - DeleteConfiguration Response: deleted:{0}", success); } ``` @@ -215,7 +215,7 @@ private void AddCollection() private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Add collection Response: {0}", data); } ``` @@ -235,7 +235,7 @@ private void GetCollections() private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletions Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Get colletions Response: {0}", data); } ``` @@ -255,7 +255,7 @@ private void GetCollection() private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Get colletion Response: {0}", data); } ``` @@ -275,7 +275,7 @@ private void GetFields() private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Get fields Response: {0}", data); } ``` @@ -295,7 +295,7 @@ private void DeleteCollection() private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery", "Discovery - Delete collection Response: deleted:{0}", success); } ``` @@ -316,7 +316,7 @@ private void AddDocument() private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Add document Response: {0}", data); } ``` @@ -337,7 +337,7 @@ private void UpdateDocument() private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Update document Response: {0}", data); } ``` @@ -358,7 +358,7 @@ private void GetDocument() private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Get document Response: {0}", data); } ``` @@ -378,7 +378,7 @@ private void DeleteDocument() private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery", "Discovery - Delete document Response: deleted:{0}", success); } ``` @@ -400,7 +400,7 @@ private void Query() private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery", "Discovery - Query Response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md index 3b38ef81c..a3d131277 100755 --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslation.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslation", "Failed to get models."); + Log.Debug("ExampleLanguageTranslation", "Failed to get models."); } private void OnGetModels(TranslationModels models, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get models response: {0}", customData); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslation.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslation", "Failed to create model."); + Log.Debug("ExampleLanguageTranslation", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Create model response: {0}", customData); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslation.GetModel(OnGetModel, )) - Log.Debug("TestLanguageTranslation", "Failed to get model."); + Log.Debug("ExampleLanguageTranslation", "Failed to get model."); } private void OnGetModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get model response: {0}", customData); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslation.DeleteModel(OnDeleteModel, )) - Log.Debug("TestLanguageTranslation", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslation", "Failed to delete model."); } private void OnDeleteModel(bool success, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslation.GetTranslation(, , , OnGetTranslation)) - Log.Debug("TestLanguageTranslation", "Failed to translate."); + Log.Debug("ExampleLanguageTranslation", "Failed to translate."); } private void OnGetTranslation(Translations translation, string customData) { - Log.Debug("TestLanguageTranslation", "Langauge Translation - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Langauge Translation - Translate Response: {0}", customData); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslation.Identify(OnIdentify, )) - Log.Debug("TestLanguageTranslation", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslation", "Failed to identify language."); } private void OnIdentify(string lang, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Identify response: {0}", customData); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslation.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslation", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslation", "Failed to get languages."); } private void OnGetLanguages(Languages languages, string customData) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get languages response: {0}", customData); } ``` diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md index eb1d0432a..81b90d2ba 100755 --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslator", "Failed to get models."); + Log.Debug("ExampleLanguageTranslator", "Failed to get models."); } private void OnGetModels(TranslationModels models, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get models response: {0}", customData); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslator.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("ExampleLanguageTranslator", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Create model response: {0}", customData); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslator.GetModel(OnGetModel, )) - Log.Debug("TestLanguageTranslator", "Failed to get model."); + Log.Debug("ExampleLanguageTranslator", "Failed to get model."); } private void OnGetModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get model response: {0}", customData); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslator.DeleteModel(OnDeleteModel, )) - Log.Debug("TestLanguageTranslator", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslator", "Failed to delete model."); } private void OnDeleteModel(bool success, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslator.GetTranslation(, , , OnGetTranslation)) - Log.Debug("TestLanguageTranslator", "Failed to translate."); + Log.Debug("ExampleLanguageTranslator", "Failed to translate."); } private void OnGetTranslation(Translations translation, string customData) { - Log.Debug("TestLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslator.Identify(OnIdentify, )) - Log.Debug("TestLanguageTranslator", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslator", "Failed to identify language."); } private void OnIdentify(string lang, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Identify response: {0}", customData); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslator", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslator", "Failed to get languages."); } private void OnGetLanguages(Languages languages, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get languages response: {0}", customData); } ``` diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md index d8a5fc0be..e482e0f03 100755 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -26,12 +26,12 @@ Analyze features of natural language content. private void Analyze() { if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, )) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); } private void OnAnalyze(AnalysisResults resp, string customData) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "AnalysisResults: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding", "AnalysisResults: {0}", customData.ToString()); } ``` @@ -43,12 +43,12 @@ List available custom models. private void GetModels() { if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); } private void OnGetModels(ListModelsResults resp, string customData) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "ListModelsResult: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding", "ListModelsResult: {0}", customData.ToString()); } ``` @@ -60,12 +60,12 @@ Delete a custom model. private void DeleteModel() { if (!_naturalLanguageUnderstanding.DeleteModel(OnDeleteModel, )) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to delete model."); + Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to delete model."); } private void OnDeleteModel(bool success, string customData) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "DeleteModelResult: {0}", success); + Log.Debug("ExampleNaturalLanguageUnderstanding", "DeleteModelResult: {0}", success); } ``` From 2b46712abf29eec8b9499fc64c7a1a98e275b624 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Sat, 28 Oct 2017 09:12:00 -0500 Subject: [PATCH 032/100] standardize debug statments to only print data --- .../Services/LanguageTranslation/v2/README.md | 26 +++--- .../Services/LanguageTranslator/v2/README.md | 26 +++--- .../NaturalLanguageUnderstanding/v1/README.md | 10 +-- Scripts/Services/RetrieveAndRank/v1/README.md | 32 ++++---- Scripts/Services/SpeechToText/v1/README.md | 80 +++++++++---------- Scripts/Services/TextToSpeech/v1/README.md | 36 ++++----- .../Services/TradeoffAnalytics/v1/README.md | 2 +- .../Services/VisualRecognition/v3/README.md | 50 ++++++------ 8 files changed, 131 insertions(+), 131 deletions(-) diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md index a3d131277..5d2e4adbc 100755 --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -31,9 +31,9 @@ private void GetModels() Log.Debug("ExampleLanguageTranslation", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string customData) +private void OnGetModels(TranslationModels models, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get models response: {0}", data); } ``` @@ -50,9 +50,9 @@ private void CreateModel() Log.Debug("ExampleLanguageTranslation", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string customData) +private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Create model response: {0}", data); } ``` @@ -69,9 +69,9 @@ private void GetModel() Log.Debug("ExampleLanguageTranslation", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string customData) +private void OnGetModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get model response: {0}", data); } ``` @@ -88,7 +88,7 @@ private void DeleteModel() Log.Debug("ExampleLanguageTranslation", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { Log.Debug("ExampleLanguageTranslation", "Language Translation - Delete model response: success: {0}", success); } @@ -107,9 +107,9 @@ private void Translate() Log.Debug("ExampleLanguageTranslation", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string customData) +private void OnGetTranslation(Translations translation, string data) { - Log.Debug("ExampleLanguageTranslation", "Langauge Translation - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Langauge Translation - Translate Response: {0}", data); } ``` @@ -125,9 +125,9 @@ private void Identify() Log.Debug("ExampleLanguageTranslation", "Failed to identify language."); } -private void OnIdentify(string lang, string customData) +private void OnIdentify(string lang, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Identify response: {0}", data); } ``` @@ -144,9 +144,9 @@ private void GetLanguages() Log.Debug("ExampleLanguageTranslation", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string customData) +private void OnGetLanguages(Languages languages, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslation", "Language Translation - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md index 81b90d2ba..eb0c0eac9 100755 --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -31,9 +31,9 @@ private void GetModels() Log.Debug("ExampleLanguageTranslator", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string customData) +private void OnGetModels(TranslationModels models, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get models response: {0}", data); } ``` @@ -50,9 +50,9 @@ private void CreateModel() Log.Debug("ExampleLanguageTranslator", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string customData) +private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Create model response: {0}", data); } ``` @@ -69,9 +69,9 @@ private void GetModel() Log.Debug("ExampleLanguageTranslator", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string customData) +private void OnGetModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get model response: {0}", data); } ``` @@ -88,7 +88,7 @@ private void DeleteModel() Log.Debug("ExampleLanguageTranslator", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { Log.Debug("ExampleLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); } @@ -107,9 +107,9 @@ private void Translate() Log.Debug("ExampleLanguageTranslator", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string customData) +private void OnGetTranslation(Translations translation, string data) { - Log.Debug("ExampleLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Langauge Translator - Translate Response: {0}", data); } ``` @@ -125,9 +125,9 @@ private void Identify() Log.Debug("ExampleLanguageTranslator", "Failed to identify language."); } -private void OnIdentify(string lang, string customData) +private void OnIdentify(string lang, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Identify response: {0}", data); } ``` @@ -144,9 +144,9 @@ private void GetLanguages() Log.Debug("ExampleLanguageTranslator", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string customData) +private void OnGetLanguages(Languages languages, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslator", "Language Translator - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md index e482e0f03..4296df235 100755 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -29,9 +29,9 @@ private void Analyze() Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); } -private void OnAnalyze(AnalysisResults resp, string customData) +private void OnAnalyze(AnalysisResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstanding", "AnalysisResults: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding", "AnalysisResults: {0}", data); } ``` @@ -46,9 +46,9 @@ private void GetModels() Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); } -private void OnGetModels(ListModelsResults resp, string customData) +private void OnGetModels(ListModelsResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstanding", "ListModelsResult: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding", "ListModelsResult: {0}", data); } ``` @@ -63,7 +63,7 @@ private void DeleteModel() Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { Log.Debug("ExampleNaturalLanguageUnderstanding", "DeleteModelResult: {0}", success); } diff --git a/Scripts/Services/RetrieveAndRank/v1/README.md b/Scripts/Services/RetrieveAndRank/v1/README.md index 0d7167937..62f473530 100755 --- a/Scripts/Services/RetrieveAndRank/v1/README.md +++ b/Scripts/Services/RetrieveAndRank/v1/README.md @@ -31,7 +31,7 @@ void GetClusters() private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusters results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetClusters results: {0}", data); } ``` @@ -47,7 +47,7 @@ void CreateCluster() private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateCluster results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "CreateCluster results: {0}", data); } ``` @@ -80,7 +80,7 @@ void GetCluster() private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetCluster results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetCluster results: {0}", data); } ``` @@ -96,7 +96,7 @@ void GetClusterConfigs() private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfigs results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetClusterConfigs results: {0}", data); } ``` @@ -128,7 +128,7 @@ void GetClusterConfig() private void OnGetClusterConfig(byte[] respData, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetClusterConfig results: {0}", data); } ``` @@ -143,7 +143,7 @@ void SaveClusterConfig() private void OnSaveConfig(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "SaveClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "SaveClusterConfig results: {0}", data); } ``` @@ -159,7 +159,7 @@ void UploadClusterConfig() private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "UploadClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "UploadClusterConfig results: {0}", data); } ``` @@ -175,7 +175,7 @@ void ListCollections() private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data); } ``` @@ -191,7 +191,7 @@ void CreateCollection() private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data); } ``` @@ -207,7 +207,7 @@ void DeleteCollection() private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteCollection results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "DeleteCollection results: {0}", data); } ``` @@ -227,7 +227,7 @@ void IndexDocuments() private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "IndexDocuments results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "IndexDocuments results: {0}", data); } ``` @@ -250,7 +250,7 @@ void Search() private void OnSearch(SearchResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Search results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "Search results: {0}", data); } ``` @@ -266,7 +266,7 @@ void GetRankers() private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRankers results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetRankers results: {0}", data); } ``` @@ -284,7 +284,7 @@ void CreateRanker() private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateRanker results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "CreateRanker results: {0}", data); } ``` @@ -302,7 +302,7 @@ void Rank() private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Rank results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "Rank results: {0}", data); } ``` @@ -334,7 +334,7 @@ void GetRanker() private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRanker results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank", "GetRanker results: {0}", data); } ``` [retrieve-and-rank-service]: https://www.ibm.com/watson/services/retrieve-and-rank/ diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md index 693bba898..b052e3d22 100755 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -43,9 +43,9 @@ private void GetModels() Log.Debug("ExampleSpeechToText", "Failed to get models"); } -private void HandleGetModels(ModelSet result, string customData) +private void HandleGetModels(ModelSet result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", data); } ``` @@ -61,9 +61,9 @@ private void GetModel() Log.Debug("ExampleSpeechToText", "Failed to get model"); } -private void HandleGetModel(Model result, string customData) +private void HandleGetModel(Model result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", data); } ``` @@ -166,9 +166,9 @@ private void GetCustomizations() Log.Debug("ExampleSpeechToText", "Failed to get customizations"); } -private void HandleGetCustomizations(Customizations customizations, string customData) +private void HandleGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", data); } ``` @@ -184,9 +184,9 @@ private void GetCustomization() Log.Debug("ExampleSpeechToText", "Failed to get customization"); } -private void HandleGetCustomization(Customization customization, string customData) +private void HandleGetCustomization(Customization customization, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", data); } ``` @@ -202,9 +202,9 @@ private void CreateModel() Log.Debug("ExampleSpeechToText", "Failed to create custom model"); } -private void HandleCreateCustomization(CustomizationID customizationID, string customData) +private void HandleCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", data); } ``` @@ -220,7 +220,7 @@ private void TrainModel() Log.Debug("ExampleSpeechToText", "Failed to train custom model"); } -private void HandleTrainCustomization(bool success, string customData) +private void HandleTrainCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Train model response: {0}", success); } @@ -239,7 +239,7 @@ private void ResetModel() Log.Debug("ExampleSpeechToText", "Failed to train custom model"); } -private void HandleResetCustomization(bool success, string customData) +private void HandleResetCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Reset model response: {0}", success); } @@ -257,7 +257,7 @@ private void UpgradeModel() Log.Debug("ExampleSpeechToText", "Failed to train custom model"); } -private void HandleUpgradeCustomizationh(bool success, string customData) +private void HandleUpgradeCustomizationh(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Upgrade model response: {0}", success); } @@ -275,7 +275,7 @@ private void DeleteModel() Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); } -private void HandleDeleteCustomization(bool success, string customData) +private void HandleDeleteCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Delete model response: {0}", success); } @@ -294,7 +294,7 @@ private void AddCustomCorpus() Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); } -private void HandleAddCustomCorpus(bool success, string customData) +private void HandleAddCustomCorpus(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: {0}", success); } @@ -313,7 +313,7 @@ private void GetCorpora() Log.Debug("ExampleSpeechToText", "Failed to get custom corpora"); } -private void HandleGetCustomCorpora(Corpora corpora, string customData) +private void HandleGetCustomCorpora(Corpora corpora, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customdData); } @@ -332,7 +332,7 @@ private void GetCorpus() Log.Debug("ExampleSpeechToText", "Failed to get custom corpus"); } -private void HandleGetCustomCorpus(Corpus corpus, string customData) +private void HandleGetCustomCorpus(Corpus corpus, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customdData); } @@ -351,7 +351,7 @@ private void DeleteCorpus() Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus"); } -private void HandleDeleteCustomCorpus(bool success, string customData) +private void HandleDeleteCustomCorpus(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom corpus response: {0}", success); } @@ -412,7 +412,7 @@ private void AddCustomWordsUsingFile() Log.Debug("ExampleSpeechToText", "Failed to add custom words"); } -private void HandleAddCustomCorpus(bool success, string customData) +private void HandleAddCustomCorpus(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words response: {0}", success); } @@ -430,9 +430,9 @@ private void GetCustomWords() Log.Debug("ExampleSpeechToText", "Failed to get custom words"); } -private void HandleGetCustomWords(WordsList wordList, string customData) +private void HandleGetCustomWords(WordsList wordList, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", data); } ``` @@ -449,9 +449,9 @@ private void GetCustomWord() Log.Debug("ExampleSpeechToText", "Failed to get custom word"); } -private void HandleGetCustomWord(WordData word, string customData) +private void HandleGetCustomWord(WordData word, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", data); } ``` @@ -470,7 +470,7 @@ private void DeleteCustomWord() Log.Debug("ExampleSpeechToText", "Failed to delete custom word"); } -private void HandleDeleteCustomWord(bool success, string customData) +private void HandleDeleteCustomWord(bool success, string data) { Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: {0}", success); } @@ -487,9 +487,9 @@ private void ListCustomAcousticModels() Log.Debug("ExampleSpeechToText", "Failed to list custom acoustic models"); } -private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) +private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); + Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", data); } ``` @@ -505,9 +505,9 @@ private void CreateAcousticCustomization() Log.Debug("ExampleSpeechToText", "Failed to create acoustic customization"); } -private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) +private void HandleCreateAcousticCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); + Log.Debug("ExampleSpeechToText", "customizationId: {0}", data); } ``` @@ -525,7 +525,7 @@ private void DeleteAcousticCustomization() Log.Debug("ExampleSpeechToText", "Failed to delete acoustic customization"); } -private void HandleDeleteAcousticCustomization(bool success, string customData) +private void HandleDeleteAcousticCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); } @@ -544,9 +544,9 @@ private void GetCustomAcousticModel() Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic model"); } -private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) +private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); + Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", data); } ``` @@ -574,7 +574,7 @@ private void TrainAcousticCustomization() Log.Debug("ExampleSpeechToText", "Failed to train acoustic customization"); } -private void HandleTrainAcousticCustomization(bool success, string customData) +private void HandleTrainAcousticCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); } @@ -593,7 +593,7 @@ private void ResetAcousticCustomization() Log.Debug("ExampleSpeechToText", "Failed to reset acoustic customizations"); } -private void HandleResetAcousticCustomization(bool success, string customData) +private void HandleResetAcousticCustomization(bool success, string data) { Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); } @@ -612,9 +612,9 @@ private void GetCustomAcousticResources() Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resources"); } -private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) +private void HandleGetCustomAcousticResources(AudioResources audioResources, string data) { - Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); + Log.Debug("ExampleSpeechToText", "audioResources: {0}", data); } ``` @@ -631,7 +631,7 @@ private void DeleteAcousticResource() Log.Debug("ExampleSpeechToText", "Failed to delete acoustic resource"); } -private void HandleDeleteAcousticResource(bool success, string customData) +private void HandleDeleteAcousticResource(bool success, string data) { Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); } @@ -655,9 +655,9 @@ private void GetCustomAcousticResource() Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resource"); } -private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) +private void HandleGetCustomAcousticResource(AudioListing audioListing, string data) { - Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); + Log.Debug("ExampleSpeechToText", "audioListing: {0}", data); } ``` @@ -688,9 +688,9 @@ private void AddAcousticResource() Log.Debug("ExampleSpeechToText", "Failed to add acoustic resource"); } -private void HandleAddAcousticResource(string customData) +private void HandleAddAcousticResource(string data) { - Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); + Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", data); } ``` diff --git a/Scripts/Services/TextToSpeech/v1/README.md b/Scripts/Services/TextToSpeech/v1/README.md index 136ad7f4b..020a5feae 100755 --- a/Scripts/Services/TextToSpeech/v1/README.md +++ b/Scripts/Services/TextToSpeech/v1/README.md @@ -67,9 +67,9 @@ private void GetVoices() Log.Debug("ExampleTextToSpeech", "Failed to get voices!"); } -private void OnGetVoices(Voices voices, string customData) +private void OnGetVoices(Voices voices, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", data); } ``` @@ -87,9 +87,9 @@ private void GetVoice() Log.Debug("ExampleTextToSpeech", "Failed to get voice!"); } -private void OnGetVoice(Voice voice, string customData) +private void OnGetVoice(Voice voice, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", data); } ``` @@ -115,7 +115,7 @@ private void Synthesize() Log.Debug("ExampleTextToSpeech", "Failed to synthesize!"); } -private void OnSynthesize(AudioClip clip, string customData) +private void OnSynthesize(AudioClip clip, string data) { PlayClip(clip); } @@ -162,9 +162,9 @@ private void GetPronunciation() Log.Debug("ExampleTextToSpeech", "Failed to get pronunication!"); } -private void OnGetPronunciation(Pronunciation pronunciation, string customData) +private void OnGetPronunciation(Pronunciation pronunciation, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", data); } ``` @@ -182,9 +182,9 @@ private void CreateCustomization() Log.Debug("ExampleTextToSpeech", "Failed to create customization!"); } -private void OnCreateCustomization(CustomizationID customizationID, string customData) +private void OnCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", data); } ``` @@ -209,7 +209,7 @@ private void UpdateCustomization() Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); } -private void OnUpdateCustomization(bool success, string customData) +private void OnUpdateCustomization(bool success, string data) { Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", success); } @@ -229,9 +229,9 @@ private void GetCustomizations() Log.Debug("ExampleTextToSpeech", "Failed to get customizations!"); } -private void OnGetCustomizations(Customizations customizations, string customData) +private void OnGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", data); } ``` @@ -249,9 +249,9 @@ private void GetCustomization() Log.Debug("ExampleTextToSpeech", "Failed to get customization!"); } -private void OnGetCustomization(Customization customization, string customData) +private void OnGetCustomization(Customization customization, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", data); } ``` @@ -269,7 +269,7 @@ private void DeleteCustomization() Log.Debug("ExampleTextToSpeech", "Failed to delete customization!"); } -private void OnDeleteCustomization(bool success, string customData) +private void OnDeleteCustomization(bool success, string data) { Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", success); } @@ -330,9 +330,9 @@ private void GetCustomizationWords() Log.Debug("ExampleTextToSpeech", "Failed to get customization words!"); } -private void OnGetCustomizationWords(Words words, string customData) +private void OnGetCustomizationWords(Words words, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization words response: {0}", customData); + Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization words response: {0}", data); } ``` @@ -355,7 +355,7 @@ private void DeleteCustomizationWord() Log.Debug("ExampleTextToSpeech", "Failed to get delete word!"); } -private void OnDeleteCustomizationWords(bool success, string customData) +private void OnDeleteCustomizationWords(bool success, string data) { Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization word response: {0}", success); } diff --git a/Scripts/Services/TradeoffAnalytics/v1/README.md b/Scripts/Services/TradeoffAnalytics/v1/README.md index 8ffd8d3c1..c7bebacaa 100755 --- a/Scripts/Services/TradeoffAnalytics/v1/README.md +++ b/Scripts/Services/TradeoffAnalytics/v1/README.md @@ -102,7 +102,7 @@ private void GetDillema() Log.Debug("ExampleTradeoffAnalytics", "Failed to get dillema!"); } -private void OnGetDillema(DilemmasResponse resp) +private void OnGetDillema(DilemmasResponse resp, string data) { Log.Debug("ExampleTradeoffAnalytics", "Get dillema result: {0}", data); } diff --git a/Scripts/Services/VisualRecognition/v3/README.md b/Scripts/Services/VisualRecognition/v3/README.md index 33c3bccd6..c1f813cf6 100755 --- a/Scripts/Services/VisualRecognition/v3/README.md +++ b/Scripts/Services/VisualRecognition/v3/README.md @@ -74,7 +74,7 @@ void TrainClassifier() Log.Debug("ExampleVisualRecognition", "Train classifier failed!"); } -private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier) +private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { Log.Debug("ExampleVisualRecognition", "Train classifier result: {0}", data); } @@ -89,7 +89,7 @@ void GetClassifiers() Log.Debug("ExampleVisualRecognition", "Getting classifiers failed!"); } -private void OnGetClassifiers (GetClassifiersTopLevelBrief classifiers) +private void OnGetClassifiers (GetClassifiersTopLevelBrief classifiers, string data) { Log.Debug("ExampleVisualRecognition", "Get classifiers result: {0}", data); } @@ -104,7 +104,7 @@ void GetClassifier() Log.Debug("ExampleVisualRecognition", "Getting classifier failed!"); } -private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier) +private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { Log.Debug("ExampleVisualRecognition", "Get classifier result: {0}", data); } @@ -127,7 +127,7 @@ void UpdateClassifier() Log.Debug("ExampleVisualRecognition", "Update classifier failed!"); } -private void OnUpdateClassifier(GetClassifiersPerClassifierVerbose classifier) +private void OnUpdateClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { Log.Debug("ExampleVisualRecognition", "Update classifier result: {0}", data); } @@ -157,9 +157,9 @@ void CreateCollection() Log.Debug("ExampleVisualRecognition", "Failed to create collection"); } -private void OnCreateCollection(CreateCollection collection, string customData) +private void OnCreateCollection(CreateCollection collection, string data) { - Log.Debug("ExampleVisualRecognition", "Create collection result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Create collection result: {0}", data); } ``` @@ -172,9 +172,9 @@ void GetCollections() Log.Debug("ExampleVisualRecognition", "Failed to get collections"); } -private void OnGetCollections(GetCollections collections, string customData) +private void OnGetCollections(GetCollections collections, string data) { - Log.Debug("ExampleVisualRecognition", "Get collections result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Get collections result: {0}", data); } ``` @@ -187,9 +187,9 @@ void GetCollection() Log.Debug("ExampleVisualRecognition", "Failed to get collection"); } -private void OnGetCollection(CreateCollection collection, string customData) +private void OnGetCollection(CreateCollection collection, string data) { - Log.Debug("ExampleVisualRecognition", "Get collections result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Get collections result: {0}", data); } ``` @@ -202,9 +202,9 @@ void DeleteCollection() Log.Debug("ExampleVisualRecognition", "Failed to delete collection"); } -private void OnDeleteCollection(bool success, string customData) +private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleVisualRecognition", "Delete collection result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Delete collection result: {0}", data); } ``` @@ -216,9 +216,9 @@ void AddCollectionImage() if(!_visualRecognition.AddCollectionImage(OnAddImageToCollection, , , )) Log.Debug("ExampleVisualRecognition", "Failed to add images to collection"); } -private void OnAddImageToCollection(CollectionsConfig images, string customData) +private void OnAddImageToCollection(CollectionsConfig images, string data) { - Log.Debug("ExampleVisualRecognition", "Add collectionimage result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Add collectionimage result: {0}", data); } ``` @@ -231,9 +231,9 @@ void GetCollectionImages() Log.Debug("ExampleVisualRecognition", "Failed to get collection images"); } -private void OnGetCollectionImages(GetCollectionImages collections, string customData) +private void OnGetCollectionImages(GetCollectionImages collections, string data) { - Log.Debug("ExampleVisualRecognition", "Get collection images result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Get collection images result: {0}", data); } ``` @@ -246,9 +246,9 @@ void GetImage() Log.Debug("ExampleVisualRecognition", "Failed to get collection image"); } -private void OnGetImage(GetCollectionsBrief image, string customData) +private void OnGetImage(GetCollectionsBrief image, string data) { - Log.Debug("ExampleVisualRecognition", "Get collection image result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Get collection image result: {0}", data); } ``` @@ -261,9 +261,9 @@ void DeleteCollectionImage() Log.Debug("ExampleVisualRecognition", "Failed to delete collection image"); } -private void OnDeleteCollectionImage(bool success, string customData) +private void OnDeleteCollectionImage(bool success, string data) { - Log.Debug("ExampleVisualRecognition", "Delete collection image result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Delete collection image result: {0}", data); } ``` @@ -276,9 +276,9 @@ void GetMetadata() Log.Debug("ExampleVisualRecognition", "Failed to get metadata"); } -private void OnGetMetadata(object responseObject, string customData) +private void OnGetMetadata(object responseObject, string data) { - Log.Debug("ExampleVisualRecognition", "Get metadata result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Get metadata result: {0}", data); } ``` @@ -291,7 +291,7 @@ void DeleteMetadata() Log.Debug("ExampleVisualRecognition", "Failed to delete image metadata"); } -private void OnDeleteMetadata(bool success, string customData) +private void OnDeleteMetadata(bool success, string data) { Log.Debug("ExampleVisualRecognition", "Delete image metadata result: {0}", success); @@ -307,9 +307,9 @@ void FindSimilar() Log.Debug("ExampleVisualRecognition", "Failed to find similar images"); } -private void OnFindSimilar(SimilarImagesConfig images, string customData) +private void OnFindSimilar(SimilarImagesConfig images, string data) { - Log.Debug("ExampleVisualRecognition", "Find similar result: {0}", customData); + Log.Debug("ExampleVisualRecognition", "Find similar result: {0}", data); } ``` From 6f07b4d3419e127015f559b82113400fc493d749 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Sat, 28 Oct 2017 11:22:09 -0500 Subject: [PATCH 033/100] add overload to stt Recognize that takes a byte array. add example recognizing ogg vorbis. --- .../Scripts/ExampleSpeechToText.cs | 75 ++++++++++++++++--- .../Services/SpeechToText/v1/SpeechToText.cs | 35 +++++++-- .../websocket-sharp.csproj.meta | 8 -- 3 files changed, 93 insertions(+), 25 deletions(-) delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index 8dfb5d6f7..4943382fa 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -29,7 +29,6 @@ public class ExampleSpeechToText : MonoBehaviour private string _password = null; private string _url = null; - private AudioClip _audioClip; private SpeechToText _speechToText; private string _modelNameToGet; @@ -38,13 +37,19 @@ public class ExampleSpeechToText : MonoBehaviour private string _customCorpusFilePath; private string _customWordsFilePath; private string _acousticResourceUrl = "https://ia802302.us.archive.org/10/items/Greatest_Speeches_of_the_20th_Century/TheFirstAmericaninEarthOrbit.mp3"; + private string _oggResourceUrl = "https://ia802302.us.archive.org/10/items/Greatest_Speeches_of_the_20th_Century/InauguralAddress-1981.ogg"; private bool _isAudioLoaded = false; private string _createdAcousticModelId; private string _acousticResourceName = "unity-acoustic-resource"; private string _createdAcousticModelName = "unity-example-acoustic-model"; private byte[] _acousticResourceData; + private string _acousticResourceMimeType; + private byte[] _oggResourceData; + private string _oggResourceMimeType; + private bool _isOggLoaded = false; private bool _recognizeTested = false; + private bool _recognizeOggTested = false; private bool _getModelsTested = false; private bool _getModelTested = false; private bool _getCustomizationsTested = false; @@ -87,6 +92,10 @@ void Start() _speechToText = new SpeechToText(credentials); _customCorpusFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/theJabberwocky-utf8.txt"; _customWordsFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/test-stt-words.json"; + _acousticResourceMimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); + _oggResourceMimeType = Utility.GetMimeType(Path.GetExtension(_oggResourceUrl)); + + _speechToText.StreamMultipart = true; Runnable.Run(Examples()); } @@ -94,6 +103,12 @@ void Start() private IEnumerator Examples() { Runnable.Run(DownloadAcousticResource()); + while (!_isAudioLoaded) + yield return null; + + Runnable.Run(DownloadOggResource()); + while (!_isOggLoaded) + yield return null; // Recognize Log.Debug("ExampleSpeechToText", "Attempting to recognize"); @@ -101,10 +116,17 @@ private IEnumerator Examples() keywords.Add("speech"); _speechToText.KeywordsThreshold = 0.5f; _speechToText.Keywords = keywords.ToArray(); - _speechToText.Recognize(_audioClip, HandleOnRecognize); + _speechToText.Recognize(_acousticResourceData, _acousticResourceMimeType, HandleOnRecognize); while (!_recognizeTested) yield return null; + // Recognize ogg + _speechToText.StreamMultipart = true; + Log.Debug("ExampleSpeechToText", "Attempting to recognize ogg: mimeType: {0} | _speechTText.StreamMultipart: {1}", _oggResourceMimeType, _speechToText.StreamMultipart); + _speechToText.Recognize(_oggResourceData, _oggResourceMimeType + ";codecs=vorbis", HandleOnRecognizeOgg); + while (!_recognizeOggTested) + yield return null; + // Get models Log.Debug("ExampleSpeechToText", "Attempting to get models"); _speechToText.GetModels(HandleGetModels); @@ -237,7 +259,7 @@ private IEnumerator Examples() // yield return null; // Delete custom word - Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + Log.Debug("ExampleSpeechToText", "Attempting to delete custom wreord {1} in customization {0}", _createdCustomizationID, words.words[2].word); _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); while (!_deleteCustomWordTested) yield return null; @@ -299,13 +321,9 @@ private IEnumerator Examples() while (!_getAcousticCustomizationTested) yield return null; - while (!_isAudioLoaded) - yield return null; - // Create acoustic resource Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); - string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); - _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); + _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, _acousticResourceMimeType, _acousticResourceMimeType, true, _acousticResourceData); while (!_addAcousticResourcesTested) yield return null; @@ -426,6 +444,32 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) } } + private void HandleOnRecognizeOgg(SpeechRecognitionEvent result) + { + if (result != null && result.results.Length > 0) + { + foreach (var res in result.results) + { + foreach (var alt in res.alternatives) + { + string text = alt.transcript; + Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + + if (res.final) + _recognizeOggTested = true; + } + + if (res.keywords_result != null && res.keywords_result.keyword != null) + { + foreach (var keyword in res.keywords_result.keyword) + { + Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + } + } + } + } + } + private void HandleGetCustomizations(Customizations customizations, string customData) { Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); @@ -720,9 +764,22 @@ private IEnumerator DownloadAcousticResource() Log.Debug("ExampleSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); WWW www = new WWW(_acousticResourceUrl); yield return www; - + Log.Debug("ExampleSpeechToText", "acoustic resource downloaded"); _acousticResourceData = www.bytes; _isAudioLoaded = true; + www.Dispose(); + } + + private IEnumerator DownloadOggResource() + { + Log.Debug("ExampleSpeechToText", "downloading ogg resource from {0}", _oggResourceUrl); + WWW www = new WWW(_oggResourceUrl); + yield return www; + + Log.Debug("ExampleSpeechToText", "ogg resource downloaded"); + _oggResourceData = www.bytes; + _isOggLoaded = true; + www.Dispose(); } } \ No newline at end of file diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 6fd47a1fa..cc859c1f0 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -107,8 +107,8 @@ public class SpeechToText : IWatsonService private int _inactivityTimeout = 60; private string _customization_id = null; private string _acoustic_customization_id = null; - public float _customization_weight = 0.3f; - public bool _streamMultipart = false; // If true sets `Transfer-Encoding` header of multipart request to `chunked`. + private float _customization_weight = 0.3f; + private bool _streamMultipart = false; // If true sets `Transfer-Encoding` header of multipart request to `chunked`. private fsSerializer _serializer = new fsSerializer(); private Credentials _credentials = null; @@ -764,26 +764,45 @@ public bool Recognize(AudioClip clip, OnRecognize callback) throw new ArgumentNullException("clip"); if (callback == null) throw new ArgumentNullException("callback"); + + return Recognize(WaveFile.CreateWAV(clip), "audio/wav", callback); + } + + /// + /// This function POSTs the given audio clip the recognize function and convert speech into text. This function should be used + /// only on AudioClips under 4MB once they have been converted into WAV format. Use the StartListening() for continuous + /// recognition of text. + /// + /// The audio data. + /// The content type of the audio data. + /// A callback to invoke with the results. + /// + public bool Recognize(byte[] audioData, string contentType, OnRecognize callback) + { + if (audioData == null) + throw new ArgumentNullException("audioData"); + if (callback == null) + throw new ArgumentNullException("callback"); RESTConnector connector = RESTConnector.GetConnector(Credentials, "/v1/recognize"); if (connector == null) return false; RecognizeRequest req = new RecognizeRequest(); - req.Clip = clip; + req.AudioData = audioData; req.Callback = callback; - req.Headers["Content-Type"] = "audio/wav"; + req.Headers["Content-Type"] = contentType; if (StreamMultipart) req.Headers["Transfer-Encoding"] = "chunked"; - req.Send = WaveFile.CreateWAV(clip); + req.Send = audioData; if (req.Send.Length > MaxRecognizeClipSize) { Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); return false; } - if(!string.IsNullOrEmpty(AcousticCustomizationId)) + if (!string.IsNullOrEmpty(AcousticCustomizationId)) req.Parameters["acoustic_customization_id"] = AcousticCustomizationId; if (!string.IsNullOrEmpty(CustomizationId)) { @@ -801,7 +820,7 @@ public bool Recognize(AudioClip clip, OnRecognize callback) req.Parameters["timestamps"] = EnableTimestamps ? "true" : "false"; if (Credentials.HasAuthorizationToken()) req.Parameters["watson-token"] = Credentials.AuthenticationToken; - if(WordAlternativesThreshold != null) + if (WordAlternativesThreshold != null) req.Parameters["word_alternatives_threshold"] = WordAlternativesThreshold; req.Parameters["word_confidence"] = EnableWordConfidence ? "true" : "false"; @@ -812,7 +831,7 @@ public bool Recognize(AudioClip clip, OnRecognize callback) private class RecognizeRequest : RESTConnector.Request { - public AudioClip Clip { get; set; } + public byte[] AudioData { get; set; } public OnRecognize Callback { get; set; } }; diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta deleted file mode 100644 index a7e986208..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0fbe68503a01cc440bbbf2f8130640f2 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From 4538cedb35425efe59e79257bab89de536b309e3 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Sun, 29 Oct 2017 11:09:53 -0500 Subject: [PATCH 034/100] break down buffer into chunks and send chunks smaller than 1/2 second --- .../ServiceExamples/ExampleStreaming.unity | 327 ++++++++++++++++-- .../Scripts/ExampleStreaming.cs | 136 +++++++- .../Services/SpeechToText/v1/SpeechToText.cs | 2 +- 3 files changed, 422 insertions(+), 43 deletions(-) diff --git a/Examples/ServiceExamples/ExampleStreaming.unity b/Examples/ServiceExamples/ExampleStreaming.unity index 2d5d7cffd..366aa03b1 100644 --- a/Examples/ServiceExamples/ExampleStreaming.unity +++ b/Examples/ServiceExamples/ExampleStreaming.unity @@ -1,19 +1,19 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 -SceneSettings: +OcclusionCullingSettings: m_ObjectHideFlags: 0 - m_PVSData: - m_PVSObjectsArray: [] - m_PVSPortalsArray: [] + serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 7 + serializedVersion: 8 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -25,6 +25,7 @@ RenderSettings: m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} m_HaloStrength: 0.5 m_FlareStrength: 1 @@ -37,11 +38,11 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.4469244, g: 0.4967847, b: 0.575083, a: 1} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 7 + serializedVersion: 9 m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 @@ -53,7 +54,7 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: - serializedVersion: 4 + serializedVersion: 8 m_Resolution: 2 m_BakeResolution: 40 m_TextureWidth: 1024 @@ -66,39 +67,150 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_DirectLightInLightProbes: 1 m_FinalGather: 0 m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 m_LightingDataAsset: {fileID: 0} - m_RuntimeCPUUsage: 25 + m_ShadowMaskMode: 2 --- !u!196 &4 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 + agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 - accuratePlacement: 0 minRegionArea: 2 - cellSize: 0.16666667 manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &278297820 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 278297824} + - component: {fileID: 278297823} + - component: {fileID: 278297822} + - component: {fileID: 278297821} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &278297821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 278297820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &278297822 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 278297820} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &278297823 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 278297820} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &278297824 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 278297820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1863902090} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} --- !u!1 &1159842907 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1159842909} - - 108: {fileID: 1159842908} + - component: {fileID: 1159842909} + - component: {fileID: 1159842908} m_Layer: 0 m_Name: Directional Light m_TagString: Untagged @@ -113,7 +225,7 @@ Light: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1159842907} m_Enabled: 1 - serializedVersion: 7 + serializedVersion: 8 m_Type: 1 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_Intensity: 1 @@ -138,6 +250,8 @@ Light: m_Lightmapping: 4 m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 --- !u!4 &1159842909 @@ -149,22 +263,22 @@ Transform: m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} --- !u!1 &1391086061 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1391086066} - - 20: {fileID: 1391086065} - - 92: {fileID: 1391086064} - - 124: {fileID: 1391086063} - - 81: {fileID: 1391086062} + - component: {fileID: 1391086066} + - component: {fileID: 1391086065} + - component: {fileID: 1391086064} + - component: {fileID: 1391086063} + - component: {fileID: 1391086062} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -201,8 +315,8 @@ Camera: m_GameObject: {fileID: 1391086061} m_Enabled: 1 serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.066176474, g: 0.066176474, b: 0.066176474, a: 0} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -223,6 +337,8 @@ Camera: m_TargetDisplay: 0 m_TargetEye: 3 m_HDR: 0 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 @@ -236,19 +352,81 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 1, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1428860024 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1428860027} + - component: {fileID: 1428860026} + - component: {fileID: 1428860025} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1428860025 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1428860024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1428860026 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1428860024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1428860027 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1428860024} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1646685149 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 4 + serializedVersion: 5 m_Component: - - 4: {fileID: 1646685151} - - 114: {fileID: 1646685150} + - component: {fileID: 1646685151} + - component: {fileID: 1646685150} m_Layer: 0 m_Name: ExampleStreaming m_TagString: Untagged @@ -267,6 +445,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6c5299c1c838a8c44b49ecc9254704e0, type: 3} m_Name: m_EditorClassIdentifier: + ResultsField: {fileID: 1863902092} --- !u!4 &1646685151 Transform: m_ObjectHideFlags: 0 @@ -276,7 +455,95 @@ Transform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1863902089 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1863902090} + - component: {fileID: 1863902093} + - component: {fileID: 1863902092} + - component: {fileID: 1863902091} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1863902090 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1863902089} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 278297824} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1863902091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1863902089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1741964061, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &1863902092 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1863902089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1863902093 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1863902089} diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 21a88537a..c84eac6fe 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -15,6 +15,9 @@ * */ +// Uncomment to test chunked +#define TEST_NEW + using UnityEngine; using System.Collections; using IBM.Watson.DeveloperCloud.Logging; @@ -22,18 +25,21 @@ using IBM.Watson.DeveloperCloud.Utilities; using IBM.Watson.DeveloperCloud.DataTypes; using System.Collections.Generic; +using UnityEngine.UI; public class ExampleStreaming : MonoBehaviour { private string _username = null; private string _password = null; private string _url = null; + public Text ResultsField; private int _recordingRoutine = 0; private string _microphoneID = null; private AudioClip _recording = null; - private int _recordingBufferSize = 2; + private int _recordingBufferSize = 1; private int _recordingHZ = 22050; + private int _chunkCount = 50; private SpeechToText _speechToText; @@ -57,24 +63,24 @@ public bool Active { if (value && !_speechToText.IsListening) { - _speechToText.DetectSilence = true; + _speechToText.DetectSilence = false; _speechToText.EnableWordConfidence = true; _speechToText.EnableTimestamps = true; _speechToText.SilenceThreshold = 0.1f; - _speechToText.MaxAlternatives = 5; + _speechToText.MaxAlternatives = 0; _speechToText.EnableInterimResults = true; _speechToText.OnError = OnError; _speechToText.InactivityTimeout = -1; - _speechToText.ProfanityFilter = true; + _speechToText.ProfanityFilter = false; _speechToText.SmartFormatting = true; - _speechToText.SpeakerLabels = true; + _speechToText.SpeakerLabels = false; _speechToText.WordAlternativesThreshold = null; - List keywords = new List(); - keywords.Add("hello"); - keywords.Add("testing"); - keywords.Add("watson"); - _speechToText.KeywordsThreshold = 0.5f; - _speechToText.Keywords = keywords.ToArray(); + //List keywords = new List(); + //keywords.Add("hello"); + //keywords.Add("testing"); + //keywords.Add("watson"); + //_speechToText.KeywordsThreshold = 0.5f; + //_speechToText.Keywords = keywords.ToArray(); _speechToText.StartListening(OnRecognize, OnRecognizeSpeaker); } else if (!value && _speechToText.IsListening) @@ -110,6 +116,111 @@ private void OnError(string error) Log.Debug("ExampleStreaming", "Error! {0}", error); } +#if TEST_NEW + + private IEnumerator RecordingHandler() + { + Log.Debug("ExampleStreamingChunks", "devices: {0}", Microphone.devices); + // Start recording + _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); + yield return null; + + if (_recording == null) + { + StopRecording(); + yield break; + } + +#if ENABLE_TIME_LOGGING + // Set a reference to now to check timing + DateTime now = DateTime.Now; +#endif + + // Current chunk number + int chunkNum = 0; + + // Size of the chunk in samples + int chunkSize = _recording.samples / _chunkCount; + + // Init samples + float[] samples = null; + + while (_recordingRoutine != 0 && _recording != null) + { + // Get the mic position + int microphonePosition = Microphone.GetPosition(_microphoneID); + if (microphonePosition > _recording.samples || !Microphone.IsRecording(_microphoneID)) + { + Log.Error("ExampleStreaming", "Microphone disconnected."); + + StopRecording(); + yield break; + } + + int sampleStart = chunkSize * chunkNum; + int sampleEnd = chunkSize * (chunkNum + 1); + +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "microphonePosition: {0} | sampleStart: {1} | sampleEnd: {2} | chunkNum: {3}", + microphonePosition.ToString(), + sampleStart.ToString(), + sampleEnd.ToString(), + chunkNum.ToString()); +#endif + //If the write position is past the end of the chunk or if write position is before the start of the chunk and the chunk number is equal to the chunk count + if (microphonePosition > sampleEnd || (microphonePosition < sampleStart && chunkNum == (_chunkCount - 1))) + { + // Init samples + samples = new float[chunkSize]; + // Write data from recording into samples starting from the chunkStart + _recording.GetData(samples, sampleStart); + + // Create AudioData and use the samples we just created + AudioData record = new AudioData(); + record.MaxLevel = Mathf.Max(samples); + record.Clip = AudioClip.Create("Recording", chunkSize, _recording.channels, _recordingHZ, false); + record.Clip.SetData(samples, 0); + + // Send the newly created AudioData to the service + _speechToText.OnListen(record); + + // Iterate or reset chunkNum + if (chunkNum < _chunkCount - 1) + { + chunkNum++; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "Iterating chunkNum: {0}", chunkNum); +#endif + } + else + { + chunkNum = 0; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "Resetting chunkNum: {0}", chunkNum); +#endif + } + +#if ENABLE_TIME_LOGGING + Log.Debug("ExampleStreamingChunks", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); + now = DateTime.Now; +#endif + } + else + { + // calculate the number of samples remaining until we ready for a block of audio, + // and wait that amount of time it will take to record. + int remaining = sampleEnd - microphonePosition; + float timeRemaining = (float)remaining / (float)_recordingHZ; + + yield return new WaitForSeconds(timeRemaining); + } + } + + yield break; + } + +#else + private IEnumerator RecordingHandler() { Log.Debug("ExampleStreaming", "devices: {0}", Microphone.devices); @@ -167,6 +278,7 @@ private IEnumerator RecordingHandler() yield break; } +#endif private void OnRecognize(SpeechRecognitionEvent result) { @@ -178,6 +290,7 @@ private void OnRecognize(SpeechRecognitionEvent result) { string text = alt.transcript; Log.Debug("ExampleStreaming", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + ResultsField.text = text; } if (res.keywords_result != null && res.keywords_result.keyword != null) @@ -210,6 +323,5 @@ private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) Log.Debug("ExampleStreaming", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); } } - } } \ No newline at end of file diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index cc859c1f0..9b3c8fe76 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -55,7 +55,7 @@ public class SpeechToText : IWatsonService /// /// How many recording AudioClips will we queue before we enter a error state. /// - private const int MaxQueuedRecordings = 30; + private const int MaxQueuedRecordings = 1000; /// /// Size of a clip in bytes that can be sent through the Recognize function. /// From b67633aac02c715f0750a7a9f763a12fa3fe9e50 Mon Sep 17 00:00:00 2001 From: kimberlysiva Date: Tue, 31 Oct 2017 13:17:08 -0400 Subject: [PATCH 035/100] Allow websocketsharp dll on WSA with IL2CPP backend. Remove lingering meta file. --- Plugins/websocket-sharp.dll.meta | 6 +++--- ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta | 8 -------- 2 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/Plugins/websocket-sharp.dll.meta b/Plugins/websocket-sharp.dll.meta index 06ce25bb7..adf0437f1 100644 --- a/Plugins/websocket-sharp.dll.meta +++ b/Plugins/websocket-sharp.dll.meta @@ -24,7 +24,7 @@ PluginImporter: Exclude OSXUniversal: 0 Exclude Win: 0 Exclude Win64: 0 - Exclude WindowsStoreApps: 1 + Exclude WindowsStoreApps: 0 data: first: Any: @@ -112,13 +112,13 @@ PluginImporter: first: Windows Store Apps: WindowsStoreApps second: - enabled: 0 + enabled: 1 settings: CPU: AnyCPU DontProcess: False PlaceholderPath: SDK: AnySDK - ScriptingBackend: AnyScriptingBackend + ScriptingBackend: Il2Cpp userData: assetBundleName: assetBundleVariant: diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta deleted file mode 100644 index a7e986208..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0fbe68503a01cc440bbbf2f8130640f2 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From d9ced8dc4e448c567437942a733842e034bd2110 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 31 Oct 2017 17:09:18 -0500 Subject: [PATCH 036/100] replace www with UnityWebRequest for delete operations --- Scripts/Connection/RESTConnector.cs | 35 +++++++++-------------------- Scripts/Utilities/Constants.cs | 2 +- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index ae3a1a950..dc35a586f 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -24,8 +24,8 @@ using System.Collections; using System.Collections.Generic; using System.Text; -using System.Threading; using UnityEngine; +using UnityEngine.Networking; #if UNITY_EDITOR using System.Net; @@ -491,7 +491,7 @@ private IEnumerator ProcessRequestQueue() float timeout = Mathf.Max(Constants.Config.Timeout, req.Timeout); DeleteRequest deleteReq = new DeleteRequest(); - deleteReq.Send(url, req.Headers); + Runnable.Run(deleteReq.Send(url, req.Headers)); while (!deleteReq.IsComplete) { if (req.Cancel) @@ -521,7 +521,6 @@ private IEnumerator ProcessRequestQueue() yield break; } -#if UNITY_EDITOR private class DeleteRequest { public string URL { get; set; } @@ -529,15 +528,11 @@ private class DeleteRequest public bool IsComplete { get; set; } public bool Success { get; set; } - private Thread _thread = null; - - public bool Send(string url, Dictionary headers) + public IEnumerator Send(string url, Dictionary headers) { #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DeleteRequest, Send: {0}, _thread:{1}", url, _thread); #endif - if (_thread != null && _thread.IsAlive) - return false; URL = url; Headers = new Dictionary(); @@ -547,42 +542,32 @@ public bool Send(string url, Dictionary headers) Headers[kp.Key] = kp.Value; } - _thread = new Thread(ProcessRequest); - - _thread.Start(); - return true; - } - - private void ProcessRequest() - { // This fixes the exception thrown by self-signed certificates. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DeleteRequest, ProcessRequest {0}", URL); #endif - - WebRequest deleteReq = WebRequest.Create(URL); - + UnityWebRequest deleteReq = UnityWebRequest.Delete(URL); + deleteReq.method = "DELETE"; foreach (var kp in Headers) - deleteReq.Headers.Add(kp.Key, kp.Value); - deleteReq.Method = "DELETE"; - + deleteReq.SetRequestHeader(kp.Key, kp.Value); + deleteReq.SendWebRequest(); #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DeleteRequest, sending deletereq {0}", deleteReq); #endif - HttpWebResponse deleteResp = deleteReq.GetResponse() as HttpWebResponse; + while (!deleteReq.isDone) + yield return null; #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DELETE Request SENT: {0}", URL); #endif - Success = deleteResp.StatusCode == HttpStatusCode.OK || deleteResp.StatusCode == HttpStatusCode.NoContent; + Success = deleteReq.responseCode == (long)HttpStatusCode.OK || deleteReq.responseCode == (long)HttpStatusCode.NoContent; #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DELETE Request COMPLETE: {0}", URL); #endif IsComplete = true; } }; -#endif #endregion } } diff --git a/Scripts/Utilities/Constants.cs b/Scripts/Utilities/Constants.cs index 2e82af1fc..d5ba694a7 100644 --- a/Scripts/Utilities/Constants.cs +++ b/Scripts/Utilities/Constants.cs @@ -64,7 +64,7 @@ public static class Config /// /// Default time in seconds after which a call should timeout. /// - public static float Timeout = 120.0f; + public static float Timeout = 60f; } /// From 1780a689bf1e626ad1fde89f52c96c6a96697211 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 31 Oct 2017 17:11:29 -0500 Subject: [PATCH 037/100] update credentials --- Config.json.enc | Bin 6544 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index fdb4fb9cb688919ef3e4bdbae823894ca32a3679..bf899f8f235a57c1be2ba0d4c8843cdbc5cea74f 100644 GIT binary patch literal 8768 zcmV-GBEQ`$>zJGa_b6r(h4s`+93%kqri94+Z7Rq3`<8d5(z*lS|6Vc_8B z0#B142YCp@t@9`Mexwk8uV3hST;Nmk$zHtU!$#&YC!|oncJD9vYHH*9^z8B=Ayg>o zfkL+hAvad)Pt-2 zT|xHyEMDS_j38v-yvBUD|9%I7w_cMlLdW9Y_t_`e zu6Od%F~-t*Kc~vRo76i^>=~~k8d^0-v5_k-0WJvnBl*m5PynBf3y!BVyYM?tg4C~} z$Sh#NZ|O9&MzMOXO@K}{Ny`xh2!U!>YtRh};`$#hKkV6y9*I>ExAaWQO?wm?32pH* z9LYOFuT4Jdf_xnl&maf-T3_FqZm)Q=m1eenP;YTj;rc Yzh%kQrmR<}Ly3aknJRGonjt4J%lp{m|> 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 literal 6544 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 COsr-A From cefe0dbffca8a455cdc69f773727f0c6a1aa5388 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 31 Oct 2017 18:13:04 -0500 Subject: [PATCH 038/100] added ifdef to use UnityWebRequest.Send() if unity version is less than 2017 --- Scripts/Connection/RESTConnector.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index dc35a586f..a755711c1 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -552,7 +552,11 @@ public IEnumerator Send(string url, Dictionary headers) deleteReq.method = "DELETE"; foreach (var kp in Headers) deleteReq.SetRequestHeader(kp.Key, kp.Value); +#if UNITY_2017_0_OR_NEWER deleteReq.SendWebRequest(); +#else + deleteReq.Send(); +#endif #if ENABLE_DEBUGGING Log.Debug("RESTConnector", "DeleteRequest, sending deletereq {0}", deleteReq); #endif @@ -568,6 +572,6 @@ public IEnumerator Send(string url, Dictionary headers) IsComplete = true; } }; - #endregion +#endregion } } From 5b9187c63260d62cb98451772f52dbf5702e7f15 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 31 Oct 2017 19:50:18 -0500 Subject: [PATCH 039/100] update installed Unity version in Travis --- ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta | 8 -------- Travis/installUnity.sh | 9 +++------ 2 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta diff --git a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta b/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta deleted file mode 100644 index a7e986208..000000000 --- a/ThirdParty/WebSocketSharp/websocket-sharp.csproj.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0fbe68503a01cc440bbbf2f8130640f2 -timeCreated: 1499973980 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Travis/installUnity.sh b/Travis/installUnity.sh index 27bb46979..a5043f3ab 100644 --- a/Travis/installUnity.sh +++ b/Travis/installUnity.sh @@ -2,9 +2,9 @@ set -e -BASE_URL=http://netstorage.unity3d.com/unity -HASH=38b4efef76f0 -VERSION=5.5.0f3 +BASE_URL=https://netstorage.unity3d.com/unity +HASH=46dda1414e51 +VERSION=2017.2.0f3 download() { file=$1 @@ -35,6 +35,3 @@ fi install "MacEditorInstaller/Unity-$VERSION.pkg" install "MacEditorTargetInstaller/UnitySetup-Windows-Support-for-Editor-$VERSION.pkg" - -#"Mac Target Support - now part of Editor as default player instead of web player" -#install "MacEditorTargetInstaller/UnitySetup-Mac-Support-for-Editor-$VERSION.pkg" From 016466b7bd97cd086610070ce95075b22aaa487e Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 31 Oct 2017 19:52:54 -0500 Subject: [PATCH 040/100] ifdef to 2017.1 or newer --- Scripts/Connection/RESTConnector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index a755711c1..879114f19 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -552,7 +552,7 @@ public IEnumerator Send(string url, Dictionary headers) deleteReq.method = "DELETE"; foreach (var kp in Headers) deleteReq.SetRequestHeader(kp.Key, kp.Value); -#if UNITY_2017_0_OR_NEWER +#if UNITY_2017_1_OR_NEWER deleteReq.SendWebRequest(); #else deleteReq.Send(); From 3de242f8d841f381fc8a42fae512040c9ba1b1c7 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Wed, 1 Nov 2017 12:40:10 -0500 Subject: [PATCH 041/100] scene changes --- .../ServiceExamples/ExampleStreaming.unity | 29 ++++++++++--------- .../Scripts/ExampleStreaming.cs | 6 ++-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Examples/ServiceExamples/ExampleStreaming.unity b/Examples/ServiceExamples/ExampleStreaming.unity index 366aa03b1..0e3017dfc 100644 --- a/Examples/ServiceExamples/ExampleStreaming.unity +++ b/Examples/ServiceExamples/ExampleStreaming.unity @@ -38,11 +38,11 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_IndirectSpecularColor: {r: 0.4465934, g: 0.49642956, b: 0.57482487, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 11 m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 @@ -54,7 +54,7 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: - serializedVersion: 8 + serializedVersion: 9 m_Resolution: 2 m_BakeResolution: 40 m_TextureWidth: 1024 @@ -77,17 +77,19 @@ LightmapSettings: m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 - m_PVRFiltering: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 m_PVRFilteringMode: 1 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousColorSigma: 1 - m_PVRFilteringAtrousNormalSigma: 1 - m_PVRFilteringAtrousPositionSigma: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 m_LightingDataAsset: {fileID: 0} - m_ShadowMaskMode: 2 + m_UseShadowmask: 1 --- !u!196 &4 NavMeshSettings: serializedVersion: 2 @@ -107,6 +109,8 @@ NavMeshSettings: manualTileSize: 0 tileSize: 256 accuratePlacement: 0 + debug: + m_Flags: 0 m_NavMeshData: {fileID: 0} --- !u!1 &278297820 GameObject: @@ -190,8 +194,8 @@ RectTransform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 278297820} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 574, y: 313.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1863902090} m_Father: {fileID: 0} @@ -316,7 +320,7 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 2 - m_BackGroundColor: {r: 0.066176474, g: 0.066176474, b: 0.066176474, a: 0} + m_BackGroundColor: {r: 0.125, g: 0.125, b: 0.125, a: 0} m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -342,7 +346,6 @@ Camera: m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 - m_StereoMirrorMode: 0 --- !u!4 &1391086066 Transform: m_ObjectHideFlags: 0 @@ -540,7 +543,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: + m_Text: Watson Speech to Text --- !u!222 &1863902093 CanvasRenderer: m_ObjectHideFlags: 0 diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index c84eac6fe..404bb88d1 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -288,9 +288,9 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var alt in res.alternatives) { - string text = alt.transcript; - Log.Debug("ExampleStreaming", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); - ResultsField.text = text; + string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); + Log.Debug("ExampleStreaming", text); + ResultsField.text = text; } if (res.keywords_result != null && res.keywords_result.keyword != null) From 40645aeac16339adeb86c43c7279caaf2d919c7a Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Wed, 1 Nov 2017 15:01:45 -0500 Subject: [PATCH 042/100] update credentials --- Config.json.enc | Bin 6544 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index fdb4fb9cb688919ef3e4bdbae823894ca32a3679..98b2a78d872df272ac26923592fe854946395b13 100644 GIT binary patch literal 8768 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 COsr-A From fce516bc6fcbfc4178b4abd7356048365993f60e Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Wed, 1 Nov 2017 16:58:07 -0500 Subject: [PATCH 043/100] change delete string to verb const --- Scripts/Connection/RESTConnector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index 879114f19..02093cb8d 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -549,7 +549,7 @@ public IEnumerator Send(string url, Dictionary headers) Log.Debug("RESTConnector", "DeleteRequest, ProcessRequest {0}", URL); #endif UnityWebRequest deleteReq = UnityWebRequest.Delete(URL); - deleteReq.method = "DELETE"; + deleteReq.method = UnityWebRequest.kHttpVerbDELETE; foreach (var kp in Headers) deleteReq.SetRequestHeader(kp.Key, kp.Value); #if UNITY_2017_1_OR_NEWER From 8872716f1e20044d6b31ffa33b72191d454228b5 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Wed, 1 Nov 2017 19:34:55 -0500 Subject: [PATCH 044/100] update credentials --- Config.json.enc | Bin 8768 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index bf899f8f235a57c1be2ba0d4c8843cdbc5cea74f..f7921d775c088c35b8c9a2696622a59052de94c8 100644 GIT binary patch literal 8768 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%0A@D9Qq2?n-^vy=mNpf&%)ZuF~N!A5J~; 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 literal 8768 zcmV-GBEQ`$>zJGa_b6r(h4s`+93%kqri94+Z7Rq3`<8d5(z*lS|6Vc_8B z0#B142YCp@t@9`Mexwk8uV3hST;Nmk$zHtU!$#&YC!|oncJD9vYHH*9^z8B=Ayg>o zfkL+hAvad)Pt-2 zT|xHyEMDS_j38v-yvBUD|9%I7w_cMlLdW9Y_t_`e zu6Od%F~-t*Kc~vRo76i^>=~~k8d^0-v5_k-0WJvnBl*m5PynBf3y!BVyYM?tg4C~} z$Sh#NZ|O9&MzMOXO@K}{Ny`xh2!U!>YtRh};`$#hKkV6y9*I>ExAaWQO?wm?32pH* z9LYOFuT4Jdf_xnl&maf-T3_FqZm)Q=m1eenP;YTj;rc Yzh%kQrmR<}Ly3aknJRGonjt4J%lp{m|> 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 From f9c476c59a8634158154ae38ccf70ec1c87b4fd0 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 2 Nov 2017 10:35:08 -0500 Subject: [PATCH 045/100] update unity version allowed for UnityWebRequest.SendWebRequest() --- Scripts/Connection/RESTConnector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index 02093cb8d..caa85cbc7 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -552,7 +552,7 @@ public IEnumerator Send(string url, Dictionary headers) deleteReq.method = UnityWebRequest.kHttpVerbDELETE; foreach (var kp in Headers) deleteReq.SetRequestHeader(kp.Key, kp.Value); -#if UNITY_2017_1_OR_NEWER +#if UNITY_2017_2_OR_NEWER deleteReq.SendWebRequest(); #else deleteReq.Send(); From d3c0b87cc2950de241dfe22bda16810548ad8f37 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 2 Nov 2017 11:20:58 -0500 Subject: [PATCH 046/100] rename ifdef --- Examples/ServiceExamples/Scripts/ExampleStreaming.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 404bb88d1..f8a379297 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -16,7 +16,7 @@ */ // Uncomment to test chunked -#define TEST_NEW +#define CHUNK_BUFFER using UnityEngine; using System.Collections; @@ -116,7 +116,7 @@ private void OnError(string error) Log.Debug("ExampleStreaming", "Error! {0}", error); } -#if TEST_NEW + #if CHUNK_BUFFER private IEnumerator RecordingHandler() { From 619664a9bf30e651f86a5907d5ac0069d5c376f0 Mon Sep 17 00:00:00 2001 From: Ajiemar Date: Thu, 2 Nov 2017 17:25:33 -0500 Subject: [PATCH 047/100] WIP - refactoring debug --- .../Scripts/ExampleAlchemyDataNews.cs | 6 +- .../Scripts/ExampleAlchemyLanguage.cs | 190 ++++++++--------- .../Scripts/ExampleConversation.cs | 10 +- .../Scripts/ExampleDiscoveryV1.cs | 126 +++++------ .../Scripts/ExampleDocumentConversion.cs | 6 +- .../Scripts/ExampleGetToken.cs | 8 +- .../Scripts/ExampleLanguageTranslation.cs | 4 +- .../Scripts/ExampleLanguageTranslator.cs | 30 +-- .../ExampleNaturalLanguageClassifier.cs | 26 +-- .../ExampleNaturalLanguageUnderstandingV1.cs | 14 +- .../Scripts/ExamplePersonalityInsightsV3.cs | 10 +- .../Scripts/ExampleRetrieveAndRank.cs | 126 +++++------ .../Scripts/ExampleSpeechToText.cs | 166 +++++++-------- .../Scripts/ExampleStreaming.cs | 16 +- .../Scripts/ExampleTextToSpeech.cs | 66 +++--- .../Scripts/ExampleToneAnalyzer.cs | 6 +- .../Scripts/ExampleTradeoffAnalytics.cs | 4 +- .../Scripts/ExampleVisualRecognition.cs | 66 +++--- Scripts/Connection/RESTConnector.cs | 28 +-- Scripts/Connection/WSConnector.cs | 10 +- Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs | 54 ++--- .../Services/Conversation/v1/Conversation.cs | 2 +- Scripts/Services/Discovery/v1/Discovery.cs | 30 +-- .../v2/LanguageTranslator.cs | 8 +- .../v1/NaturalLanguageUnderstanding.cs | 4 +- .../RetrieveAndRank/v1/RetrieveAndRank.cs | 2 +- .../Services/SpeechToText/v1/SpeechToText.cs | 22 +- .../Services/TextToSpeech/v1/TextToSpeech.cs | 2 +- .../VisualRecognition/v3/VisualRecognition.cs | 1 - Scripts/UnitTests/TestAlchemyLanguage.cs | 198 +++++++++--------- Scripts/UnitTests/TestConversation.cs | 16 +- Scripts/UnitTests/TestDiscovery.cs | 128 +++++------ Scripts/UnitTests/TestDocumentConversion.cs | 8 +- Scripts/UnitTests/TestLanguageTranslator.cs | 32 +-- .../TestNaturalLanguageClassifier.cs | 28 +-- .../TestNaturalLanguageUnderstanding.cs | 16 +- .../UnitTests/TestPersonalityInsightsV3.cs | 12 +- Scripts/UnitTests/TestRetrieveAndRank.cs | 132 ++++++------ Scripts/UnitTests/TestSpeechToText.cs | 170 +++++++-------- Scripts/UnitTests/TestTextToSpeech.cs | 68 +++--- Scripts/UnitTests/TestToneAnalyzer.cs | 8 +- Scripts/UnitTests/TestTradeoffAnalytics.cs | 6 +- Scripts/UnitTests/TestVisualRecognition.cs | 66 +++--- Scripts/Utilities/Runnable.cs | 4 +- Scripts/Utilities/Utility.cs | 2 +- Scripts/Utilities/WaveFile.cs | 8 +- Travis/TravisIntegrationTests.cs | 4 +- 47 files changed, 974 insertions(+), 975 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs b/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs index 4d940c072..bfdc9157f 100644 --- a/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs +++ b/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs @@ -50,17 +50,17 @@ private IEnumerator Examples() queryFields.Add(Fields.EnrichedUrlCleanedtitle, "Washington"); string[] returnFields = { Fields.EnrichedUrlEntities, Fields.EnrichedUrlKeywords }; if (!_alchemyAPI.GetNews(OnGetNews, returnFields, queryFields)) - Log.Debug("ExampleAlchemyDataNews", "Failed to get news!"); + Log.Debug("ExampleAlchemyDataNews.GetNews()", "Failed to get news!"); while (!_getNewsTested) yield return null; - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news examples complete!"); + Log.Debug("ExampleAlchemyDataNews.Examples()", "Alchemy data news examples complete!"); } private void OnGetNews(NewsResponse newsData, string data) { - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news - Get news Response: {0}", data); + Log.Debug("ExampleAlchemyDataNews.OnGetNews()", "Alchemy data news - Get news Response: {0}", data); _getNewsTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs b/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs index b4b04c17c..f3e777f13 100644 --- a/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs +++ b/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs @@ -119,568 +119,568 @@ private IEnumerator Examples() { // Get Author URL POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors URL POST!"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors URL POST!"); while (!_getAuthorsURLTested) yield return null; //Get Author HTML POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors HTML POST!"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors HTML POST!"); while (!_getAuthorsHTMLTested) yield return null; ////Get Concepts Text POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts Text POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts Text POST!"); while (!_getRankedConceptsTextTested) yield return null; //Get Concepts HTML POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts HTML POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts HTML POST!"); while (!_getRankedConceptsHTMLTested) yield return null; //Get Concepts URL POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts url POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts url POST!"); while (!_getRankedConceptsURLTested) yield return null; //Get Date URL POST if (!_alchemyAPI.GetDates(OnGetDatesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by URL POST"); while (!_getDatesURLTested) yield return null; //Get Date Text POST if (!_alchemyAPI.GetDates(OnGetDatesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by text POST"); while (!_getDatesTextTested) yield return null; //Get Date HTML POST if (!_alchemyAPI.GetDates(OnGetDatesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by HTML POST"); while (!_getDatesHTMLTested) yield return null; //Get Emotions URL POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsUrl, _exampleURL_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by URL POST"); while (!_getEmotionURLTested) yield return null; //Get Emotions Text POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsText, _exampleText_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by text POST"); while (!_getEmotionTextTested) yield return null; //Get Emotions HTML POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsHtml, _watson_beats_jeopardy_html, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by HTML POST"); while (!_getEmotionHTMLTested) yield return null; //Extract Entities URL POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by URL POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by URL POST"); while (!_getEntityExtractionURLTested) yield return null; //Extract Entities Text POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by text POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by text POST"); while (!_getEntityExtractionTextTested) yield return null; //Extract Entities HTML POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by HTML POST"); while (!_getEntityExtractionHTMLTested) yield return null; //Detect Feeds URL POST if (!_alchemyAPI.DetectFeeds(OnDetectFeedsUrl, "http://time.com/newsfeed/")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by URL POST"); + Log.Debug("ExampleAlchemyLanguage.DetectFeeds()", "Failed to get feeds by URL POST"); while (!_detectFeedsURLTested) yield return null; ////Detect Feeds HTML POST //if (!_alchemyAPI.DetectFeeds(OnDetectFeedsHtml, ycombinator_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by HTML POST"); + // Log.Debug("ExampleAlchemyLanguage.DetectFeeds()", "Failed to get feeds by HTML POST"); //while (!_detectFeedsHTMLTested) // yield return null; //Extract Keywords URL POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by URL POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by URL POST"); while (!_getKeywordExtractionURLTested) yield return null; //Extract Keywords Text POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by text POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by text POST"); while (!_getKeywordExtractionTextTested) yield return null; //Extract Keywords HTML POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by HTML POST"); while (!_getKeywordExtractionHTMLTested) yield return null; //Extract Languages URL POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageURLTested) yield return null; //Extract Languages Text POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageTextTested) yield return null; //Extract Languages HTML POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by HTML POST"); while (!_getLanguageHTMLTested) yield return null; //Get Microformats URL POST if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsUrl, _exampleURL_microformats)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); while (!_getMicroformatURLTested) yield return null; //Get Microformats HTML POST //if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsHtml, microformats_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + // Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); //while (!_getMicroformatHTMLTested) // yield return null; //Get PublicationDate URL POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by url POST"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by url POST"); while (!_getPubDateURLTested) yield return null; //Get PublicationDate HTML POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by html POST"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by html POST"); while (!_getPubDateHTMLTested) yield return null; //Get Relations URL POST if (!_alchemyAPI.GetRelations(OnGetRelationsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsURLTested) yield return null; //Get Relations Text POST if (!_alchemyAPI.GetRelations(OnGetRelationsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsTextTested) yield return null; //Get Relations HTML POST if (!_alchemyAPI.GetRelations(OnGetRelationsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by HTML POST"); while (!_getRelationsHTMLTested) yield return null; //Get Sentiment URL POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentURLTested) yield return null; //Get Sentiment Text POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentTextTested) yield return null; //Get Sentiment HTML POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by HTML POST"); while (!_getTextSentimentHTMLTested) yield return null; //Get Targeted Sentiment URL POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentUrl, _exampleURL_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentURLTested) yield return null; //Get Targeted Sentiment Text POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentText, _exampleText_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentTextTested) yield return null; //Get Targeted Sentiment HTML POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentHtml, _watson_beats_jeopardy_html, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by HTML POST"); while (!_getTargetedSentimentHTMLTested) yield return null; //Get Taxonomy URL POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyURLTested) yield return null; //Get Taxonomy Text POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy9", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyTextTested) yield return null; //Get Taxonomy HTML POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by HTML POST"); while (!_getRankedTaxonomyHTMLTested) yield return null; //Get Text HTML POST if (!_alchemyAPI.GetText(OnGetTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextHTMLTested) yield return null; //Get Text URL POST if (!_alchemyAPI.GetText(OnGetTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextURLTested) yield return null; //Get Raw Text HTML POST if (!_alchemyAPI.GetRawText(OnGetRawTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextHTMLTested) yield return null; //Get Raw Text URL POST if (!_alchemyAPI.GetRawText(OnGetRawTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextURLTested) yield return null; //Get Title HTML POST if (!_alchemyAPI.GetTitle(OnGetTitleHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleHTMLTested) yield return null; //Get Title URL POST if (!_alchemyAPI.GetTitle(OnGetTitleUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleURLTested) yield return null; // Get Combined Data URL POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataUrl, _exampleURL_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataURLTested) yield return null; //Get Combined Data Text POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataText, _exampleText_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataTextTested) yield return null; //Get Combined Data HTML POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataHtml, _watson_beats_jeopardy_html, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by HTML POST"); while (!_getCombinedDataHTMLTested) yield return null; - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language examples complete"); + Log.Debug("ExampleAlchemyLanguage.Examples()", "Alchemy Language examples complete"); } private void OnGetAuthorsHtml(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsHtml()", "Alchemy Language - Get authors response html: {0}", data); _getAuthorsHTMLTested = true; } private void OnGetAuthorsUrl(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsUrl()", "Alchemy Language - Get authors response url: {0}", data); _getAuthorsURLTested = true; } private void OnGetConceptsHtml(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsUrl()", "Alchemy Language - Get ranked concepts response html: {0}", data); _getRankedConceptsHTMLTested = true; } private void OnGetConceptsUrl(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConceptsUrl()", "Alchemy Language - Get ranked concepts response url: {0}", data); _getRankedConceptsURLTested = true; } private void OnGetConceptsText(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConceptsText()", "Alchemy Language - Get ranked concepts response text: {0}", data); _getRankedConceptsTextTested = true; } private void OnGetDatesHtml(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesHtml()", "Alchemy Language - Get dates response html: {0}", data); _getDatesHTMLTested = true; } private void OnGetDatesUrl(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesUrl()", "Alchemy Language - Get dates response url: {0}", data); _getDatesURLTested = true; } private void OnGetDatesText(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesText()", "Alchemy Language - Get dates response text: {0}", data); _getDatesTextTested = true; } private void OnGetEmotionsHtml(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsHtml()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionHTMLTested = true; } private void OnGetEmotionsUrl(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsUrl()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionURLTested = true; } private void OnGetEmotionsText(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsText()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionTextTested = true; } private void OnExtractEntitiesHtml(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesHtml()", "Alchemy Language - Extract entities response html: {0}", data); _getEntityExtractionHTMLTested = true; } private void OnExtractEntitiesUrl(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesUrl()", "Alchemy Language - Extract entities response url: {0}", data); _getEntityExtractionURLTested = true; } private void OnExtractEntitiesText(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesText()", "Alchemy Language - Extract entities response text: {0}", data); _getEntityExtractionTextTested = true; } //private void OnDetectFeedsHtml(FeedData feedData, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response html: {0}", data); + // Log.Debug("ExampleAlchemyLanguage.OnDetectFeedsHtml()", "Alchemy Language - Detect feeds response html: {0}", data); // _detectFeedsHTMLTested = true; //} private void OnDetectFeedsUrl(FeedData feedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnDetectFeedsUrl()", "Alchemy Language - Detect feeds response url: {0}", data); _detectFeedsURLTested = true; } private void OnExtractKeywordsHtml(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsHtml()", "Alchemy Language - Extract keywords response html: {0}", data); _getKeywordExtractionHTMLTested = true; } private void OnExtractKeywordsUrl(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsUrl()", "Alchemy Language - Extract keywords response url: {0}", data); _getKeywordExtractionURLTested = true; } private void OnExtractKeywordsText(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsText()", "Alchemy Language - Extract keywords response text: {0}", data); _getKeywordExtractionTextTested = true; } private void OnGetLanguagesHtml(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesHtml()", "Alchemy Language - Get languages response html: {0}", data); _getLanguageHTMLTested = true; } private void OnGetLanguagesUrl(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesUrl()", "Alchemy Language - Get languages response url: {0}", data); _getLanguageURLTested = true; } private void OnGetLanguagesText(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesText()", "Alchemy Language - Get languages response text: {0}", data); _getLanguageTextTested = true; } //private void OnGetMicroformatsHtml(MicroformatData microformats, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response html: {0}", data); + // Log.Debug("ExampleAlchemyLanguage.OnGetMicroformatsHtml()", "Alchemy Language - Get microformats response html: {0}", data); // _getMicroformatHTMLTested = true; //} private void OnGetMicroformatsUrl(MicroformatData microformats, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetMicroformatsUrl()", "Alchemy Language - Get microformats response url: {0}", data); _getMicroformatURLTested = true; } private void OnGetPublicationDateHtml(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDateHtml()", "Alchemy Language - Get publication date response html: {0}", data); _getPubDateHTMLTested = true; } private void OnGetPublicationDateUrl(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDateUrl()", "Alchemy Language - Get publication date response url: {0}", data); _getPubDateURLTested = true; } private void OnGetRelationsHtml(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsHtml()", "Alchemy Language - Get relations response html: {0}", data); _getRelationsHTMLTested = true; } private void OnGetRelationsUrl(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsUrl()", "Alchemy Language - Get relations response url: {0}", data); _getRelationsURLTested = true; } private void OnGetRelationsText(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsText()", "Alchemy Language - Get relations response text: {0}", data); _getRelationsTextTested = true; } private void OnGetTextSentimentHtml(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentHtml()", "Alchemy Language - Get text sentiment response html: {0}", data); _getTextSentimentHTMLTested = true; } private void OnGetTextSentimentUrl(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentUrl()", "Alchemy Language - Get text sentiment response url: {0}", data); _getTextSentimentURLTested = true; } private void OnGetTextSentimentText(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentText()", "Alchemy Language - Get text sentiment response text: {0}", data); _getTextSentimentTextTested = true; } private void OnGetTargetedSentimentHtml(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentHtml()", "Alchemy Language - Get targeted sentiment response html: {0}", data); _getTargetedSentimentHTMLTested = true; } private void OnGetTargetedSentimentUrl(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentUrl()", "Alchemy Language - Get targeted sentiment response url: {0}", data); _getTargetedSentimentURLTested = true; } private void OnGetTargetedSentimentText(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentText()", "Alchemy Language - Get targeted sentiment response text: {0}", data); _getTargetedSentimentTextTested = true; } private void OnGetRankedTaxonomyHtml(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyHtml()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); _getRankedTaxonomyHTMLTested = true; } private void OnGetRankedTaxonomyUrl(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyUrl()", "Alchemy Language - Get ranked taxonomy response url: {0}", data); _getRankedTaxonomyURLTested = true; } private void OnGetRankedTaxonomyText(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyText()", "Alchemy Language - Get ranked taxonomy response text: {0}", data); _getRankedTaxonomyTextTested = true; } private void OnGetTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextHtml()", "Alchemy Language - Get Text HTML response: {0}", data); _getTextHTMLTested = true; } private void OnGetTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextUrl()", "Alchemy Language - Get Text Url response: {0}", data); _getTextURLTested = true; } private void OnGetRawTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawTextHtml()", "Alchemy Language - Get raw text HTML response: {0}", data); _getRawTextHTMLTested = true; } private void OnGetRawTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawTextUrl()", "Alchemy Language - Get raw text Url response: {0}", data); _getRawTextURLTested = true; } private void OnGetTitleHtml(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitleHtml()", "Alchemy Language - Get Title HTML response: {0}", data); _getTitleHTMLTested = true; } private void OnGetTitleUrl(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitleUrl()", "Alchemy Language - Get Title Url response: {0}", data); _getTitleURLTested = true; } private void OnGetCombinedDataHtml(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataHtml()", "Alchemy Language - Get Combined Data HTML response: {0}", data); _getCombinedDataHTMLTested = true; } private void OnGetCombinedDataUrl(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataUrl()", "Alchemy Language - Get Combined Data Url response: {0}", data); _getCombinedDataURLTested = true; } private void OnGetCombinedDataText(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataText()", "Alchemy Language - Get Combined Data Text response: {0}", data); _getCombinedDataTextTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleConversation.cs b/Examples/ServiceExamples/Scripts/ExampleConversation.cs index e5b71c67c..1f3bff23d 100644 --- a/Examples/ServiceExamples/Scripts/ExampleConversation.cs +++ b/Examples/ServiceExamples/Scripts/ExampleConversation.cs @@ -55,7 +55,7 @@ void Start() private IEnumerator Examples() { if (!_conversation.Message(OnMessage, _workspaceId, "hello")) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); while (_waitingForResponse) yield return null; @@ -89,7 +89,7 @@ private IEnumerator Examples() while (_waitingForResponse) yield return null; - Log.Debug("ExampleConversation", "Conversation examples complete."); + Log.Debug("ExampleConversation.Examples()", "Conversation examples complete."); } private void AskQuestion() @@ -104,12 +104,12 @@ private void AskQuestion() }; if (!_conversation.Message(OnMessage, _workspaceId, messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.AskQuestion()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); // Convert resp to fsdata fsData fsdata = null; @@ -131,7 +131,7 @@ private void OnMessage(object resp, string data) if (_tempContext != null) _context = _tempContext as Dictionary; else - Log.Debug("ExampleConversation", "Failed to get context"); + Log.Debug("ExampleConversation.OnMessage()", "Failed to get context"); _waitingForResponse = false; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs b/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs index 3f42204d3..2b6877b90 100644 --- a/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs +++ b/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs @@ -82,16 +82,16 @@ private void Start() private IEnumerator Examples() { // Get Environments - Log.Debug("ExampleDiscoveryV1", "Attempting to get environments"); + Log.Debug("ExampleDiscoveryV1.Examples()", "Attempting to get environments"); if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environments"); + Log.Debug("ExampleDiscoveryV1.GetEnvironments()", "Failed to get environments"); while (!_getEnvironmentsTested) yield return null; // AddEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to add environment"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add environment"); if (!_discovery.AddEnvironment(OnAddEnvironment, "unity-testing-AddEnvironment-do-not-delete-until-active", "Testing addEnvironment in Unity SDK. Please do not delete this environment until the status is 'active'", 1)) - Log.Debug("ExampleDiscoveryV1", "Failed to add environment"); + Log.Debug("ExampleDiscovery.AddEnvironment()", "Failed to add environment"); while (!_addEnvironmentTested) yield return null; @@ -101,165 +101,165 @@ private IEnumerator Examples() yield return null; // GetEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get environment"); if (!_discovery.GetEnvironment(OnGetEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environment"); + Log.Debug("ExampleDiscovery.GetEnvironment()", "Failed to get environment"); while (!_getEnvironmentTested) yield return null; // Get Configurations - Log.Debug("ExampleDiscoveryV1", "Attempting to get configurations"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get configurations"); if (!_discovery.GetConfigurations(OnGetConfigurations, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configurations"); + Log.Debug("ExampleDiscovery.GetConfigurations()", "Failed to get configurations"); while (!_getConfigurationsTested) yield return null; // Add Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to add configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add configuration"); if (!_discovery.AddConfiguration(OnAddConfiguration, _createdEnvironmentID, _configurationJsonPath)) - Log.Debug("ExampleDiscoveryV1", "Failed to add configuration"); + Log.Debug("ExampleDiscovery.AddConfiguration()", "Failed to add configuration"); while (!_addConfigurationTested) yield return null; // Get Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to get configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get configuration"); if (!_discovery.GetConfiguration(OnGetConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configuration"); + Log.Debug("ExampleDiscovery.GetConfiguration()", "Failed to get configuration"); while (!_getConfigurationTested) yield return null; // Preview Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to preview configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to preview configuration"); if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, _createdEnvironmentID, _createdConfigurationID, null, _filePathToIngest, _metadata)) - Log.Debug("ExampleDiscoveryV1", "Failed to preview configuration"); + Log.Debug("ExampleDiscovery.PreviewConfiguration()", "Failed to preview configuration"); while (!_previewConfigurationTested) yield return null; // Get Collections - Log.Debug("ExampleDiscoveryV1", "Attempting to get collections"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get collections"); if (!_discovery.GetCollections(OnGetCollections, _createdEnvironmentID)) - Log.Debug("ExampleDiscovery", "Failed to get collections"); + Log.Debug("ExampleDiscovery.GetCollections()", "Failed to get collections"); while (!_getCollectionsTested) yield return null; // Add Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to add collection"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add collection"); if (!_discovery.AddCollection(OnAddCollection, _createdEnvironmentID, _createdCollectionName, _createdCollectionDescription, _createdConfigurationID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.AddCollection()", "Failed to add collection"); while (!_addCollectionTested) yield return null; // Get Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to get collection"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get collection"); if (!_discovery.GetCollection(OnGetCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get collection"); + Log.Debug("ExampleDiscovery.GetCollection()", "Failed to get collection"); while (!_getCollectionTested) yield return null; // Get fields if (!_discovery.GetFields(OnGetFields, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get fields"); + Log.Debug("ExampleDiscovery.GetFields()", "Failed to get fields"); while (!_getFieldsTested) yield return null; // Add Document - Log.Debug("ExampleDiscoveryV1", "Attempting to add document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add document"); if (!_discovery.AddDocument(OnAddDocument, _createdEnvironmentID, _createdCollectionID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to add document"); + Log.Debug("ExampleDiscovery.AddDocument()", "Failed to add document"); while (!_addDocumentTested) yield return null; // Get Document - Log.Debug("ExampleDiscoveryV1", "Attempting to get document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get document"); if (!_discovery.GetDocument(OnGetDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to get document"); + Log.Debug("ExampleDiscovery.GetDocument()", "Failed to get document"); while (!_getDocumentTested) yield return null; // Update Document - Log.Debug("ExampleDiscoveryV1", "Attempting to update document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to update document"); if (!_discovery.UpdateDocument(OnUpdateDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to update document"); + Log.Debug("ExampleDiscovery.UpdateDocument()", "Failed to update document"); while (!_updateDocumentTested) yield return null; // Query - Log.Debug("ExampleDiscoveryV1", "Attempting to query"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to query"); if (!_discovery.Query(OnQuery, _createdEnvironmentID, _createdCollectionID, null, _query, null, 10, null, 0)) - Log.Debug("ExampleDiscovery", "Failed to query"); + Log.Debug("ExampleDiscovery.Query()", "Failed to query"); while (!_queryTested) yield return null; // Delete Document - Log.Debug("ExampleDiscoveryV1", "Attempting to delete document {0}", _createdDocumentID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete document {0}", _createdDocumentID); if (!_discovery.DeleteDocument(OnDeleteDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to delete document"); + Log.Debug("ExampleDiscovery.DeleteDocument()", "Failed to delete document"); while (!_deleteDocumentTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete collection for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete collection for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to delete collection {0}", _createdCollectionID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete collection {0}", _createdCollectionID); if (!_discovery.DeleteCollection(OnDeleteCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.DeleteCollection()", "Failed to add collection"); while (!_deleteCollectionTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete configuration for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete configuration for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to delete configuration {0}", _createdConfigurationID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete configuration {0}", _createdConfigurationID); if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete configuration"); + Log.Debug("ExampleDiscovery.DeleteConfiguration()", "Failed to delete configuration"); while (!_deleteConfigurationTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete environment for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete environment for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Environment - Log.Debug("ExampleDiscoveryV1", "Attempting to delete environment {0}", _createdEnvironmentID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete environment {0}", _createdEnvironmentID); if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete environment"); + Log.Debug("ExampleDiscovery.DeleteEnvironment()", "Failed to delete environment"); while (!_deleteEnvironmentTested) yield return null; - Log.Debug("ExampleDiscoveryV1", "Discovery examples complete."); + Log.Debug("ExampleDiscovery.Examples()", "Discovery examples complete."); } #region Check State private void CheckEnvironmentState() { - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment state"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get environment state"); try { _discovery.GetEnvironment(HandleCheckEnvironmentState, _createdEnvironmentID); } catch (System.Exception e) { - Log.Debug("ExampleDiscoveryV1", string.Format("Failed to get environment state: {0}", e.Message)); + Log.Debug("ExampleDiscovery.Examples()", string.Format("Failed to get environment state: {0}", e.Message)); CheckEnvironmentState(); } } private void HandleCheckEnvironmentState(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Environment {0} is {1}", resp.environment_id, resp.status); + Log.Debug("ExampleDiscovery.Examples()", "Environment {0} is {1}", resp.environment_id, resp.status); if (resp.status.ToLower() == "active") _isEnvironmentReady = true; @@ -277,39 +277,39 @@ private void Delay() private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); _getEnvironmentsTested = true; } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); _getEnvironmentTested = true; } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); _createdEnvironmentID = resp.environment_id; _addEnvironmentTested = true; } private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); _getConfigurationsTested = true; } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); _getConfigurationTested = true; } private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); _createdConfigurationID = resp.configuration_id; _addConfigurationTested = true; } @@ -317,56 +317,56 @@ private void OnAddConfiguration(Configuration resp, string data) private void OnPreviewConfiguration(TestDocument resp, string data) { _previewConfigurationTested = true; - Log.Debug("ExampleDiscoveryV1", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); } private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get collections Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get collections Response: {0}", data); _getCollectionsTested = true; } private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); _getCollectionTested = true; } private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); _createdCollectionID = resp.collection_id; _addCollectionTested = true; } private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); _getFieldsTested = true; } private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); _createdDocumentID = resp.document_id; _addDocumentTested = true; } private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); _getDocumentTested = true; } private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); _updateDocumentTested = true; } private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); if (success) _createdDocumentID = default(string); @@ -376,7 +376,7 @@ private void OnDeleteDocument(bool success, string data) private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); if (success) _createdCollectionID = default(string); @@ -386,7 +386,7 @@ private void OnDeleteCollection(bool success, string data) private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteConfiguration Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteConfiguration()", "Discovery - DeleteConfiguration Response: deleted:{0}", success); if (success) _createdConfigurationID = default(string); @@ -396,7 +396,7 @@ private void OnDeleteConfiguration(bool success, string data) private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteEnvironment Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteEnvironment()", "Discovery - DeleteEnvironment Response: deleted:{0}", success); if (success) _createdEnvironmentID = default(string); @@ -406,7 +406,7 @@ private void OnDeleteEnvironment(bool success, string data) private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); _queryTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs b/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs index 18c6641c9..a719179e2 100644 --- a/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs +++ b/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs @@ -48,17 +48,17 @@ void Start() private IEnumerator Examples() { if (!_documentConversion.ConvertDocument(OnConvertDocument, _examplePath, _conversionTarget)) - Log.Debug("ExampleDocumentConversion", "Document conversion failed!"); + Log.Debug("ExampleDocumentConversion.ConvertDocument()", "Document conversion failed!"); while (!_convertDocumentTested) yield return null; - Log.Debug("ExampleDoucmentConversion", "Document conversion examples complete."); + Log.Debug("ExampleDoucmentConversion.Examples()", "Document conversion examples complete."); } private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) { - Log.Debug("ExampleDoucmentConversion", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); + Log.Debug("ExampleDoucmentConversion.OnConvertDocument()", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); _convertDocumentTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleGetToken.cs b/Examples/ServiceExamples/Scripts/ExampleGetToken.cs index 833dab86c..484004c54 100644 --- a/Examples/ServiceExamples/Scripts/ExampleGetToken.cs +++ b/Examples/ServiceExamples/Scripts/ExampleGetToken.cs @@ -42,7 +42,7 @@ private IEnumerator Example() { // Get token if (!Utility.GetToken(OnGetToken, _url, _username, _password)) - Log.Debug("ExampleGetToken", "Failed to get token."); + Log.Debug("ExampleGetToken.GetToken()", "Failed to get token."); while (!_receivedAuthToken) yield return null; @@ -54,14 +54,14 @@ private IEnumerator Example() private void OnGetToken(AuthenticationToken authenticationToken, string customData) { _authenticationToken = authenticationToken; - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.OnGetToken()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); _receivedAuthToken = true; } private IEnumerator GetTokenTimeRemaining(float time) { yield return new WaitForSeconds(time); - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.GetTokenTimeRemaining()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); } private void Message() @@ -80,7 +80,7 @@ private void Message() private void OnMessage(object resp, string customData) { - Log.Debug("ExampleGetToken", "message response: {0}", customData); + Log.Debug("ExampleGetToken.OnMessage()", "message response: {0}", customData); // Check token time remaining Runnable.Run(GetTokenTimeRemaining(0f)); diff --git a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs index eb5b4b35d..c9ba0bb65 100644 --- a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs +++ b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs @@ -34,13 +34,13 @@ void Start() Credentials credentials = new Credentials(_username, _password, _url); _languageTranslation = new LanguageTranslation(credentials); - Log.Debug("ExampleLangaugeTranslation", "English Phrase to translate: " + _pharseToTranslate); + Log.Debug("ExampleLangaugeTranslation.Start()", "English Phrase to translate: " + _pharseToTranslate); _languageTranslation.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation); } private void OnGetTranslation(Translations translation, string customData) { if (translation != null && translation.translations.Length > 0) - Log.Debug("ExampleLangaugeTranslation", "Spanish Translation: " + translation.translations[0].translation); + Log.Debug("ExampleLangaugeTranslation.OnGetTranslation()", "Spanish Translation: " + translation.translations[0].translation); } } diff --git a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs index 4dc273d57..573bb45b2 100644 --- a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs +++ b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs @@ -59,84 +59,84 @@ void Start() private IEnumerator Examples() { if (!_languageTranslator.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation)) - Log.Debug("TestLanguageTranslator", "Failed to translate."); + Log.Debug("ExampleLanguageTranslator.GetTranslation()", "Failed to translate."); while (!_getTranslationTested) yield return null; if (!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslator", "Failed to get models."); + Log.Debug("ExampleLanguageTranslator.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; if (!_languageTranslator.CreateModel(OnCreateModel, _baseModelName, _customModelName, _forcedGlossaryFilePath)) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("ExampleLanguageTranslator.CreateModel()", "Failed to create model."); while (!_createModelTested) yield return null; if (!_languageTranslator.GetModel(OnGetModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to get model."); + Log.Debug("ExampleLanguageTranslator.GetModel()", "Failed to get model."); while (!_getModelTested) yield return null; if (!_languageTranslator.DeleteModel(OnDeleteModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslator.DeleteModel()", "Failed to delete model."); while (!_deleteModelTested) yield return null; if (!_languageTranslator.Identify(OnIdentify, _pharseToIdentify)) - Log.Debug("TestLanguageTranslator", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslator.Identify()", "Failed to identify language."); while (!_identifyTested) yield return null; if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslator", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslator.GetLanguages()", "Failed to get languages."); while (!_getLanguagesTested) yield return null; - Log.Debug("TestLanguageTranslator", "Language Translator examples complete."); + Log.Debug("ExampleLanguageTranslator.Examples()", "Language Translator examples complete."); } private void OnGetModels(TranslationModels models, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", customData); _getModelsTested = true; } private void OnCreateModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", customData); _customLanguageModelId = model.model_id; _createModelTested = true; } private void OnGetModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", customData); _getModelTested = true; } private void OnDeleteModel(bool success, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); _customLanguageModelId = null; _deleteModelTested = true; } private void OnGetTranslation(Translations translation, string customData) { - Log.Debug("TestLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", customData); _getTranslationTested = true; } private void OnIdentify(string lang, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", customData); _identifyTested = true; } private void OnGetLanguages(Languages languages, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", customData); _getLanguagesTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs index e9cedba3e..3705c9745 100644 --- a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs +++ b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs @@ -67,13 +67,13 @@ private IEnumerator Examples() { // Get classifiers if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifiers!"); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); while (!_getClassifiersTested) yield return null; if (_classifierIds.Count == 0) - Log.Debug("ExampleNaturalLanguageClassifier", "There are no trained classifiers. Please train a classifier..."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "There are no trained classifiers. Please train a classifier..."); if (_classifierIds.Count > 0) { @@ -81,7 +81,7 @@ private IEnumerator Examples() foreach (string classifierId in _classifierIds) { if (!naturalLanguageClassifier.GetClassifier(classifierId, OnGetClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifier {0}!", classifierId); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } while (!_getClassifierTested) @@ -89,14 +89,14 @@ private IEnumerator Examples() } if (!_areAnyClassifiersAvailable && _classifierIds.Count > 0) - Log.Debug("ExampleNaturalLanguageClassifier", "All classifiers are training..."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "All classifiers are training..."); // Train classifier #if TRAIN_CLASSIFIER string dataPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/weather_data_train.csv"; var trainingContent = File.ReadAllText(dataPath); if (!naturalLanguageClassifier.TrainClassifier(_classifierName + "/" + DateTime.Now.ToString(), "en", trainingContent, OnTrainClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to train clasifier!"); + Log.Debug("ExampleNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); while (!_trainClassifierTested) yield return null; @@ -105,25 +105,25 @@ private IEnumerator Examples() #if DELETE_TRAINED_CLASSIFIER if (!string.IsNullOrEmpty(_classifierToDelete)) if (!naturalLanguageClassifier.DeleteClassifer(_classifierToDelete, OnDeleteTrainedClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to delete clasifier {0}!", _classifierToDelete); + Log.Debug("ExampleNaturalLanguageClassifier.DeleteClassifer()", "Failed to delete clasifier {0}!", _classifierToDelete); #endif // Classify if (_areAnyClassifiersAvailable) { if (!naturalLanguageClassifier.Classify(_classifierId, _inputString, OnClassify)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to classify!"); + Log.Debug("ExampleNaturalLanguageClassifier.Classify()", "Failed to classify!"); while (!_classifyTested) yield return null; } - Log.Debug("ExampleNaturalLanguageClassifier", "Natural language classifier examples complete."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "Natural language classifier examples complete."); } private void OnGetClassifiers(Classifiers classifiers, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); foreach (Classifier classifier in classifiers.classifiers) _classifierIds.Add(classifier.classifier_id); @@ -133,14 +133,14 @@ private void OnGetClassifiers(Classifiers classifiers, string data) private void OnClassify(ClassifyResult result, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); _classifyTested = true; } #if TRAIN_CLASSIFIER private void OnTrainClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; #endif @@ -150,7 +150,7 @@ private void OnTrainClassifier(Classifier classifier, string data) private void OnGetClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); // Get any classifier that is available if (!string.IsNullOrEmpty(classifier.status) && classifier.status.ToLower() == "available") @@ -166,7 +166,7 @@ private void OnGetClassifier(Classifier classifier, string data) #if DELETE_TRAINED_CLASSIFIER private void OnDeleteTrainedClassifier(bool success, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); } #endif } diff --git a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs index 72b4a81c8..f9bbd4bd3 100644 --- a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs +++ b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs @@ -48,9 +48,9 @@ void Start() private IEnumerator Examples() { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to get models..."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "attempting to get models..."); if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; @@ -76,20 +76,20 @@ private IEnumerator Examples() } }; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to analyze..."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "attempting to analyze..."); if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, parameters)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); while (!_analyzeTested) yield return null; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Natural language understanding examples complete."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "Natural language understanding examples complete."); } private void OnGetModels(ListModelsResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "ListModelsResult: {0}", data.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "ListModelsResult: {0}", data.ToString()); _getModelsTested = true; } @@ -98,7 +98,7 @@ private void OnAnalyze(AnalysisResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "AnalysisResults: {0}", data.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "AnalysisResults: {0}", data.ToString()); _analyzeTested = true; } diff --git a/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs b/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs index e6c4df56c..b41fc75d3 100644 --- a/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs +++ b/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs @@ -55,27 +55,27 @@ void Start() private IEnumerator Examples() { if (!_personalityInsights.GetProfile(OnGetProfileJson, _dataPath, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileJsonTested) yield return null; if (!_personalityInsights.GetProfile(OnGetProfileText, _testString, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileTextTested) yield return null; - Log.Debug("ExamplePersonalityInsights", "Personality insights examples complete."); + Log.Debug("ExamplePersonalityInsights.Examples()", "Personality insights examples complete."); } private void OnGetProfileText(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileText Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileText()", "Personality Insights - GetProfileText Response: {0}", data); _getProfileTextTested = true; } private void OnGetProfileJson(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileJson Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileJson()", "Personality Insights - GetProfileJson Response: {0}", data); _getProfileJsonTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs b/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs index 4fa734812..552d99645 100644 --- a/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs +++ b/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs @@ -92,17 +92,17 @@ void Start() private IEnumerator Examples() { // Get clusters - Log.Debug("ExampleRetrieveAndRank", "Attempting to get clusters."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get clusters."); if (!_retrieveAndRank.GetClusters(OnGetClusters)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get clusters!"); + Log.Debug("ExampleRetrieveAndRank.GetClusters()", "Failed to get clusters!"); while (!_getClustersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to create cluster."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create cluster."); if (!_retrieveAndRank.CreateCluster(OnCreateCluster, "unity-test-cluster", "1")) - Log.Debug("ExampleRetrieveAndRank", "Failed to create cluster!"); + Log.Debug("ExampleRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); while (!_createClusterTested || !_readyToContinue) yield return null; @@ -113,78 +113,78 @@ private IEnumerator Examples() _readyToContinue = false; // List cluster configs - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster configs."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster configs."); if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster configs!"); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); while (!_getClusterConfigsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Upload cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to upload cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to upload cluster config."); if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, _clusterToDelete, _testClusterConfigName, _testClusterConfigPath)) - Log.Debug("ExampleRetrieveAndRank", "Failed to upload cluster config {0}!", _testClusterConfigPath); + Log.Debug("ExampleRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", _testClusterConfigPath); while (!_uploadClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster."); if (!_retrieveAndRank.GetCluster(OnGetCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster!"); + Log.Debug("ExampleRetrieveAndRank.GetCluster()", "Failed to get cluster!"); while (!_getClusterTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster config."); if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, _clusterToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster config {0}!", _testClusterConfigName); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", _testClusterConfigName); while (!_getClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // List Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to get collections."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get collections."); if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, _clusterToDelete, CollectionsAction.List)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); while (!_getCollectionsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to create collection."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create collection."); if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, _clusterToDelete, CollectionsAction.Create, _collectionNameToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); while (!_createCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Index documents - Log.Debug("ExampleRetrieveAndRank", "Attempting to index documents."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to index documents."); if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, _indexDataPath, _clusterToDelete, _collectionNameToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to index documents!"); + Log.Debug("ExampleRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); while (!_indexDocumentsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRankers(OnGetRankers)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get rankers!"); + Log.Debug("ExampleRetrieveAndRank.GetRankers()", "Failed to get rankers!"); while (!_getRankersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create ranker - Log.Debug("ExampleRetrieveAndRank", "Attempting to create ranker."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create ranker."); if (!_retrieveAndRank.CreateRanker(OnCreateRanker, _testRankerTrainingPath, _createdRankerName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create ranker!"); + Log.Debug("ExampleRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); while (!_createRankerTested || !_readyToContinue) yield return null; // Wait for ranker status to be `Available`. - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Checking ranker status in 10 seconds"); CheckRankerStatus(); while (!_isRankerReady || !_readyToContinue) yield return null; @@ -192,74 +192,74 @@ private IEnumerator Examples() _readyToContinue = false; // Standard Search string[] fl = { "title", "id", "body", "author", "bibliography" }; - Log.Debug("ExampleRetrieveAndRank", "Attempting to search standard."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to search standard."); if (!_retrieveAndRank.Search(OnSearchStandard, _clusterToDelete, _collectionNameToDelete, _testQuery, fl)) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); while (!_searchStandardTested || !_readyToContinue) yield return null; _readyToContinue = false; // Rank - Log.Debug("ExampleRetrieveAndRank", "Attempting to rank."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to rank."); if (!_retrieveAndRank.Rank(OnRank, _rankerIdToDelete, _testAnswerDataPath)) - Log.Debug("ExampleRetriveAndRank", "Failed to rank!"); + Log.Debug("ExampleRetrieveAndRank.Rank()", "Failed to rank!"); while (!_rankTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get ranker info - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRanker(OnGetRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get ranker!"); + Log.Debug("ExampleRetrieveAndRank.GetRanker()", "Failed to get ranker!"); while (!_getRankerTested) yield return null; _readyToContinue = false; // Delete rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete ranker {0}.", _rankerIdToDelete); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete ranker {0}.", _rankerIdToDelete); if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete ranker {0}!", _rankerIdToDelete); + Log.Debug("ExampleRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", _rankerIdToDelete); while (!_deleteRankerTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete collection {0}.", "TestCollectionToDelete"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete collection {0}.", "TestCollectionToDelete"); if (!_retrieveAndRank.ForwardCollectionRequest(OnDeleteCollection, _clusterToDelete, CollectionsAction.Delete, "TestCollectionToDelete")) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); while (!_deleteCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster config string clusterConfigToDelete = "test-config"; - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete cluster config."); if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, _clusterToDelete, clusterConfigToDelete)) - Log.Debug("ExampleRetriveAndRank", "Failed to delete cluster config {0}", clusterConfigToDelete); + Log.Debug("ExampleRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", clusterConfigToDelete); while (!_deleteClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster {0}.", _clusterToDelete); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete cluster {0}.", _clusterToDelete); if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete cluster!"); + Log.Debug("ExampleRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); while (!_deleteClusterTested || !_readyToContinue) yield return null; - Log.Debug("ExampleRetrieveAndRank", "Retrieve and rank examples complete!"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Retrieve and rank examples complete!"); } private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get clusters response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "Retrieve and rank - Get clusters response: {0}", data); _getClustersTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCluster()", "Retrieve and rank - Create cluster response: {0}", data); _clusterToDelete = resp.solr_cluster_id; _createClusterTested = true; Invoke("ReadyToContinue", _waitTime); @@ -267,28 +267,28 @@ private void OnCreateCluster(SolrClusterResponse resp, string data) private void OnDeleteCluster(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCluster()", "Retrieve and rank - Delete cluster response: {0}", data); _deleteClusterTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "Retrieve and rank - Get cluster response: {0}", data); _getClusterTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "Retrieve and rank - Get cluster config response: {0}", data); _getClusterConfigsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteClusterConfig(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Deletecluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteClusterConfig()", "Retrieve and rank - Deletecluster config response: {0}", data); _deleteClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); } @@ -297,9 +297,9 @@ private void OnDeleteClusterConfig(bool success, string data) private void OnGetClusterConfig(byte[] respData, string data) { #if UNITY_EDITOR - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "Retrieve and rank - Get cluster config response: {0}", data); #else - Log.Debug("ExampleRetrieveAndRank", "Not in editor - skipping download."); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "Not in editor - skipping download."); #endif _getClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); @@ -307,49 +307,49 @@ private void OnGetClusterConfig(byte[] respData, string data) private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Upload cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "Retrieve and rank - Upload cluster config response: {0}", data); _uploadClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "Retrieve and rank - Get collections response: {0}", data); _getCollectionsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "Retrieve and rank - Get collections response: {0}", data); _createCollectionTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCollection()", "Retrieve and rank - Get collections response: {0}", data); _deleteCollectionTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Index documents response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "Retrieve and rank - Index documents response: {0}", data); _indexDocumentsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get rankers response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "Retrieve and rank - Get rankers response: {0}", data); _getRankersTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "Retrieve and rank - Create ranker response: {0}", data); _rankerIdToDelete = resp.ranker_id; _createRankerTested = true; Invoke("ReadyToContinue", _waitTime); @@ -357,28 +357,28 @@ private void OnCreateRanker(RankerStatusPayload resp, string data) private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Rank response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnRank()", "Retrieve and rank - Rank response: {0}", data); _rankTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "Retrieve and rank - Get ranker response: {0}", data); _getRankerTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteRanker(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteRanker()", "Retrieve and rank - Delete ranker response: {0}", data); _deleteRankerTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnSearchStandard(SearchResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Search standard response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSearchStandard()", "Retrieve and rank - Search standard response: {0}", data); _searchStandardTested = true; Invoke("ReadyToContinue", _waitTime); } @@ -387,10 +387,10 @@ private void CheckClusterStatus() { if (!_retrieveAndRank.GetCluster((SolrClusterResponse resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr cluster status is '{0}'", resp.solr_cluster_status); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Solr cluster status is '{0}'", resp.solr_cluster_status); if (resp.solr_cluster_status.ToLower() != "ready") { - Log.Debug("ExampleRetrieveAndRank", "Checking cluster status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Checking cluster status in 10 seconds"); Invoke("CheckClusterStatus", 10f); } else @@ -398,17 +398,17 @@ private void CheckClusterStatus() _isClusterReady = true; } }, _clusterToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get cluster"); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Failed to get cluster"); } private void CheckRankerStatus() { if (!_retrieveAndRank.GetRanker((RankerStatusPayload resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr ranker status is '{0}'", resp.status); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Solr ranker status is '{0}'", resp.status); if (resp.status.ToLower() != "available") { - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Checking ranker status in 10 seconds"); Invoke("CheckRankerStatus", 10f); } else @@ -416,7 +416,7 @@ private void CheckRankerStatus() _isRankerReady = true; } }, _rankerIdToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get ranker"); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Failed to get ranker"); } private void ReadyToContinue() diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index 8dfb5d6f7..28f6e5e4a 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -96,7 +96,7 @@ private IEnumerator Examples() Runnable.Run(DownloadAcousticResource()); // Recognize - Log.Debug("ExampleSpeechToText", "Attempting to recognize"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to recognize"); List keywords = new List(); keywords.Add("speech"); _speechToText.KeywordsThreshold = 0.5f; @@ -106,50 +106,50 @@ private IEnumerator Examples() yield return null; // Get models - Log.Debug("ExampleSpeechToText", "Attempting to get models"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get models"); _speechToText.GetModels(HandleGetModels); while (!_getModelsTested) yield return null; // Get model - Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get model {0}", _modelNameToGet); _speechToText.GetModel(HandleGetModel, _modelNameToGet); while (!_getModelTested) yield return null; // Get customizations - Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get customizations"); _speechToText.GetCustomizations(HandleGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create customization - Log.Debug("ExampleSpeechToText", "Attempting create customization"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting create customization"); _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); while (!_createCustomizationsTested) yield return null; // Get customization - Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get customization {0}", _createdCustomizationID); _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); while (!_getCustomizationTested) yield return null; // Get custom corpora - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom corpora for {0}", _createdCustomizationID); _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); while (!_getCustomCorporaTested) yield return null; // Add custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); string corpusData = File.ReadAllText(_customCorpusFilePath); _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; // Get custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_getCustomCorpusTested) yield return null; @@ -160,13 +160,13 @@ private IEnumerator Examples() yield return null; // Get custom words - Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom words."); _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); while (!_getCustomWordsTested) yield return null; // Add custom words from path - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); string customWords = File.ReadAllText(_customWordsFilePath); _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); while (!_addCustomWordsFromPathTested) @@ -201,7 +201,7 @@ private IEnumerator Examples() wordList.Add(w2); words.words = wordList.ToArray(); - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); while (!_addCustomWordsFromObjectTested) yield return null; @@ -213,13 +213,13 @@ private IEnumerator Examples() yield return null; // Get custom word - Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); while (!_getCustomWordTested) yield return null; // Train customization - Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to train customization {0}", _createdCustomizationID); _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); while (!_trainCustomizationTested) yield return null; @@ -231,70 +231,70 @@ private IEnumerator Examples() yield return null; // Upgrade customization - not currently implemented in service - //Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + //Log.Debug("ExampleSpeechToText.Examples()", "Attempting to upgrade customization {0}", _createdCustomizationID); //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); //while (!_upgradeCustomizationTested) // yield return null; // Delete custom word - Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); while (!_deleteCustomWordTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_deleteCustomCorpusTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Reset customization - Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to reset customization {0}", _createdCustomizationID); _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); while (!_resetCustomizationTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete customization - Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete customization {0}", _createdCustomizationID); _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); while (!_deleteCustomizationsTested) yield return null; // List acoustic customizations - Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customizations"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get acoustic customizations"); _speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels); while (!_getAcousticCustomizationsTested) yield return null; // Create acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to create acoustic customization"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to create acoustic customization"); _speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, _createdAcousticModelName); while (!_createAcousticCustomizationsTested) yield return null; // Get acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get acoustic customization {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, _createdAcousticModelId); while (!_getAcousticCustomizationTested) yield return null; @@ -303,7 +303,7 @@ private IEnumerator Examples() yield return null; // Create acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); while (!_addAcousticResourcesTested) @@ -316,19 +316,19 @@ private IEnumerator Examples() yield return null; // List acoustic resources - Log.Debug("ExampleSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get audio resources {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); while (!_getAcousticResourcesTested) yield return null; // Train acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to train acoustic customization {0}", _createdAcousticModelId); _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId, null, true); while (!_trainAcousticCustomizationsTested) yield return null; // Get acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); while (!_getAcousticResourceTested) yield return null; @@ -340,13 +340,13 @@ private IEnumerator Examples() yield return null; // Reset acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); while (!_resetAcousticCustomizationsTested) yield return null; // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -355,7 +355,7 @@ private IEnumerator Examples() DeleteAcousticResource(); // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -366,37 +366,37 @@ private IEnumerator Examples() yield return null; // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; - Log.Debug("ExampleSpeechToText", "Speech to Text examples complete."); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text examples complete."); } private void DeleteAcousticResource() { - Log.Debug("ExampleSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); } private void DeleteAcousticCustomization() { - Log.Debug("ExampleSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); } private void HandleGetModels(ModelSet result, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text - Get models response: {0}", customData); _modelNameToGet = (result.models[UnityEngine.Random.Range(0, result.models.Length - 1)] as Model).name; _getModelsTested = true; } private void HandleGetModel(Model model, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text - Get model response: {0}", customData); _getModelTested = true; } @@ -409,7 +409,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("ExampleSpeechToText.HandleOnRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -419,7 +419,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) { foreach (var keyword in res.keywords_result.keyword) { - Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + Log.Debug("ExampleSpeechToText.HandleOnRecognize()", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } } @@ -428,20 +428,20 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) private void HandleGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", customData); _getCustomizationsTested = true; } private void HandleCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Create customization response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Create customization response: {0}", customData); _createdCustomizationID = customizationID.customization_id; _createCustomizationsTested = true; } private void HandleGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", customData); _getCustomizationTested = true; } @@ -449,12 +449,12 @@ private void HandleDeleteCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomization()", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); _createdCustomizationID = default(string); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete customization!"); + Log.Debug("ExampleSpeechToText.Examples()", "Failed to delete customization!"); } _deleteCustomizationsTested = true; @@ -464,11 +464,11 @@ private void HandleTrainCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Trained customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Trained customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to train customization!"); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Failed to train customization!"); } _trainCustomizationTested = true; @@ -478,11 +478,11 @@ private void HandleTrainCustomization(bool success, string customData) //{ // if (success) // { - // Log.Debug("ExampleSpeechToText", "Upgrade customization {0}!", _createdCustomizationID); + // Log.Debug("ExampleSpeechToText.HandleUpgradeCustomization()", "Upgrade customization {0}!", _createdCustomizationID); // } // else // { - // Log.Debug("ExampleSpeechToText", "Failed to upgrade customization!"); + // Log.Debug("ExampleSpeechToText.HandleUpgradeCustomization()", "Failed to upgrade customization!"); // } // _upgradeCustomizationTested = true; @@ -492,11 +492,11 @@ private void HandleResetCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Reset customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Reset customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to reset customization!"); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Failed to reset customization!"); } _resetCustomizationTested = true; @@ -504,7 +504,7 @@ private void HandleResetCustomization(bool success, string customData) private void HandleGetCustomCorpora(Corpora corpora, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customData); _getCustomCorporaTested = true; } @@ -512,11 +512,11 @@ private void HandleDeleteCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - delete custom coprus response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - delete custom coprus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Failed to delete custom corpus!"); } _deleteCustomCorpusTested = true; @@ -526,11 +526,11 @@ private void HandleAddCustomCorpus(bool success, string customData) { if(success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to add custom corpus!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Failed to add custom corpus!"); } _addCustomCorpusTested = true; @@ -538,13 +538,13 @@ private void HandleAddCustomCorpus(bool success, string customData) private void HandleGetCustomCorpus(Corpus corpus, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customData); _getCustomCorpusTested = true; } private void HandleGetCustomWords(WordsList wordList, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", customData); _getCustomWordsTested = true; } @@ -552,11 +552,11 @@ private void HandleAddCustomWordsFromPath(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from path response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromPath()", "Speech to Text - Add custom words from path response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromPath()", "Failed to delete custom word!"); } _addCustomWordsFromPathTested = true; @@ -566,11 +566,11 @@ private void HandleAddCustomWordsFromObject(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from object response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromObject()", "Speech to Text - Add custom words from object response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromObject()", "Failed to delete custom word!"); } _addCustomWordsFromObjectTested = true; @@ -580,11 +580,11 @@ private void HandleDeleteCustomWord(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Failed to delete custom word!"); } _deleteCustomWordTested = true; @@ -592,67 +592,67 @@ private void HandleDeleteCustomWord(bool success, string customData) private void HandleGetCustomWord(WordData word, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", customData); _getCustomWordTested = true; } private void HandleGetCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) { - Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModels()", "acousticCustomizations: {0}", customData); _getAcousticCustomizationsTested = true; } private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", customData); _createdAcousticModelId = customizationID.customization_id; _createAcousticCustomizationsTested = true; } private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) { - Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", customData); _getAcousticCustomizationTested = true; } private void HandleTrainAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); _trainAcousticCustomizationsTested = true; } private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) { - Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", customData); _getAcousticResourcesTested = true; } private void HandleAddAcousticResource(string customData) { - Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", customData); _addAcousticResourcesTested = true; } private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) { - Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", customData); _getAcousticResourceTested = true; } private void HandleResetAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); _resetAcousticCustomizationsTested = true; } private void HandleDeleteAcousticResource(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } private void HandleDeleteAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); if (success) _deleteAcousticCustomizationsTested = true; else @@ -661,7 +661,7 @@ private void HandleDeleteAcousticCustomization(bool success, string customData) private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking customization status in {0} seconds...", delay.ToString()); + Log.Debug("ExampleSpeechToText.CheckCustomizationStatus()", "Checking customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -672,7 +672,7 @@ private void OnCheckCustomizationStatus(Customization customization, string cust { if (customization != null) { - Log.Debug("TestSpeechToText", "Customization status: {0}", customization.status); + Log.Debug("ExampleSpeechToText.OnCheckCustomizationStatus()", "Customization status: {0}", customization.status); if (customization.status != "ready" && customization.status != "available") Runnable.Run(CheckCustomizationStatus(customData, 5f)); else @@ -680,13 +680,13 @@ private void OnCheckCustomizationStatus(Customization customization, string cust } else { - Log.Debug("TestSpeechToText", "Check customization status failed!"); + Log.Debug("ExampleSpeechToText.OnCheckCustomizationStatus()", "Check customization status failed!"); } } private IEnumerator CheckAcousticCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking acoustic customization status in {0} seconds...", delay.ToString()); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Checking acoustic customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -697,7 +697,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu { if (acousticCustomization != null) { - Log.Debug("TestSpeechToText", "Acoustic customization status: {0}", acousticCustomization.status); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Acoustic customization status: {0}", acousticCustomization.status); if (acousticCustomization.status != "ready" && acousticCustomization.status != "available") Runnable.Run(CheckAcousticCustomizationStatus(customData, 5f)); else @@ -705,7 +705,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu } else { - Log.Debug("TestSpeechToText", "Check acoustic customization status failed!"); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Check acoustic customization status failed!"); } } @@ -717,11 +717,11 @@ private IEnumerator Delay(float delayTime) private IEnumerator DownloadAcousticResource() { - Log.Debug("ExampleSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); + Log.Debug("ExampleSpeechToText.DownloadAcousticResource()", "downloading acoustic resource from {0}", _acousticResourceUrl); WWW www = new WWW(_acousticResourceUrl); yield return www; - Log.Debug("ExampleSpeechToText", "acoustic resource downloaded"); + Log.Debug("ExampleSpeechToText.DownloadAcousticResource()", "acoustic resource downloaded"); _acousticResourceData = www.bytes; _isAudioLoaded = true; } diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 21a88537a..2e5e7ee31 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -107,12 +107,12 @@ private void OnError(string error) { Active = false; - Log.Debug("ExampleStreaming", "Error! {0}", error); + Log.Debug("ExampleStreaming.OnError()", "Error! {0}", error); } private IEnumerator RecordingHandler() { - Log.Debug("ExampleStreaming", "devices: {0}", Microphone.devices); + Log.Debug("ExampleStreaming.RecordingHandler()", "devices: {0}", Microphone.devices); _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); yield return null; // let _recordingRoutine get set.. @@ -131,7 +131,7 @@ private IEnumerator RecordingHandler() int writePos = Microphone.GetPosition(_microphoneID); if (writePos > _recording.samples || !Microphone.IsRecording(_microphoneID)) { - Log.Error("MicrophoneWidget", "Microphone disconnected."); + Log.Error("ExampleStreaming.RecordingHandler()", "Microphone disconnected."); StopRecording(); yield break; @@ -177,14 +177,14 @@ private void OnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleStreaming", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("ExampleStreaming.OnRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); } if (res.keywords_result != null && res.keywords_result.keyword != null) { foreach (var keyword in res.keywords_result.keyword) { - Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + Log.Debug("ExampleStreaming.OnRecognize()", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } @@ -192,9 +192,9 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var wordAlternative in res.word_alternatives) { - Log.Debug("ExampleSpeechToText", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); + Log.Debug("ExampleStreaming.OnRecognize()", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); foreach(var alternative in wordAlternative.alternatives) - Log.Debug("ExampleSpeechToText", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); + Log.Debug("ExampleStreaming.OnRecognize()", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); } } } @@ -207,7 +207,7 @@ private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) { foreach (SpeakerLabelsResult labelResult in result.speaker_labels) { - Log.Debug("ExampleStreaming", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); + Log.Debug("ExampleStreaming.OnRecognize()", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); } } diff --git a/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs b/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs index 7a57a19d7..d25f236fc 100644 --- a/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs +++ b/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs @@ -66,51 +66,51 @@ void Start() private IEnumerator Examples() { // Synthesize - Log.Debug("ExampleTextToSpeech", "Attempting synthesize."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting synthesize."); _textToSpeech.Voice = VoiceType.en_US_Allison; _textToSpeech.ToSpeech(_testString, HandleToSpeechCallback, true); while (!_synthesizeTested) yield return null; // Get Voices - Log.Debug("ExampleTextToSpeech", "Attempting to get voices."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get voices."); _textToSpeech.GetVoices(OnGetVoices); while (!_getVoicesTested) yield return null; // Get Voice - Log.Debug("ExampleTextToSpeech", "Attempting to get voice {0}.", VoiceType.en_US_Allison); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get voice {0}.", VoiceType.en_US_Allison); _textToSpeech.GetVoice(OnGetVoice, VoiceType.en_US_Allison); while (!_getVoiceTested) yield return null; // Get Pronunciation - Log.Debug("ExampleTextToSpeech", "Attempting to get pronunciation of {0}", _testWord); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get pronunciation of {0}", _testWord); _textToSpeech.GetPronunciation(OnGetPronunciation, _testWord, VoiceType.en_US_Allison); while (!_getPronuciationTested) yield return null; // Get Customizations - Log.Debug("ExampleTextToSpeech", "Attempting to get a list of customizations"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a list of customizations"); _textToSpeech.GetCustomizations(OnGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create Customization - Log.Debug("ExampleTextToSpeech", "Attempting to create a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to create a customization"); _textToSpeech.CreateCustomization(OnCreateCustomization, _customizationName, _customizationLanguage, _customizationDescription); while (!_createCustomizationTested) yield return null; // Get Customization - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a customization"); if (!_textToSpeech.GetCustomization(OnGetCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to get custom voice model!"); + Log.Debug("ExampleTextToSpeech.Examples()", "Failed to get custom voice model!"); while (!_getCustomizationTested) yield return null; // Update Customization - Log.Debug("ExampleTextToSpeech", "Attempting to update a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to update a customization"); Word[] wordsToUpdateCustomization = { new Word() @@ -138,19 +138,19 @@ private IEnumerator Examples() }; if (!_textToSpeech.UpdateCustomization(OnUpdateCustomization, _createdCustomizationId, _customVoiceUpdate)) - Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); + Log.Debug("ExampleTextToSpeech.Examples()", "Failed to update customization!"); while (!_updateCustomizationTested) yield return null; // Get Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization's words"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a customization's words"); if (!_textToSpeech.GetCustomizationWords(OnGetCustomizationWords, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to get {0} words!", _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.GetCustomizationWords()", "Failed to get {0} words!", _createdCustomizationId); while (!_getCustomizationWordsTested) yield return null; // Add Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to add words to a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to add words to a customization"); Word[] wordArrayToAddToCustomization = { new Word() @@ -176,34 +176,34 @@ private IEnumerator Examples() }; if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, _createdCustomizationId, wordsToAddToCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to add words to {0}!", _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.AddCustomizationWords()", "Failed to add words to {0}!", _createdCustomizationId); while (!_addCustomizationWordsTested) yield return null; // Get Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to get the translation of a custom voice model's word."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get the translation of a custom voice model's word."); string customIdentifierWord = wordsToUpdateCustomization[0].word; if (!_textToSpeech.GetCustomizationWord(OnGetCustomizationWord, _createdCustomizationId, customIdentifierWord)) - Log.Debug("ExampleTextToSpeech", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.GetCustomizationWord()", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); while (!_getCustomizationWordTested) yield return null; // Delete Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to delete customization word from custom voice model."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to delete customization word from custom voice model."); string wordToDelete = "goodbye"; if (!_textToSpeech.DeleteCustomizationWord(OnDeleteCustomizationWord, _createdCustomizationId, wordToDelete)) - Log.Debug("ExampleTextToSpeech", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.DeleteCustomizationWord()", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); while (!_deleteCustomizationWordTested) yield return null; // Delete Customization - Log.Debug("ExampleTextToSpeech", "Attempting to delete a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to delete a customization"); if (!_textToSpeech.DeleteCustomization(OnDeleteCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to delete custom voice model!"); + Log.Debug("ExampleTextToSpeech.DeleteCustomization()", "Failed to delete custom voice model!"); while (!_deleteCustomizationTested) yield return null; - Log.Debug("ExampleTextToSpeech", "Text to Speech examples complete."); + Log.Debug("ExampleTextToSpeech.Examples()", "Text to Speech examples complete."); } void HandleToSpeechCallback(AudioClip clip, string customData) @@ -230,75 +230,75 @@ private void PlayClip(AudioClip clip) private void OnGetVoices(Voices voices, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", customData); _getVoicesTested = true; } private void OnGetVoice(Voice voice, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", customData); _getVoiceTested = true; } private void OnGetPronunciation(Pronunciation pronunciation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", customData); _getPronuciationTested = true; } private void OnGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", customData); _getCustomizationsTested = true; } private void OnCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", customData); _createdCustomizationId = customizationID.customization_id; _createCustomizationTested = true; } private void OnDeleteCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomization()", "Text to Speech - Delete customization response: {0}", customData); _createdCustomizationId = null; _deleteCustomizationTested = true; } private void OnGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", customData); _getCustomizationTested = true; } private void OnUpdateCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", customData); _updateCustomizationTested = true; } private void OnGetCustomizationWords(Words words, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization words response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizationWords()", "Text to Speech - Get customization words response: {0}", customData); _getCustomizationWordsTested = true; } private void OnAddCustomizationWords(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Add customization words response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnAddCustomizationWords()", "Text to Speech - Add customization words response: {0}", customData); _addCustomizationWordsTested = true; } private void OnDeleteCustomizationWord(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization word response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomizationWord()", "Text to Speech - Delete customization word response: {0}", customData); _deleteCustomizationWordTested = true; } private void OnGetCustomizationWord(Translation translation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization word response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizationWord()", "Text to Speech - Get customization word response: {0}", customData); _getCustomizationWordTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs b/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs index 415b08e83..b3d9b8274 100644 --- a/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs +++ b/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs @@ -50,17 +50,17 @@ private IEnumerator Examples() { // Analyze tone if (!_toneAnalyzer.GetToneAnalyze(OnGetToneAnalyze, _stringToTestTone)) - Log.Debug("ExampleToneAnalyzer", "Failed to analyze!"); + Log.Debug("ExampleToneAnalyzer.Examples()", "Failed to analyze!"); while (!_analyzeToneTested) yield return null; - Log.Debug("ExampleToneAnalyzer", "Tone analyzer examples complete."); + Log.Debug("ExampleToneAnalyzer.Examples()", "Tone analyzer examples complete."); } private void OnGetToneAnalyze(ToneAnalyzerResponse resp, string data) { - Log.Debug("ExampleToneAnalyzer", "Tone Analyzer - Analyze Response: {0}", data); + Log.Debug("ExampleToneAnalyzer.OnGetToneAnalyze()", "Tone Analyzer - Analyze Response: {0}", data); _analyzeToneTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs b/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs index 68981839f..443989b90 100644 --- a/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs +++ b/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs @@ -124,12 +124,12 @@ private IEnumerator Examples() while(!_GetDillemaTested) yield return null; - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff analytics examples complete."); + Log.Debug("ExampleTradeoffAnalyitics.Examples()", "Tradeoff analytics examples complete."); } private void OnGetDilemma(DilemmasResponse resp, string data) { - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff Analytics - Get Dillema: {0}", data); + Log.Debug("ExampleTradeoffAnalyitics.OnGetDilemma()", "Tradeoff Analytics - Get Dillema: {0}", data); _GetDillemaTested = true; } diff --git a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs index 365b722c8..321530a0f 100644 --- a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs +++ b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs @@ -73,84 +73,84 @@ void Start() private IEnumerator Examples() { // Get all classifiers - Log.Debug("ExampleVisualRecognition", "Attempting to get all classifiers"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to get all classifiers"); if (!_visualRecognition.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleVisualRecognition", "Failed to get all classifiers!"); + Log.Debug("ExampleVisualRecognition.GetClassifiers()", "Failed to get all classifiers!"); while (!_getClassifiersTested) yield return null; #if TRAIN_CLASSIFIER // Train classifier - Log.Debug("ExampleVisualRecognition", "Attempting to train classifier"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to train classifier"); string positiveExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_positive_examples.zip"; string negativeExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/negative_examples.zip"; Dictionary positiveExamples = new Dictionary(); positiveExamples.Add("giraffe", positiveExamplesPath); if (!_visualRecognition.TrainClassifier(OnTrainClassifier, "unity-test-classifier-example", positiveExamples, negativeExamplesPath)) - Log.Debug("ExampleVisualRecognition", "Failed to train classifier!"); + Log.Debug("ExampleVisualRecognition.TrainClassifier()", "Failed to train classifier!"); while (!_trainClassifierTested) yield return null; // Find classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to find classifier by ID"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to find classifier by ID"); if (!_visualRecognition.GetClassifier(OnGetClassifier, _classifierID)) - Log.Debug("ExampleVisualRecognition", "Failed to get classifier!"); + Log.Debug("ExampleVisualRecognition.GetClassifier()", "Failed to get classifier!"); while (!_getClassifierTested) yield return null; #endif // Classify get - Log.Debug("ExampleVisualRecognition", "Attempting to get classify via URL"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to get classify via URL"); if (!_visualRecognition.Classify(OnClassifyGet, _imageURL)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyGetTested) yield return null; // Classify post image - Log.Debug("ExampleVisualRecognition", "Attempting to classify via image on file system"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to classify via image on file system"); string imagesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_to_classify.jpg"; string[] owners = { "IBM", "me" }; string[] classifierIDs = { "default", _classifierID }; if (!_visualRecognition.Classify(imagesPath, OnClassifyPost, owners, classifierIDs, 0.5f)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyPostTested) yield return null; // Detect faces get - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via URL"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to detect faces via URL"); if (!_visualRecognition.DetectFaces(OnDetectFacesGet, _imageURL)) - Log.Debug("ExampleVisualRecogntiion", "Detect faces failed!"); + Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesGetTested) yield return null; // Detect faces post image - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via image"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to detect faces via image"); string faceExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/obama.jpg"; if (!_visualRecognition.DetectFaces(faceExamplePath, OnDetectFacesPost)) - Log.Debug("ExampleVisualRecognition", "Detect faces failed!"); + Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesPostTested) yield return null; //// Recognize text get - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via URL"); - //if (!_visualRecognition.RecognizeText(OnRecognizeTextGet, _imageTextURL)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + //Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to recognizeText via URL"); + //if (!_visualRecognition.(OnRecognizeTextGet, _imageTextURL)) + // Log.Debug("ExampleVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextGetTested) // yield return null; //// Recognize text post image - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via image"); + //Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to recognizeText via image"); //string textExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/from_platos_apology.png"; //if (!_visualRecognition.RecognizeText(textExamplePath, OnRecognizeTextPost)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + // Log.Debug("ExampleVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextPostTested) // yield return null; @@ -164,34 +164,34 @@ private IEnumerator Examples() #endregion // Delete classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to delete classifier"); if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) - Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); + Log.Debug("ExampleVisualRecognition.DeleteClassifier()", "Failed to delete classifier!"); while (!_deleteClassifierTested) yield return null; #endif - Log.Debug("ExampleVisualRecognition", "Visual Recogition tests complete"); + Log.Debug("ExampleVisualRecognition.Examples()", "Visual Recogition tests complete"); } private void OnGetClassifiers(GetClassifiersTopLevelBrief classifiers, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifiers Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifiers()", "VisualRecognition - GetClassifiers Response: {0}", data); _getClassifiersTested = true; } private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifier Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifier()", "VisualRecognition - GetClassifier Response: {0}", data); _getClassifierTested = true; } #if DELETE_TRAINED_CLASSIFIER private void OnDeleteClassifier(bool success, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DeleteClassifier Response: {0}", success); + Log.Debug("ExampleVisualRecognition.OnDeleteClassifier()", "VisualRecognition - DeleteClassifier Response: {0}", success); _deleteClassifierTested = true; } #endif @@ -199,7 +199,7 @@ private void OnDeleteClassifier(bool success, string data) #if TRAIN_CLASSIFIER private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - TrainClassifier Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnTrainClassifier()", "VisualRecognition - TrainClassifier Response: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; @@ -211,38 +211,38 @@ private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, st private void OnClassifyGet(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyGet Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnClassifyGet()", "VisualRecognition - ClassifyGet Response: {0}", data); _classifyGetTested = true; } private void OnClassifyPost(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyPost Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnClassifyPost()", "VisualRecognition - ClassifyPost Response: {0}", data); _classifyPostTested = true; } private void OnDetectFacesGet(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesGet Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDetectFacesGet()", "VisualRecognition - DetectFacesGet Response: {0}", data); _detectFacesGetTested = true; } private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesPost Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDetectFacesPost()", "VisualRecognition - DetectFacesPost Response: {0}", data); _detectFacesPostTested = true; } //private void OnRecognizeTextGet(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextGet Response: {0}", data); + // Log.Debug("ExampleVisualRecognition.OnRecognizeTextGet()", "VisualRecognition - RecognizeTextGet Response: {0}", data); // _recognizeTextGetTested = true; //} //private void OnRecognizeTextPost(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextPost Response: {0}", data); + // Log.Debug("ExampleVisualRecognition.OnRecognizeTextPost()", "VisualRecognition - RecognizeTextPost Response: {0}", data); // _recognizeTextPostTested = true; //} @@ -255,7 +255,7 @@ private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data private IEnumerator Delay(float delayTime) { _isWaitingForDelay = true; - Log.Debug("TestVisualRecognition", "Delaying for {0} seconds....", delayTime); + Log.Debug("ExampleVisualRecognition.Delay()", "Delaying for {0} seconds....", delayTime); yield return new WaitForSeconds(delayTime); _isWaitingForDelay = false; } diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index 02093cb8d..e6c0fb428 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -334,9 +334,9 @@ private IEnumerator ProcessRequestQueue() else if (value is Int32 || value is Int64 || value is UInt32 || value is UInt64 || value is float || value is bool) value = value.ToString(); else if (value != null) - Log.Warning("RESTConnector", "Unsupported parameter value type {0}", value.GetType().Name); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Unsupported parameter value type {0}", value.GetType().Name); else - Log.Error("RESTConnector", "Parameter {0} value is null", key); + Log.Error("RESTConnector.ProcessRequestQueue()", "Parameter {0} value is null", key); if (args == null) args = new StringBuilder(); @@ -381,7 +381,7 @@ private IEnumerator ProcessRequestQueue() } catch (Exception e) { - Log.Error("RESTConnector", "Exception when initializing WWWForm: {0}", e.ToString()); + Log.Error("RESTConnector.ProcessRequestQueue()", "Exception when initializing WWWForm: {0}", e.ToString()); } www = new WWW(url, form.data, req.Headers); } @@ -438,15 +438,15 @@ private IEnumerator ProcessRequestQueue() } if (bError) - Log.Error("RESTConnector", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, + Log.Error("RESTConnector.ProcessRequestQueue()", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, string.IsNullOrEmpty(www.text) ? "" : www.text); else - Log.Warning("RESTConnector", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, + Log.Warning("RESTConnector.ProcessRequestQueue()", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, string.IsNullOrEmpty(www.text) ? "" : www.text); } if (!www.isDone) { - Log.Error("RESTConnector", "Request timed out for URL: {0}", url); + Log.Error("RESTConnector.ProcessRequestQueue()", "Request timed out for URL: {0}", url); bError = true; } /*if (!bError && (www.bytes == null || www.bytes.Length == 0)) @@ -473,7 +473,7 @@ private IEnumerator ProcessRequestQueue() // if the response is over a threshold, then log with status instead of debug if (resp.ElapsedTime > LogResponseTime) - Log.Warning("RESTConnector", "Request {0} completed in {1} seconds.", url, resp.ElapsedTime); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Request {0} completed in {1} seconds.", url, resp.ElapsedTime); if (req.OnResponse != null) req.OnResponse(req, resp); @@ -484,7 +484,7 @@ private IEnumerator ProcessRequestQueue() { #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "Delete Request URL: {0}", url); + Log.Debug("RESTConnector.ProcessRequestQueue90", "Delete Request URL: {0}", url); #endif #if UNITY_EDITOR @@ -507,7 +507,7 @@ private IEnumerator ProcessRequestQueue() resp.Success = deleteReq.Success; #else - Log.Warning( "RESTConnector", "DELETE method is supported in the editor only." ); + Log.Warning( "RESTConnector.ProcessRequestQueue()", "DELETE method is supported in the editor only." ); resp.Success = false; #endif resp.ElapsedTime = (float)(DateTime.Now - startTime).TotalSeconds; @@ -531,7 +531,7 @@ private class DeleteRequest public IEnumerator Send(string url, Dictionary headers) { #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, Send: {0}, _thread:{1}", url, _thread); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, Send: {0}, _thread:{1}", url, _thread); #endif URL = url; @@ -546,7 +546,7 @@ public IEnumerator Send(string url, Dictionary headers) ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, ProcessRequest {0}", URL); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, ProcessRequest {0}", URL); #endif UnityWebRequest deleteReq = UnityWebRequest.Delete(URL); deleteReq.method = UnityWebRequest.kHttpVerbDELETE; @@ -558,16 +558,16 @@ public IEnumerator Send(string url, Dictionary headers) deleteReq.Send(); #endif #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, sending deletereq {0}", deleteReq); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, sending deletereq {0}", deleteReq); #endif while (!deleteReq.isDone) yield return null; #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DELETE Request SENT: {0}", URL); + Log.Debug("DeleteRequest.Send()", "DELETE Request SENT: {0}", URL); #endif Success = deleteReq.responseCode == (long)HttpStatusCode.OK || deleteReq.responseCode == (long)HttpStatusCode.NoContent; #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DELETE Request COMPLETE: {0}", URL); + Log.Debug("DeleteRequest.Send()", "DELETE Request COMPLETE: {0}", URL); #endif IsComplete = true; } diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 8338de882..1bb3828c0 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -215,7 +215,7 @@ public static WSConnector CreateConnector(Credentials credentials, string functi public void Send(Message msg, bool queue = false) { #if ENABLE_MESSAGE_DEBUGGING - Log.Debug( "WSConnector", "Sending {0} message: {1}", + Log.Debug( "WSConnector.Send()", "Sending {0} message: {1}", msg is TextMessage ? "TextMessage" : "BinaryMessage", msg is TextMessage ? ((TextMessage)msg).Text : ((BinaryMessage)msg).Data.Length.ToString() + " bytes" ); #endif @@ -278,7 +278,7 @@ private IEnumerator ProcessReceiveQueue() { Message msg = _receiveQueue.Dequeue(); #if ENABLE_MESSAGE_DEBUGGING - Log.Debug( "WSConnector", "Received {0} message: {1}", + Log.Debug( "WSConnector.ProcessReceiveQueue()", "Received {0} message: {1}", msg is TextMessage ? "TextMessage" : "BinaryMessage", msg is TextMessage ? ((TextMessage)msg).Text : ((BinaryMessage)msg).Data.Length.ToString() + " bytes" ); #endif @@ -338,7 +338,7 @@ private void SendMessages() catch (System.Exception e) { _connectionState = ConnectionState.DISCONNECTED; - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessages()", "Caught WebSocket exception: {0}", e.ToString()); } } @@ -424,7 +424,7 @@ private async Task SendMessagesAsync() catch (System.Exception e) { _connectionState = ConnectionState.DISCONNECTED; - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessagesAsync()", "Caught WebSocket exception: {0}", e.ToString()); } } @@ -467,7 +467,7 @@ private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocket } catch (System.Exception e) { - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessagesAsync()", "Caught WebSocket exception: {0}", e.ToString()); } } #endif diff --git a/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs b/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs index 82a5e4c27..58e2f2689 100644 --- a/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs +++ b/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs @@ -151,7 +151,7 @@ public AlchemyAPI(Credentials credentials) } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetAuthors!"); + Log.Error("AlchemyAPI.GetAuthors()", "Either a URL or a html page source is required for GetAuthors!"); return false; } @@ -198,7 +198,7 @@ private void OnGetAuthorsResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetAuthorsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyAPI.OnGetAuthorsResponse()", "OnGetAuthorsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -326,7 +326,7 @@ private void OnGetRankedConceptsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRankedConceptsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRankedConceptsResponse()", "OnGetRankedConceptsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -447,7 +447,7 @@ private void OnGetDatesResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnDatesResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetDatesResponse()", "OnDatesResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -571,7 +571,7 @@ private void OnGetEmotionsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEmotionsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetEmotionsResponse()", "OnGetEmotionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -714,7 +714,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEntitiesResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetEntitiesResponse()", "OnGetEntitiesResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -769,7 +769,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } else if (source.StartsWith(Application.dataPath) && !normalizedSource.StartsWith("http://") && !normalizedSource.StartsWith("https://")) { - Log.Error("Alchemy Language", "A URL source is required for DetectFeeds!"); + Log.Error("AlchemyAPI.DetectFeeds()", "A URL source is required for DetectFeeds!"); return false; // service = SERVICE_DETECT_FEEDS_HTML; // string htmlData = default(string); @@ -778,7 +778,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } else { - Log.Error("Alchemy Language", "A URL source is required for DetectFeeds!"); + Log.Error("AlchemyAPI.DetectFeeds()", "A URL source is required for DetectFeeds!"); return false; } @@ -825,7 +825,7 @@ private void OnDetectFeedsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnDetectFeedsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnDetectFeedsResponse()", "OnDetectFeedsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -954,7 +954,7 @@ private void OnGetKeywordsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetKeywordsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetKeywordsResponse()", "OnGetKeywordsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1071,7 +1071,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEmotionsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetLanguagesResponse()", "OnGetEmotionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1126,7 +1126,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } else if (source.StartsWith(Application.dataPath) && !normalizedSource.StartsWith("http://") && !normalizedSource.StartsWith("https://")) { - Log.Error("Alchemy Language", "A URL source is required for GetMicroformats!"); + Log.Error("AlchemyAPI.GetMicroformats()", "A URL source is required for GetMicroformats!"); return false; // service = SERVICE_GET_MICROFORMAT_HTML; // string htmlData = default(string); @@ -1135,7 +1135,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } else { - Log.Error("Alchemy Language", "A URL source is required for GetMicroformats!"); + Log.Error("AlchemyAPI.GetMicroformats()", "A URL source is required for GetMicroformats!"); return false; } @@ -1182,7 +1182,7 @@ private void OnGetMicroformatsResponse(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetMicroformatsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetMicroformatsResponse()", "OnGetMicroformatsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1249,7 +1249,7 @@ private void OnGetMicroformatsResponse(RESTConnector.Request req, RESTConnector. } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetPublicationDate!"); + Log.Error("AlchemyAPI.GetPublicationDate()", "Either a URL or a html page source is required for GetPublicationDate!"); return false; } @@ -1296,7 +1296,7 @@ private void OnGetPublicationDateResponse(RESTConnector.Request req, RESTConnect } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetPublicationDateResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetPublicationDateResponse()", "OnGetPublicationDateResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1446,7 +1446,7 @@ private void OnGetRelationsResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRelationsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRelationsResponse()", "OnGetRelationsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1563,7 +1563,7 @@ private void OnGetTextSentimentResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTextSentimentResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTextSentimentResponse()", "OnGetTextSentimentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1684,7 +1684,7 @@ private void OnGetTargetedSentimentResponse(RESTConnector.Request req, RESTConne } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTargetedSentimentResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTargetedSentimentResponse()", "OnGetTargetedSentimentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1801,7 +1801,7 @@ private void OnGetRankedTaxonomyResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRankedTaxonomyResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRankedTaxonomyResponse()", "OnGetRankedTaxonomyResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1872,7 +1872,7 @@ private void OnGetRankedTaxonomyResponse(RESTConnector.Request req, RESTConnecto } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetText!"); + Log.Error("AlchemyAPI.GetText()", "Either a URL or a html page source is required for GetText!"); return false; } @@ -1919,7 +1919,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTextResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTextResponse()", "OnGetTextResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1981,7 +1981,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetRawText!"); + Log.Error("AlchemyAPI.GetRawText()", "Either a URL or a html page source is required for GetRawText!"); return false; } @@ -2052,7 +2052,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetTitle!"); + Log.Error("AlchemyAPI.GetTitle()", "Either a URL or a html page source is required for GetTitle!"); return false; } @@ -2099,7 +2099,7 @@ private void OnGetTitleResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTitleResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTitleResponse()", "OnGetTitleResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2292,7 +2292,7 @@ private void OnCombinedCallResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnCombinedCallResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnCombinedCallResponse()", "OnCombinedCallResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2398,7 +2398,7 @@ private void OnGetNewsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("AlchemyDataNews", "OnGetNewsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyAPI.OnGetNewsResponse()", "OnGetNewsResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/Conversation/v1/Conversation.cs b/Scripts/Services/Conversation/v1/Conversation.cs index f74ad7a33..0ff029233 100644 --- a/Scripts/Services/Conversation/v1/Conversation.cs +++ b/Scripts/Services/Conversation/v1/Conversation.cs @@ -222,7 +222,7 @@ private void MessageResp(RESTConnector.Request req, RESTConnector.Response resp) } catch (Exception e) { - Log.Error("Conversation", "MessageResp Exception: {0}", e.ToString()); + Log.Error("Conversation.MessageResp()", "MessageResp Exception: {0}", e.ToString()); data = e.Message; resp.Success = false; } diff --git a/Scripts/Services/Discovery/v1/Discovery.cs b/Scripts/Services/Discovery/v1/Discovery.cs index cd348b34f..8bb929b94 100644 --- a/Scripts/Services/Discovery/v1/Discovery.cs +++ b/Scripts/Services/Discovery/v1/Discovery.cs @@ -172,7 +172,7 @@ private void OnGetEnvironmentsResponse(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("Discovery", "OnGetEnvironmentsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetEnvironmentsResponse()", "OnGetEnvironmentsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -277,7 +277,7 @@ private void OnAddEnvironmentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnAddEnvironmentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddEnvironmentResponse()", "OnAddEnvironmentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -353,7 +353,7 @@ private void OnGetEnvironmentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnGetEnvironmentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetEnvironmentResponse()", "OnGetEnvironmentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -491,7 +491,7 @@ private void OnGetConfigurationsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -604,7 +604,7 @@ private void OnAddConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -684,7 +684,7 @@ private void OnGetConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -925,7 +925,7 @@ private void OnPreviewConfigurationResponse(RESTConnector.Request req, RESTConne } catch (Exception e) { - Log.Error("Discovery", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1009,7 +1009,7 @@ private void OnGetCollectionsResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnGetCollectionsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetCollectionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1119,7 +1119,7 @@ private void OnAddCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1199,7 +1199,7 @@ private void OnGetCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery", "OnGetCollectionResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetCollectionResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1339,7 +1339,7 @@ private void OnGetFieldsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery", "OnGetFieldsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetFieldsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1627,7 +1627,7 @@ private void OnAddDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "OnAddDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnAddDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1778,7 +1778,7 @@ private void OnGetDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "OnGetDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2065,7 +2065,7 @@ private void OnUpdateDocumentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2188,7 +2188,7 @@ private void OnQueryResponse(RESTConnector.Request req, RESTConnector.Response r } catch (Exception e) { - Log.Error("Discovery", "OnQueryResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnQueryResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs index 62aabd1cc..fe30d5eed 100644 --- a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs +++ b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs @@ -427,7 +427,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch(Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the forced glossary file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the forced glossary file: {0}", e.Message); } } @@ -439,7 +439,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the parallel corpus file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the parallel corpus file: {0}", e.Message); } } @@ -451,7 +451,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the monolingual corpus file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the monolingual corpus file: {0}", e.Message); } } @@ -502,7 +502,7 @@ private void OnCreateModelResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "Create model Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.OnCreateModelResponse()", "Create model Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs index 97cce3399..a41bd1ab4 100644 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs @@ -165,7 +165,7 @@ private void OnAnalyzeResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Discovery", "OnAnalyzeResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnAnalyzeResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -236,7 +236,7 @@ private void OnGetModelsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery", "OnGetModelssResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.Method()", "OnGetModelssResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs index fb0e65d7c..b28f61917 100644 --- a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs +++ b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs @@ -1078,7 +1078,7 @@ private void OnIndexDocumentsResponse(RESTConnector.Request req, RESTConnector.R try { string json = Encoding.UTF8.GetString(resp.Data); - Log.Debug("RetriveAndRank", "json: {0}", json); + Log.Debug("RetriveAndRank.OnIndexDocumentsResponse()", "json: {0}", json); fsResult r = fsJsonParser.Parse(json, out data); if (!r.Succeeded) throw new WatsonException(r.FormattedMessages); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 6fd47a1fa..6e385d017 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -560,7 +560,7 @@ private bool CreateListenConnector() else { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Created listen socket. Model: {0}, parsedParams: {1}", WWW.EscapeURL(_recognizeModel), parsedParams); + Log.Debug("SpeechToText.CreateListenConnector()", "Created listen socket. Model: {0}, parsedParams: {1}", WWW.EscapeURL(_recognizeModel), parsedParams); #endif } @@ -603,7 +603,7 @@ private void SendStart() _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "SendStart() with the following params: {0}", Json.Serialize(start)); + Log.Debug("SpeechToText.SendStart()", "SendStart() with the following params: {0}", Json.Serialize(start)); #endif _lastStartSent = DateTime.Now; } @@ -638,7 +638,7 @@ private IEnumerator KeepAlive() AudioClip _keepAliveClip = Resources.Load("highHat"); #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Sending keep alive."); + Log.Debug("SpeechToText.KeepAlive()", "Sending keep alive."); #endif _listenSocket.Send(new WSConnector.BinaryMessage(AudioClipUtil.GetL16(_keepAliveClip))); _keepAliveClip = null; @@ -646,7 +646,7 @@ private IEnumerator KeepAlive() _lastKeepAlive = DateTime.Now; } } - Log.Debug("SpeechToText", "KeepAlive exited."); + Log.Debug("SpeechToText.KeepAlive()", "KeepAlive exited."); } private void OnListenMessage(WSConnector.Message msg) @@ -665,7 +665,7 @@ private void OnListenMessage(WSConnector.Message msg) { //// when we get results, start listening for the next block .. if (results.HasFinalResult()) - Log.Debug("SpeechToText", "final json response: {0}", tm.Text); + Log.Debug("SpeechToText.OnListenMessage()", "final json response: {0}", tm.Text); // SendStart(); if (_listenCallback != null) @@ -674,14 +674,14 @@ private void OnListenMessage(WSConnector.Message msg) StopListening(); // automatically stop listening if our callback is destroyed. } else - Log.Error("SpeechToText", "Failed to parse results: {0}", tm.Text); + Log.Error("SpeechToText.OnListenMessage()", "Failed to parse results: {0}", tm.Text); } else if (json.Contains("state")) { string state = (string)json["state"]; #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Server state is {0}", state); + Log.Debug("SpeechToText.OnListenMessage()", "Server state is {0}", state); #endif if (state == "listening") { @@ -714,7 +714,7 @@ private void OnListenMessage(WSConnector.Message msg) else if (json.Contains("error")) { string error = (string)json["error"]; - Log.Error("SpeechToText", "Error: {0}", error); + Log.Error("SpeechToText.OnListenMessage()", "Error: {0}", error); StopListening(); if (OnError != null) @@ -722,12 +722,12 @@ private void OnListenMessage(WSConnector.Message msg) } else { - Log.Warning("SpeechToText", "Unknown message: {0}", tm.Text); + Log.Warning("SpeechToText.OnListenMessage()", "Unknown message: {0}", tm.Text); } } else { - Log.Error("SpeechToText", "Failed to parse JSON from server: {0}", tm.Text); + Log.Error("SpeechToText.OnListenMessage()", "Failed to parse JSON from server: {0}", tm.Text); } } } @@ -735,7 +735,7 @@ private void OnListenMessage(WSConnector.Message msg) private void OnListenClosed(WSConnector connector) { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "OnListenClosed(), State = {0}", connector.State.ToString()); + Log.Debug("SpeechToText.OnListenClosed()", "OnListenClosed(), State = {0}", connector.State.ToString()); #endif _listenActive = false; diff --git a/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs b/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs index 1b0185348..3bb6b79b1 100644 --- a/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs +++ b/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs @@ -354,7 +354,7 @@ private void ToSpeechResponse(RESTConnector.Request req, RESTConnector.Response if (speechReq == null) throw new WatsonException("Wrong type of request object."); - //Log.Debug( "TextToSpeech", "Request completed in {0} seconds.", resp.ElapsedTime ); + //Log.Debug( "TextToSpeech.ToSpeechResponse()", "Request completed in {0} seconds.", resp.ElapsedTime ); AudioClip clip = resp.Success ? ProcessResponse(speechReq.TextId, resp.Data) : null; if (clip == null) diff --git a/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs b/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs index fd96b5838..f24f0b2c2 100644 --- a/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs +++ b/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs @@ -1135,7 +1135,6 @@ private void OnTrainClassifierResp(RESTConnector.Request req, RESTConnector.Resp if (string.IsNullOrEmpty(_apikey)) throw new WatsonException("No API Key was found!"); - Log.Debug("VisualRecognition", "Attempting to delete classifier {0}", classifierId); RESTConnector connector = RESTConnector.GetConnector(Credentials, ClassifiersEndpoint + "/" + classifierId); if (connector == null) return false; diff --git a/Scripts/UnitTests/TestAlchemyLanguage.cs b/Scripts/UnitTests/TestAlchemyLanguage.cs index c8eaa20db..458f33f35 100644 --- a/Scripts/UnitTests/TestAlchemyLanguage.cs +++ b/Scripts/UnitTests/TestAlchemyLanguage.cs @@ -142,7 +142,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestAlchemyLanguage", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestAlchemyLanguage.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -154,287 +154,287 @@ public override IEnumerator RunTest() // Get Author URL POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors URL POST!"); + Log.Debug("TestAlchemyLanguage.GetAuthors()", "Failed to get authors URL POST!"); while (!_getAuthorsURLTested) yield return null; //Get Author HTML POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors HTML POST!"); + Log.Debug("TestAlchemyLanguage.GetAuthors()", "Failed to get authors HTML POST!"); while (!_getAuthorsHTMLTested) yield return null; ////Get Concepts Text POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts Text POST!"); + Log.Debug("TestAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts Text POST!"); while (!_getRankedConceptsTextTested) yield return null; //Get Concepts HTML POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts HTML POST!"); + Log.Debug("TestAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts HTML POST!"); while (!_getRankedConceptsHTMLTested) yield return null; //Get Concepts URL POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts url POST!"); + Log.Debug("TestAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts url POST!"); while (!_getRankedConceptsURLTested) yield return null; //Get Date URL POST if (!_alchemyAPI.GetDates(OnGetDatesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by URL POST"); + Log.Debug("TestAlchemyLanguage.GetDates()", "Failed to get dates by URL POST"); while (!_getDatesURLTested) yield return null; //Get Date Text POST if (!_alchemyAPI.GetDates(OnGetDatesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by text POST"); + Log.Debug("TestAlchemyLanguage.GetDates()", "Failed to get dates by text POST"); while (!_getDatesTextTested) yield return null; //Get Date HTML POST if (!_alchemyAPI.GetDates(OnGetDatesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetDates()", "Failed to get dates by HTML POST"); while (!_getDatesHTMLTested) yield return null; //Get Emotions URL POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsUrl, _exampleURL_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by URL POST"); + Log.Debug("TestAlchemyLanguage.GetEmotions()", "Failed to get emotions by URL POST"); while (!_getEmotionURLTested) yield return null; //Get Emotions Text POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsText, _exampleText_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by text POST"); + Log.Debug("TestAlchemyLanguage.GetEmotions()", "Failed to get emotions by text POST"); while (!_getEmotionTextTested) yield return null; //Get Emotions HTML POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsHtml, _watson_beats_jeopardy_html, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetEmotions()", "Failed to get emotions by HTML POST"); while (!_getEmotionHTMLTested) yield return null; //Extract Entities URL POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by URL POST"); + Log.Debug("TestAlchemyLanguage.ExtractEntities()", "Failed to get entities by URL POST"); while (!_getEntityExtractionURLTested) yield return null; //Extract Entities Text POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by text POST"); + Log.Debug("TestAlchemyLanguage.ExtractEntities()", "Failed to get entities by text POST"); while (!_getEntityExtractionTextTested) yield return null; //Extract Entities HTML POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by HTML POST"); + Log.Debug("TestAlchemyLanguage.ExtractEntities()", "Failed to get entities by HTML POST"); while (!_getEntityExtractionHTMLTested) yield return null; //Detect Feeds URL POST if (!_alchemyAPI.DetectFeeds(OnDetectFeedsUrl, "http://time.com/newsfeed/")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by URL POST"); + Log.Debug("TestAlchemyLanguage.DetectFeeds()", "Failed to get feeds by URL POST"); while (!_detectFeedsURLTested) yield return null; ////Detect Feeds HTML POST //if (!_alchemyAPI.DetectFeeds(OnDetectFeedsHtml, ycombinator_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by HTML POST"); + // Log.Debug("TestAlchemyLanguage.DetectFeeds()", "Failed to get feeds by HTML POST"); //while (!_detectFeedsHTMLTested) // yield return null; //Extract Keywords URL POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by URL POST"); + Log.Debug("TestAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by URL POST"); while (!_getKeywordExtractionURLTested) yield return null; //Extract Keywords Text POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by text POST"); + Log.Debug("TestAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by text POST"); while (!_getKeywordExtractionTextTested) yield return null; //Extract Keywords HTML POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by HTML POST"); + Log.Debug("TestAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by HTML POST"); while (!_getKeywordExtractionHTMLTested) yield return null; //Extract Languages URL POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("TestAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageURLTested) yield return null; //Extract Languages Text POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("TestAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageTextTested) yield return null; //Extract Languages HTML POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetLanguages()", "Failed to get languages by HTML POST"); while (!_getLanguageHTMLTested) yield return null; //Get Microformats URL POST if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsUrl, _exampleURL_microformats)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + Log.Debug("TestAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); while (!_getMicroformatURLTested) yield return null; //Get Microformats HTML POST //if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsHtml, microformats_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + // Log.Debug("TestAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); //while (!_getMicroformatHTMLTested) // yield return null; //Get PublicationDate URL POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by url POST"); + Log.Debug("TestAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by url POST"); while (!_getPubDateURLTested) yield return null; //Get PublicationDate HTML POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by html POST"); + Log.Debug("TestAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by html POST"); while (!_getPubDateHTMLTested) yield return null; //Get Relations URL POST if (!_alchemyAPI.GetRelations(OnGetRelationsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("TestAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsURLTested) yield return null; //Get Relations Text POST if (!_alchemyAPI.GetRelations(OnGetRelationsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("TestAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsTextTested) yield return null; //Get Relations HTML POST if (!_alchemyAPI.GetRelations(OnGetRelationsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetRelations()", "Failed to get relations by HTML POST"); while (!_getRelationsHTMLTested) yield return null; //Get Sentiment URL POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("TestAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentURLTested) yield return null; //Get Sentiment Text POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("TestAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentTextTested) yield return null; //Get Sentiment HTML POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by HTML POST"); while (!_getTextSentimentHTMLTested) yield return null; //Get Targeted Sentiment URL POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentUrl, _exampleURL_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("TestAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentURLTested) yield return null; //Get Targeted Sentiment Text POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentText, _exampleText_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("TestAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentTextTested) yield return null; //Get Targeted Sentiment HTML POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentHtml, _watson_beats_jeopardy_html, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by HTML POST"); while (!_getTargetedSentimentHTMLTested) yield return null; //Get Taxonomy URL POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("TestAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyURLTested) yield return null; //Get Taxonomy Text POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("TestAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyTextTested) yield return null; //Get Taxonomy HTML POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by HTML POST"); while (!_getRankedTaxonomyHTMLTested) yield return null; //Get Text HTML POST if (!_alchemyAPI.GetText(OnGetTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("TestAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextHTMLTested) yield return null; //Get Text URL POST if (!_alchemyAPI.GetText(OnGetTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("TestAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextURLTested) yield return null; //Get Raw Text HTML POST if (!_alchemyAPI.GetRawText(OnGetRawTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("TestAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextHTMLTested) yield return null; //Get Raw Text URL POST if (!_alchemyAPI.GetRawText(OnGetRawTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("TestAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextURLTested) yield return null; //Get Title HTML POST if (!_alchemyAPI.GetTitle(OnGetTitleHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("TestAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleHTMLTested) yield return null; //Get Title URL POST if (!_alchemyAPI.GetTitle(OnGetTitleUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("TestAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleURLTested) yield return null; // Get Combined Data URL POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataUrl, _exampleURL_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("TestAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataURLTested) yield return null; //Get Combined Data Text POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataText, _exampleText_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("TestAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataTextTested) yield return null; //Get Combined Data HTML POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataHtml, _watson_beats_jeopardy_html, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by HTML POST"); + Log.Debug("TestAlchemyLanguage.GetCombinedData()", "Failed to get combined data by HTML POST"); while (!_getCombinedDataHTMLTested) yield return null; - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language examples complete"); + Log.Debug("TestAlchemyLanguage.RunTest()", "Alchemy Language examples complete"); Dictionary queryFields = new Dictionary(); queryFields.Add(Fields.EnrichedUrlRelationsRelationSubjectText, "Obama"); @@ -442,348 +442,348 @@ public override IEnumerator RunTest() string[] returnFields = { Fields.EnrichedUrlEntities, Fields.EnrichedUrlKeywords }; if (!_alchemyAPI.GetNews(OnGetNews, returnFields, queryFields)) - Log.Debug("ExampleAlchemyDataNews", "Failed to get news!"); + Log.Debug("TestAlchemyDataNews.GetNews()", "Failed to get news!"); while (!_getNewsTested) yield return null; - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news examples complete!"); + Log.Debug("TestAlchemyDataNews.RunTest()", "Alchemy data news examples complete!"); yield break; } private void OnGetAuthorsHtml(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetAuthorsHtml()", "Alchemy Language - Get authors response html: {0}", data); Test(authors != null); _getAuthorsHTMLTested = true; } private void OnGetAuthorsUrl(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetAuthorsUrl()", "Alchemy Language - Get authors response url: {0}", data); Test(authors != null); _getAuthorsURLTested = true; } private void OnGetConceptsHtml(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetConceptsHtml()", "Alchemy Language - Get ranked concepts response html: {0}", data); Test(concepts != null); _getRankedConceptsHTMLTested = true; } private void OnGetConceptsUrl(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetConceptsUrl()", "Alchemy Language - Get ranked concepts response url: {0}", data); Test(concepts != null); _getRankedConceptsURLTested = true; } private void OnGetConceptsText(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetConceptsText()", "Alchemy Language - Get ranked concepts response text: {0}", data); Test(concepts != null); _getRankedConceptsTextTested = true; } private void OnGetDatesHtml(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetDatesHtml()", "Alchemy Language - Get dates response html: {0}", data); Test(dates != null); _getDatesHTMLTested = true; } private void OnGetDatesUrl(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetDatesUrl()", "Alchemy Language - Get dates response url: {0}", data); Test(dates != null); _getDatesURLTested = true; } private void OnGetDatesText(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetDatesText()", "Alchemy Language - Get dates response text: {0}", data); Test(dates != null); _getDatesTextTested = true; } private void OnGetEmotionsHtml(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetEmotionsHtml()", "Alchemy Language - Get emotions response html: {0}", data); Test(emotions != null); _getEmotionHTMLTested = true; } private void OnGetEmotionsUrl(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetEmotionsUrl()", "Alchemy Language - Get emotions response html: {0}", data); Test(emotions != null); _getEmotionURLTested = true; } private void OnGetEmotionsText(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetEmotionsText()", "Alchemy Language - Get emotions response html: {0}", data); Test(emotions != null); _getEmotionTextTested = true; } private void OnExtractEntitiesHtml(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractEntitiesHtml()", "Alchemy Language - Extract entities response html: {0}", data); Test(entityData != null); _getEntityExtractionHTMLTested = true; } private void OnExtractEntitiesUrl(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractEntitiesUrl()", "Alchemy Language - Extract entities response url: {0}", data); Test(entityData != null); _getEntityExtractionURLTested = true; } private void OnExtractEntitiesText(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractEntitiesText()", "Alchemy Language - Extract entities response text: {0}", data); Test(entityData != null); _getEntityExtractionTextTested = true; } //private void OnDetectFeedsHtml(FeedData feedData, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response html: {0}", data); + // Log.Debug("TestAlchemyLanguage.OnDetectFeedsHtml()", "Alchemy Language - Detect feeds response html: {0}", data); //Test(feedData != null); // _detectFeedsHTMLTested = true; //} private void OnDetectFeedsUrl(FeedData feedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnDetectFeedsUrl()", "Alchemy Language - Detect feeds response url: {0}", data); Test(feedData != null); _detectFeedsURLTested = true; } private void OnExtractKeywordsHtml(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractKeywordsHtml()", "Alchemy Language - Extract keywords response html: {0}", data); Test(keywordData != null); _getKeywordExtractionHTMLTested = true; } private void OnExtractKeywordsUrl(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractKeywordsUrl()", "Alchemy Language - Extract keywords response url: {0}", data); Test(keywordData != null); _getKeywordExtractionURLTested = true; } private void OnExtractKeywordsText(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnExtractKeywordsText()", "Alchemy Language - Extract keywords response text: {0}", data); Test(keywordData != null); _getKeywordExtractionTextTested = true; } private void OnGetLanguagesHtml(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetLanguagesHtml()", "Alchemy Language - Get languages response html: {0}", data); Test(languages != null); _getLanguageHTMLTested = true; } private void OnGetLanguagesUrl(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetLanguagesUrl()", "Alchemy Language - Get languages response url: {0}", data); Test(languages != null); _getLanguageURLTested = true; } private void OnGetLanguagesText(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetLanguagesText()", "Alchemy Language - Get languages response text: {0}", data); Test(languages != null); _getLanguageTextTested = true; } //private void OnGetMicroformatsHtml(MicroformatData microformats, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response html: {0}", data); + // Log.Debug("TestAlchemyLanguage.OnGetMicroformatsHtml()", "Alchemy Language - Get microformats response html: {0}", data); //Test(microformats != null); // _getMicroformatHTMLTested = true; //} private void OnGetMicroformatsUrl(MicroformatData microformats, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetMicroformatsUrl()", "Alchemy Language - Get microformats response url: {0}", data); Test(microformats != null); _getMicroformatURLTested = true; } private void OnGetPublicationDateHtml(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetPublicationDateHtml()", "Alchemy Language - Get publication date response html: {0}", data); Test(pubDates != null); _getPubDateHTMLTested = true; } private void OnGetPublicationDateUrl(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetPublicationDateUrl()", "Alchemy Language - Get publication date response url: {0}", data); Test(pubDates != null); _getPubDateURLTested = true; } private void OnGetRelationsHtml(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRelationsHtml()", "Alchemy Language - Get relations response html: {0}", data); Test(relationsData != null); _getRelationsHTMLTested = true; } private void OnGetRelationsUrl(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRelationsUrl()", "Alchemy Language - Get relations response url: {0}", data); Test(relationsData != null); _getRelationsURLTested = true; } private void OnGetRelationsText(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRelationsText()", "Alchemy Language - Get relations response text: {0}", data); Test(relationsData != null); _getRelationsTextTested = true; } private void OnGetTextSentimentHtml(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTextSentimentHtml()", "Alchemy Language - Get text sentiment response html: {0}", data); Test(sentimentData != null); _getTextSentimentHTMLTested = true; } private void OnGetTextSentimentUrl(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTextSentimentUrl()", "Alchemy Language - Get text sentiment response url: {0}", data); Test(sentimentData != null); _getTextSentimentURLTested = true; } private void OnGetTextSentimentText(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTextSentimentText()", "Alchemy Language - Get text sentiment response text: {0}", data); Test(sentimentData != null); _getTextSentimentTextTested = true; } private void OnGetTargetedSentimentHtml(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTargetedSentimentHtml()", "Alchemy Language - Get targeted sentiment response html: {0}", data); Test(sentimentData != null); _getTargetedSentimentHTMLTested = true; } private void OnGetTargetedSentimentUrl(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTargetedSentimentUrl()", "Alchemy Language - Get targeted sentiment response url: {0}", data); Test(sentimentData != null); _getTargetedSentimentURLTested = true; } private void OnGetTargetedSentimentText(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTargetedSentimentText()", "Alchemy Language - Get targeted sentiment response text: {0}", data); Test(sentimentData != null); _getTargetedSentimentTextTested = true; } private void OnGetRankedTaxonomyHtml(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRankedTaxonomyHtml()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); Test(taxonomyData != null); _getRankedTaxonomyHTMLTested = true; } private void OnGetRankedTaxonomyUrl(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response url: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRankedTaxonomyUrl()", "Alchemy Language - Get ranked taxonomy response url: {0}", data); Test(taxonomyData != null); _getRankedTaxonomyURLTested = true; } private void OnGetRankedTaxonomyText(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response text: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRankedTaxonomyText()", "Alchemy Language - Get ranked taxonomy response text: {0}", data); Test(taxonomyData != null); _getRankedTaxonomyTextTested = true; } private void OnGetTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTextHtml()", "Alchemy Language - Get Text HTML response: {0}", data); Test(textData != null); _getTextHTMLTested = true; } private void OnGetTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text Url response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTextUrl()", "Alchemy Language - Get Text Url response: {0}", data); Test(textData != null); _getTextURLTested = true; } private void OnGetRawTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRawTextHtml()", "Alchemy Language - Get raw text HTML response: {0}", data); Test(textData != null); _getRawTextHTMLTested = true; } private void OnGetRawTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text Url response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetRawTextUrl()", "Alchemy Language - Get raw text Url response: {0}", data); Test(textData != null); _getRawTextURLTested = true; } private void OnGetTitleHtml(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title HTML response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTitleHtml()", "Alchemy Language - Get Title HTML response: {0}", data); Test(titleData != null); _getTitleHTMLTested = true; } private void OnGetTitleUrl(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetTitleUrl()", "Alchemy Language - Get Title Url response: {0}", data); Test(titleData != null); _getTitleURLTested = true; } private void OnGetCombinedDataHtml(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data HTML response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetCombinedDataHtml()", "Alchemy Language - Get Combined Data HTML response: {0}", data); Test(combinedData != null); _getCombinedDataHTMLTested = true; } private void OnGetCombinedDataUrl(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Url response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetCombinedDataUrl()", "Alchemy Language - Get Combined Data Url response: {0}", data); Test(combinedData != null); _getCombinedDataURLTested = true; } private void OnGetCombinedDataText(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("TestAlchemyLanguage.OnGetCombinedDataText()", "Alchemy Language - Get Combined Data Text response: {0}", data); Test(combinedData != null); _getCombinedDataTextTested = true; } private void OnGetNews(NewsResponse newsData, string data) { - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news - Get news Response: {0}", data); + Log.Debug("TestAlchemyDataNews.OnGetNews()", "Alchemy data news - Get news Response: {0}", data); Test(newsData != null); _getNewsTested = true; } diff --git a/Scripts/UnitTests/TestConversation.cs b/Scripts/UnitTests/TestConversation.cs index 47381c202..623512615 100644 --- a/Scripts/UnitTests/TestConversation.cs +++ b/Scripts/UnitTests/TestConversation.cs @@ -79,7 +79,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestConversation", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestConversation.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -90,7 +90,7 @@ public override IEnumerator RunTest() // Test initate with empty string if (!_conversation.Message(OnMessage, _workspaceId, "")) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("TestConversation.RunTest()", "Failed to message!"); // Test initiate with empty string message object MessageRequest messageRequest = new MessageRequest() @@ -103,10 +103,10 @@ public override IEnumerator RunTest() }; if (!_conversation.Message(OnMessage, _workspaceId, messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("TestConversation.RunTest()", "Failed to message!"); if (!_conversation.Message(OnMessage, _workspaceId, "hello")) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("TestConversation.RunTest()", "Failed to message!"); while (_waitingForResponse) yield return null; @@ -140,7 +140,7 @@ public override IEnumerator RunTest() while (_waitingForResponse) yield return null; - Log.Debug("ExampleConversation", "Conversation examples complete."); + Log.Debug("TestConversation.RunTest()", "Conversation examples complete."); yield break; } @@ -157,12 +157,12 @@ private void AskQuestion() }; if (!_conversation.Message(OnMessage, _workspaceId, messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("TestConversation.AskQuestion()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("TestConversation.OnMessage()", "Conversation: Message Response: {0}", data); // Convert resp to fsdata fsData fsdata = null; @@ -184,7 +184,7 @@ private void OnMessage(object resp, string data) if (_tempContext != null) _context = _tempContext as Dictionary; else - Log.Debug("ExampleConversation", "Failed to get context"); + Log.Debug("TestConversation.OnMessage()", "Failed to get context"); Test(messageResponse != null); _waitingForResponse = false; diff --git a/Scripts/UnitTests/TestDiscovery.cs b/Scripts/UnitTests/TestDiscovery.cs index 0016ac59a..fc4e3af67 100644 --- a/Scripts/UnitTests/TestDiscovery.cs +++ b/Scripts/UnitTests/TestDiscovery.cs @@ -106,7 +106,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestDiscovery", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestDiscovery.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -125,16 +125,16 @@ public override IEnumerator RunTest() _documentFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/watson_beats_jeopardy.html"; // Get Environments - Log.Debug("ExampleDiscoveryV1", "Attempting to get environments"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get environments"); if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environments"); + Log.Debug("TestDiscovery.GetEnvironments()", "Failed to get environments"); while (!_getEnvironmentsTested) yield return null; // AddEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to add environment"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to add environment"); if (!_discovery.AddEnvironment(OnAddEnvironment, "unity-testing-AddEnvironment-do-not-delete-until-active", "Testing addEnvironment in Unity SDK. Please do not delete this environment until the status is 'active'", 1)) - Log.Debug("ExampleDiscoveryV1", "Failed to add environment"); + Log.Debug("TestDiscovery.AddEnvironment()", "Failed to add environment"); while (!_addEnvironmentTested) yield return null; @@ -144,103 +144,103 @@ public override IEnumerator RunTest() yield return null; // GetEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get environment"); if (!_discovery.GetEnvironment(OnGetEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environment"); + Log.Debug("TestDiscovery.GetEnvironment()", "Failed to get environment"); while (!_getEnvironmentTested) yield return null; // Get Configurations - Log.Debug("ExampleDiscoveryV1", "Attempting to get configurations"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get configurations"); if (!_discovery.GetConfigurations(OnGetConfigurations, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configurations"); + Log.Debug("TestDiscovery.GetConfigurations()", "Failed to get configurations"); while (!_getConfigurationsTested) yield return null; // Add Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to add configuration"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to add configuration"); if (!_discovery.AddConfiguration(OnAddConfiguration, _createdEnvironmentID, _configurationJsonPath)) - Log.Debug("ExampleDiscoveryV1", "Failed to add configuration"); + Log.Debug("TestDiscovery.AddConfiguration()", "Failed to add configuration"); while (!_addConfigurationTested) yield return null; // Get Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to get configuration"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get configuration"); if (!_discovery.GetConfiguration(OnGetConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configuration"); + Log.Debug("TestDiscovery.GetConfiguration()", "Failed to get configuration"); while (!_getConfigurationTested) yield return null; // Preview Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to preview configuration"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to preview configuration"); if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, _createdEnvironmentID, _createdConfigurationID, null, _filePathToIngest, _metadata)) - Log.Debug("ExampleDiscoveryV1", "Failed to preview configuration"); + Log.Debug("TestDiscovery.PreviewConfiguration()", "Failed to preview configuration"); while (!_previewConfigurationTested) yield return null; // Get Collections - Log.Debug("ExampleDiscoveryV1", "Attempting to get collections"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get collections"); if (!_discovery.GetCollections(OnGetCollections, _createdEnvironmentID)) - Log.Debug("ExampleDiscovery", "Failed to get collections"); + Log.Debug("TestDiscovery.GetCollections()", "Failed to get collections"); while (!_getCollectionsTested) yield return null; // Add Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to add collection"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to add collection"); if (!_discovery.AddCollection(OnAddCollection, _createdEnvironmentID, _createdCollectionName, _createdCollectionDescription, _createdConfigurationID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("TestDiscovery.AddCollection()", "Failed to add collection"); while (!_addCollectionTested) yield return null; // Get Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to get collection"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get collection"); if (!_discovery.GetCollection(OnGetCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get collection"); + Log.Debug("TestDiscovery.GetCollection()", "Failed to get collection"); while (!_getCollectionTested) yield return null; if (!_discovery.GetFields(OnGetFields, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get fields"); + Log.Debug("TestDiscovery.GetFields()", "Failed to get fields"); while (!_getFieldsTested) yield return null; // Add Document - Log.Debug("ExampleDiscoveryV1", "Attempting to add document"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to add document"); if (!_discovery.AddDocument(OnAddDocument, _createdEnvironmentID, _createdCollectionID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to add document"); + Log.Debug("TestDiscovery.AddDocument()", "Failed to add document"); while (!_addDocumentTested) yield return null; // Get Document - Log.Debug("ExampleDiscoveryV1", "Attempting to get document"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to get document"); if (!_discovery.GetDocument(OnGetDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to get document"); + Log.Debug("TestDiscovery.GetDocument()", "Failed to get document"); while (!_getDocumentTested) yield return null; // Update Document - Log.Debug("ExampleDiscoveryV1", "Attempting to update document"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to update document"); if (!_discovery.UpdateDocument(OnUpdateDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to update document"); + Log.Debug("TestDiscovery.UpdateDocument()", "Failed to update document"); while (!_updateDocumentTested) yield return null; // Query - Log.Debug("ExampleDiscoveryV1", "Attempting to query"); + Log.Debug("TestDiscovery.RunTest()", "Attempting to query"); if (!_discovery.Query(OnQuery, _createdEnvironmentID, _createdCollectionID, null, _query, null, 10, null, 0)) - Log.Debug("ExampleDiscovery", "Failed to query"); + Log.Debug("TestDiscovery.Query()", "Failed to query"); while (!_queryTested) yield return null; // Delete Document - Log.Debug("ExampleDiscoveryV1", "Attempting to delete document {0}", _createdDocumentID); + Log.Debug("TestDiscovery.RunTest()", "Attempting to delete document {0}", _createdDocumentID); if (!_discovery.DeleteDocument(OnDeleteDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to delete document"); + Log.Debug("TestDiscovery.DeleteDocument()", "Failed to delete document"); while (!_deleteDocumentTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete collection for 10 sec"); + Log.Debug("TestDiscovery.RunTest()", "Delaying delete collection for 10 sec"); Runnable.Run(Delay(_waitTime)); while (!_readyToContinue) yield return null; @@ -252,14 +252,14 @@ public override IEnumerator RunTest() _readyToContinue = false; // Delete Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to delete collection {0}", _createdCollectionID); + Log.Debug("TestDiscovery.RunTest()", "Attempting to delete collection {0}", _createdCollectionID); if (!_discovery.DeleteCollection(OnDeleteCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("TestDiscovery.DeleteCollection()", "Failed to add collection"); while (!_deleteCollectionTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete configuration for 10 sec"); + Log.Debug("TestDiscovery.RunTest()", "Delaying delete configuration for 10 sec"); Runnable.Run(Delay(_waitTime)); while (!_readyToContinue) yield return null; @@ -271,14 +271,14 @@ public override IEnumerator RunTest() _readyToContinue = false; // Delete Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to delete configuration {0}", _createdConfigurationID); + Log.Debug("TestDiscovery.RunTest()", "Attempting to delete configuration {0}", _createdConfigurationID); if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete configuration"); + Log.Debug("TestDiscovery.DeleteConfiguration()", "Failed to delete configuration"); while (!_deleteConfigurationTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete environment for 10 sec"); + Log.Debug("TestDiscovery.RunTest()", "Delaying delete environment for 10 sec"); Runnable.Run(Delay(_waitTime)); while (!_readyToContinue) yield return null; @@ -290,9 +290,9 @@ public override IEnumerator RunTest() _readyToContinue = false; // Delete Environment - Log.Debug("ExampleDiscoveryV1", "Attempting to delete environment {0}", _createdEnvironmentID); + Log.Debug("TestDiscovery.RunTest()", "Attempting to delete environment {0}", _createdEnvironmentID); if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete environment"); + Log.Debug("TestDiscovery.DeleteEnvironment()", "Failed to delete environment"); while (!_deleteEnvironmentTested) yield return null; @@ -304,7 +304,7 @@ public override IEnumerator RunTest() } } - Log.Debug("ExampleDiscoveryV1", "Discovery examples complete."); + Log.Debug("TestDiscovery.RunTest()", "Discovery examples complete."); yield break; } @@ -314,21 +314,21 @@ private IEnumerator CheckEnvironmentState(float waitTime) { yield return new WaitForSeconds(waitTime); - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment state"); + Log.Debug("TestDiscovery.CheckEnvironmentState()", "Attempting to get environment state"); try { _discovery.GetEnvironment(HandleCheckEnvironmentState, _createdEnvironmentID); } catch (System.Exception e) { - Log.Debug("ExampleDiscoveryV1", string.Format("Failed to get environment state: {0}", e.Message)); + Log.Debug("TestDiscovery.CheckEnvironmentState()", string.Format("Failed to get environment state: {0}", e.Message)); Runnable.Run(CheckEnvironmentState(10f)); } } private void HandleCheckEnvironmentState(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Environment {0} is {1}", resp.environment_id, resp.status); + Log.Debug("TestDiscovery.HandleCheckEnvironmentState()", "Environment {0} is {1}", resp.environment_id, resp.status); if (resp.status.ToLower() == "active") _isEnvironmentReady = true; @@ -347,21 +347,21 @@ private IEnumerator Delay(float waitTime) private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("TestDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); Test(resp != null); _getEnvironmentsTested = true; } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("TestDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); Test(resp != null); _getEnvironmentTested = true; } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("TestDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); _createdEnvironmentID = resp.environment_id; Test(resp != null); _addEnvironmentTested = true; @@ -369,14 +369,14 @@ private void OnAddEnvironment(Environment resp, string data) private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("TestDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); Test(resp != null); _getConfigurationsTested = true; } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("TestDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); Test(resp != null); _getConfigurationTested = true; @@ -384,7 +384,7 @@ private void OnGetConfiguration(Configuration resp, string data) private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("TestDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); _createdConfigurationID = resp.configuration_id; Test(resp != null); _addConfigurationTested = true; @@ -392,28 +392,28 @@ private void OnAddConfiguration(Configuration resp, string data) private void OnPreviewConfiguration(TestDocument resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("TestDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); Test(resp != null); _previewConfigurationTested = true; } private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get collections Response: {0}", data); + Log.Debug("TestDiscovery.OnGetCollections()", "Discovery - Get collections Response: {0}", data); Test(resp != null); _getCollectionsTested = true; } private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletion Response: {0}", data); + Log.Debug("TestDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); Test(resp != null); _getCollectionTested = true; } private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add collection Response: {0}", data); + Log.Debug("TestDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); _createdCollectionID = resp.collection_id; Test(resp != null); _addCollectionTested = true; @@ -421,14 +421,14 @@ private void OnAddCollection(CollectionRef resp, string data) private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get fields Response: {0}", data); + Log.Debug("TestDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); Test(resp != null); _getFieldsTested = true; } private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add document Response: {0}", data); + Log.Debug("TestDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); _createdDocumentID = resp.document_id; Test(resp != null); _addDocumentTested = true; @@ -436,21 +436,21 @@ private void OnAddDocument(DocumentAccepted resp, string data) private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get document Response: {0}", data); + Log.Debug("TestDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); Test(resp != null); _getDocumentTested = true; } private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Update document Response: {0}", data); + Log.Debug("TestDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); Test(resp != null); _updateDocumentTested = true; } private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("TestDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); if (success) _createdDocumentID = default(string); @@ -461,7 +461,7 @@ private void OnDeleteDocument(bool success, string data) private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("TestDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); if (success) _createdCollectionID = default(string); @@ -472,7 +472,7 @@ private void OnDeleteCollection(bool success, string data) private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete configuration Response: deleted:{0}", success); + Log.Debug("TestDiscovery.OnDeleteConfiguration()", "Discovery - Delete configuration Response: deleted:{0}", success); if (success) _createdConfigurationID = default(string); @@ -483,7 +483,7 @@ private void OnDeleteConfiguration(bool success, string data) private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete environment Response: deleted:{0}", success); + Log.Debug("TestDiscovery.OnDeleteEnvironment()", "Discovery - Delete environment Response: deleted:{0}", success); if (success) _createdEnvironmentID = default(string); @@ -494,7 +494,7 @@ private void OnDeleteEnvironment(bool success, string data) private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Query Response: {0}", data); + Log.Debug("TestDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); Test(resp != null); _queryTested = true; } diff --git a/Scripts/UnitTests/TestDocumentConversion.cs b/Scripts/UnitTests/TestDocumentConversion.cs index c87499b2d..d2a29aa31 100644 --- a/Scripts/UnitTests/TestDocumentConversion.cs +++ b/Scripts/UnitTests/TestDocumentConversion.cs @@ -74,7 +74,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestDocumentConversion", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestDocumentConversion.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -90,19 +90,19 @@ public override IEnumerator RunTest() _examplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/watson_beats_jeopardy.html"; if (!_documentConversion.ConvertDocument(OnConvertDocument, _examplePath, _conversionTarget)) - Log.Debug("ExampleDocumentConversion", "Document conversion failed!"); + Log.Debug("TestDocumentConversion.RunTest()", "Document conversion failed!"); while (!_convertDocumentTested) yield return null; - Log.Debug("ExampleDoucmentConversion", "Document conversion examples complete."); + Log.Debug("TestDoucmentConversion.RunTest()", "Document conversion examples complete."); yield break; } private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) { - Log.Debug("ExampleDoucmentConversion", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); + Log.Debug("TestDoucmentConversion.OnConvertDocument()", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); Test(documentConversionResponse != null); _convertDocumentTested = true; } diff --git a/Scripts/UnitTests/TestLanguageTranslator.cs b/Scripts/UnitTests/TestLanguageTranslator.cs index bcc8fb2d4..100f91e40 100644 --- a/Scripts/UnitTests/TestLanguageTranslator.cs +++ b/Scripts/UnitTests/TestLanguageTranslator.cs @@ -84,7 +84,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestLanguageTranslator", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestLanguageTranslator.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -101,55 +101,55 @@ public override IEnumerator RunTest() _forcedGlossaryFilePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/glossary.tmx"; if (!_languageTranslator.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation)) - Log.Debug("TestLanguageTranslator", "Failed to translate."); + Log.Debug("TestLanguageTranslator.GetTranslation()", "Failed to translate."); while (!_getTranslationTested) yield return null; if(!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslator", "Failed to get models."); + Log.Debug("TestLanguageTranslator.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; if(!_languageTranslator.CreateModel(OnCreateModel, _baseModelName, _customModelName, _forcedGlossaryFilePath)) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("TestLanguageTranslator.CreateModel()", "Failed to create model."); while (!_createModelTested) yield return null; if (!_languageTranslator.GetModel(OnGetModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to get model."); + Log.Debug("TestLanguageTranslator.GetModel()", "Failed to get model."); while (!_getModelTested) yield return null; if (!_languageTranslator.DeleteModel(OnDeleteModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to delete model."); + Log.Debug("TestLanguageTranslator.DeleteModel()", "Failed to delete model."); while (!_deleteModelTested) yield return null; if (!_languageTranslator.Identify(OnIdentify, _pharseToTranslate)) - Log.Debug("TestLanguageTranslator", "Failed to identify language."); + Log.Debug("TestLanguageTranslator.Identify()", "Failed to identify language."); while (!_identifyTested) yield return null; if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslator", "Failed to get languages."); + Log.Debug("TestLanguageTranslator.GetLanguages()", "Failed to get languages."); while (!_getLanguagesTested) yield return null; - Log.Debug("TestLanguageTranslator", "Language Translator examples complete."); + Log.Debug("TestLanguageTranslator.RunTest()", "Language Translator examples complete."); yield break; } private void OnGetModels(TranslationModels models, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", customData); Test(models != null); _getModelsTested = true; } private void OnCreateModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", customData); _customLanguageModelId = model.model_id; Test(model != null); _createModelTested = true; @@ -157,14 +157,14 @@ private void OnCreateModel(TranslationModel model, string customData) private void OnGetModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", customData); Test(model != null); _getModelTested = true; } private void OnDeleteModel(bool success, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("TestLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); Test(success); _customLanguageModelId = null; _deleteModelTested = true; @@ -172,21 +172,21 @@ private void OnDeleteModel(bool success, string customData) private void OnGetTranslation(Translations translation, string customData) { - Log.Debug("TestLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", customData); Test(translation != null); _getTranslationTested = true; } private void OnIdentify(string lang, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", customData); Test(lang != null); _identifyTested = true; } private void OnGetLanguages(Languages languages, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("TestLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", customData); Test(languages != null); _getLanguagesTested = true; } diff --git a/Scripts/UnitTests/TestNaturalLanguageClassifier.cs b/Scripts/UnitTests/TestNaturalLanguageClassifier.cs index 3bcf8ea8e..620c524ed 100644 --- a/Scripts/UnitTests/TestNaturalLanguageClassifier.cs +++ b/Scripts/UnitTests/TestNaturalLanguageClassifier.cs @@ -93,7 +93,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestNaturalLanguageClassifier", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestNaturalLanguageClassifier.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -109,13 +109,13 @@ public override IEnumerator RunTest() // Get classifiers if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifiers!"); + Log.Debug("TestNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); while (!_getClassifiersTested) yield return null; if (_classifierIds.Count == 0) - Log.Debug("ExampleNaturalLanguageClassifier", "There are no trained classifiers. Please train a classifier..."); + Log.Debug("TestNaturalLanguageClassifier.RunTest()", "There are no trained classifiers. Please train a classifier..."); if (_classifierIds.Count > 0) { @@ -123,7 +123,7 @@ public override IEnumerator RunTest() foreach (string classifierId in _classifierIds) { if (!naturalLanguageClassifier.GetClassifier(classifierId, OnGetClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifier {0}!", classifierId); + Log.Debug("TestNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } while (!_getClassifierTested) @@ -131,14 +131,14 @@ public override IEnumerator RunTest() } if (!_areAnyClassifiersAvailable && _classifierIds.Count > 0) - Log.Debug("ExampleNaturalLanguageClassifier", "All classifiers are training..."); + Log.Debug("TestNaturalLanguageClassifier.RunTest()", "All classifiers are training..."); // Train classifier #if TRAIN_CLASSIFIER string dataPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/weather_data_train.csv"; var trainingContent = File.ReadAllText(dataPath); if (!naturalLanguageClassifier.TrainClassifier(_classifierName + "/" + DateTime.Now.ToString(), "en", trainingContent, OnTrainClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to train clasifier!"); + Log.Debug("TestNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); while (!_trainClassifierTested) yield return null; @@ -147,26 +147,26 @@ public override IEnumerator RunTest() #if DELETE_TRAINED_CLASSIFIER if (!string.IsNullOrEmpty(_classifierToDelete)) if (!naturalLanguageClassifier.DeleteClassifer(_classifierToDelete, OnDeleteTrainedClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to delete clasifier {0}!", _classifierToDelete); + Log.Debug("TestNaturalLanguageClassifier.DeleteClassifer()", "Failed to delete clasifier {0}!", _classifierToDelete); #endif // Classify if (_areAnyClassifiersAvailable) { if (!naturalLanguageClassifier.Classify(_classifierId, _inputString, OnClassify)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to classify!"); + Log.Debug("TestNaturalLanguageClassifier.Classify()", "Failed to classify!"); while (!_classifyTested) yield return null; } - Log.Debug("ExampleNaturalLanguageClassifier", "Natural language classifier examples complete."); + Log.Debug("TestNaturalLanguageClassifier.RunTest()", "Natural language classifier examples complete."); yield break; } private void OnGetClassifiers(Classifiers classifiers, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("TestNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); foreach (Classifier classifier in classifiers.classifiers) _classifierIds.Add(classifier.classifier_id); @@ -177,7 +177,7 @@ private void OnGetClassifiers(Classifiers classifiers, string data) private void OnClassify(ClassifyResult result, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("TestNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); Test(result != null); _classifyTested = true; } @@ -185,7 +185,7 @@ private void OnClassify(ClassifyResult result, string data) #if TRAIN_CLASSIFIER private void OnTrainClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("TestNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; #endif @@ -196,7 +196,7 @@ private void OnTrainClassifier(Classifier classifier, string data) private void OnGetClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); + Log.Debug("TestNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); // Get any classifier that is available if (!string.IsNullOrEmpty(classifier.status) && classifier.status.ToLower() == "available") @@ -213,7 +213,7 @@ private void OnGetClassifier(Classifier classifier, string data) #if DELETE_TRAINED_CLASSIFIER private void OnDeleteTrainedClassifier(bool success, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); + Log.Debug("TestNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); Test(success); } #endif diff --git a/Scripts/UnitTests/TestNaturalLanguageUnderstanding.cs b/Scripts/UnitTests/TestNaturalLanguageUnderstanding.cs index 6bda303e6..1e77628ee 100644 --- a/Scripts/UnitTests/TestNaturalLanguageUnderstanding.cs +++ b/Scripts/UnitTests/TestNaturalLanguageUnderstanding.cs @@ -73,7 +73,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestNaturalLanguageUnderstanding", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestNaturalLanguageUnderstanding.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -87,9 +87,9 @@ public override IEnumerator RunTest() _naturalLanguageUnderstanding = new NaturalLanguageUnderstanding(credentials); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to get models..."); + Log.Debug("TestNaturalLanguageUnderstanding.RunTests()", "attempting to get models..."); if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("TestNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; @@ -115,13 +115,13 @@ public override IEnumerator RunTest() } }; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to analyze..."); + Log.Debug("TestNaturalLanguageUnderstanding.RunTests()", "attempting to analyze..."); if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, parameters)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("TestNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); while (!_analyzeTested) yield return null; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Natural language understanding examples complete."); + Log.Debug("TestNaturalLanguageUnderstanding.RunTests()", "Natural language understanding examples complete."); yield break; } @@ -130,7 +130,7 @@ private void OnGetModels(ListModelsResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "ListModelsResult: {0}", data.ToString()); + Log.Debug("TestNaturalLanguageUnderstanding.OnGetModels()", "ListModelsResult: {0}", data.ToString()); Test(resp != null); _getModelsTested = true; @@ -140,7 +140,7 @@ private void OnAnalyze(AnalysisResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "AnalysisResults: {0}", data.ToString()); + Log.Debug("TestNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", data.ToString()); Test(resp != null); _analyzeTested = true; } diff --git a/Scripts/UnitTests/TestPersonalityInsightsV3.cs b/Scripts/UnitTests/TestPersonalityInsightsV3.cs index 3af52eee7..52c06dd2f 100644 --- a/Scripts/UnitTests/TestPersonalityInsightsV3.cs +++ b/Scripts/UnitTests/TestPersonalityInsightsV3.cs @@ -80,7 +80,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestPersonalityInsights", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestPersonalityInsights.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -98,30 +98,30 @@ public override IEnumerator RunTest() _dataPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/personalityInsights.json"; if (!_personalityInsights.GetProfile(OnGetProfileJson, _dataPath, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileJsonTested) yield return null; if (!_personalityInsights.GetProfile(OnGetProfileText, _testString, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileTextTested) yield return null; - Log.Debug("ExamplePersonalityInsights", "Personality insights examples complete."); + Log.Debug("ExamplePersonalityInsights.RunTest()", "Personality insights examples complete."); yield break; } private void OnGetProfileText(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileText Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileText()", "Personality Insights - GetProfileText Response: {0}", data); Test(profile != null); _getProfileTextTested = true; } private void OnGetProfileJson(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileJson Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileJson()", "Personality Insights - GetProfileJson Response: {0}", data); Test(profile != null); _getProfileJsonTested = true; } diff --git a/Scripts/UnitTests/TestRetrieveAndRank.cs b/Scripts/UnitTests/TestRetrieveAndRank.cs index 4fd445114..8b819c781 100644 --- a/Scripts/UnitTests/TestRetrieveAndRank.cs +++ b/Scripts/UnitTests/TestRetrieveAndRank.cs @@ -119,7 +119,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestRetrieveAndRank", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestRetrieveAndRank.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -134,17 +134,17 @@ public override IEnumerator RunTest() _retrieveAndRank = new RetrieveAndRank(credentials); // Get clusters - Log.Debug("ExampleRetrieveAndRank", "Attempting to get clusters."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get clusters."); if (!_retrieveAndRank.GetClusters(OnGetClusters)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get clusters!"); + Log.Debug("TestRetrieveAndRank.GetClusters()", "Failed to get clusters!"); while (!_getClustersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to create cluster."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to create cluster."); if (!_retrieveAndRank.CreateCluster(OnCreateCluster, "unity-test-cluster", "1")) - Log.Debug("ExampleRetrieveAndRank", "Failed to create cluster!"); + Log.Debug("TestRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); while (!_createClusterTested || !_readyToContinue) yield return null; @@ -155,78 +155,78 @@ public override IEnumerator RunTest() _readyToContinue = false; // List cluster configs - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster configs."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get cluster configs."); if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster configs!"); + Log.Debug("TestRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); while (!_getClusterConfigsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Upload cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to upload cluster config."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to upload cluster config."); if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, _clusterToDelete, _testClusterConfigName, _testClusterConfigPath)) - Log.Debug("ExampleRetrieveAndRank", "Failed to upload cluster config {0}!", _testClusterConfigPath); + Log.Debug("TestRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", _testClusterConfigPath); while (!_uploadClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get cluster."); if (!_retrieveAndRank.GetCluster(OnGetCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster!"); + Log.Debug("TestRetrieveAndRank.GetCluster()", "Failed to get cluster!"); while (!_getClusterTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster config."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get cluster config."); if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, _clusterToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster config {0}!", _testClusterConfigName); + Log.Debug("TestRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", _testClusterConfigName); while (!_getClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // List Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to get collections."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get collections."); if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, _clusterToDelete, CollectionsAction.List)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get collections!"); + Log.Debug("TestRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); while (!_getCollectionsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to create collection."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to create collection."); if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, _clusterToDelete, CollectionsAction.Create, _collectionNameToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create collections!"); + Log.Debug("TestRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); while (!_createCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Index documents - Log.Debug("ExampleRetrieveAndRank", "Attempting to index documents."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to index documents."); if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, _indexDataPath, _clusterToDelete, _collectionNameToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to index documents!"); + Log.Debug("TestRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); while (!_indexDocumentsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRankers(OnGetRankers)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get rankers!"); + Log.Debug("TestRetrieveAndRank.GetRankers()", "Failed to get rankers!"); while (!_getRankersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create ranker - Log.Debug("ExampleRetrieveAndRank", "Attempting to create ranker."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to create ranker."); if (!_retrieveAndRank.CreateRanker(OnCreateRanker, _testRankerTrainingPath, _createdRankerName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create ranker!"); + Log.Debug("TestRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); while (!_createRankerTested || !_readyToContinue) yield return null; // Wait for ranker status to be `Available`. - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("TestRetrieveAndRank.RunTest()", "Checking ranker status in 10 seconds"); Runnable.Run(CheckRankerStatus(10f)); while (!_isRankerReady || !_readyToContinue) yield return null; @@ -234,68 +234,68 @@ public override IEnumerator RunTest() _readyToContinue = false; // Standard Search string[] fl = { "title", "id", "body", "author", "bibliography" }; - Log.Debug("ExampleRetrieveAndRank", "Attempting to search standard."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to search standard."); if (!_retrieveAndRank.Search(OnSearchStandard, _clusterToDelete, _collectionNameToDelete, _testQuery, fl)) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("TestRetrieveAndRank.Search()", "Failed to search!"); while (!_searchStandardTested || !_readyToContinue) yield return null; _readyToContinue = false; // Rank - Log.Debug("ExampleRetrieveAndRank", "Attempting to rank."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to rank."); if (!_retrieveAndRank.Rank(OnRank, _rankerIdToDelete, _testAnswerDataPath)) - Log.Debug("ExampleRetriveAndRank", "Failed to rank!"); + Log.Debug("TestRetrieveAndRank.Rank()", "Failed to rank!"); while (!_rankTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get ranker info - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRanker(OnGetRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get ranker!"); + Log.Debug("TestRetrieveAndRank.GetRanker()", "Failed to get ranker!"); while (!_getRankerTested) yield return null; _readyToContinue = false; // Delete rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete ranker {0}.", _rankerIdToDelete); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to delete ranker {0}.", _rankerIdToDelete); if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete ranker {0}!", _rankerIdToDelete); + Log.Debug("TestRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", _rankerIdToDelete); while (!_deleteRankerTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete collection {0}.", "TestCollectionToDelete"); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to delete collection {0}.", "TestCollectionToDelete"); if (!_retrieveAndRank.ForwardCollectionRequest(OnDeleteCollection, _clusterToDelete, CollectionsAction.Delete, "TestCollectionToDelete")) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete collections!"); + Log.Debug("TestRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); while (!_deleteCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster config string clusterConfigToDelete = "test-config"; - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster config."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to delete cluster config."); if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, _clusterToDelete, clusterConfigToDelete)) - Log.Debug("ExampleRetriveAndRank", "Failed to delete cluster config {0}", clusterConfigToDelete); + Log.Debug("TestRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", clusterConfigToDelete); while (!_deleteClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster {0}.", _clusterToDelete); + Log.Debug("TestRetrieveAndRank.RunTest()", "Attempting to delete cluster {0}.", _clusterToDelete); if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete cluster!"); + Log.Debug("TestRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); while (!_deleteClusterTested || !_readyToContinue) yield return null; - Log.Debug("ExampleRetrieveAndRank", "Retrieve and rank examples complete!"); + Log.Debug("TestRetrieveAndRank.RunTest()", "Retrieve and rank examples complete!"); yield break; } private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get clusters response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetClusters()", "Retrieve and rank - Get clusters response: {0}", data); Test(resp != null); _getClustersTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -303,7 +303,7 @@ private void OnGetClusters(SolrClusterListResponse resp, string data) private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create cluster response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnCreateCluster()", "Retrieve and rank - Create cluster response: {0}", data); _clusterToDelete = resp.solr_cluster_id; Test(resp != null); _createClusterTested = true; @@ -312,7 +312,7 @@ private void OnCreateCluster(SolrClusterResponse resp, string data) private void OnDeleteCluster(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete cluster response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnDeleteCluster()", "Retrieve and rank - Delete cluster response: {0}", data); Test(success); _deleteClusterTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -320,7 +320,7 @@ private void OnDeleteCluster(bool success, string data) private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetCluster()", "Retrieve and rank - Get cluster response: {0}", data); Test(resp != null); _getClusterTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -328,7 +328,7 @@ private void OnGetCluster(SolrClusterResponse resp, string data) private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetClusterConfigs()", "Retrieve and rank - Get cluster config response: {0}", data); Test(resp != null); _getClusterConfigsTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -336,7 +336,7 @@ private void OnGetClusterConfigs(SolrConfigList resp, string data) private void OnDeleteClusterConfig(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Deletecluster config response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnDeleteClusterConfig()", "Retrieve and rank - Deletecluster config response: {0}", data); Test(success); _deleteClusterConfigTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -345,9 +345,9 @@ private void OnDeleteClusterConfig(bool success, string data) private void OnGetClusterConfig(byte[] respData, string data) { #if UNITY_EDITOR - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetClusterConfig()", "Retrieve and rank - Get cluster config response: {0}", data); #else - Log.Debug("ExampleRetrieveAndRank", "Not in editor - skipping download."); + Log.Debug("TestRetrieveAndRank.RunTest()", "Not in editor - skipping download."); #endif Test(respData != null); _getClusterConfigTested = true; @@ -356,15 +356,15 @@ private void OnGetClusterConfig(byte[] respData, string data) //private void OnSaveConfig(bool success, string data) //{ - // Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Save config response: {0}", data); - //Test(success); + // Log.Debug("TestRetrieveAndRank.OnSaveConfig()", "Retrieve and rank - Save config response: {0}", data); + //Test(success); // _saveConfigTested = true; // Runnable.Run(ReadyToContinue(_waitTime)); //} private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Upload cluster config response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnUploadClusterConfig()", "Retrieve and rank - Upload cluster config response: {0}", data); Test(resp != null); _uploadClusterConfigTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -372,7 +372,7 @@ private void OnUploadClusterConfig(UploadResponse resp, string data) private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetCollections()", "Retrieve and rank - Get collections response: {0}", data); Test(resp != null); _getCollectionsTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -380,7 +380,7 @@ private void OnGetCollections(CollectionsResponse resp, string data) private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnCreateCollection()", "Retrieve and rank - Get collections response: {0}", data); Test(resp != null); _createCollectionTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -388,7 +388,7 @@ private void OnCreateCollection(CollectionsResponse resp, string data) private void OnDeleteCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnDeleteCollection()", "Retrieve and rank - Get collections response: {0}", data); Test(resp != null); _deleteCollectionTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -396,7 +396,7 @@ private void OnDeleteCollection(CollectionsResponse resp, string data) private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Index documents response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnIndexDocuments()", "Retrieve and rank - Index documents response: {0}", data); Test(resp != null); _indexDocumentsTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -404,7 +404,7 @@ private void OnIndexDocuments(IndexResponse resp, string data) private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get rankers response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetRankers()", "Retrieve and rank - Get rankers response: {0}", data); Test(resp != null); _getRankersTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -412,7 +412,7 @@ private void OnGetRankers(ListRankersPayload resp, string data) private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create ranker response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnCreateRanker()", "Retrieve and rank - Create ranker response: {0}", data); _rankerIdToDelete = resp.ranker_id; Test(resp != null); _createRankerTested = true; @@ -421,7 +421,7 @@ private void OnCreateRanker(RankerStatusPayload resp, string data) private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Rank response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnRank()", "Retrieve and rank - Rank response: {0}", data); Test(resp != null); _rankTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -429,7 +429,7 @@ private void OnRank(RankerOutputPayload resp, string data) private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get ranker response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnGetRanker()", "Retrieve and rank - Get ranker response: {0}", data); Test(resp != null); _getRankerTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -437,7 +437,7 @@ private void OnGetRanker(RankerStatusPayload resp, string data) private void OnDeleteRanker(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete ranker response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnDeleteRanker()", "Retrieve and rank - Delete ranker response: {0}", data); Test(success); _deleteRankerTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -445,7 +445,7 @@ private void OnDeleteRanker(bool success, string data) private void OnSearchStandard(SearchResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Search standard response: {0}", data); + Log.Debug("TestRetrieveAndRank.OnSearchStandard()", "Retrieve and rank - Search standard response: {0}", data); Test(resp != null); _searchStandardTested = true; Runnable.Run(ReadyToContinue(_waitTime)); @@ -457,10 +457,10 @@ private IEnumerator CheckClusterStatus(float waitTime) if (!_retrieveAndRank.GetCluster((SolrClusterResponse resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr cluster status is '{0}'", resp.solr_cluster_status); + Log.Debug("TestRetrieveAndRank.CheckClusterStatus()", "Solr cluster status is '{0}'", resp.solr_cluster_status); if (resp.solr_cluster_status.ToLower() != "ready") { - Log.Debug("ExampleRetrieveAndRank", "Checking cluster status in 10 seconds"); + Log.Debug("TestRetrieveAndRank.CheckClusterStatus()", "Checking cluster status in 10 seconds"); Runnable.Run(CheckClusterStatus(waitTime)); } else @@ -468,7 +468,7 @@ private IEnumerator CheckClusterStatus(float waitTime) _isClusterReady = true; } }, _clusterToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get cluster"); + Log.Debug("TestRetrieveAndRank.CheckClusterStatus()", "Failed to get cluster"); } private IEnumerator CheckRankerStatus(float waitTime) @@ -477,10 +477,10 @@ private IEnumerator CheckRankerStatus(float waitTime) if (!_retrieveAndRank.GetRanker((RankerStatusPayload resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr ranker status is '{0}'", resp.status); + Log.Debug("TestRetrieveAndRank.CheckRankerStatus()", "Solr ranker status is '{0}'", resp.status); if (resp.status.ToLower() != "available") { - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("TestRetrieveAndRank.CheckRankerStatus()", "Checking ranker status in 10 seconds"); Runnable.Run(CheckRankerStatus(10f)); } else @@ -488,7 +488,7 @@ private IEnumerator CheckRankerStatus(float waitTime) _isRankerReady = true; } }, _rankerIdToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get ranker"); + Log.Debug("TestRetrieveAndRank.CheckRankerStatus()", "Failed to get ranker"); } private IEnumerator ReadyToContinue(float waitTime) diff --git a/Scripts/UnitTests/TestSpeechToText.cs b/Scripts/UnitTests/TestSpeechToText.cs index 150801d8c..871dc97e0 100644 --- a/Scripts/UnitTests/TestSpeechToText.cs +++ b/Scripts/UnitTests/TestSpeechToText.cs @@ -118,7 +118,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestSpeechToText", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestSpeechToText.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -138,56 +138,56 @@ public override IEnumerator RunTest() Runnable.Run(DownloadAcousticResource()); - Log.Debug("TestSpeechToText", "Attempting to recognize"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to recognize"); _speechToText.Recognize(_audioClip, HandleOnRecognize); while (!_recognizeTested) yield return null; // Get models - Log.Debug("TestSpeechToText", "Attempting to get models"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get models"); _speechToText.GetModels(HandleGetModels); while (!_getModelsTested) yield return null; // Get model - Log.Debug("TestSpeechToText", "Attempting to get model {0}", _modelNameToGet); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get model {0}", _modelNameToGet); _speechToText.GetModel(HandleGetModel, _modelNameToGet); while (!_getModelTested) yield return null; // Get customizations - Log.Debug("TestSpeechToText", "Attempting to get customizations"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get customizations"); _speechToText.GetCustomizations(HandleGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create customization - Log.Debug("TestSpeechToText", "Attempting create customization"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting create customization"); _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); while (!_createCustomizationsTested) yield return null; // Get customization - Log.Debug("TestSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get customization {0}", _createdCustomizationID); _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); while (!_getCustomizationTested) yield return null; // Get custom corpora - Log.Debug("TestSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get custom corpora for {0}", _createdCustomizationID); _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); while (!_getCustomCorporaTested) yield return null; // Add custom corpus - Log.Debug("TestSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); string corpusData = File.ReadAllText(_customCorpusFilePath); _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; // Get custom corpus - Log.Debug("TestSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_getCustomCorpusTested) yield return null; @@ -198,13 +198,13 @@ public override IEnumerator RunTest() yield return null; // Get custom words - Log.Debug("TestSpeechToText", "Attempting to get custom words."); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get custom words."); _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); while (!_getCustomWordsTested) yield return null; // Add custom words from path - Log.Debug("TestSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); string customWords = File.ReadAllText(_customWordsFilePath); _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); while (!_addCustomWordsFromPathTested) @@ -239,7 +239,7 @@ public override IEnumerator RunTest() wordList.Add(w2); words.words = wordList.ToArray(); - Log.Debug("TestSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); while (!_addCustomWordsFromObjectTested) yield return null; @@ -251,13 +251,13 @@ public override IEnumerator RunTest() yield return null; // Get custom word - Log.Debug("TestSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); while (!_getCustomWordTested) yield return null; // Train customization - Log.Debug("TestSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to train customization {0}", _createdCustomizationID); _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); while (!_trainCustomizationTested) yield return null; @@ -269,45 +269,45 @@ public override IEnumerator RunTest() yield return null; // Upgrade customization - not currently implemented in service - //Log.Debug("TestSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + //Log.Debug("TestSpeechToText.RunTest()", "Attempting to upgrade customization {0}", _createdCustomizationID); //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); //while (!_upgradeCustomizationTested) // yield return null; // Delete custom word - Log.Debug("TestSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); while (!_deleteCustomWordTested) yield return null; // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete custom corpus - Log.Debug("TestSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_deleteCustomCorpusTested) yield return null; // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Reset customization - Log.Debug("TestSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to reset customization {0}", _createdCustomizationID); _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); while (!_resetCustomizationTested) yield return null; // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying continue for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying continue for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -315,19 +315,19 @@ public override IEnumerator RunTest() _readyToContinue = false; // List acoustic customizations - Log.Debug("TestSpeechToText", "Attempting to get acoustic customizations"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get acoustic customizations"); _speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels); while (!_getAcousticCustomizationsTested) yield return null; // Create acoustic customization - Log.Debug("TestSpeechToText", "Attempting to create acoustic customization"); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to create acoustic customization"); _speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, _createdAcousticModelName); while (!_createAcousticCustomizationsTested) yield return null; // Get acoustic customization - Log.Debug("TestSpeechToText", "Attempting to get acoustic customization {0}", _createdAcousticModelId); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get acoustic customization {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, _createdAcousticModelId); while (!_getAcousticCustomizationTested) yield return null; @@ -336,7 +336,7 @@ public override IEnumerator RunTest() yield return null; // Create acoustic resource - Log.Debug("TestSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); while (!_addAcousticResourcesTested) @@ -349,19 +349,19 @@ public override IEnumerator RunTest() yield return null; // List acoustic resources - Log.Debug("TestSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get audio resources {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); while (!_getAcousticResourcesTested) yield return null; // Train acoustic customization - Log.Debug("TestSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to train acoustic customization {0}", _createdAcousticModelId); _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId, null, true); while (!_trainAcousticCustomizationsTested) yield return null; // Get acoustic resource - Log.Debug("TestSpeechToText", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); while (!_getAcousticResourceTested) yield return null; @@ -373,13 +373,13 @@ public override IEnumerator RunTest() yield return null; // Reset acoustic customization - Log.Debug("TestSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); while (!_resetAcousticCustomizationsTested) yield return null; // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -388,18 +388,18 @@ public override IEnumerator RunTest() DeleteAcousticResource(); // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying delete customization for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying delete customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete customization - Log.Debug("TestSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + Log.Debug("TestSpeechToText.RunTest()", "Attempting to delete customization {0}", _createdCustomizationID); _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -408,12 +408,12 @@ public override IEnumerator RunTest() DeleteAcousticCustomization(); // Delay - Log.Debug("TestSpeechToText", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); + Log.Debug("TestSpeechToText.RunTest()", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; - Log.Debug("TestSpeechToText", "Speech to Text examples complete."); + Log.Debug("TestSpeechToText.RunTest()", "Speech to Text examples complete."); yield break; } @@ -421,7 +421,7 @@ public override IEnumerator RunTest() private void HandleGetModels(ModelSet result, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetModels()", "Speech to Text - Get models response: {0}", customData); _modelNameToGet = (result.models[UnityEngine.Random.Range(0, result.models.Length - 1)] as Model).name; Test(result != null); _getModelsTested = true; @@ -429,7 +429,7 @@ private void HandleGetModels(ModelSet result, string customData) private void HandleGetModel(Model model, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetModel()", "Speech to Text - Get model response: {0}", customData); Test(model != null); _getModelTested = true; } @@ -443,7 +443,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("TestSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("TestSpeechToText.HandleOnRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -456,14 +456,14 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) private void HandleGetCustomizations(Customizations customizations, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", customData); Test(customizations != null); _getCustomizationsTested = true; } private void HandleCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Create customization response: {0}", customData); + Log.Debug("TestSpeechToText.HandleCreateCustomization()", "Speech to Text - Create customization response: {0}", customData); _createdCustomizationID = customizationID.customization_id; Test(customizationID != null); _createCustomizationsTested = true; @@ -471,7 +471,7 @@ private void HandleCreateCustomization(CustomizationID customizationID, string c private void HandleGetCustomization(Customization customization, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", customData); Test(customization != null); _getCustomizationTested = true; } @@ -480,12 +480,12 @@ private void HandleDeleteCustomization(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText.HandleDeleteCustomization()", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); _createdCustomizationID = default(string); } else { - Log.Debug("TestSpeechToText", "Failed to delete customization!"); + Log.Debug("TestSpeechToText.HandleDeleteCustomization()", "Failed to delete customization!"); } } @@ -494,11 +494,11 @@ private void HandleTrainCustomization(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Trained customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText.HandleTrainCustomization()", "Trained customization {0}!", _createdCustomizationID); } else { - Log.Debug("TestSpeechToText", "Failed to train customization!"); + Log.Debug("TestSpeechToText.HandleTrainCustomization()", "Failed to train customization!"); } Test(success); @@ -509,13 +509,13 @@ private void HandleTrainCustomization(bool success, string customData) //{ // if (success) // { - // Log.Debug("TestSpeechToText", "Upgrade customization {0}!", _createdCustomizationID); + // Log.Debug("TestSpeechToText.HandleUpgradeCustomization()", "Upgrade customization {0}!", _createdCustomizationID); // } // else // { - // Log.Debug("TestSpeechToText", "Failed to upgrade customization!"); + // Log.Debug("TestSpeechToText.HandleUpgradeCustomization()", "Failed to upgrade customization!"); // } - //Test(success); + //Test(success); // _upgradeCustomizationTested = true; //} @@ -524,11 +524,11 @@ private void HandleResetCustomization(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Reset customization {0}!", _createdCustomizationID); + Log.Debug("TestSpeechToText.HandleResetCustomization()", "Reset customization {0}!", _createdCustomizationID); } else { - Log.Debug("TestSpeechToText", "Failed to reset customization!"); + Log.Debug("TestSpeechToText.HandleResetCustomization()", "Failed to reset customization!"); } Test(success); @@ -537,7 +537,7 @@ private void HandleResetCustomization(bool success, string customData) private void HandleGetCustomCorpora(Corpora corpora, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get custom corpora response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customData); Test(corpora != null); _getCustomCorporaTested = true; } @@ -546,11 +546,11 @@ private void HandleDeleteCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - delete custom coprus response: succeeded!"); + Log.Debug("TestSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - delete custom coprus response: succeeded!"); } else { - Log.Debug("TestSpeechToText", "Failed to delete custom corpus!"); + Log.Debug("TestSpeechToText.HandleDeleteCustomCorpus()", "Failed to delete custom corpus!"); } Test(success); @@ -561,11 +561,11 @@ private void HandleAddCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - Add custom corpus response: succeeded!"); + Log.Debug("TestSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: succeeded!"); } else { - Log.Debug("TestSpeechToText", "Failed to add custom corpus!"); + Log.Debug("TestSpeechToText.HandleAddCustomCorpus()", "Failed to add custom corpus!"); } Test(success); @@ -574,14 +574,14 @@ private void HandleAddCustomCorpus(bool success, string customData) private void HandleGetCustomCorpus(Corpus corpus, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get custom corpus response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customData); Test(corpus != null); _getCustomCorpusTested = true; } private void HandleGetCustomWords(WordsList wordList, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", customData); Test(wordList != null); _getCustomWordsTested = true; } @@ -590,11 +590,11 @@ private void HandleAddCustomWordsFromPath(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - Add custom words from path response: succeeded!"); + Log.Debug("TestSpeechToText.HandleAddCustomWordsFromPath()", "Speech to Text - Add custom words from path response: succeeded!"); } else { - Log.Debug("TestSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText.HandleAddCustomWordsFromPath()", "Failed to delete custom word!"); } Test(success); @@ -605,11 +605,11 @@ private void HandleAddCustomWordsFromObject(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - Add custom words from object response: succeeded!"); + Log.Debug("TestSpeechToText.HandleAddCustomWordsFromObject()", "Speech to Text - Add custom words from object response: succeeded!"); } else { - Log.Debug("TestSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText.HandleAddCustomWordsFromObject()", "Failed to delete custom word!"); } Test(success); @@ -620,11 +620,11 @@ private void HandleDeleteCustomWord(bool success, string customData) { if (success) { - Log.Debug("TestSpeechToText", "Speech to Text - Delete custom word response: succeeded!"); + Log.Debug("TestSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: succeeded!"); } else { - Log.Debug("TestSpeechToText", "Failed to delete custom word!"); + Log.Debug("TestSpeechToText.HandleDeleteCustomWord()", "Failed to delete custom word!"); } Test(success); @@ -633,21 +633,21 @@ private void HandleDeleteCustomWord(bool success, string customData) private void HandleGetCustomWord(WordData word, string customData) { - Log.Debug("TestSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", customData); Test(word != null); _getCustomWordTested = true; } private void HandleGetCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) { - Log.Debug("TestSpeechToText", "acousticCustomizations: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomAcousticModels()", "acousticCustomizations: {0}", customData); Test(acousticCustomizations != null); _getAcousticCustomizationsTested = true; } private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) { - Log.Debug("TestSpeechToText", "customizationId: {0}", customData); + Log.Debug("TestSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", customData); _createdAcousticModelId = customizationID.customization_id; Test(!string.IsNullOrEmpty(_createdAcousticModelId)); _createAcousticCustomizationsTested = true; @@ -655,59 +655,59 @@ private void HandleCreateAcousticCustomization(CustomizationID customizationID, private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) { - Log.Debug("TestSpeechToText", "acousticCustomization: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", customData); Test(acousticCustomization != null); _getAcousticCustomizationTested = true; } private void HandleTrainAcousticCustomization(bool success, string customData) { - Log.Debug("TestSpeechToText", "train customization success: {0}", success); + Log.Debug("TestSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); Test(success); _trainAcousticCustomizationsTested = true; } private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) { - Log.Debug("TestSpeechToText", "audioResources: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", customData); Test(audioResources != null); _getAcousticResourcesTested = true; } private void HandleAddAcousticResource(string customData) { - Log.Debug("TestSpeechToText", "added acoustic resource: {0}", customData); + Log.Debug("TestSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", customData); Test(!string.IsNullOrEmpty(customData)); _addAcousticResourcesTested = true; } private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) { - Log.Debug("TestSpeechToText", "audioListing: {0}", customData); + Log.Debug("TestSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", customData); Test(audioListing != null); _getAcousticResourceTested = true; } private void HandleResetAcousticCustomization(bool success, string customData) { - Log.Debug("TestSpeechToText", "reset customization success: {0}", success); + Log.Debug("TestSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); Test(success); _resetAcousticCustomizationsTested = true; } private void HandleDeleteAcousticResource(bool success, string customData) { - Log.Debug("TestSpeechToText", "deleted acoustic resource: {0}", success); + Log.Debug("TestSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } private void HandleDeleteAcousticCustomization(bool success, string customData) { - Log.Debug("TestSpeechToText", "deleted acoustic customization: {0}", success); + Log.Debug("TestSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); } private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking customization status in {0} seconds...", delay.ToString()); + Log.Debug("TestSpeechToText.CheckCustomizationStatus()", "Checking customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -718,7 +718,7 @@ private void OnCheckCustomizationStatus(Customization customization, string cust { if (customization != null) { - Log.Debug("TestSpeechToText", "Customization status: {0}", customization.status); + Log.Debug("TestSpeechToText.OnCheckCustomizationStatus()", "Customization status: {0}", customization.status); if (customization.status != "ready" && customization.status != "available") Runnable.Run(CheckCustomizationStatus(customData, 5f)); else @@ -726,13 +726,13 @@ private void OnCheckCustomizationStatus(Customization customization, string cust } else { - Log.Debug("TestSpeechToText", "Check customization status failed!"); + Log.Debug("TestSpeechToText.OnCheckCustomizationStatus()", "Check customization status failed!"); } } private IEnumerator CheckAcousticCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking acoustic customization status in {0} seconds...", delay.ToString()); + Log.Debug("TestSpeechToText.CheckAcousticCustomizationStatus()", "Checking acoustic customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -743,7 +743,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu { if (acousticCustomization != null) { - Log.Debug("TestSpeechToText", "Acoustic customization status: {0}", acousticCustomization.status); + Log.Debug("TestSpeechToText.OnCheckAcousticCustomizationStatus()", "Acoustic customization status: {0}", acousticCustomization.status); if (acousticCustomization.status != "ready" && acousticCustomization.status != "available") Runnable.Run(CheckAcousticCustomizationStatus(customData, 5f)); else @@ -751,7 +751,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu } else { - Log.Debug("TestSpeechToText", "Check acoustic customization status failed!"); + Log.Debug("TestSpeechToText.OnCheckAcousticCustomizationStatus()", "Check acoustic customization status failed!"); } } @@ -763,24 +763,24 @@ private IEnumerator Delay(float delayTime) private IEnumerator DownloadAcousticResource() { - Log.Debug("TestSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); + Log.Debug("TestSpeechToText.DownloadAcousticResource()", "downloading acoustic resource from {0}", _acousticResourceUrl); WWW www = new WWW(_acousticResourceUrl); yield return www; - Log.Debug("TestSpeechToText", "acoustic resource downloaded"); + Log.Debug("TestSpeechToText.DownloadAcousticResource()", "acoustic resource downloaded"); _acousticResourceData = www.bytes; _isAudioLoaded = true; } private void DeleteAcousticResource() { - Log.Debug("TestSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("TestSpeechToText.DeleteAcousticResource()", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); } private void DeleteAcousticCustomization() { - Log.Debug("TestSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + Log.Debug("TestSpeechToText.DeleteAcousticCustomization()", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); } } diff --git a/Scripts/UnitTests/TestTextToSpeech.cs b/Scripts/UnitTests/TestTextToSpeech.cs index fbf5ea30e..227b575b1 100644 --- a/Scripts/UnitTests/TestTextToSpeech.cs +++ b/Scripts/UnitTests/TestTextToSpeech.cs @@ -93,7 +93,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestTextToSpeech", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestTextToSpeech.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -108,51 +108,51 @@ public override IEnumerator RunTest() _textToSpeech = new TextToSpeech(credentials); // Synthesize - Log.Debug("ExampleTextToSpeech", "Attempting synthesize."); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting synthesize."); _textToSpeech.Voice = VoiceType.en_US_Allison; _textToSpeech.ToSpeech(_testString, HandleToSpeechCallback, true); while (!_synthesizeTested) yield return null; // Get Voices - Log.Debug("ExampleTextToSpeech", "Attempting to get voices."); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get voices."); _textToSpeech.GetVoices(OnGetVoices); while (!_getVoicesTested) yield return null; // Get Voice - Log.Debug("ExampleTextToSpeech", "Attempting to get voice {0}.", VoiceType.en_US_Allison); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get voice {0}.", VoiceType.en_US_Allison); _textToSpeech.GetVoice(OnGetVoice, VoiceType.en_US_Allison); while (!_getVoiceTested) yield return null; // Get Pronunciation - Log.Debug("ExampleTextToSpeech", "Attempting to get pronunciation of {0}", _testWord); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get pronunciation of {0}", _testWord); _textToSpeech.GetPronunciation(OnGetPronunciation, _testWord, VoiceType.en_US_Allison); while (!_getPronuciationTested) yield return null; // Get Customizations - Log.Debug("ExampleTextToSpeech", "Attempting to get a list of customizations"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get a list of customizations"); _textToSpeech.GetCustomizations(OnGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create Customization - Log.Debug("ExampleTextToSpeech", "Attempting to create a customization"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to create a customization"); _textToSpeech.CreateCustomization(OnCreateCustomization, _customizationName, _customizationLanguage, _customizationDescription); while (!_createCustomizationTested) yield return null; // Get Customization - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get a customization"); if (!_textToSpeech.GetCustomization(OnGetCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to get custom voice model!"); + Log.Debug("TestTextToSpeech.RunTest()", "Failed to get custom voice model!"); while (!_getCustomizationTested) yield return null; // Update Customization - Log.Debug("ExampleTextToSpeech", "Attempting to update a customization"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to update a customization"); Word[] wordsToUpdateCustomization = { new Word() @@ -180,20 +180,20 @@ public override IEnumerator RunTest() }; if (!_textToSpeech.UpdateCustomization(OnUpdateCustomization, _createdCustomizationId, _customVoiceUpdate)) - Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); + Log.Debug("TestTextToSpeech.UpdateCustomization()", "Failed to update customization!"); while (!_updateCustomizationTested) yield return null; // Get Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization's words"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get a customization's words"); string customIdentifierToGetWords = "1476ea80-5355-4911-ac99-ba39162a2d34"; if (!_textToSpeech.GetCustomizationWords(OnGetCustomizationWords, customIdentifierToGetWords)) - Log.Debug("ExampleTextToSpeech", "Failed to get {0} words!", customIdentifierToGetWords); + Log.Debug("TestTextToSpeech.GetCustomizationWords()", "Failed to get {0} words!", customIdentifierToGetWords); while (!_getCustomizationWordsTested) yield return null; // Add Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to add words to a customization"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to add words to a customization"); Word[] wordArrayToAddToCustomization = { new Word() @@ -219,34 +219,34 @@ public override IEnumerator RunTest() }; if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, _createdCustomizationId, wordsToAddToCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to add words to {0}!", _createdCustomizationId); + Log.Debug("TestTextToSpeech.AddCustomizationWords()", "Failed to add words to {0}!", _createdCustomizationId); while (!_addCustomizationWordsTested) yield return null; // Get Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to get the translation of a custom voice model's word."); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get the translation of a custom voice model's word."); string customIdentifierWord = wordsToUpdateCustomization[0].word; if (!_textToSpeech.GetCustomizationWord(OnGetCustomizationWord, _createdCustomizationId, customIdentifierWord)) - Log.Debug("ExampleTextToSpeech", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); + Log.Debug("TestTextToSpeech.GetCustomizationWord()", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); while (!_getCustomizationWordTested) yield return null; // Delete Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to delete customization word from custom voice model."); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to delete customization word from custom voice model."); string wordToDelete = "goodbye"; if (!_textToSpeech.DeleteCustomizationWord(OnDeleteCustomizationWord, _createdCustomizationId, wordToDelete)) - Log.Debug("ExampleTextToSpeech", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); + Log.Debug("TestTextToSpeech.DeleteCustomizationWord()", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); while (!_deleteCustomizationWordTested) yield return null; // Delete Customization - Log.Debug("ExampleTextToSpeech", "Attempting to delete a customization"); + Log.Debug("TestTextToSpeech.RunTest()", "Attempting to delete a customization"); if (!_textToSpeech.DeleteCustomization(OnDeleteCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to delete custom voice model!"); + Log.Debug("TestTextToSpeech.DeleteCustomization()", "Failed to delete custom voice model!"); while (!_deleteCustomizationTested) yield return null; - Log.Debug("ExampleTextToSpeech", "Text to Speech examples complete."); + Log.Debug("TestTextToSpeech.RunTest()", "Text to Speech examples complete."); yield break; } @@ -275,35 +275,35 @@ private void PlayClip(AudioClip clip) private void OnGetVoices(Voices voices, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", customData); Test(voices != null); _getVoicesTested = true; } private void OnGetVoice(Voice voice, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", customData); Test(voice != null); _getVoiceTested = true; } private void OnGetPronunciation(Pronunciation pronunciation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", customData); Test(pronunciation != null); _getPronuciationTested = true; } private void OnGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", customData); Test(customizations != null); _getCustomizationsTested = true; } private void OnCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", customData); + Log.Debug("TestTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", customData); _createdCustomizationId = customizationID.customization_id; Test(customizationID != null); _createCustomizationTested = true; @@ -311,7 +311,7 @@ private void OnCreateCustomization(CustomizationID customizationID, string custo private void OnDeleteCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization response: {0}", customData); + Log.Debug("TestTextToSpeech.OnDeleteCustomization()", "Text to Speech - Delete customization response: {0}", customData); _createdCustomizationId = null; Test(success); _deleteCustomizationTested = true; @@ -319,42 +319,42 @@ private void OnDeleteCustomization(bool success, string customData) private void OnGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", customData); Test(customization != null); _getCustomizationTested = true; } private void OnUpdateCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", customData); + Log.Debug("TestTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", customData); Test(success); _updateCustomizationTested = true; } private void OnGetCustomizationWords(Words words, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization words response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetCustomizationWords()", "Text to Speech - Get customization words response: {0}", customData); Test(words != null); _getCustomizationWordsTested = true; } private void OnAddCustomizationWords(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Add customization words response: {0}", customData); + Log.Debug("TestTextToSpeech.OnAddCustomizationWords()", "Text to Speech - Add customization words response: {0}", customData); Test(success); _addCustomizationWordsTested = true; } private void OnDeleteCustomizationWord(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization word response: {0}", customData); + Log.Debug("TestTextToSpeech.OnDeleteCustomizationWord()", "Text to Speech - Delete customization word response: {0}", customData); Test(success); _deleteCustomizationWordTested = true; } private void OnGetCustomizationWord(Translation translation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization word response: {0}", customData); + Log.Debug("TestTextToSpeech.OnGetCustomizationWord()", "Text to Speech - Get customization word response: {0}", customData); Test(translation != null); _getCustomizationWordTested = true; } diff --git a/Scripts/UnitTests/TestToneAnalyzer.cs b/Scripts/UnitTests/TestToneAnalyzer.cs index 8e3d2b960..1781c0453 100644 --- a/Scripts/UnitTests/TestToneAnalyzer.cs +++ b/Scripts/UnitTests/TestToneAnalyzer.cs @@ -74,7 +74,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestToneAnalyzer", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestToneAnalyzer.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service Credentials credentials = new Credentials(_username, _password, _url); @@ -90,19 +90,19 @@ public override IEnumerator RunTest() // Analyze tone if (!_toneAnalyzer.GetToneAnalyze(OnGetToneAnalyze, _stringToTestTone)) - Log.Debug("ExampleToneAnalyzer", "Failed to analyze!"); + Log.Debug("ExampleToneAnalyzer.GetToneAnalyze()", "Failed to analyze!"); while (!_analyzeToneTested) yield return null; - Log.Debug("ExampleToneAnalyzer", "Tone analyzer examples complete."); + Log.Debug("ExampleToneAnalyzer.RunTest()", "Tone analyzer examples complete."); yield break; } private void OnGetToneAnalyze(ToneAnalyzerResponse resp, string data) { - Log.Debug("ExampleToneAnalyzer", "Tone Analyzer - Analyze Response: {0}", data); + Log.Debug("ExampleToneAnalyzer.OnGetToneAnalyze()", "Tone Analyzer - Analyze Response: {0}", data); Test(resp != null); _analyzeToneTested = true; } diff --git a/Scripts/UnitTests/TestTradeoffAnalytics.cs b/Scripts/UnitTests/TestTradeoffAnalytics.cs index a8f4d062d..b133082bd 100644 --- a/Scripts/UnitTests/TestTradeoffAnalytics.cs +++ b/Scripts/UnitTests/TestTradeoffAnalytics.cs @@ -74,7 +74,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestTradeoffAnalytics", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestTradeoffAnalytics.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -166,14 +166,14 @@ public override IEnumerator RunTest() while (!_GetDillemaTested) yield return null; - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff analytics examples complete."); + Log.Debug("ExampleTradeoffAnalyitics.RunTest()", "Tradeoff analytics examples complete."); yield break; } private void OnGetDilemma(DilemmasResponse resp, string data) { - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff Analytics - Get Dillema: {0}", data); + Log.Debug("ExampleTradeoffAnalyitics.OnGetDilemma()", "Tradeoff Analytics - Get Dillema: {0}", data); Test(resp != null); _GetDillemaTested = true; } diff --git a/Scripts/UnitTests/TestVisualRecognition.cs b/Scripts/UnitTests/TestVisualRecognition.cs index 4160156c6..b0d2f425e 100644 --- a/Scripts/UnitTests/TestVisualRecognition.cs +++ b/Scripts/UnitTests/TestVisualRecognition.cs @@ -98,7 +98,7 @@ public override IEnumerator RunTest() } catch { - Log.Debug("TestVisualRecognition", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); + Log.Debug("TestVisualRecognition.RunTest()", "Failed to get credentials from VCAP_SERVICES file. Please configure credentials to run this test. For more information, see: https://github.com/watson-developer-cloud/unity-sdk/#authentication"); } // Create credential and instantiate service @@ -108,84 +108,84 @@ public override IEnumerator RunTest() _visualRecognition.VersionDate = _visualRecognitionVersionDate; // Get all classifiers - Log.Debug("ExampleVisualRecognition", "Attempting to get all classifiers"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to get all classifiers"); if (!_visualRecognition.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleVisualRecognition", "Failed to get all classifiers!"); + Log.Debug("TestVisualRecognition.GetClassifiers()", "Failed to get all classifiers!"); while (!_getClassifiersTested) yield return null; #if TRAIN_CLASSIFIER // Train classifier - Log.Debug("ExampleVisualRecognition", "Attempting to train classifier"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to train classifier"); string positiveExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_positive_examples.zip"; string negativeExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/negative_examples.zip"; Dictionary positiveExamples = new Dictionary(); positiveExamples.Add("giraffe", positiveExamplesPath); if (!_visualRecognition.TrainClassifier(OnTrainClassifier, "unity-test-classifier-example", positiveExamples, negativeExamplesPath)) - Log.Debug("ExampleVisualRecognition", "Failed to train classifier!"); + Log.Debug("TestVisualRecognition.TrainClassifier()", "Failed to train classifier!"); while (!_trainClassifierTested) yield return null; // Find classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to find classifier by ID"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to find classifier by ID"); if (!_visualRecognition.GetClassifier(OnGetClassifier, _classifierID)) - Log.Debug("ExampleVisualRecognition", "Failed to get classifier!"); + Log.Debug("TestVisualRecognition.GetClassifier()", "Failed to get classifier!"); while (!_getClassifierTested) yield return null; #endif // Classify get - Log.Debug("ExampleVisualRecognition", "Attempting to get classify via URL"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to get classify via URL"); if (!_visualRecognition.Classify(OnClassifyGet, _imageURL)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("TestVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyGetTested) yield return null; // Classify post image - Log.Debug("ExampleVisualRecognition", "Attempting to classify via image on file system"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to classify via image on file system"); string imagesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_to_classify.jpg"; string[] owners = { "IBM", "me" }; string[] classifierIDs = { "default", _classifierID }; if (!_visualRecognition.Classify(imagesPath, OnClassifyPost, owners, classifierIDs, 0.5f)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("TestVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyPostTested) yield return null; // Detect faces get - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via URL"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to detect faces via URL"); if (!_visualRecognition.DetectFaces(OnDetectFacesGet, _imageURL)) - Log.Debug("ExampleVisualRecogntiion", "Detect faces failed!"); + Log.Debug("TestVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesGetTested) yield return null; // Detect faces post image - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via image"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to detect faces via image"); string faceExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/obama.jpg"; if (!_visualRecognition.DetectFaces(faceExamplePath, OnDetectFacesPost)) - Log.Debug("ExampleVisualRecognition", "Detect faces failed!"); + Log.Debug("TestVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesPostTested) yield return null; //// Recognize text get - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via URL"); + //Log.Debug("TestVisualRecognition.RunTest()", "Attempting to recognizeText via URL"); //if (!_visualRecognition.RecognizeText(OnRecognizeTextGet, _imageTextURL)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + // Log.Debug("TestVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextGetTested) // yield return null; //// Recognize text post image - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via image"); + //Log.Debug("TestVisualRecognition.RunTest()", "Attempting to recognizeText via image"); //string textExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/from_platos_apology.png"; //if (!_visualRecognition.RecognizeText(textExamplePath, OnRecognizeTextPost)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + // Log.Debug("TestVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextPostTested) // yield return null; @@ -198,28 +198,28 @@ public override IEnumerator RunTest() #endregion // Delete classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); + Log.Debug("TestVisualRecognition.RunTest()", "Attempting to delete classifier"); if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) - Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); + Log.Debug("TestVisualRecognition.DeleteClassifier()", "Failed to delete classifier!"); while (!_deleteClassifierTested) yield return null; #endif - Log.Debug("ExampleVisualRecognition", "Visual Recogition tests complete"); + Log.Debug("TestVisualRecognition.RunTest()", "Visual Recogition tests complete"); yield break; } private void OnGetClassifiers(GetClassifiersTopLevelBrief classifiers, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifiers Response: {0}", data); + Log.Debug("TestVisualRecognition.OnGetClassifiers()", "VisualRecognition - GetClassifiers Response: {0}", data); Test(classifiers != null); _getClassifiersTested = true; } private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifier Response: {0}", data); + Log.Debug("TestVisualRecognition.OnGetClassifier()", "VisualRecognition - GetClassifier Response: {0}", data); Test(classifier != null); _getClassifierTested = true; } @@ -227,7 +227,7 @@ private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, stri #if DELETE_TRAINED_CLASSIFIER private void OnDeleteClassifier(bool success, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DeleteClassifier Response: {0}", success); + Log.Debug("TestVisualRecognition.OnDeleteClassifier()", "VisualRecognition - DeleteClassifier Response: {0}", success); Test(success); _deleteClassifierTested = true; } @@ -236,7 +236,7 @@ private void OnDeleteClassifier(bool success, string data) #if TRAIN_CLASSIFIER private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - TrainClassifier Response: {0}", data); + Log.Debug("TestVisualRecognition.OnTrainClassifier()", "VisualRecognition - TrainClassifier Response: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; @@ -249,7 +249,7 @@ private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, st private void OnClassifyGet(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyGet Response: {0}", data); + Log.Debug("TestVisualRecognition.OnClassifyGet()", "VisualRecognition - ClassifyGet Response: {0}", data); Test(classify != null); _classifyGetTested = true; @@ -257,34 +257,34 @@ private void OnClassifyGet(ClassifyTopLevelMultiple classify, string data) private void OnClassifyPost(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyPost Response: {0}", data); + Log.Debug("TestVisualRecognition.OnClassifyPost()", "VisualRecognition - ClassifyPost Response: {0}", data); Test(classify != null); _classifyPostTested = true; } private void OnDetectFacesGet(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesGet Response: {0}", data); + Log.Debug("TestVisualRecognition.OnDetectFacesGet()", "VisualRecognition - DetectFacesGet Response: {0}", data); Test(multipleImages != null); _detectFacesGetTested = true; } private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesPost Response: {0}", data); + Log.Debug("TestVisualRecognition.OnDetectFacesPost()", "VisualRecognition - DetectFacesPost Response: {0}", data); Test(multipleImages != null); _detectFacesPostTested = true; } //private void OnRecognizeTextGet(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextGet Response: {0}", data); + // Log.Debug("TestVisualRecognition.OnRecognizeTextGet()", "VisualRecognition - RecognizeTextGet Response: {0}", data); // _recognizeTextGetTested = true; //} //private void OnRecognizeTextPost(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextPost Response: {0}", data); + // Log.Debug("TestVisualRecognition.OnRecognizeTextPost()", "VisualRecognition - RecognizeTextPost Response: {0}", data); // _recognizeTextPostTested = true; //} @@ -297,7 +297,7 @@ private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data private IEnumerator Delay(float delayTime) { _isWaitingForDelay = true; - Log.Debug("TestVisualRecognition", "Delaying for {0} seconds....", delayTime); + Log.Debug("TestVisualRecognition.Delay()", "Delaying for {0} seconds....", delayTime); yield return new WaitForSeconds(delayTime); _isWaitingForDelay = false; } diff --git a/Scripts/Utilities/Runnable.cs b/Scripts/Utilities/Runnable.cs index 7bc2e111e..eeb0e3090 100644 --- a/Scripts/Utilities/Runnable.cs +++ b/Scripts/Utilities/Runnable.cs @@ -117,7 +117,7 @@ public Routine(IEnumerator a_enumerator) Runnable.Instance._routines[ID] = this; #if ENABLE_RUNNABLE_DEBUGGING - Log.Debug("Runnable", "Coroutine {0} started.", ID ); + Log.Debug("Runnable.Routine()", "Coroutine {0} started.", ID ); #endif } @@ -133,7 +133,7 @@ public bool MoveNext() { Runnable.Instance._routines.Remove(ID); // remove from the mapping #if ENABLE_RUNNABLE_DEBUGGING - Log.Debug("Runnable", "Coroutine {0} stopped.", ID ); + Log.Debug("Runnable.Routine()", "Coroutine {0} stopped.", ID ); #endif } diff --git a/Scripts/Utilities/Utility.cs b/Scripts/Utilities/Utility.cs index 964a7d364..420fe5d7b 100644 --- a/Scripts/Utilities/Utility.cs +++ b/Scripts/Utilities/Utility.cs @@ -327,7 +327,7 @@ public static DateTime GetLocalDateTimeFromEpoch(double epochTime) } catch (ArgumentOutOfRangeException ex) { - Log.Debug("Utility", "Time conversion assuming time is in Milliseconds: {0}, {1}", epochTime, ex.Message); + Log.Debug("Utility.GetLocalDateTimeFromEpoch()", "Time conversion assuming time is in Milliseconds: {0}, {1}", epochTime, ex.Message); dateTime = dateTime.AddMilliseconds(epochTime).ToLocalTime(); } diff --git a/Scripts/Utilities/WaveFile.cs b/Scripts/Utilities/WaveFile.cs index 3d585d577..58f7a180e 100644 --- a/Scripts/Utilities/WaveFile.cs +++ b/Scripts/Utilities/WaveFile.cs @@ -145,7 +145,7 @@ public static AudioClip ParseWAV(string clipName, byte[] data) { if (!bHeaderFound) { - Log.Error("TextToSpeech", "Failed to find header."); + Log.Error("WaveFile.ParseWAV()", "Failed to find header."); return null; } byte[] waveform = reader.ReadBytes(ChunkLength); @@ -157,7 +157,7 @@ public static AudioClip ParseWAV(string clipName, byte[] data) int bytesps = bps / 8; int samples = waveform.Length / bytesps; - Log.Debug("TextToSpeech", "WAV INFO, channels = {0}, bps = {1}, samples = {2}, rate = {3}", + Log.Debug("WaveFile.ParseWAV()", "WAV INFO, channels = {0}, bps = {1}, samples = {2}, rate = {3}", channels, bps, samples, header.sample_rate); float[] wf = new float[samples]; @@ -178,7 +178,7 @@ public static AudioClip ParseWAV(string clipName, byte[] data) } else { - Log.Error("ParseWAV", "Unspported BPS {0} in WAV data.", bps.ToString()); + Log.Error("WaveFile.ParseWAV()", "Unspported BPS {0} in WAV data.", bps.ToString()); return null; } @@ -253,7 +253,7 @@ public static byte[] CreateWAV(AudioClip clip, int bps = 16) } else { - Log.Error("CreateWAV", "Unsupported BPS {0} in WAV data.", bps.ToString()); + Log.Error("WaveFile.CreateWAV()", "Unsupported BPS {0} in WAV data.", bps.ToString()); return null; } diff --git a/Travis/TravisIntegrationTests.cs b/Travis/TravisIntegrationTests.cs index 208fc08f9..13385bb03 100644 --- a/Travis/TravisIntegrationTests.cs +++ b/Travis/TravisIntegrationTests.cs @@ -30,7 +30,7 @@ public class TravisIntegrationTests : MonoBehaviour { public static void RunTests() { - Log.Debug("TravisIntegrationTests", "***** Running Integration tests!"); + Log.Debug("TravisIntegrationTests.RunTests()", "***** Running Integration tests!"); #if UNITY_EDITOR Runnable.EnableRunnableInEditor(); @@ -68,7 +68,7 @@ public static void RunTests() } static void OnTravisIntegrationTestsComplete() { - Log.Debug("TravisIntegrationTests", " ***** Integration tests complete!"); + Log.Debug("TravisIntegrationTests.OnTravisIntegrationTestsComplete()", " ***** Integration tests complete!"); } } } From 18b82273e3f47c5b7830d28489de78ff2f7db96a Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 2 Nov 2017 19:45:13 -0500 Subject: [PATCH 048/100] update credentials --- Config.json.enc | Bin 8768 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index f7921d775c088c35b8c9a2696622a59052de94c8..cde64d1e6fbb62d4a1d6b00b63b7e771a26b1ba2 100644 GIT binary patch literal 8768 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 literal 8768 zcmV-GBEQ|KX}-9zmErE=v)YiE3%MM3yQrozH){=+xhgj9M7C9T2{Mzqs2%6&(hEy# zhkJs*(M?H3weAldh9A9awts7H$!TS=nOi6*&rM8`?8;j$C~CUb)f@2+m%&?jy_iv&OMUcybDR!64(h?1Loh=X_r>9kg zmV#mgSPf*T5k_v8UhYaJ;1SrC=`&qy8LM;RjXA=i{D&T5&v(T5J1_<%*;DKg=>(tl zN=cO!))taZu0##$uJCnT;86Bxg~Pc?97XQe&k8L!jA$Z4pBL2kQG*%U0 zbKOx}{x>_Q8{y;Wj`SpgyBYCJuf)OU2r0>KHP5;<-5G_A!Mfu1*O8B=WNUlbS#T#N zBiMsqwlp=+ld@2qQ}*tO;fH_GWcbB`TwZs-0**7XD?w5v$P(@uK{(7YwEKRp#B!G| zIxm3np~=;3Xz;TMr6T>H?K6TLawxuWAv5@l+8JxT>icuCzKaOJd#J-GpIn?M*<>y; zfVb|#z%VjiXy-}R_?kuJE#5`~)=V8j12Z8EMo5bJ*e6q>a=lqcTn*OD5x&TTRUy)!r$JigB-a8SJR0geL)FiUhPQ0jDEbTf4)p*R&G)Efhj6f3jyfO0r3FYma< z*#vs$24N$J=~{XKuM`Q8!obdjF{Wf%p0fsvnsB~sH9osDQ3R`&$0mdTI%=(!y=9Fh z!=WQ9>B@O&S@9Gb&c6(GR(C6%RP(Hp8-8bv#M-3zDn@rL(&$yfU|il^T<`zJI_|t0 z&0Kw9*x7W`{Dxw@fPlrr5t7-I^cMQ9kuk&8I;1xY+Dm*q6vlr-pJWsW{?%L3=aiWt z?76lFJy%qdo!NH;WnA>Ncb|uNtb^E(Luri&DO5GG5TaH*7=%F#Q3`+Oz!Mr`OdOSh zxDgvz$Z_SPEFOxM-9X4Oiq^(%7!zR*sS94?w24>@zcAOb66;gCQyMubf5q>RSh#&w zu|q8)%`2BJssk!bP<)uB?NQGah9n z{YbYd++-9zf`7-op&w+{=@_~Sbop=Uik3iuOTvQG->TvLw{HV=Xo=@mE&}K%7IgV7G9!IqTY9Wd|g1+xLUw&t(cHNq-)goekiHC+b!ON~+ z)gi;2isKnnDIug@^HPhFmYgM06>3x?A(ns2}_8?^=6JiqV0>z^U_1I)T*f?dw|}7 zHVn@ihBMB4l8}8lk>n;^Vc~m{Jfo%5^u$ka11sB9Qs;_q_GJ;w^ROB{_O-q*_y_TC z14uPWkjW$>PVMb+#0j2<#a#7kAuwhPH9-F%lZ;G(E%tp)DA2CSj9-tjjvkeIXZxBZ zKbg@c4^x#=K+1LB(Rqr%FyG8&@->QRWj7mvrGW28*{vrosf#oi>i--8z`lARGh? zM$2X5R&80p?i#;>xiebh%sQgSyx%uae2Og?`Aiiq&nTwSSKq}lrR!M^NuHE7@ z3nl>+$E}W6%+@18 zs>H*G^(G80T>on!|HF8M;KR7L@oKx_5Sl}|NpINGz1@;Mn_l*z4v_g8ni!4szvwuP za)4Cp5IgZOndxAN8*89LeI^C90}Z97aTovUGNjL3Z=EDjxUPr;LJ~FXywCnUJr9~T zmIO`_FhnrHaRkN?z_W|FqAn`XL@3c`@JNg!qYV^mn(D3KAzHyqyu-&|l}yF@Pq*li zP7+ih?L>IgNK*4!!gu9d^3}n9O3kd^aT&;PVw8GFbF&MRJ!o|T7H|X`YR-{OiY35D zrBu}(&=AF+)Z*ef?Mce%G0ww{cfzA#ze5c!6YnO zM{zxEKPC>~a^ZSA1^_7GL$GNAa-&0=;ki}lE7g3D``4|5zjy|KXkVTA^>tWR#0gPn z;zpmw4>7@CU0y+h>K>?t>3H@_gX;OUzHuTah|k;|HliY5~m2J#%WO$*}fTg+9XB(1`y0!yO3i zcN_ZFUA^`8ZBxgBd(K0FO|-_U#zvK`%a(ZCI@HY}WTkurQ#WkRYk(-NbYL97z`jAl z-We^I@R=M_;`X0x3eSsNsM%+`PcIRuq}|$vnpWXit6$&nn^+&SfpQ%DiA%XCNZksr z{;=87bR=>(HJz*s3ucJ9ucPxyF={M)`b`~WFk}dn^i>3;apR;czlIrGRL`otygrZ` zxRt~u+ZZ1SzoN^U{GKsKzj7+D>#Q55eV7R|=nteD*I;p#-*HME?Y+bH zj#Ui;Zd;(#dkq+$JSac+9&b^>ormmL=b1K%so~xX#@vo8D9~gA~`~oxGOV;;=xbca+cgijBD6u$M6>_4w;I z!u%{#G$O)T))$~RQLZvt zXiiCT5!Ep=jsfS9r76bKe`l32cU`Xk(NR> zbxyEXC@Eiy{LDJ9WdpVNSj+)@xq=WF!$J_!PZBV%#=>p>>e;_FUBU2ci6_b!Ifp6%tehD=FfrLbqRp278I5BJ_)`sxAK~S&Ql?IOdK8KdWn~BB4 zr$|ehz}c&o!1OmrVFz6opzTKIN{J611CXDdUg~~f8E^FPjX{&0zR4;mtJK{;Kj?wo zJ<`KY(Ov4%O{O1BzUX+BWp^>w9o$kV7TXc$AJ%@pz{$@yR7#YlAD!4!RKeT%XEUa?N$uHd&M+r52eP*)#vf6h z6U96o=E@>`nTM`0Yk1l#0zgM?{lqw7n}>BsD+C$`?H=fHL%c7|OpM%+qsMmNcF#y; zV6Z%>=-U>#!BLQb;`#ybps2rXL1KRVI`wu|ANmxA%5optP7O<_tVJYHKSl}AK zu5ngOS*=HY76^Pff28|fClI}>8th`wS_KqAjMyO`dQura>?Kra?U53>9uWjsKGpE^ zNkFz`_p^}#ba|O*1K>0(F2=mDUZ0al-YVA6*UwAQrPongt+)J23`6?r@*r<*bUlf2 zc6g5oekUMa@uL-%*29MWmN9C`j?^hKWX$9#nHWkL@_-{E)_BLp%KdX))+h<_Nc%Eb z3o8Mzs_o7Tf@^}#*biPw(BoU}SyXn)7yc>Ne!nhR2QzVLn4FQWERX>9Gl30^$<`1A zfRx%&LK8am9hju>NJMjB=nqOJ*A7#Exw-8ldwEzTQei0eQI=N%+q?jylN{Ve%4 zoC6=q=0G%sQq$%9@Dgox^~~jtQP{XMuqjkJDeLU^2F@|iZh>ED1>4o~g{AYJDT)x? zH)9FOS8dnh0;PBfXu9|?ebVmG8ei87{m>?EWB_qEJP28PeJV1T3Kht%-PdCgIk|72 zfuFw{TYde~a;#OagN_7nm(QHcwk9bGt(YOO(*SQ^0fOJ6;C#Yx)QsTdFza0ns%*){ z>g}jbWL-h?>KsKT-*SkOiQze0f`aSXP(NM>O%2pUb1NH)UJIM0Q8;pu$g|y-y`fLq zSjU|SVv2m@N&?8A%pM|o#pre-NTI-#ZE-Yq#mKkhz)YUQEZhj-9`(-HBTa7&#jJO@ zU)Z{!&D< z&LJ$GKVbIUG`)A~(SHAg$`9@|{uEtYgy z6DBLmTQ!6?PU59FX+z@Hf1u>gS*gX6V-lX|ywNOns`k)XO>iyp~oPdXVh83Tr;tli6aajd4(9 zB%={#5B%47j5~3l46c^h+GA?P8h^cJ?wafJxfl9J!3v;wI94TnDdOVBM^H zR*Q8c>2F^bHXsQ#^r(!uR#ae9_c_88zi_P9(R%{M%6_w1FRPcJ8vWDClBQ0HJsc0G zsEyK64=1~>P*YM<{qlwz7!jw2m50uMK%0A@D9Qq2?n-^vy=mNpf&%)ZuF~N!A5J~; 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 From 2c274b2dd6991f19b77573e27aca577202ff3a44 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 3 Nov 2017 09:20:34 -0500 Subject: [PATCH 049/100] @kimberlysiva's reccomended changes --- .../Scripts/ExampleStreaming.cs | 28 ++++++++----------- Scripts/Connection/WSConnector.cs | 19 +++++++++---- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index f8a379297..5328cb30c 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -33,7 +33,7 @@ public class ExampleStreaming : MonoBehaviour private string _password = null; private string _url = null; public Text ResultsField; - + private int _recordingRoutine = 0; private string _microphoneID = null; private AudioClip _recording = null; @@ -116,7 +116,7 @@ private void OnError(string error) Log.Debug("ExampleStreaming", "Error! {0}", error); } - #if CHUNK_BUFFER +#if CHUNK_BUFFER private IEnumerator RecordingHandler() { @@ -167,8 +167,8 @@ private IEnumerator RecordingHandler() sampleEnd.ToString(), chunkNum.ToString()); #endif - //If the write position is past the end of the chunk or if write position is before the start of the chunk and the chunk number is equal to the chunk count - if (microphonePosition > sampleEnd || (microphonePosition < sampleStart && chunkNum == (_chunkCount - 1))) + //If the write position is past the end of the chunk or if write position is before the start of the chunk + while (microphonePosition > sampleEnd || microphonePosition < sampleStart) { // Init samples samples = new float[chunkSize]; @@ -204,21 +204,17 @@ private IEnumerator RecordingHandler() Log.Debug("ExampleStreamingChunks", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); now = DateTime.Now; #endif + sampleStart = chunkSize * chunkNum; + sampleEnd = chunkSize * (chunkNum + 1); } - else - { - // calculate the number of samples remaining until we ready for a block of audio, - // and wait that amount of time it will take to record. - int remaining = sampleEnd - microphonePosition; - float timeRemaining = (float)remaining / (float)_recordingHZ; - yield return new WaitForSeconds(timeRemaining); - } + yield return 0; } yield break; } + #else private IEnumerator RecordingHandler() @@ -288,9 +284,9 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var alt in res.alternatives) { - string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); - Log.Debug("ExampleStreaming", text); - ResultsField.text = text; + string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); + Log.Debug("ExampleStreaming", text); + ResultsField.text = text; } if (res.keywords_result != null && res.keywords_result.keyword != null) @@ -306,7 +302,7 @@ private void OnRecognize(SpeechRecognitionEvent result) foreach (var wordAlternative in res.word_alternatives) { Log.Debug("ExampleSpeechToText", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); - foreach(var alternative in wordAlternative.alternatives) + foreach (var alternative in wordAlternative.alternatives) Log.Debug("ExampleSpeechToText", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); } } diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 8338de882..1b39a19be 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -324,13 +324,20 @@ private void SendMessages() msg = _sendQueue.Dequeue(); } - if (msg == null) - continue; + while (msg != null) + { + if (msg is TextMessage) + ws.Send(((TextMessage)msg).Text); + else if (msg is BinaryMessage) + ws.Send(((BinaryMessage)msg).Data); - if (msg is TextMessage) - ws.Send(((TextMessage)msg).Text); - else if (msg is BinaryMessage) - ws.Send(((BinaryMessage)msg).Data); + msg = null; + lock (_sendQueue) + { + if (_sendQueue.Count > 0) + msg = _sendQueue.Dequeue(); + } + } } ws.Close(); From 4cbd6626c2745ed60bd690cecae6854fe820812d Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 3 Nov 2017 11:04:39 -0500 Subject: [PATCH 050/100] refactor error and warning --- Scripts/Connection/RESTConnector.cs | 4 +- Scripts/Services/Discovery/v1/Discovery.cs | 24 +++++----- .../v1/DocumentConversion.cs | 4 +- .../v2/LanguageTranslation.cs | 10 ++-- .../v2/LanguageTranslator.cs | 8 ++-- .../v2/NaturalLanguageClassifier.cs | 8 ++-- .../v1/NaturalLanguageUnderstanding.cs | 4 +- .../v3/PersonalityInsights.cs | 2 +- .../RetrieveAndRank/v1/RetrieveAndRank.cs | 34 +++++++------- .../Services/SpeechToText/v1/SpeechToText.cs | 46 +++++++++---------- .../Services/TextToSpeech/v1/TextToSpeech.cs | 30 ++++++------ .../Services/ToneAnalyzer/v3/ToneAnalyzer.cs | 2 +- .../TradeoffAnalytics/v1/TradeoffAnalytics.cs | 2 +- .../VisualRecognition/v3/VisualRecognition.cs | 46 +++++++++---------- Scripts/UnitTests/UnitTest.cs | 6 +-- Scripts/UnitTests/UnitTestManager.cs | 18 ++++---- Scripts/Utilities/AudioClipUtil.cs | 2 +- Scripts/Utilities/EventManager.cs | 4 +- Scripts/Utilities/Utility.cs | 4 +- Scripts/Utilities/WaveFile.cs | 2 +- Scripts/Widgets/Widget.cs | 12 ++--- 21 files changed, 136 insertions(+), 136 deletions(-) diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index e6c0fb428..bd7b7ac36 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -374,7 +374,7 @@ private IEnumerator ProcessRequestQueue() else if (formData.Value.BoxedObject is int) form.AddField(formData.Key, (int)formData.Value.BoxedObject); else if (formData.Value.BoxedObject != null) - Log.Warning("RESTConnector", "Unsupported form field type {0}", formData.Value.BoxedObject.GetType().ToString()); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Unsupported form field type {0}", formData.Value.BoxedObject.GetType().ToString()); } foreach (var headerData in form.headers) req.Headers[headerData.Key] = headerData.Value; @@ -451,7 +451,7 @@ private IEnumerator ProcessRequestQueue() } /*if (!bError && (www.bytes == null || www.bytes.Length == 0)) { - Log.Warning("RESTConnector", "No data recevied for URL: {0}", url); + Log.Warning("RESTConnector.ProcessRequestQueue()", "No data recevied for URL: {0}", url); bError = true; }*/ diff --git a/Scripts/Services/Discovery/v1/Discovery.cs b/Scripts/Services/Discovery/v1/Discovery.cs index 8bb929b94..b5a209b88 100644 --- a/Scripts/Services/Discovery/v1/Discovery.cs +++ b/Scripts/Services/Discovery/v1/Discovery.cs @@ -491,7 +491,7 @@ private void OnGetConfigurationsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetConfigurationsResponse()", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -604,7 +604,7 @@ private void OnAddConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddConfigurationResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -684,7 +684,7 @@ private void OnGetConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetConfigurationResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -925,7 +925,7 @@ private void OnPreviewConfigurationResponse(RESTConnector.Request req, RESTConne } catch (Exception e) { - Log.Error("Discovery.Method()", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnPreviewConfigurationResponse()", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1009,7 +1009,7 @@ private void OnGetCollectionsResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetCollectionsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetCollectionsResponse()", "OnGetCollectionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1119,7 +1119,7 @@ private void OnAddCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddCollectionResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1199,7 +1199,7 @@ private void OnGetCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetCollectionResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetCollectionResponse()", "OnGetCollectionResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1339,7 +1339,7 @@ private void OnGetFieldsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetFieldsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetFieldsResponse()", "OnGetFieldsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1627,7 +1627,7 @@ private void OnAddDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery.Method()", "OnAddDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddDocumentResponse()", "OnAddDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1778,7 +1778,7 @@ private void OnGetDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetDocumentResponse()", "OnGetDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2065,7 +2065,7 @@ private void OnUpdateDocumentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery.Method()", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnUpdateDocumentResponse()", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2188,7 +2188,7 @@ private void OnQueryResponse(RESTConnector.Request req, RESTConnector.Response r } catch (Exception e) { - Log.Error("Discovery.Method()", "OnQueryResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnQueryResponse()", "OnQueryResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs index 47b7ed0ee..d6b315e2e 100644 --- a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs +++ b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs @@ -146,7 +146,7 @@ public bool ConvertDocument(OnConvertDocument callback, string documentPath, str } if (documentData == null) - Log.Error("DocumentConversion", "Failed to upload {0}!", documentPath); + Log.Error("DocumentConversion.ConvertDocument()", "Failed to upload {0}!", documentPath); } if (documentData != null) @@ -191,7 +191,7 @@ private void ConvertDocumentResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("DocumentConversion", "ConvertDocumentResponse Exception: {0}", e.ToString()); + Log.Error("DocumentConversion.ConvertDocumentResponse()", "ConvertDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs b/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs index 33c3abb90..a8d569fa4 100644 --- a/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs +++ b/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs @@ -198,7 +198,7 @@ private void TranslateResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetTranslation Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.TranslateResponse()", "GetTranslation Exception: {0}", e.ToString()); resp.Success = false; } } @@ -289,7 +289,7 @@ private void GetModelsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModels Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetModelsResponse()", "GetModels Exception: {0}", e.ToString()); resp.Success = false; } } @@ -347,7 +347,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModel Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetModelResponse()", "GetModel Exception: {0}", e.ToString()); resp.Success = false; } } @@ -403,7 +403,7 @@ private void GetLanguagesResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetLanguages Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetLanguagesResponse()", "GetLanguages Exception: {0}", e.ToString()); resp.Success = false; } } @@ -458,7 +458,7 @@ private void OnIdentifyResponse(RESTConnector.Request r, RESTConnector.Response } else { - Log.Error("Translate", "Identify() failed: {0}", resp.Error); + Log.Error("LanguageTranslation.OnIdentifyResponse()", "Identify() failed: {0}", resp.Error); if (req.Callback != null) req.Callback(null); } diff --git a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs index fe30d5eed..03963be66 100644 --- a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs +++ b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs @@ -210,7 +210,7 @@ private void TranslateResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetTranslation Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.TranslateResponse()", "GetTranslation Exception: {0}", e.ToString()); resp.Success = false; } } @@ -303,7 +303,7 @@ private void GetModelsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModels Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetModelsResponse()", "GetModels Exception: {0}", e.ToString()); resp.Success = false; } } @@ -364,7 +364,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModel Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetModelResponse()", "GetModel Exception: {0}", e.ToString()); resp.Success = false; } } @@ -599,7 +599,7 @@ private void GetLanguagesResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetLanguages Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetLanguagesResponse()", "GetLanguages Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs b/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs index 093a5c4b6..cb00f4e12 100644 --- a/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs +++ b/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs @@ -163,7 +163,7 @@ private void OnGetClassifiersResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnGetClassifiersResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -225,7 +225,7 @@ private void OnGetClassifierResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnGetClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -300,7 +300,7 @@ private void OnTrainClassifierResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnTrainClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -414,7 +414,7 @@ private void OnClassifyResp(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnTrainClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); } } diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs index a41bd1ab4..2aa3873a2 100644 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs @@ -165,7 +165,7 @@ private void OnAnalyzeResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Discovery.Method()", "OnAnalyzeResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAnalyzeResponse()", "OnAnalyzeResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -236,7 +236,7 @@ private void OnGetModelsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery.Method()", "OnGetModelssResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetModelsResponse()", "OnGetModelssResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs b/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs index fcacb662f..28c0a7400 100644 --- a/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs +++ b/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs @@ -190,7 +190,7 @@ private void GetProfileResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("PersonalityInsights", "GetProfileResponse Exception: {0}", e.ToString()); + Log.Error("PersonalityInsights.GetProfileResponse()", "GetProfileResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs index b28f61917..e2384872e 100644 --- a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs +++ b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs @@ -196,7 +196,7 @@ private void OnGetClustersResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClustersResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClustersResponse()", "OnGetClustersResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -288,7 +288,7 @@ private void OnCreateClusterResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("RetriveAndRank", "OnCreateClusterResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnCreateClusterResponse()", "OnCreateClusterResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -448,7 +448,7 @@ private void OnGetClusterResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClusterResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClusterResponse()", "OnGetClusterResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -540,7 +540,7 @@ private void OnGetClusterConfigsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClusterConfigsResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClusterConfigsResponse()", "OnGetClusterConfigsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -730,7 +730,7 @@ public void SaveConfig(OnSaveClusterConfig callback, byte[] configData, string c catch (Exception e) { success = false; - Log.Error("RetrieveAndRank", "Caught exception: {0}", e.ToString()); + Log.Error("RetrieveAndRank.SaveConfig()", "Caught exception: {0}", e.ToString()); } } @@ -788,7 +788,7 @@ public void SaveConfig(OnSaveClusterConfig callback, byte[] configData, string c } if (configData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", configPath); + Log.Error("RetrieveAndRank.UploadClusterConfig()", "Failed to upload {0}!", configPath); req.Headers["Content-Type"] = "application/zip"; req.Send = configData; @@ -839,7 +839,7 @@ private void UploadClusterConfigResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("RetriveAndRank", "UploadClusterConfigResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.UploadClusterConfigResponse()", "UploadClusterConfigResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -968,7 +968,7 @@ private void OnForwardCollectionRequestResponse(RESTConnector.Request req, RESTC } catch (Exception e) { - Log.Error("RetriveAndRank", "OnForwardCollectionRequestResponse exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnForwardCollectionRequestResponse()", "OnForwardCollectionRequestResponse exception: {0}", e.ToString()); resp.Success = false; } } @@ -1028,7 +1028,7 @@ private void OnForwardCollectionRequestResponse(RESTConnector.Request req, RESTC } if (indexData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", indexDataPath); + Log.Error("RetrieveAndRank.IndexDocuments()", "Failed to upload {0}!", indexDataPath); RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(CollectionUpdateEndpoint, clusterID, collectionName)); if (connector == null) @@ -1089,7 +1089,7 @@ private void OnIndexDocumentsResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("RetriveAndRank", "OnIndexDocumentsResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnIndexDocumentsResponse()", "OnIndexDocumentsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1214,7 +1214,7 @@ private void OnSearchResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("RetriveAndRank", "OnSearchResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnSearchResponse()", "OnSearchResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1292,7 +1292,7 @@ private void OnGetRankersResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetRankersResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetRankersResponse()", "OnGetRankersResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1348,7 +1348,7 @@ private void OnGetRankersResponse(RESTConnector.Request req, RESTConnector.Respo } if (trainingData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", trainingDataPath); + Log.Error("RetrieveAndRank.CreateRanker()", "Failed to upload {0}!", trainingDataPath); RESTConnector connector = RESTConnector.GetConnector(Credentials, RankersEndpoint); if (connector == null) @@ -1408,7 +1408,7 @@ private void OnCreateRankerResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("RetriveAndRank", "OnCreateRankerResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnCreateRankerResponse()", "OnCreateRankerResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1464,7 +1464,7 @@ private void OnCreateRankerResponse(RESTConnector.Request req, RESTConnector.Res } if (searchResultData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", searchResultData); + Log.Error("RetrieveAndRank.Rank()", "Failed to upload {0}!", searchResultData); RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(RankEndpoint, rankerID)); if (connector == null) @@ -1528,7 +1528,7 @@ private void OnRankResponse(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("RetriveAndRank", "OnRankResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnRankResponse()", "OnRankResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1688,7 +1688,7 @@ private void OnGetRankerResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetRankerResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetRankerResponse()", "OnGetRankerResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 6e385d017..34309f73c 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -324,11 +324,11 @@ private void OnGetModelsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("SpeechToText", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); + Log.Error("SpeechToText.OnGetModelsResponse()", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); } if (resp == null) - Log.Error("SpeechToText", "Failed to parse GetModel response."); + Log.Error("SpeechToText.OnGetModelsResponse()", "Failed to parse GetModel response."); } string customData = ((GetModelsRequest)req).Data; @@ -396,11 +396,11 @@ private void OnGetModelResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("SpeechToText", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); + Log.Error("SpeechToText.OnGetModelResponse()", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); } if (resp == null) - Log.Error("SpeechToText", "Failed to parse GetModel response."); + Log.Error("SpeechToText.OnGetModelResponse()", "Failed to parse GetModel response."); } string customData = ((GetModelRequest)req).Data; @@ -481,7 +481,7 @@ public void OnListen(AudioData clip) // check the length of this queue and do something if it gets too full. if (_listenRecordings.Count > MaxQueuedRecordings) { - Log.Error("SpeechToText", "Recording queue is full."); + Log.Error("SpeechToText.OnListen()", "Recording queue is full."); StopListening(); if (OnError != null) @@ -499,7 +499,7 @@ public void OnListen(AudioData clip) // by LISTEN_TIMEOUT. If not, then stop listening and record the error. if (!_listenActive && (DateTime.Now - _lastStartSent).TotalSeconds > ListenTimeout) { - Log.Error("SpeechToText", "Failed to enter listening state."); + Log.Error("SpeechToText.OnListen()", "Failed to enter listening state."); StopListening(); if (OnError != null) @@ -780,7 +780,7 @@ public bool Recognize(AudioClip clip, OnRecognize callback) req.Send = WaveFile.CreateWAV(clip); if (req.Send.Length > MaxRecognizeClipSize) { - Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); + Log.Error("SpeechToText.Recognize()", "AudioClip is too large for Recognize()."); return false; } if(!string.IsNullOrEmpty(AcousticCustomizationId)) @@ -828,7 +828,7 @@ private void OnRecognizeResponse(RESTConnector.Request req, RESTConnector.Respon result = ParseRecognizeResponse(resp.Data); if (result == null) { - Log.Error("SpeechToText", "Failed to parse json response: {0}", + Log.Error("SpeechToText.OnRecognizeResponse()", "Failed to parse json response: {0}", resp.Data != null ? Encoding.UTF8.GetString(resp.Data) : ""); } else @@ -839,7 +839,7 @@ private void OnRecognizeResponse(RESTConnector.Request req, RESTConnector.Respon } else { - Log.Error("SpeechToText", "Recognize Error: {0}", resp.Error); + Log.Error("SpeechToText.OnRecognizeResponse()", "Recognize Error: {0}", resp.Error); } if (recognizeReq.Callback != null) @@ -893,7 +893,7 @@ private SpeakerRecognitionEvent ParseSpeakerRecognitionResponse(IDictionary resp } catch (Exception e) { - Log.Error("SpeechToText", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); + Log.Error("SpeechToText.ParseSpeakerRecognitionResponse()", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); return null; } } @@ -1059,7 +1059,7 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) } catch (Exception e) { - Log.Error("SpeechToText", "ParseJsonResponse exception: {0}", e.ToString()); + Log.Error("SpeechToText.ParseRecognizeResponse()", "ParseJsonResponse exception: {0}", e.ToString()); return null; } } @@ -1130,7 +1130,7 @@ private void OnGetCustomizationsResp(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Speech To Text", "GetCustomizations Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomizationsResp()", "GetCustomizations Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1218,7 +1218,7 @@ private void OnCreateCustomizationResp(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("Speech To Text", "CreateCustomization Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnCreateCustomizationResp()", "CreateCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1343,7 +1343,7 @@ private void OnGetCustomizationResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Speech To Text", "GetCustomization Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomizationResp()", "GetCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1586,7 +1586,7 @@ private void OnGetCustomCorporaResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomCorporaResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomCorporaResp()", "OnGetCustomCorporaResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1666,7 +1666,7 @@ private void OnGetCustomCorpusResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomCorpusResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomCorpusResp()", "OnGetCustomCorpusResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1892,7 +1892,7 @@ private void OnGetCustomWordsResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomWordsResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomWordsResp()", "OnGetCustomWordsResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2128,7 +2128,7 @@ private void OnGetCustomWordResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomWordResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomWordResp()", "OnGetCustomWordResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2196,7 +2196,7 @@ private void OnGetCustomAcousticModelsResp(RESTConnector.Request req, RESTConnec } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticModelsResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticModelsResp()", "OnGetCustomAcousticModelsResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2283,7 +2283,7 @@ private void OnCreateAcousticCustomizationResp(RESTConnector.Request req, RESTCo } catch (Exception e) { - Log.Error("Speech To Text", "OnCreateAcousticCustomizationResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnCreateAcousticCustomizationResp()", "OnCreateAcousticCustomizationResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2403,7 +2403,7 @@ private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnect } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticModelResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticModelResp()", "OnGetCustomAcousticModelResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2573,7 +2573,7 @@ private void OnGetCustomAcousticResourcesResp(RESTConnector.Request req, RESTCon } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticResourcesResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticResourcesResp()", "OnGetCustomAcousticResourcesResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2701,7 +2701,7 @@ private void OnGetCustomAcousticResourceResp(RESTConnector.Request req, RESTConn } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticResourceResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticResourceResp()", "OnGetCustomAcousticResourceResp Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs b/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs index 3bb6b79b1..759e010ed 100644 --- a/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs +++ b/Scripts/Services/TextToSpeech/v1/TextToSpeech.cs @@ -122,7 +122,7 @@ private string GetVoiceType(VoiceType voiceType) } else { - Log.Warning("TextToSpeech", "There is no voicetype for {0}!", voiceType); + Log.Warning("TextToSpeech.GetVoiceType()", "There is no voicetype for {0}!", voiceType); return null; } } @@ -195,7 +195,7 @@ private void OnGetVoicesResp(RESTConnector.Request req, RESTConnector.Response r } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetVoices Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetVoicesResp()", "GetVoices Exception: {0}", e.ToString()); resp.Success = false; } } @@ -262,7 +262,7 @@ private void OnGetVoiceResp(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("TextToSpeech", "GetVoice Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetVoiceResp()", "GetVoice Exception: {0}", e.ToString()); resp.Success = false; } } @@ -306,12 +306,12 @@ private class ToSpeechRequest : RESTConnector.Request if (!_audioFormats.ContainsKey(_audioFormat)) { - Log.Error("TextToSpeech", "Unsupported audio format: {0}", _audioFormat.ToString()); + Log.Error("TextToSpeech.ToSpeech()", "Unsupported audio format: {0}", _audioFormat.ToString()); return false; } if (!_voiceTypes.ContainsKey(_voice)) { - Log.Error("TextToSpeech", "Unsupported voice: {0}", _voice.ToString()); + Log.Error("TextToSpeech.ToSpeech()", "Unsupported voice: {0}", _voice.ToString()); return false; } @@ -320,7 +320,7 @@ private class ToSpeechRequest : RESTConnector.Request RESTConnector connector = RESTConnector.GetConnector(Credentials, "/v1/synthesize"); if (connector == null) { - Log.Error("TextToSpeech", "Failed to get connector."); + Log.Error("TextToSpeech.ToSpeech()", "Failed to get connector."); return false; } @@ -358,7 +358,7 @@ private void ToSpeechResponse(RESTConnector.Request req, RESTConnector.Response AudioClip clip = resp.Success ? ProcessResponse(speechReq.TextId, resp.Data) : null; if (clip == null) - Log.Error("TextToSpeech", "Request Failed: {0}", resp.Error); + Log.Error("TextToSpeech.ToSpeechResponse()", "Request Failed: {0}", resp.Error); if (speechReq.Callback != null) speechReq.Callback(clip, speechReq.Data); @@ -374,7 +374,7 @@ private AudioClip ProcessResponse(string textId, byte[] data) break; } - Log.Error("TextToSpeech", "Unsupported audio format: {0}", _audioFormat.ToString()); + Log.Error("TextToSpeech.ProcessResponse()", "Unsupported audio format: {0}", _audioFormat.ToString()); return null; } #endregion @@ -457,7 +457,7 @@ private void OnGetPronunciationResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Text To Speech", "GetPronunciation Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetPronunciationResp()", "GetPronunciation Exception: {0}", e.ToString()); resp.Success = false; } } @@ -526,7 +526,7 @@ private void OnGetCustomizationsResp(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Text To Speech", "GetCustomizations Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetCustomizationsResp()", "GetCustomizations Exception: {0}", e.ToString()); resp.Success = false; } } @@ -614,7 +614,7 @@ private void OnCreateCustomizationResp(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("Text To Speech", "CreateCustomization Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnCreateCustomizationResp()", "CreateCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -740,7 +740,7 @@ private void OnGetCustomizationResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Text To Speech", "GetCustomization Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetCustomizationResp()", "GetCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -879,7 +879,7 @@ private void OnGetCustomizationWordsResp(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("Text To Speech", "GetCustomizationWords Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetCustomizationWordsResp()", "GetCustomizationWords Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1078,7 +1078,7 @@ private void OnGetCustomizationWordResp(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Text To Speech", "GetCustomizationWord Exception: {0}", e.ToString()); + Log.Error("TextToSpeech.OnGetCustomizationWordResp()", "GetCustomizationWord Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1108,7 +1108,7 @@ private void OnGetCustomizationWordResp(RESTConnector.Request req, RESTConnector /// public bool AddCustomizationWord(AddCustomizationWordCallback callback, string customizationID, string word, string translation, string customData = default(string)) { - Log.Error("TextToSpeech", "AddCustomizationWord is not supported. Unity WWW does not support PUT method! Use AddCustomizationWords() instead!"); + Log.Error("TextToSpeech.AddCustomizationWord()", "AddCustomizationWord is not supported. Unity WWW does not support PUT method! Use AddCustomizationWords() instead!"); if (callback == null) throw new ArgumentNullException("callback"); if (string.IsNullOrEmpty(customizationID)) diff --git a/Scripts/Services/ToneAnalyzer/v3/ToneAnalyzer.cs b/Scripts/Services/ToneAnalyzer/v3/ToneAnalyzer.cs index 18b907a6b..3be1d0c01 100644 --- a/Scripts/Services/ToneAnalyzer/v3/ToneAnalyzer.cs +++ b/Scripts/Services/ToneAnalyzer/v3/ToneAnalyzer.cs @@ -162,7 +162,7 @@ private void GetToneAnalyzerResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("ToneAnalyzer", "GetToneAnalyzerResponse Exception: {0}", e.ToString()); + Log.Error("ToneAnalyzer.GetToneAnalyzerResponse()", "GetToneAnalyzerResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/TradeoffAnalytics/v1/TradeoffAnalytics.cs b/Scripts/Services/TradeoffAnalytics/v1/TradeoffAnalytics.cs index 4b30e8586..5535ea826 100644 --- a/Scripts/Services/TradeoffAnalytics/v1/TradeoffAnalytics.cs +++ b/Scripts/Services/TradeoffAnalytics/v1/TradeoffAnalytics.cs @@ -140,7 +140,7 @@ private void GetDilemmaResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("TradeoffAnalytics", "GetDilemmaResponse Exception: {0}", e.ToString()); + Log.Error("TradeoffAnalytics.GetDilemmaResponse()", "GetDilemmaResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs b/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs index f24f0b2c2..82196ad0f 100644 --- a/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs +++ b/Scripts/Services/VisualRecognition/v3/VisualRecognition.cs @@ -312,7 +312,7 @@ public VisualRecognition(Credentials credentials) } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.Classify()", "Failed to upload {0}!", imagePath); } return Classify(callback, imageData, owners, classifierIDs, threshold, acceptLanguage); @@ -408,7 +408,7 @@ private void OnClassifyResp(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("Visual Recognition", "Classify exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnClassifyResp()", "Classify exception: {0}", e.ToString()); } } @@ -484,7 +484,7 @@ private void OnClassifyResp(RESTConnector.Request req, RESTConnector.Response re } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.DetectFaces()", "Failed to upload {0}!", imagePath); } return DetectFaces(callback, imageData, customData); @@ -565,7 +565,7 @@ private void OnDetectFacesResp(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Visual Recognition", "Detect faces exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnDetectFacesResp()", "Detect faces exception: {0}", e.ToString()); } } @@ -644,7 +644,7 @@ private void OnDetectFacesResp(RESTConnector.Request req, RESTConnector.Response } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.RecognizeText()", "Failed to upload {0}!", imagePath); } return RecognizeText(callback, imageData, customData); @@ -720,7 +720,7 @@ private void OnRecognizeTextResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Visual Recognition", "Detect text exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnRecognizeTextResp()", "Detect text exception: {0}", e.ToString()); } } @@ -795,7 +795,7 @@ private void OnGetClassifiersResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("VisualRecognition", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetClassifiersResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -869,7 +869,7 @@ private void OnGetClassifierResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Visual Recognition", "GetClassifier Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetClassifierResp()", "GetClassifier Exception: {0}", e.ToString()); resp.Success = false; } } @@ -926,7 +926,7 @@ private void OnGetClassifierResp(RESTConnector.Request req, RESTConnector.Respon } if (positiveExamplesData.Count == 0 || negativeExamplesData == null) - Log.Error("VisualRecognition", "Failed to upload positive or negative examples!"); + Log.Error("VisualRecognition.TrainClassifier()", "Failed to upload positive or negative examples!"); return TrainClassifier(callback, classifierName, positiveExamplesData, negativeExamplesData, mimeType, customData); } @@ -1009,7 +1009,7 @@ private void OnTrainClassifierResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("VisualRecognition", "TrainClassifiers Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnTrainClassifierResp()", "TrainClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1067,7 +1067,7 @@ private void OnTrainClassifierResp(RESTConnector.Request req, RESTConnector.Resp } if (positiveExamplesData.Count == 0 && negativeExamplesData == null) - Log.Error("VisualRecognition", "Failed to upload positive or negative examples!"); + Log.Error("VisualRecognition.UpdateClassifier()", "Failed to upload positive or negative examples!"); return UpdateClassifier(callback, classifierID, classifierName, positiveExamplesData, negativeExamplesData, mimeType, customData); } @@ -1233,7 +1233,7 @@ private void OnGetCollectionsResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("VisualRecognition", "GetCollections Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetCollectionsResp()", "GetCollections Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1318,7 +1318,7 @@ private void OnCreateCollectionResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("VisualRecognition", "OnCreateCollectionResp Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnCreateCollectionResp()", "OnCreateCollectionResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1458,7 +1458,7 @@ private void OnGetCollectionResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("VisualRecognition", "GetCollection Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetCollectionResp()", "GetCollection Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1539,7 +1539,7 @@ private void OnGetCollectionImagesResp(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("VisualRecognition", "GetCollectionImages Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetCollectionImagesResp()", "GetCollectionImages Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1588,7 +1588,7 @@ public bool AddCollectionImage(OnAddCollectionImage callback, string collectionI } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.AddCollectionImage()", "Failed to upload {0}!", imagePath); } return AddCollectionImage(callback, collectionID, imageData, Path.GetFileName(imagePath), GetMetadataJson(metadata), customData); @@ -1631,7 +1631,7 @@ public bool AddCollectionImage(OnAddCollectionImage callback, string collectionI } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.AddCollectionImage()", "Failed to upload {0}!", imagePath); } string metadata = null; @@ -1640,7 +1640,7 @@ public bool AddCollectionImage(OnAddCollectionImage callback, string collectionI metadata = File.ReadAllText(metadataPath); if (string.IsNullOrEmpty(metadata)) - Log.Error("VisualRecognition", "Failed to read {0}!", imagePath); + Log.Error("VisualRecognition.AddCollectionImage()", "Failed to read {0}!", imagePath); } return AddCollectionImage(callback, collectionID, imageData, Path.GetFileName(imagePath), metadata, customData); @@ -1734,7 +1734,7 @@ private void OnAddCollectionImageResp(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("VisualRecognition", "OnCreateCollectionResp Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnAddCollectionImageResp()", "OnCreateCollectionResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1889,7 +1889,7 @@ private void OnGetCollectionImageResp(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("VisualRecognition", "GetCollectionImage Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetCollectionImageResp()", "GetCollectionImage Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2045,7 +2045,7 @@ private void OnGetCollectionImageMetadataResp(RESTConnector.Request req, RESTCon } catch (Exception e) { - Log.Error("VisualRecognition", "GetCollectionImage Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnGetCollectionImageMetadataResp()", "GetCollectionImage Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2094,7 +2094,7 @@ public bool FindSimilar(OnFindSimilar callback, string collectionID, string imag } if (imageData == null) - Log.Error("VisualRecognition", "Failed to upload {0}!", imagePath); + Log.Error("VisualRecognition.FindSimilar()", "Failed to upload {0}!", imagePath); } return FindSimilar(callback, collectionID, imageData, limit, customData); @@ -2187,7 +2187,7 @@ private void OnFindSimilarResp(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("VisualRecognition", "OnCreateCollectionResp Exception: {0}", e.ToString()); + Log.Error("VisualRecognition.OnFindSimilarResp()", "OnCreateCollectionResp Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/UnitTests/UnitTest.cs b/Scripts/UnitTests/UnitTest.cs index 518a6e5fd..b40c121b7 100644 --- a/Scripts/UnitTests/UnitTest.cs +++ b/Scripts/UnitTests/UnitTest.cs @@ -48,14 +48,14 @@ public void Test(bool condition) { if (!condition) { - Log.Error("UnitTest", "UnitTest {0} has failed, Stack:\n{1}", GetType().Name, StackTraceUtility.ExtractStackTrace()); + Log.Error("UnitTest.Test()", "UnitTest {0} has failed, Stack:\n{1}", GetType().Name, StackTraceUtility.ExtractStackTrace()); TestFailed = true; } else { - Log.Status("UnitTest", "UnitTest {0} has passed.", GetType().Name); + Log.Status("UnitTest.Test()", "UnitTest {0} has passed.", GetType().Name); #if PRINT_ENDPOINT - Log.Status("UnitTest", "endpoint: {0}", _url); + Log.Status("UnitTest.Test()", "endpoint: {0}", _url); #endif } } diff --git a/Scripts/UnitTests/UnitTestManager.cs b/Scripts/UnitTests/UnitTestManager.cs index 3d0cd6768..69790a4d4 100644 --- a/Scripts/UnitTests/UnitTestManager.cs +++ b/Scripts/UnitTests/UnitTestManager.cs @@ -115,7 +115,7 @@ private IEnumerator RunTestsCR() { if ((string.IsNullOrEmpty(_activeTest.ProjectToTest()) && string.IsNullOrEmpty(ProjectToTest)) || (_activeTest.ProjectToTest() == ProjectToTest) || (!string.IsNullOrEmpty(_activeTest.ProjectToTest()) && !string.IsNullOrEmpty(ProjectToTest) && ProjectToTest.ToLower().Contains(_activeTest.ProjectToTest().ToLower()))) { - Log.Status("UnitTestManager", "STARTING UnitTest {0} ...", testType.Name); + Log.Status("UnitTestManager.RunTestsCR()", "STARTING UnitTest {0} ...", testType.Name); // wait for the test to complete.. bool bTestException = true; @@ -131,7 +131,7 @@ private IEnumerator RunTestsCR() yield return null; if ((DateTime.Now - startTime).TotalSeconds > TestTimeout) { - Log.Error("UnitTestManager", "UnitTest {0} has timed out.", testType.Name); + Log.Error("UnitTestManager.RunTestsCR()", "UnitTest {0} has timed out.", testType.Name); _activeTest.TestFailed = true; break; } @@ -140,12 +140,12 @@ private IEnumerator RunTestsCR() bTestException = false; if (_activeTest.TestFailed) { - Log.Error("UnitTestManager", "... UnitTest {0} FAILED.", testType.Name); + Log.Error("UnitTestManager.RunTestsCR()", "... UnitTest {0} FAILED.", testType.Name); TestsFailed += 1; } else { - Log.Status("UnitTestManager", "... UnitTest {0} COMPLETED.", testType.Name); + Log.Status("UnitTestManager.RunTestsCR()", "... UnitTest {0} COMPLETED.", testType.Name); TestsComplete += 1; } } @@ -155,7 +155,7 @@ private IEnumerator RunTestsCR() if (bTestException) { - Log.Error("UnitTestManager", "... UnitTest {0} threw exception.", testType.Name); + Log.Error("UnitTestManager.RunTestsCR()", "... UnitTest {0} threw exception.", testType.Name); TestsFailed += 1; } } @@ -167,7 +167,7 @@ private IEnumerator RunTestsCR() } else { - Log.Error("UnitTestManager", "Failed to instantiate test {0}.", testType.Name); + Log.Error("UnitTestManager.RunTestsCR()", "Failed to instantiate test {0}.", testType.Name); TestsFailed += 1; } @@ -178,11 +178,11 @@ private IEnumerator RunTestsCR() if (TestsComplete == 0 && TestsFailed == 0) { - Log.Status("UnitTestManager", "Nothing to Test"); + Log.Status("UnitTestManager.RunTestsCR()", "Nothing to Test"); } else { - Log.Status("UnitTestManager", "Tests Completed: {0}, Tests Failed: {1}", TestsComplete, TestsFailed); + Log.Status("UnitTestManager.RunTestsCR()", "Tests Completed: {0}, Tests Failed: {1}", TestsComplete, TestsFailed); } #if UNITY_EDITOR @@ -251,7 +251,7 @@ static public void All() if (kv[0] == "ProjectName") { ProjectToTest = kv.Length > 1 ? kv[1] : ""; - Log.Status("RunUnitTest", "AutoLunchOptions ProjectToTest:{0}", ProjectToTest); + Log.Status("UnitTestManager.RunUnitTest()", "AutoLunchOptions ProjectToTest:{0}", ProjectToTest); break; } } diff --git a/Scripts/Utilities/AudioClipUtil.cs b/Scripts/Utilities/AudioClipUtil.cs index 989ca16ff..f750b09be 100644 --- a/Scripts/Utilities/AudioClipUtil.cs +++ b/Scripts/Utilities/AudioClipUtil.cs @@ -51,7 +51,7 @@ public static AudioClip Combine(params AudioClip[] clips) if (firstClip.channels != clips[i].channels || firstClip.frequency != clips[i].frequency) { - Log.Error("AudioClipUtil", "Combine() requires clips to have the sample number of channels and same frequency."); + Log.Error("AudioClipUtil.Combine()", "Combine() requires clips to have the sample number of channels and same frequency."); return null; } } diff --git a/Scripts/Utilities/EventManager.cs b/Scripts/Utilities/EventManager.cs index 1b2d1ea59..28e08597a 100644 --- a/Scripts/Utilities/EventManager.cs +++ b/Scripts/Utilities/EventManager.cs @@ -102,7 +102,7 @@ public bool SendEvent(string eventName, params object[] args) { if (receivers[i] == null) { - Log.Warning("EventManager", "Removing invalid event receiver."); + Log.Warning("EventManager.SendEvent()", "Removing invalid event receiver."); receivers.RemoveAt(i--); continue; } @@ -112,7 +112,7 @@ public bool SendEvent(string eventName, params object[] args) } catch (Exception ex) { - Log.Error("EventManager", "Event Receiver Exception: {0}", ex.ToString()); + Log.Error("EventManager.SendEvent()", "Event Receiver Exception: {0}", ex.ToString()); } } return true; diff --git a/Scripts/Utilities/Utility.cs b/Scripts/Utilities/Utility.cs index 420fe5d7b..242113494 100644 --- a/Scripts/Utilities/Utility.cs +++ b/Scripts/Utilities/Utility.cs @@ -440,7 +440,7 @@ public static byte[] Color32ArrayToByteArray(Color32[] colors) } catch (Exception e) { - Log.Error("Utility", "DeserializeResponse Exception: {0}", e.ToString()); + Log.Error("Utility.DeserializeResponse()", "DeserializeResponse Exception: {0}", e.ToString()); } return null; @@ -1241,7 +1241,7 @@ private static void OnGetTokenResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Visual Recognition", "GetClassifier Exception: {0}", e.ToString()); + Log.Error("Utility.OnGetTokenResp()", "Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Utilities/WaveFile.cs b/Scripts/Utilities/WaveFile.cs index 58f7a180e..eea2859d8 100644 --- a/Scripts/Utilities/WaveFile.cs +++ b/Scripts/Utilities/WaveFile.cs @@ -118,7 +118,7 @@ public static AudioClip ParseWAV(string clipName, byte[] data) IFF_FORM_CHUNK form = ReadType(reader); if (GetID(form.form_id) != "RIFF" || GetID(form.id) != "WAVE") { - Log.Error("TextToSpeech", "Malformed WAV header: {0} != RIFF || {1} != WAVE", GetID(form.form_id), GetID(form.id)); + Log.Error("WaveFile.ParseWAV()", "Malformed WAV header: {0} != RIFF || {1} != WAVE", GetID(form.form_id), GetID(form.id)); return null; } diff --git a/Scripts/Widgets/Widget.cs b/Scripts/Widgets/Widget.cs index a5fdb5151..aa94e9ca2 100644 --- a/Scripts/Widgets/Widget.cs +++ b/Scripts/Widgets/Widget.cs @@ -207,10 +207,10 @@ public virtual void Start(Widget owner) { DataReceiver = info.CreateDelegate(typeof(OnReceiveData), Owner) as OnReceiveData; if (DataReceiver == null) - Log.Error("Widget", "CreateDelegate failed for function {0}", ReceiverFunction); + Log.Error("Widget.Start()", "CreateDelegate failed for function {0}", ReceiverFunction); } else - Log.Error("Widget", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); + Log.Error("Widget.Start()", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); #else MethodInfo info = Owner.GetType().GetMethod(ReceiverFunction, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod); @@ -218,10 +218,10 @@ public virtual void Start(Widget owner) { DataReceiver = Delegate.CreateDelegate(typeof(OnReceiveData), Owner, info) as OnReceiveData; if (DataReceiver == null) - Log.Error("Widget", "CreateDelegate failed for function {0}", ReceiverFunction); + Log.Error("Widget.Start()", "CreateDelegate failed for function {0}", ReceiverFunction); } else - Log.Error("Widget", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); + Log.Error("Widget.Start()", "Failed to find receiver function {0} in object {1}.", ReceiverFunction, Owner.gameObject.name); #endif } } @@ -348,7 +348,7 @@ public bool ResolveTargetInput() } } - Log.Error("Widget", "Failed to resolve target {0} for object {1}.", _targetConnection, _targetObject.name); + Log.Error("Widget.ResolveTargetInput()", "Failed to resolve target {0} for object {1}.", _targetConnection, _targetObject.name); return false; } @@ -461,7 +461,7 @@ public virtual bool SendData(Data data) } catch (Exception e) { - Log.Error("Widget", "Exception sending data {0} to input {1} on object {2}: {3}", + Log.Error("Widget.SendData()", "Exception sending data {0} to input {1} on object {2}: {3}", data.Name, c.TargetInput.InputName, c.TargetObject.name, e.ToString()); } } From 7cd9fbde670deb32870411d5e57730777b8f3694 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 3 Nov 2017 11:30:14 -0500 Subject: [PATCH 051/100] refactored logs in readme --- README.md | 4 +- Scripts/Services/AlchemyAPI/v1/README.md | 72 +++++------ Scripts/Services/Conversation/v1/README.md | 18 +-- Scripts/Services/Discovery/v1/README.md | 76 ++++++------ .../Services/DocumentConversion/v1/README.md | 4 +- .../Services/LanguageTranslation/v2/README.md | 28 ++--- .../Services/LanguageTranslator/v2/README.md | 28 ++--- .../NaturalLanguageClassifier/v2/README.md | 20 +-- .../NaturalLanguageUnderstanding/v1/README.md | 12 +- .../Services/PersonalityInsights/v3/README.md | 4 +- Scripts/Services/RetrieveAndRank/v1/README.md | 78 ++++++------ Scripts/Services/SpeechToText/v1/README.md | 114 +++++++++--------- Scripts/Services/TextToSpeech/v1/README.md | 44 +++---- Scripts/Services/ToneAnalyzer/v3/README.md | 4 +- .../Services/TradeoffAnalytics/v1/README.md | 4 +- .../Services/VisualRecognition/v3/README.md | 78 ++++++------ 16 files changed, 294 insertions(+), 294 deletions(-) diff --git a/README.md b/README.md index f93eeb896..e28219fec 100755 --- a/README.md +++ b/README.md @@ -127,13 +127,13 @@ AuthenticationToken _authenticationToken; void Start() { if (!Utility.GetToken(OnGetToken, , , )) - Log.Debug("ExampleGetToken", "Failed to get token."); + Log.Debug("ExampleGetToken.Start()", "Failed to get token."); } private void OnGetToken(AuthenticationToken authenticationToken, string customData) { _authenticationToken = authenticationToken; - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.OnGetToken()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); } ``` diff --git a/Scripts/Services/AlchemyAPI/v1/README.md b/Scripts/Services/AlchemyAPI/v1/README.md index f88b93810..7c0e5dd9e 100644 --- a/Scripts/Services/AlchemyAPI/v1/README.md +++ b/Scripts/Services/AlchemyAPI/v1/README.md @@ -22,12 +22,12 @@ You can extract Authors from a URL or HTML source. private void GetAuthors() { if(!_alchemyApi.GetAuthors(OnGetAuthors, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors"); } private void OnGetAuthors(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthors()", "Alchemy Language - Get authors response html: {0}", data); } ``` @@ -37,12 +37,12 @@ You can get Concepts from a URL, HTML or Text source. private void GetRankedConcepts() { if(!_alchemyApi.GetRankedConcepts(OnGetConcepts, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } private void OnGetConcepts(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConcepts()", "Alchemy Language - Get ranked concepts response text: {0}", data); } ``` @@ -52,12 +52,12 @@ You can extract Dates from a URL, HTML or Text source. private void GetRankedConcepts() { if(!_alchemyApi.GetDates(OnGetConcepts, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } private void OnGetDates(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDates()", "Alchemy Language - Get dates response html: {0}", data); } ``` @@ -67,12 +67,12 @@ You can get Emotions from a URL, HTML or Text source. private void GetEmotions() { if(!_alchemyApi.GetEmotions(OnGetEmotions, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions"); } private void OnGetEmotions(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotions()", "Alchemy Language - Get emotions response html: {0}", data); } ``` @@ -82,12 +82,12 @@ You can extract Entities from a URL, HTML or Text source. private void ExtractEntities() { if(!_alchemyApi.ExtractEntities(OnExtractEntities, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get emotions"); } private void OnExtractEntities(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntities()", "Alchemy Language - Extract entities response html: {0}", data); } ``` @@ -97,12 +97,12 @@ You can detect RSS Feeds from a URL source. private void GetFeeds() { if(!m_AlchemyLanguage.DetectFeeds(OnDetectFeeds, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds."); + Log.Debug("ExampleAlchemyLanguage.GetFeeds()", "Failed to get feeds."); } private void OnDetectFeeds(FeedData feedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnDetectFeeds()", "Alchemy Language - Detect feeds response url: {0}", data); } ``` @@ -112,12 +112,12 @@ You can extract Keywords form a URL, HTML or Text source. private void GetKeywords() { if(!m_AlchemyLanguage.ExtractKeywords(OnExtractKeywords, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetKeywords()", "Failed to get keywords by URL POST"); } private void OnExtractKeywords(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywords()", "Alchemy Language - Extract keywords response html: {0}", data); } ``` @@ -127,12 +127,12 @@ You can extract the language of a URL, HTML or Text source. private void GetLanguages() { if(!m_AlchemyLanguage.GetLanguages(OnGetLanguages, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages"); } private void OnGetLanguages(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguages()", "Alchemy Language - Get languages response html: {0}", data); } ``` @@ -142,12 +142,12 @@ You can get the Microformat of a URL source. private void GetMicroformats() { if(!m_AlchemyLanguage.GetMicroformats(OnGetMicroformats, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats"); + Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats"); } private void OnGetMicroformats(MicroformatData microformats, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetMicroformats()", "Alchemy Language - Get microformats response url: {0}", data); } ``` @@ -157,12 +157,12 @@ You can extract the publication date from a URL or HTML source. private void GetPublicationDate() { if(!m_AlchemyLanguage.GetPublicationDate(OnGetPublicationDate, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates"); } private void OnGetPublicationDate(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDate()", "Alchemy Language - Get publication date response url: {0}", data); } ``` @@ -172,12 +172,12 @@ You can extract Relations from a URL, HTML or Text source. private void GetRelations() { if(!m_AlchemyLanguage.GetRelations(OnGetRelations, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations"); } private void OnGetRelations(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelations()", "Alchemy Language - Get relations response html: {0}", data); } ``` @@ -187,12 +187,12 @@ You can extract the Sentiment from a URL, HTML or Text source. private void GetTextSentiment() { if(!m_AlchemyLanguage.GetTextSentiment(OnGetTextSentiment, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment"); } private void OnGetTextSentiment(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentiment()", "Alchemy Language - Get text sentiment response html: {0}", data); } ``` @@ -202,12 +202,12 @@ You can extract a Targeted Sentiment from a URL, HTML or Text source. Targets ar private void GetTargetedSentiment() { if(!m_AlchemyLanguage.GetTargetedSentiment(OnGetTargetedSentiment, , )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment"); } private void OnGetTargetedSentiment(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentiment()", "Alchemy Language - Get targeted sentiment response html: {0}", data); } ``` @@ -217,12 +217,12 @@ You can get the Taxonomy of entities from a URL, HTML or Text source. private void GetRankedTaxonomy() { if(!m_AlchemyLanguage.GetRankedTaxonomy(OnGetRankedTaxonomy, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy"); } private void OnGetRankedTaxonomy(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomy()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); } ``` @@ -232,12 +232,12 @@ You can exctract the Text from a URL or HTML source. private void GetText() { if(!m_AlchemyLanguage.GetText(OnGetText, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text"); } private void OnGetText(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetText()", "Alchemy Language - Get Text HTML response: {0}", data); } ``` @@ -247,12 +247,12 @@ You can exctract the Raw Text from a URL or HTML source. private void GetRawText() { if(!m_AlchemyLanguage.GetRawText(OnGetText, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text"); } private void OnGetRawText(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawText()", "Alchemy Language - Get raw text HTML response: {0}", data); } ``` @@ -262,12 +262,12 @@ You can extract the Title form a URL or HTML source. private void GetTitle() { if(!m_AlchemyLanguage.GetTitle(OnGetTitle, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); } private void OnGetTitle(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitle()", "Alchemy Language - Get Title Url response: {0}", data); } ``` @@ -277,12 +277,12 @@ You can combine multiple requests into one call using a Combined Data call from private void CombinedCall() { if(!m_AlchemyLanguage.GetCombinedData(OnGetCombinedData, , , , , , , , , , , , , , , , )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.CombinedCall()", "Failed to get combined data by text POST"); } private void OnGetCombinedData(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedData()", "Alchemy Language - Get Combined Data Text response: {0}", data); } ``` diff --git a/Scripts/Services/Conversation/v1/README.md b/Scripts/Services/Conversation/v1/README.md index f36138aa9..3eb085f99 100755 --- a/Scripts/Services/Conversation/v1/README.md +++ b/Scripts/Services/Conversation/v1/README.md @@ -29,12 +29,12 @@ Send a message to the Conversation instance private void Message() { if (!_conversation.Message(OnMessage, , )) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); } ``` ```cs @@ -50,12 +50,12 @@ private void Message() }; if (!_conversation.Message(OnMessage, , messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); } ``` ```cs @@ -65,12 +65,12 @@ Dictionary _context; // context to persist private void Message0() { if (!_conversation.Message(OnMessage, , )) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage0(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage0()", "Conversation: Message Response: {0}", data); // Set context for next round of messaging object _tempContext = null; @@ -79,7 +79,7 @@ private void OnMessage0(object resp, string data) if (_tempContext != null) _context = _tempContext as Dictionary; else - Log.Debug("ExampleConversation", "Failed to get context"); + Log.Debug("ExampleConversation.OnMessage0()", "Failed to get context"); } private void Message1() @@ -94,12 +94,12 @@ private void Message1() }; if (!_conversation.Message(OnMessage, , messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message1()", "Failed to message!"); } private void OnMessage1(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage1()", "Conversation: Message Response: {0}", data); } ``` diff --git a/Scripts/Services/Discovery/v1/README.md b/Scripts/Services/Discovery/v1/README.md index daf810f35..852bca8e4 100755 --- a/Scripts/Services/Discovery/v1/README.md +++ b/Scripts/Services/Discovery/v1/README.md @@ -27,12 +27,12 @@ Creates an environment for the service instance. Note: You can create only one e private void CreateEnvironment() { if (!_discovery.AddEnvironment(OnAddEnvironment, , , )) - Log.Debug("ExampleDiscovery", "Failed to add environment"); + Log.Debug("ExampleDiscovery.CreateEnvironment()", "Failed to add environment"); } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); } ``` @@ -47,12 +47,12 @@ List existing environments for the service instance. private void GetEnvironments() { if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscovery", "Failed to get environments"); + Log.Debug("ExampleDiscovery.GetEnvironments()", "Failed to get environments"); } private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); } ``` @@ -67,12 +67,12 @@ Gets detailed information about the specified environment. private void GetEnvironment() { if (!_discovery.GetEnvironment(OnGetEnvironment, )) - Log.Debug("ExampleDiscovery", "Failed to get environment"); + Log.Debug("ExampleDiscovery.GetEnvironment()", "Failed to get environment"); } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); } ``` @@ -88,12 +88,12 @@ Deletes an existing environment. private void DeleteEnvironment() { if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, )) - Log.Debug("ExampleDiscovery", "Failed to delete environment"); + Log.Debug("ExampleDiscovery.DeleteEnvironment()", "Failed to delete environment"); } private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscovery", "Discovery - DeleteEnvironment Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteEnvironment()", "Discovery - DeleteEnvironment Response: deleted:{0}", success); } ``` @@ -108,12 +108,12 @@ Adds a configuration to the service instance. private void AddConfiguration() { if (!_discovery.AddConfiguration(OnAddConfiguration, , )) - Log.Debug("ExampleDiscovery", "Failed to add configuration"); + Log.Debug("ExampleDiscovery.AddConfiguration()", "Failed to add configuration"); } private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); } ``` @@ -128,12 +128,12 @@ Lists existing configurations for the service instance. private void GetConfigurations() { if (!_discovery.GetConfigurations(OnGetConfigurations, )) - Log.Debug("ExampleDiscovery", "Failed to get configurations"); + Log.Debug("ExampleDiscovery.GetConfigurations()", "Failed to get configurations"); } private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); } ``` @@ -148,12 +148,12 @@ Get information about the specified configuration. private void GetConfiguration() { if (!_discovery.GetConfiguration(OnGetConfiguration, , )) - Log.Debug("ExampleDiscovery", "Failed to get configuration"); + Log.Debug("ExampleDiscovery.GetConfiguration()", "Failed to get configuration"); } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); } ``` @@ -168,12 +168,12 @@ Runs a sample document through the default or your configuration and returns dia private void PreviewConfiguration() { if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, , , null, , )) - Log.Debug("ExampleDiscovery", "Failed to preview configuration"); + Log.Debug("ExampleDiscovery.PreviewConfiguration()", "Failed to preview configuration"); } private void OnPreviewConfiguration(TestDocument resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); } ``` @@ -190,12 +190,12 @@ The delete operation is performed unconditionally. A delete request succeeds eve private void DeleteConfiguration() { if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, , )) - Log.Debug("ExampleDiscovery", "Failed to delete configuration"); + Log.Debug("ExampleDiscovery.DeleteConfiguration()", "Failed to delete configuration"); } private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscovery", "Discovery - DeleteConfiguration Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteConfiguration()", "Discovery - DeleteConfiguration Response: deleted:{0}", success); } ``` @@ -210,12 +210,12 @@ Creates a new collection for storing documents. private void AddCollection() { if (!_discovery.AddCollection(OnAddCollection, , , , )) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.AddCollection()", "Failed to add collection"); } private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); } ``` @@ -230,12 +230,12 @@ Display a list of existing collections. private void GetCollections() { if (!_discovery.GetCollections(OnGetCollections, )) - Log.Debug("ExampleDiscovery", "Failed to get collections"); + Log.Debug("ExampleDiscovery.GetCollections()", "Failed to get collections"); } private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Get colletions Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get colletions Response: {0}", data); } ``` @@ -250,12 +250,12 @@ Show detailed information about an existing collection. private void GetCollection() { if (!_discovery.GetCollection(OnGetCollection, , )) - Log.Debug("ExampleDiscovery", "Failed to get collection"); + Log.Debug("ExampleDiscovery.GetCollection()", "Failed to get collection"); } private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); } ``` @@ -270,12 +270,12 @@ Gets a list of the unique fields, and each field's type, that are stored in a co private void GetFields() { if (!_discovery.GetFields(OnGetFields, , )) - Log.Debug("ExampleDiscovery", "Failed to get fields"); + Log.Debug("ExampleDiscovery.GetFields()", "Failed to get fields"); } private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); } ``` @@ -290,12 +290,12 @@ Deletes an existing collection. private void DeleteCollection() { if (!_discovery.DeleteCollection(OnDeleteCollection, , )) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.DeleteCollection()", "Failed to add collection"); } private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); } ``` @@ -311,12 +311,12 @@ Add a document to your collection. private void AddDocument() { if (!_discovery.AddDocument(OnAddDocument, , , , , null)) - Log.Debug("ExampleDiscovery", "Failed to add document"); + Log.Debug("ExampleDiscovery.AddDocument()", "Failed to add document"); } private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); } ``` @@ -332,12 +332,12 @@ Update or partially update a document to create or replace an existing document. private void UpdateDocument() { if (!_discovery.UpdateDocument(OnUpdateDocument, , , , , , null)) - Log.Debug("ExampleDiscovery", "Failed to update document"); + Log.Debug("ExampleDiscovery.UpdateDocument()", "Failed to update document"); } private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); } ``` @@ -353,12 +353,12 @@ Display status information about a submitted document. private void GetDocument() { if (!_discovery.GetDocument(OnGetDocument, , , )) - Log.Debug("ExampleDiscovery", "Failed to get document"); + Log.Debug("ExampleDiscovery.GetDocument()", "Failed to get document"); } private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); } ``` @@ -373,12 +373,12 @@ Delete a document from a collection. private void DeleteDocument() { if (!_discovery.DeleteDocument(OnDeleteDocument, , , )) - Log.Debug("ExampleDiscovery", "Failed to delete document"); + Log.Debug("ExampleDiscovery.DeleteDocument()", "Failed to delete document"); } private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); } ``` @@ -395,12 +395,12 @@ Once your content is uploaded and enriched by the Discovery service, you can bui private void Query() { if (!_discovery.Query(OnQuery, , , null, , null, 10, null, 0)) - Log.Debug("ExampleDiscovery", "Failed to query"); + Log.Debug("ExampleDiscovery.Query()", "Failed to query"); } private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscovery", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); } ``` diff --git a/Scripts/Services/DocumentConversion/v1/README.md b/Scripts/Services/DocumentConversion/v1/README.md index e4316b9d4..5a98e36c1 100755 --- a/Scripts/Services/DocumentConversion/v1/README.md +++ b/Scripts/Services/DocumentConversion/v1/README.md @@ -25,12 +25,12 @@ Converts a document to answer units, HTML or text. This method accepts a multipa void ConvertDocument () { if (!m_DocumentConversion.ConvertDocument(OnConvertDocument, , )) - Log.Debug("ExampleDocumentConversion", "Document conversion failed!"); + Log.Debug("ExampleDocumentConversion.ConvertDocument()", "Document conversion failed!"); } private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) { - Log.Debug("ExampleDocumentConversion", "DocuemntConversion - ConvertDocument Response: {0}", data); + Log.Debug("ExampleDocumentConversion.OnConvertDocument()", "DocuemntConversion - ConvertDocument Response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md index 5d2e4adbc..5754a1553 100755 --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslation.GetModels(OnGetModels)) - Log.Debug("ExampleLanguageTranslation", "Failed to get models."); + Log.Debug("ExampleLanguageTranslation.GetModels()", "Failed to get models."); } private void OnGetModels(TranslationModels models, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get models response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetModels()", "Language Translation - Get models response: {0}", data); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslation.CreateModel(OnCreateModel, , , )) - Log.Debug("ExampleLanguageTranslation", "Failed to create model."); + Log.Debug("ExampleLanguageTranslation.CreateModel()", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Create model response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnCreateModel()", "Language Translation - Create model response: {0}", data); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslation.GetModel(OnGetModel, )) - Log.Debug("ExampleLanguageTranslation", "Failed to get model."); + Log.Debug("ExampleLanguageTranslation.GetModel()", "Failed to get model."); } private void OnGetModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get model response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetModel()", "Language Translation - Get model response: {0}", data); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslation.DeleteModel(OnDeleteModel, )) - Log.Debug("ExampleLanguageTranslation", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslation.DeleteModel()", "Failed to delete model."); } private void OnDeleteModel(bool success, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslation.OnDeleteModel()", "Language Translation - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslation.GetTranslation(, , , OnGetTranslation)) - Log.Debug("ExampleLanguageTranslation", "Failed to translate."); + Log.Debug("ExampleLanguageTranslation.Translate()", "Failed to translate."); } private void OnGetTranslation(Translations translation, string data) { - Log.Debug("ExampleLanguageTranslation", "Langauge Translation - Translate Response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetTranslation()", "Langauge Translation - Translate Response: {0}", data); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslation.Identify(OnIdentify, )) - Log.Debug("ExampleLanguageTranslation", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslation.Identify()", "Failed to identify language."); } private void OnIdentify(string lang, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Identify response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnIdentify()", "Language Translation - Identify response: {0}", data); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslation.GetLanguages(OnGetLanguages)) - Log.Debug("ExampleLanguageTranslation", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslation.GetLanguages()", "Failed to get languages."); } private void OnGetLanguages(Languages languages, string data) { - Log.Debug("ExampleLanguageTranslation", "Language Translation - Get languages response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetLanguages()", "Language Translation - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md index eb0c0eac9..12f5a5965 100755 --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("ExampleLanguageTranslator", "Failed to get models."); + Log.Debug("ExampleLanguageTranslator.GetModels()", "Failed to get models."); } private void OnGetModels(TranslationModels models, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get models response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", data); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslator.CreateModel(OnCreateModel, , , )) - Log.Debug("ExampleLanguageTranslator", "Failed to create model."); + Log.Debug("ExampleLanguageTranslator.CreateModel()", "Failed to create model."); } private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Create model response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", data); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslator.GetModel(OnGetModel, )) - Log.Debug("ExampleLanguageTranslator", "Failed to get model."); + Log.Debug("ExampleLanguageTranslator.GetModel()", "Failed to get model."); } private void OnGetModel(TranslationModel model, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get model response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", data); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslator.DeleteModel(OnDeleteModel, )) - Log.Debug("ExampleLanguageTranslator", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslator.DeleteModel()", "Failed to delete model."); } private void OnDeleteModel(bool success, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslator.GetTranslation(, , , OnGetTranslation)) - Log.Debug("ExampleLanguageTranslator", "Failed to translate."); + Log.Debug("ExampleLanguageTranslator.Translate()", "Failed to translate."); } private void OnGetTranslation(Translations translation, string data) { - Log.Debug("ExampleLanguageTranslator", "Langauge Translator - Translate Response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", data); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslator.Identify(OnIdentify, )) - Log.Debug("ExampleLanguageTranslator", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslator.Identify()", "Failed to identify language."); } private void OnIdentify(string lang, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Identify response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", data); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("ExampleLanguageTranslator", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslator.GetLanguages()", "Failed to get languages."); } private void OnGetLanguages(Languages languages, string data) { - Log.Debug("ExampleLanguageTranslator", "Language Translator - Get languages response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/README.md b/Scripts/Services/NaturalLanguageClassifier/v2/README.md index b54258a12..689d1fd33 100755 --- a/Scripts/Services/NaturalLanguageClassifier/v2/README.md +++ b/Scripts/Services/NaturalLanguageClassifier/v2/README.md @@ -24,12 +24,12 @@ Returns an empty array if no classifiers are available. private void GetClassifiers() { if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifiers!"); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); } private void OnGetClassifiers(Classifiers classifiers, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); } ``` @@ -42,12 +42,12 @@ The status must be Available before you can use the classifier to classify calls private void Classify() { if (!naturalLanguageClassifier.Classify(, , OnClassify)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to classify!"); + Log.Debug("ExampleNaturalLanguageClassifier.Classify()", "Failed to classify!"); } private void OnClassify(ClassifyResult result, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); } ``` @@ -60,12 +60,12 @@ Sends data to create and train a classifier and returns information about the ne private void TrainClassifier() { if (!naturalLanguageClassifier.TrainClassifier(, , , OnTrainClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to train clasifier!"); + Log.Debug("ExampleNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); } private void OnTrainClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); } ``` @@ -77,12 +77,12 @@ Returns status and other information about a classifier private void GetClassifier() { if (!naturalLanguageClassifier.GetClassifier(, OnGetClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifier {0}!", classifierId); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } private void OnGetClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); } ``` @@ -95,12 +95,12 @@ Deletes a classifier private void DeleteClassifier() { if (!naturalLanguageClassifier.DeleteClassifer(, OnDeleteTrainedClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to delete clasifier {0}!", ); + Log.Debug("ExampleNaturalLanguageClassifier.DeleteClassifier()", "Failed to delete clasifier {0}!", ); } private void OnDeleteTrainedClassifier(bool success, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", , success, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", , success, data); } ``` diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md index 4296df235..91a46d7ae 100755 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -26,12 +26,12 @@ Analyze features of natural language content. private void Analyze() { if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, )) - Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); } private void OnAnalyze(AnalysisResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstanding", "AnalysisResults: {0}", data); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", data); } ``` @@ -43,12 +43,12 @@ List available custom models. private void GetModels() { if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); } private void OnGetModels(ListModelsResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstanding", "ListModelsResult: {0}", data); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnGetModels()", "ListModelsResult: {0}", data); } ``` @@ -60,12 +60,12 @@ Delete a custom model. private void DeleteModel() { if (!_naturalLanguageUnderstanding.DeleteModel(OnDeleteModel, )) - Log.Debug("ExampleNaturalLanguageUnderstanding", "Failed to delete model."); + Log.Debug("ExampleNaturalLanguageUnderstanding.DeleteModel()", "Failed to delete model."); } private void OnDeleteModel(bool success, string data) { - Log.Debug("ExampleNaturalLanguageUnderstanding", "DeleteModelResult: {0}", success); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnDeleteModel()", "DeleteModelResult: {0}", success); } ``` diff --git a/Scripts/Services/PersonalityInsights/v3/README.md b/Scripts/Services/PersonalityInsights/v3/README.md index c86db1fc2..575231c8e 100755 --- a/Scripts/Services/PersonalityInsights/v3/README.md +++ b/Scripts/Services/PersonalityInsights/v3/README.md @@ -28,12 +28,12 @@ Extract personality characteristics based on how a person writes. private void GetProfile() { if(!m_personalityInsights.GetProfile(OnGetProfileJson, dataPath, ContentType.TEXT_HTML, ContentLanguage.ENGLISH, ContentType.APPLICATION_JSON, AcceptLanguage.ENGLISH, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); } private void OnGetProfile(Profile profile, string data) { - Log.Debug("ExamplePersonalityInsights", "Profile result: {0}", data); + Log.Debug("ExamplePersonalityInsights.OnGetProfile()", "Profile result: {0}", data); } ``` diff --git a/Scripts/Services/RetrieveAndRank/v1/README.md b/Scripts/Services/RetrieveAndRank/v1/README.md index 62f473530..f5f9d6ade 100755 --- a/Scripts/Services/RetrieveAndRank/v1/README.md +++ b/Scripts/Services/RetrieveAndRank/v1/README.md @@ -26,12 +26,12 @@ Retrieves the list of Solr clusters for the service instance. void GetClusters() { if (!_retrieveAndRank.GetClusters(OnGetClusters)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get clusters!"); + Log.Debug("ExampleRetrieveAndRank.GetClusters()", "Failed to get clusters!"); } private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusters results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "GetClusters results: {0}", data); } ``` @@ -42,12 +42,12 @@ Provisions a Solr cluster asynchronously. When the operation is successful, the void CreateCluster() { if (!_retrieveAndRank.CreateCluster(OnCreateCluster, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create cluster!"); + Log.Debug("ExampleRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); } private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateCluster results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateClusterMethod()", "CreateCluster results: {0}", data); } ``` @@ -58,12 +58,12 @@ Stops and deletes a Solr Cluster asynchronously. void DeleteCluster() { if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete cluster!"); + Log.Debug("ExampleRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); } private void OnDeleteCluster(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteCluster results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCluster()", "DeleteCluster results: {0}", success); } ``` @@ -75,12 +75,12 @@ Returns status and other information about a cluster. void GetCluster() { if (!_retrieveAndRank.GetCluster(OnGetCluster, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster!"); + Log.Debug("ExampleRetrieveAndRank.GetCluster()", "Failed to get cluster!"); } private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetCluster results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "GetCluster results: {0}", data); } ``` @@ -91,12 +91,12 @@ Retrieves all configurations for a cluster. void GetClusterConfigs() { if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster configs!"); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); } private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfigs results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "GetClusterConfigs results: {0}", data); } ``` @@ -107,12 +107,12 @@ Deletes the configuration for a cluster. Before you delete the configuration, de void DeleteClusterConfig() { if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, , )) - Log.Debug("ExampleRetriveAndRank", "Failed to delete cluster config {0}", ); + Log.Debug("ExampleRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", ); } private void OnDeleteClusterConfig(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteClusterConfig results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteClusterConfig()", "DeleteClusterConfig results: {0}", success); } ``` @@ -123,12 +123,12 @@ Retrieves the configuration for a cluster by its name. void GetClusterConfig() { if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster config {0}!", ); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", ); } private void OnGetClusterConfig(byte[] respData, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "GetClusterConfig results: {0}", data); } ``` @@ -138,12 +138,12 @@ Saves the cluster config void SaveClusterConfig() { if(!_retrieveAndRank.SaveConfig(OnSaveConfig, , , data)) - Log.Debug("ExampleRetrieveAndRank", "Failed to save cluster config!"); + Log.Debug("ExampleRetrieveAndRank.SaveConfig()", "Failed to save cluster config!"); } private void OnSaveConfig(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "SaveClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSaveConfig()", "SaveClusterConfig results: {0}", data); } ``` @@ -154,12 +154,12 @@ Uploads a zip file containing the configuration files for your Solr collection. void UploadClusterConfig() { if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, , , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to upload cluster config {0}!", ); + Log.Debug("ExampleRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", ); } private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "UploadClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "UploadClusterConfig results: {0}", data); } ``` @@ -170,12 +170,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void ListCollections() { if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.LIST)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "ListCollections results: {0}", data); } ``` @@ -186,12 +186,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void CreateCollection() { if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, , CollectionsAction.CREATE, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); } private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "ListCollections results: {0}", data); } ``` @@ -202,12 +202,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void DeleteCollection() { if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.DELETE, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteCollection results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "DeleteCollection results: {0}", data); } ``` @@ -222,12 +222,12 @@ You must commit your documents to the index to search for them. For more informa void IndexDocuments() { if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, , , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to index documents!"); + Log.Debug("ExampleRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); } private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "IndexDocuments results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "IndexDocuments results: {0}", data); } ``` @@ -240,17 +240,17 @@ void Search() // Standard search string[] fl = { "title", "id", "body", "author", "bibliography" }; if (!_retrieveAndRank.Search(OnSearch, , , , fl)) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); // Ranked search string[] fl = { "title", "id", "body", "author", "bibliography" }; if (!_retrieveAndRank.Search(OnSearch, , , , fl, true, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); } private void OnSearch(SearchResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Search results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSearch()", "Search results: {0}", data); } ``` @@ -261,12 +261,12 @@ Retrieves the list of rankers for the service instance. void GetRankers() { if (!_retrieveAndRank.GetRankers(OnGetRankers)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get rankers!"); + Log.Debug("ExampleRetrieveAndRank.GetRankers()", "Failed to get rankers!"); } private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRankers results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "GetRankers results: {0}", data); } ``` @@ -279,12 +279,12 @@ When the operation is successful, the status of the ranker is set to Training. T void CreateRanker() { if (!_retrieveAndRank.CreateRanker(OnCreateRanker, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create ranker!"); + Log.Debug("ExampleRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); } private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateRanker results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "CreateRanker results: {0}", data); } ``` @@ -297,12 +297,12 @@ Use this method to return answers when you train the ranker with custom features void Rank() { if (!_retrieveAndRank.Rank(OnRank, , )) - Log.Debug("ExampleRetriveAndRank", "Failed to rank!"); + Log.Debug("ExampleRetrieveAndRank.Rank()", "Failed to rank!"); } private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Rank results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnRank()", "Rank results: {0}", data); } ``` @@ -313,12 +313,12 @@ Deletes a ranker. void DeleteRanker() { if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete ranker {0}!", ); + Log.Debug("ExampleRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", ); } private void OnDeleteRanker(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteRanker results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteRanker()", "DeleteRanker results: {0}", success); } ``` @@ -329,12 +329,12 @@ Returns status and other information about a ranker. void GetRanker() { if (!_retrieveAndRank.GetRanker(OnGetRanker, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get ranker!"); + Log.Debug("ExampleRetrieveAndRank.GetRanker()", "Failed to get ranker!"); } private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRanker results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "GetRanker results: {0}", data); } ``` [retrieve-and-rank-service]: https://www.ibm.com/watson/services/retrieve-and-rank/ diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md index b052e3d22..234afcf8c 100755 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -40,12 +40,12 @@ Retrieves a list of all models available for use with the service. The informati private void GetModels() { if(!_speechToText.GetModels(HandleGetModels)) - Log.Debug("ExampleSpeechToText", "Failed to get models"); + Log.Debug("ExampleSpeechToText.GetModels()", "Failed to get models"); } private void HandleGetModels(ModelSet result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetModels()", "Speech to Text - Get models response: {0}", data); } ``` @@ -58,12 +58,12 @@ Retrieves information about a single specified model that is available for use w private void GetModel() { if(!_speechToText.GetModel(HandleGetModel, )) - Log.Debug("ExampleSpeechToText", "Failed to get model"); + Log.Debug("ExampleSpeechToText.GetModel()", "Failed to get model"); } private void HandleGetModel(Model result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetModel()", "Speech to Text - Get model response: {0}", data); } ``` @@ -132,7 +132,7 @@ private void Recognize() _audioClip = WaveFile.ParseWAV(, ); if(!_speechToText.Recognize(HandleRecognize)) - Log.Debug("ExampleSpeechToText", "Failed to recognize!"); + Log.Debug("ExampleSpeechToText.Recognize()", "Failed to recognize!"); } private void HandleRecognize(SpeechRecognitionEvent result) @@ -144,7 +144,7 @@ private void HandleRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("ExampleSpeechToText.HandleRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -163,12 +163,12 @@ Lists information about all custom language models that are owned by the calling private void GetCustomizations() { if(!_speechToText.GetCustomizations(HandleGetCustomizations)) - Log.Debug("ExampleSpeechToText", "Failed to get customizations"); + Log.Debug("ExampleSpeechToText.GetCustomizations()", "Failed to get customizations"); } private void HandleGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", data); } ``` @@ -181,12 +181,12 @@ Lists information about a custom language model. Only the owner of a custom mode private void GetCustomization() { if(!_speechToText.GetCustomization(HandleGetCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to get customization"); + Log.Debug("ExampleSpeechToText.GetCustomization()", "Failed to get customization"); } private void HandleGetCustomization(Customization customization, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", data); } ``` @@ -199,12 +199,12 @@ Creates a new custom language model for a specified base language model. The cus private void CreateModel() { if(!_speechToText.CreateCustomization(HandleCreateCustomization, , , )) - Log.Debug("ExampleSpeechToText", "Failed to create custom model"); + Log.Debug("ExampleSpeechToText.CreateCustomization()", "Failed to create custom model"); } private void HandleCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Get model response: {0}", data); } ``` @@ -217,12 +217,12 @@ Initiates the training of a custom language model with new corpora, words, or bo private void TrainModel() { if(!_speechToText.TrainCustomization(HandleTrainCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.TrainCustomization()", "Failed to train custom model"); } private void HandleTrainCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Train model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Speech to Text - Train model response: {0}", success); } ``` @@ -236,12 +236,12 @@ Resets a custom language model by removing all corpora and words from the model. private void ResetModel() { if(!_speechToText.ResetCustomization(HandleResetCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.ResetCustomization()", "Failed to train custom model"); } private void HandleResetCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Reset model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Speech to Text - Reset model response: {0}", success); } ``` @@ -254,12 +254,12 @@ Upgrades a custom language model to the latest release level of the Speech to Te private void UpgradeModel() { if(!_speechToText.UpgradeCustomization(HandleUpgradeCustomizationh, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.UpgradeCustomization()", "Failed to train custom model"); } private void HandleUpgradeCustomizationh(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Upgrade model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleUpgradeCustomizationh()", "Speech to Text - Upgrade model response: {0}", success); } ``` --> @@ -272,12 +272,12 @@ Deletes an existing custom language model. The custom model cannot be deleted if private void DeleteModel() { if(!_speechToText.DeleteCustomization(HandleDeleteCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); + Log.Debug("ExampleSpeechToText.DeleteCustomization()", "Failed to delete custom model"); } private void HandleDeleteCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomization()", "Speech to Text - Delete model response: {0}", success); } ``` @@ -291,12 +291,12 @@ Adds a single corpus text file of new training data to the custom language model private void AddCustomCorpus() { if(!_speechToText.AddCustomCorpus(HandleAddCustomCorpus, , , , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); + Log.Debug("ExampleSpeechToText.AddCustomCorpus()", "Failed to delete custom model"); } private void HandleAddCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: {0}", success); } ``` @@ -310,12 +310,12 @@ Lists information about all corpora that have been added to the specified custom private void GetCorpora() { if(!_speechToText.GetCustomCorpora(HandleGetCustomCorpora, )) - Log.Debug("ExampleSpeechToText", "Failed to get custom corpora"); + Log.Debug("ExampleSpeechToText.GetCustomCorpora()", "Failed to get custom corpora"); } private void HandleGetCustomCorpora(Corpora corpora, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customdData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customdData); } ``` @@ -329,12 +329,12 @@ Lists information about a single specified corpus. The information includes the private void GetCorpus() { if(!_speechToText.GetCustomCorpus(HandleGetCustomCorpus, , )) - Log.Debug("ExampleSpeechToText", "Failed to get custom corpus"); + Log.Debug("ExampleSpeechToText.GetCustomCorpus()", "Failed to get custom corpus"); } private void HandleGetCustomCorpus(Corpus corpus, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customdData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customdData); } ``` @@ -348,12 +348,12 @@ Deletes an existing corpus from a custom language model. The service removes any private void DeleteCorpus() { if(!_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus"); + Log.Debug("ExampleSpeechToText.DeleteCustomCorpus()", "Failed to delete custom corpus"); } private void HandleDeleteCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom corpus response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - Delete custom corpus response: {0}", success); } ``` @@ -402,19 +402,19 @@ var words = new Words() private void AddCustomWordsUsingObject() { if(!_speechToText.AddCustomWords(HandleAddCustomWords, , words)) - Log.Debug("ExampleSpeechToText", "Failed to add custom words"); + Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } // Add custom words using words file private void AddCustomWordsUsingFile() { if(!_speechToText.AddCustomWords(HandleAddCustomWords, , )) - Log.Debug("ExampleSpeechToText", "Failed to add custom words"); + Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } private void HandleAddCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom words response: {0}", success); } ``` @@ -427,12 +427,12 @@ Lists information about all custom words from a custom language model. You can l private void GetCustomWords() { if(!_speechToText.GetCustomWords(HandleGetCustomWords, )) - Log.Debug("ExampleSpeechToText", "Failed to get custom words"); + Log.Debug("ExampleSpeechToText.GetCustomWordsMethod()", "Failed to get custom words"); } private void HandleGetCustomWords(WordsList wordList, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", data); } ``` @@ -446,12 +446,12 @@ Lists information about a custom word from a custom language model. Only the own private void GetCustomWord() { if(!_speechToText.GetCustomWord(HandleGetCustomWord, , )) - Log.Debug("ExampleSpeechToText", "Failed to get custom word"); + Log.Debug("ExampleSpeechToText.GetCustomWord()", "Failed to get custom word"); } private void HandleGetCustomWord(WordData word, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", data); } ``` @@ -467,12 +467,12 @@ Removing a custom word does not affect the custom model until you train the mode private void DeleteCustomWord() { if(!_speechToText.DeleteCustomWord(HandleDeleteCustomWord, , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom word"); + Log.Debug("ExampleSpeechToText.DeleteCustomWord()", "Failed to delete custom word"); } private void HandleDeleteCustomWord(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: {0}", success); } ``` @@ -484,12 +484,12 @@ Lists information about all custom acoustic models that are owned by an instance private void ListCustomAcousticModels() { if(!_speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels)) - Log.Debug("ExampleSpeechToText", "Failed to list custom acoustic models"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticModels()", "Failed to list custom acoustic models"); } private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", data); + Log.Debug("ExampleSpeechToText.HandleListCustomAcousticModels()", "acousticCustomizations: {0}", data); } ``` @@ -502,12 +502,12 @@ Creates a new custom acoustic model for a specified base model. The custom acous private void CreateAcousticCustomization() { if(!_speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to create acoustic customization"); + Log.Debug("ExampleSpeechToText.CreateAcousticCustomization()", "Failed to create acoustic customization"); } private void HandleCreateAcousticCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "customizationId: {0}", data); + Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", data); } ``` @@ -522,12 +522,12 @@ Deletes an existing custom acoustic model. The custom model cannot be deleted if private void DeleteAcousticCustomization() { if(!_speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to delete acoustic customization"); + Log.Debug("ExampleSpeechToText.DeleteAcousticCustomization()", "Failed to delete acoustic customization"); } private void HandleDeleteAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); } ``` @@ -541,12 +541,12 @@ Lists information about a specified custom acoustic model. You must use credenti private void GetCustomAcousticModel() { if(!_speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic model"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticModel()", "Failed to get custom acoustic model"); } private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", data); } ``` @@ -571,12 +571,12 @@ Training can fail to start for the following reasons: private void TrainAcousticCustomization() { if(!_speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, "", "", "")) - Log.Debug("ExampleSpeechToText", "Failed to train acoustic customization"); + Log.Debug("ExampleSpeechToText.TrainAcousticCustomization()", "Failed to train acoustic customization"); } private void HandleTrainAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); } ``` @@ -590,12 +590,12 @@ Resets a custom acoustic model by removing all audio resources from the model. R private void ResetAcousticCustomization() { if(!_speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to reset acoustic customizations"); + Log.Debug("ExampleSpeechToText.ResetAcousticCustomization()", "Failed to reset acoustic customizations"); } private void HandleResetAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); } ``` @@ -609,12 +609,12 @@ Lists information about all audio resources from a custom acoustic model. The in private void GetCustomAcousticResources() { if(!_speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resources"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticResources()", "Failed to get custom acoustic resources"); } private void HandleGetCustomAcousticResources(AudioResources audioResources, string data) { - Log.Debug("ExampleSpeechToText", "audioResources: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", data); } ``` @@ -628,12 +628,12 @@ Deletes an existing audio resource from a custom acoustic model. Deleting an arc private void DeleteAcousticResource() { if(!_speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, "", "")) - Log.Debug("ExampleSpeechToText", "Failed to delete acoustic resource"); + Log.Debug("ExampleSpeechToText.DeleteAcousticResource()", "Failed to delete acoustic resource"); } private void HandleDeleteAcousticResource(bool success, string data) { - Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } ``` @@ -652,12 +652,12 @@ The information includes the status of the specified audio resource, which is im private void GetCustomAcousticResource() { if(!_speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, "", "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resource"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticResource()", "Failed to get custom acoustic resource"); } private void HandleGetCustomAcousticResource(AudioListing audioListing, string data) { - Log.Debug("ExampleSpeechToText", "audioListing: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", data); } ``` @@ -685,12 +685,12 @@ private void AddAcousticResource() { string mimeType = Utility.GetMimeType(Path.GetExtension("")); if(!_speechToText.AddAcousticResource(HandleAddAcousticResource, "", "", mimeType, mimeType, true, "") - Log.Debug("ExampleSpeechToText", "Failed to add acoustic resource"); + Log.Debug("ExampleSpeechToText.AddAcousticResourceMethod()", "Failed to add acoustic resource"); } private void HandleAddAcousticResource(string data) { - Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", data); + Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", data); } ``` diff --git a/Scripts/Services/TextToSpeech/v1/README.md b/Scripts/Services/TextToSpeech/v1/README.md index 020a5feae..f3a589834 100755 --- a/Scripts/Services/TextToSpeech/v1/README.md +++ b/Scripts/Services/TextToSpeech/v1/README.md @@ -64,12 +64,12 @@ Retrieves a list of all voices available for use with the service. The informati private void GetVoices() { if(!_textToSpeech.GetVoices(OnGetVoices)) - Log.Debug("ExampleTextToSpeech", "Failed to get voices!"); + Log.Debug("ExampleTextToSpeech.GetVoices()", "Failed to get voices!"); } private void OnGetVoices(Voices voices, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", data); } ``` @@ -84,12 +84,12 @@ Lists information about the specified voice. Specify a customization_id to obtai private void GetVoice() { if(!_textToSpeech.GetVoice(OnGetVoice, )) - Log.Debug("ExampleTextToSpeech", "Failed to get voice!"); + Log.Debug("ExampleTextToSpeech.GetVoice()", "Failed to get voice!"); } private void OnGetVoice(Voice voice, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", data); } ``` @@ -112,7 +112,7 @@ private void Synthesize() { _textToSpeech.Voice = ; if(!_textToSpeech.ToSpeech(, OnSynthesize, )) - Log.Debug("ExampleTextToSpeech", "Failed to synthesize!"); + Log.Debug("ExampleTextToSpeech.ToSpeech()", "Failed to synthesize!"); } private void OnSynthesize(AudioClip clip, string data) @@ -159,12 +159,12 @@ Returns the phonetic pronunciation for the specified word. You can request the p private void GetPronunciation() { if(!_textToSpeech.GetPronunciation(OnGetPronunciation, , )) - Log.Debug("ExampleTextToSpeech", "Failed to get pronunication!"); + Log.Debug("ExampleTextToSpeech.GetPronunciation()", "Failed to get pronunication!"); } private void OnGetPronunciation(Pronunciation pronunciation, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", data); } ``` @@ -179,12 +179,12 @@ Creates a new empty custom voice model that is owned by the requesting user. private void CreateCustomization() { if(!_textToSpeech.CreateCustomization(OnCreateCustomization, , , )) - Log.Debug("ExampleTextToSpeech", "Failed to create customization!"); + Log.Debug("ExampleTextToSpeech.CreateCustomization()", "Failed to create customization!"); } private void OnCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", data); } ``` @@ -206,12 +206,12 @@ private void UpdateCustomization() } if(!_textToSpeech.UpdateCustomization(OnUpdateCustomization, , _customVoiceUpdate)) - Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); + Log.Debug("ExampleTextToSpeech.UpdateCustomization()", "Failed to update customization!"); } private void OnUpdateCustomization(bool success, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", success); + Log.Debug("ExampleTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", success); } ``` @@ -226,12 +226,12 @@ Lists metadata such as the name and description for all custom voice models that private void GetCustomizations() { if(!_textToSpeech.GetCustomizations(OnGetCustomizations)) - Log.Debug("ExampleTextToSpeech", "Failed to get customizations!"); + Log.Debug("ExampleTextToSpeech.GetCustomizations()", "Failed to get customizations!"); } private void OnGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", data); } ``` @@ -246,12 +246,12 @@ Lists all information about the specified custom voice model. In addition to met private void GetCustomization() { if(!_textToSpeech.GetCustomization(OnGetCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to get customization!"); + Log.Debug("ExampleTextToSpeech.GetCustomization()", "Failed to get customization!"); } private void OnGetCustomization(Customization customization, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", data); } ``` @@ -266,12 +266,12 @@ Deletes the custom voice model with the specified customization_id. Only the own private void DeleteCustomization() { if(!_textToSpeech.DeleteCustomization(OnDeleteCustomization, )) - Log.Debug("ExampleTextToSpeech", "Failed to delete customization!"); + Log.Debug("ExampleTextToSpeech.DeleteCustomization()", "Failed to delete customization!"); } private void OnDeleteCustomization(bool success, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", success); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomization()", "Text to Speech - Get customization response: {0}", success); } ``` @@ -308,7 +308,7 @@ Words wordsToAddToCustomization = new Words() }; if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, , _wordsToAddToCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to add words customization!"); + Log.Debug("ExampleTextToSpeech.AddCustomizationWords()", "Failed to add words customization!"); ``` WaitOne(50) --- Scripts/Connection/WSConnector.cs | 33 ++++++++++++------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index 49839678e..5760dbeb5 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -215,7 +215,7 @@ public static WSConnector CreateConnector(Credentials credentials, string functi public void Send(Message msg, bool queue = false) { #if ENABLE_MESSAGE_DEBUGGING - Log.Debug( "WSConnector", "Sending {0} message: {1}", + Log.Debug( "WSConnector.Send()", "Sending {0} message: {1}", msg is TextMessage ? "TextMessage" : "BinaryMessage", msg is TextMessage ? ((TextMessage)msg).Text : ((BinaryMessage)msg).Data.Length.ToString() + " bytes" ); #endif @@ -278,7 +278,7 @@ private IEnumerator ProcessReceiveQueue() { Message msg = _receiveQueue.Dequeue(); #if ENABLE_MESSAGE_DEBUGGING - Log.Debug( "WSConnector", "Received {0} message: {1}", + Log.Debug( "WSConnector.ProcessReceiveQueue()", "Received {0} message: {1}", msg is TextMessage ? "TextMessage" : "BinaryMessage", msg is TextMessage ? ((TextMessage)msg).Text : ((BinaryMessage)msg).Data.Length.ToString() + " bytes" ); #endif @@ -315,7 +315,7 @@ private void SendMessages() while (_connectionState == ConnectionState.CONNECTED) { - _sendEvent.WaitOne(0); + _sendEvent.WaitOne(50); Message msg = null; lock (_sendQueue) @@ -324,20 +324,13 @@ private void SendMessages() msg = _sendQueue.Dequeue(); } - while (msg != null) - { - if (msg is TextMessage) - ws.Send(((TextMessage)msg).Text); - else if (msg is BinaryMessage) - ws.Send(((BinaryMessage)msg).Data); + if (msg == null) + continue; - msg = null; - lock (_sendQueue) - { - if (_sendQueue.Count > 0) - msg = _sendQueue.Dequeue(); - } - } + if (msg is TextMessage) + ws.Send(((TextMessage)msg).Text); + else if (msg is BinaryMessage) + ws.Send(((BinaryMessage)msg).Data); } ws.Close(); @@ -345,7 +338,7 @@ private void SendMessages() catch (System.Exception e) { _connectionState = ConnectionState.DISCONNECTED; - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessages()", "Caught WebSocket exception: {0}", e.ToString()); } } @@ -400,7 +393,7 @@ private async Task SendMessagesAsync() while (_connectionState == ConnectionState.CONNECTED) { - _sendEvent.WaitOne(0); + _sendEvent.WaitOne(50); Message msg = null; lock (_sendQueue) @@ -431,7 +424,7 @@ private async Task SendMessagesAsync() catch (System.Exception e) { _connectionState = ConnectionState.DISCONNECTED; - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessagesAsync()", "Caught WebSocket exception: {0}", e.ToString()); } } @@ -474,7 +467,7 @@ private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocket } catch (System.Exception e) { - Log.Error("WSConnector", "Caught WebSocket exception: {0}", e.ToString()); + Log.Error("WSConnector.SendMessagesAsync()", "Caught WebSocket exception: {0}", e.ToString()); } } #endif From 701e356cdb01391a5a160aa66f38a4c95e1919b4 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Tue, 7 Nov 2017 17:25:44 -0600 Subject: [PATCH 058/100] encrypt credentials --- Config.json.enc | Bin 8768 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index 7eb2dabdd58f09782df86713e06a0e96933bc796..bd527c383b479043368cf366ba7901989fa6e6f5 100644 GIT binary patch literal 8768 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 literal 8768 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 Date: Wed, 8 Nov 2017 09:48:39 +0100 Subject: [PATCH 059/100] Added integration test for Conversation string --- Scripts/UnitTests/TestTextToSpeech.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) mode change 100644 => 100755 Scripts/UnitTests/TestTextToSpeech.cs diff --git a/Scripts/UnitTests/TestTextToSpeech.cs b/Scripts/UnitTests/TestTextToSpeech.cs old mode 100644 new mode 100755 index 227b575b1..9937ac8f0 --- a/Scripts/UnitTests/TestTextToSpeech.cs +++ b/Scripts/UnitTests/TestTextToSpeech.cs @@ -1,4 +1,4 @@ -/** +/** * Copyright 2015 IBM Corp. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,6 +35,7 @@ public class TestTextToSpeech : UnitTest TextToSpeech _textToSpeech; string _testString = "I'm sorry. This is Text to Speech!I'm sorry. This is Text to Speech!"; + string _testConversationString = "Arin"; string _createdCustomizationId; CustomVoiceUpdate _customVoiceUpdate; @@ -44,6 +45,7 @@ public class TestTextToSpeech : UnitTest string _testWord = "Watson"; private bool _synthesizeTested = false; + private bool _synthesizeConversationTested = false; private bool _getVoicesTested = false; private bool _getVoiceTested = false; private bool _getPronuciationTested = false; @@ -114,6 +116,13 @@ public override IEnumerator RunTest() while (!_synthesizeTested) yield return null; + // Synthesize Conversation string + Log.Debug("TestTextToSpeech.RunTest()", "Attempting synthesize a string as returned by Watson Conversation."); + _textToSpeech.Voice = VoiceType.en_US_Allison; + _textToSpeech.ToSpeech(_testConversationString, HandleConversationToSpeechCallback, true); + while (!_synthesizeConversationTested) + yield return null; + // Get Voices Log.Debug("TestTextToSpeech.RunTest()", "Attempting to get voices."); _textToSpeech.GetVoices(OnGetVoices); @@ -273,6 +282,12 @@ private void PlayClip(AudioClip clip) } } + private void HandleConversationToSpeechCallback(AudioClip clip, string customData) { + if(clip != null) { + _synthesizeConversationTested = true; + } + } + private void OnGetVoices(Voices voices, string customData) { Log.Debug("TestTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", customData); From 8aa28eb4d21d18834fe028d1e24796089f761e27 Mon Sep 17 00:00:00 2001 From: Kimberly Siva Date: Thu, 9 Nov 2017 08:34:49 -0500 Subject: [PATCH 060/100] Return the original keyword with the keyword result --- Scripts/Services/SpeechToText/v1/DataModels.cs | 4 ++++ Scripts/Services/SpeechToText/v1/SpeechToText.cs | 1 + 2 files changed, 5 insertions(+) diff --git a/Scripts/Services/SpeechToText/v1/DataModels.cs b/Scripts/Services/SpeechToText/v1/DataModels.cs index d650a69e1..b6d9bfeec 100644 --- a/Scripts/Services/SpeechToText/v1/DataModels.cs +++ b/Scripts/Services/SpeechToText/v1/DataModels.cs @@ -295,6 +295,10 @@ public class SpeakerLabelsResult [fsObject] public class KeywordResult { + /// + /// Original keyword requested by user. + /// + public string keyword { get; set; } /// /// Specified keyword normalized to the spoken phrase that matched in the audio input. /// diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 34309f73c..f35fb0314 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -1041,6 +1041,7 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) { IDictionary iKeywordDictionary = k as IDictionary; KeywordResult keywordResult = new KeywordResult(); + keywordResult.keyword = keyword; keywordResult.confidence = (double)iKeywordDictionary["confidence"]; keywordResult.end_time = (double)iKeywordDictionary["end_time"]; keywordResult.start_time = (double)iKeywordDictionary["start_time"]; From 82096c67979b9c7496c48445d4d65961019f0b97 Mon Sep 17 00:00:00 2001 From: Kimberly Siva Date: Thu, 9 Nov 2017 10:04:26 -0500 Subject: [PATCH 061/100] Fix detect silence to work with smaller audio chunks --- .../ServiceExamples/Scripts/ExampleStreaming.cs | 6 +++--- Scripts/Services/SpeechToText/v1/SpeechToText.cs | 14 +++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 5328cb30c..38d16a61a 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -63,10 +63,10 @@ public bool Active { if (value && !_speechToText.IsListening) { - _speechToText.DetectSilence = false; + _speechToText.DetectSilence = true; _speechToText.EnableWordConfidence = true; _speechToText.EnableTimestamps = true; - _speechToText.SilenceThreshold = 0.1f; + _speechToText.SilenceThreshold = 0.01f; _speechToText.MaxAlternatives = 0; _speechToText.EnableInterimResults = true; _speechToText.OnError = OnError; @@ -177,7 +177,7 @@ private IEnumerator RecordingHandler() // Create AudioData and use the samples we just created AudioData record = new AudioData(); - record.MaxLevel = Mathf.Max(samples); + record.MaxLevel = Mathf.Abs(Mathf.Max(samples)); record.Clip = AudioClip.Create("Recording", chunkSize, _recording.channels, _recordingHZ, false); record.Clip.SetData(samples, 0); diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9b3c8fe76..9dd7bf61d 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -109,6 +109,8 @@ public class SpeechToText : IWatsonService private string _acoustic_customization_id = null; private float _customization_weight = 0.3f; private bool _streamMultipart = false; // If true sets `Transfer-Encoding` header of multipart request to `chunked`. + private float _silenceDuration = 0.0f; + private float _silenceCutoff = 1.0f; private fsSerializer _serializer = new fsSerializer(); private Credentials _credentials = null; @@ -465,7 +467,17 @@ public void OnListen(AudioData clip) SendStart(); } - if (!DetectSilence || clip.MaxLevel >= _silenceThreshold) + // If silence persists for _silenceCutoff seconds, send stop and discard clips until audio resumes + if (DetectSilence && clip.MaxLevel < _silenceThreshold) + { + _silenceDuration += clip.Clip.length; + } + else + { + _silenceDuration = 0.0f; + } + + if (!DetectSilence || _silenceDuration < _silenceCutoff) { if (_listenActive) { From c935baaad6b7721d1c7ba138d843779c66c1f714 Mon Sep 17 00:00:00 2001 From: Kimberly Siva Date: Thu, 9 Nov 2017 10:21:09 -0500 Subject: [PATCH 062/100] Fix max level for audio clip --- Examples/ServiceExamples/Scripts/ExampleStreaming.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index 38d16a61a..ed2fa3270 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -177,7 +177,7 @@ private IEnumerator RecordingHandler() // Create AudioData and use the samples we just created AudioData record = new AudioData(); - record.MaxLevel = Mathf.Abs(Mathf.Max(samples)); + record.MaxLevel = Mathf.Max(Mathf.Abs(Mathf.Min(samples)), Mathf.Max(samples)); record.Clip = AudioClip.Create("Recording", chunkSize, _recording.channels, _recordingHZ, false); record.Clip.SetData(samples, 0); From 4ca383a55bd4bc95215ada587f6539685a9d8639 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 9 Nov 2017 11:48:09 -0600 Subject: [PATCH 063/100] update credentials --- Config.json.enc | Bin 8768 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index aae059b4e6f26e5a68ec7f568e29f7467fd31556..e88952bcc0b8d6239e3f7a17c25f6908dde0fd63 100644 GIT binary patch literal 8768 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%0ACf8TDbo&5To3PZ%@%)&x}q|Dpy#ASi0i;NZf)7 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 qg{&;kFg9}}j1-KI2Wn~u(-@W1$h`C@~j`E8D literal 8768 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 From 6949f279a5668188c56a2421dad6fe1604eb3400 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 9 Nov 2017 13:08:16 -0600 Subject: [PATCH 064/100] update credentials --- Config.json.enc | Bin 8768 -> 8768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Config.json.enc b/Config.json.enc index bd527c383b479043368cf366ba7901989fa6e6f5..e64b55c09ba86ef3eefb81d3b97414d266abecf3 100644 GIT binary patch literal 8768 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 literal 8768 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 From 4954939dbc5ccc7f13c9c9c761c24931d97055f1 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Thu, 9 Nov 2017 13:56:04 -0600 Subject: [PATCH 065/100] merge in develop, split streaming and streaming chunked examples --- Config.json.enc | Bin 8768 -> 8768 bytes .../ServiceExamples/ExampleStreaming.unity | 140 +++++++++- .../Scripts/ExampleAlchemyDataNews.cs | 6 +- .../Scripts/ExampleAlchemyLanguage.cs | 190 ++++++------- .../Scripts/ExampleConversation.cs | 10 +- .../Scripts/ExampleDiscoveryV1.cs | 126 ++++----- .../Scripts/ExampleDocumentConversion.cs | 6 +- .../Scripts/ExampleGetToken.cs | 8 +- .../Scripts/ExampleLanguageTranslation.cs | 5 +- .../Scripts/ExampleLanguageTranslator.cs | 30 +-- .../ExampleNaturalLanguageClassifier.cs | 26 +- .../ExampleNaturalLanguageUnderstandingV1.cs | 14 +- .../Scripts/ExamplePersonalityInsightsV3.cs | 10 +- .../Scripts/ExampleRetrieveAndRank.cs | 126 ++++----- .../Scripts/ExampleSpeechToText.cs | 176 ++++++------ .../Scripts/ExampleStreaming.cs | 133 +--------- .../Scripts/ExampleStreamingChunked.cs | 251 ++++++++++++++++++ .../Scripts/ExampleStreamingChunked.cs.meta | 13 + .../Scripts/ExampleTextToSpeech.cs | 66 ++--- .../Scripts/ExampleToneAnalyzer.cs | 6 +- .../Scripts/ExampleTradeoffAnalytics.cs | 4 +- .../Scripts/ExampleVisualRecognition.cs | 66 ++--- README.md | 4 +- Scripts/Connection/RESTConnector.cs | 49 ++-- Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs | 54 ++-- Scripts/Services/AlchemyAPI/v1/README.md | 72 ++--- .../Services/Conversation/v1/Conversation.cs | 2 +- Scripts/Services/Conversation/v1/README.md | 18 +- Scripts/Services/Discovery/v1/Discovery.cs | 30 +-- Scripts/Services/Discovery/v1/README.md | 76 +++--- .../v1/DocumentConversion.cs | 4 +- .../Services/DocumentConversion/v1/README.md | 4 +- .../v2/LanguageTranslation.cs | 10 +- .../Services/LanguageTranslation/v2/README.md | 42 +-- .../v2/LanguageTranslator.cs | 16 +- .../Services/LanguageTranslator/v2/README.md | 42 +-- .../v2/NaturalLanguageClassifier.cs | 8 +- .../NaturalLanguageClassifier/v2/README.md | 20 +- .../v1/NaturalLanguageUnderstanding.cs | 4 +- .../NaturalLanguageUnderstanding/v1/README.md | 18 +- .../v3/PersonalityInsights.cs | 2 +- .../Services/PersonalityInsights/v3/README.md | 4 +- Scripts/Services/RetrieveAndRank/v1/README.md | 78 +++--- .../RetrieveAndRank/v1/RetrieveAndRank.cs | 36 +-- .../Services/SpeechToText/v1/DataModels.cs | 4 + Scripts/Services/SpeechToText/v1/README.md | 168 ++++++------ .../Services/SpeechToText/v1/SpeechToText.cs | 69 ++--- Scripts/Services/TextToSpeech/v1/README.md | 66 ++--- .../Services/TextToSpeech/v1/TextToSpeech.cs | 64 +++-- Scripts/Services/ToneAnalyzer/v3/README.md | 4 +- .../Services/ToneAnalyzer/v3/ToneAnalyzer.cs | 2 +- .../Services/TradeoffAnalytics/v1/README.md | 6 +- .../TradeoffAnalytics/v1/TradeoffAnalytics.cs | 2 +- .../Services/VisualRecognition/v3/README.md | 106 ++++---- .../VisualRecognition/v3/VisualRecognition.cs | 47 ++-- Scripts/UnitTests/TestAlchemyLanguage.cs | 198 +++++++------- Scripts/UnitTests/TestConversation.cs | 16 +- Scripts/UnitTests/TestDiscovery.cs | 128 ++++----- Scripts/UnitTests/TestDocumentConversion.cs | 8 +- Scripts/UnitTests/TestLanguageTranslator.cs | 32 +-- .../TestNaturalLanguageClassifier.cs | 28 +- .../TestNaturalLanguageUnderstanding.cs | 16 +- .../UnitTests/TestPersonalityInsightsV3.cs | 12 +- Scripts/UnitTests/TestRetrieveAndRank.cs | 132 ++++----- Scripts/UnitTests/TestSpeechToText.cs | 170 ++++++------ Scripts/UnitTests/TestTextToSpeech.cs | 85 +++--- Scripts/UnitTests/TestToneAnalyzer.cs | 8 +- Scripts/UnitTests/TestTradeoffAnalytics.cs | 6 +- Scripts/UnitTests/TestVisualRecognition.cs | 66 ++--- Scripts/UnitTests/UnitTest.cs | 6 +- Scripts/UnitTests/UnitTestManager.cs | 18 +- Scripts/Utilities/AudioClipUtil.cs | 2 +- Scripts/Utilities/EventManager.cs | 4 +- Scripts/Utilities/Runnable.cs | 4 +- Scripts/Utilities/Utility.cs | 6 +- Scripts/Utilities/WaveFile.cs | 10 +- Scripts/Widgets/Widget.cs | 12 +- Travis/TravisIntegrationTests.cs | 4 +- 78 files changed, 1924 insertions(+), 1590 deletions(-) create mode 100644 Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs create mode 100644 Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs.meta mode change 100644 => 100755 Scripts/Services/TextToSpeech/v1/TextToSpeech.cs mode change 100644 => 100755 Scripts/UnitTests/TestTextToSpeech.cs diff --git a/Config.json.enc b/Config.json.enc index e64b55c09ba86ef3eefb81d3b97414d266abecf3..e533826a5e637bbdf7bcfa89053a81197e852059 100644 GIT binary patch literal 8768 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 literal 8768 zcmV-GBEQ`-c7OW((8Sa#ZfoJ|Wo3>2B~DwZ)-PiscALZ$(qPDloP{Z-t-;KFQaVLB zZ$o}J)oFq={1yDP+@@1pdk_(}`_tSz=(St_52431!F9mssN$Ayi!c1Pgc`rl`=L_n zr!nZd;>~LQ+j^7{QbpP^Tj6m-C469*_Ni_(OaplZ8gX5SR3IQp%f9vp}2Oi-@Yy`BZVZny(rTD_GWG%lSYhQOz7YEgWwvM>2an+%b}sc zeNAdJD#cSg8MHG{u!jUZB`>cEnkALWmdZ@gP0o{F`?+h@D4BgGIU%u7F-%~}FKx+z zpE>|~R5TFQt7!H`NYWR_hy1^(k$@jB%z3+^=9;gx26`VdU(!6BpH7*gBslMZD(wb& zBl6jN;-@9<1qsN@>hnl&Zl1zpWyo2$4fh zjM5nncwHK+O}T~O!>RRMBP+AeG6Mbtpz$w526QV(yM{jPuUZmor^bKa=U>O1gfvjO zfH@Z9@*QQ!p>fM+ezKwc#9yn*^$To@SKxmt00!ML6Y3SoQxdXj)hKvwFcm2%JWOm9 zJT;)is2&80U7;c@4X|uo1K*`h2!_T&_r;b7`@`AK^J-^knt)etAI|nN4X8}g^$qp$ zduJ68x;1;urAd1E;t3*}Nh+XjqzPq>@PG8hSJ0R&D?Q(Z9x*G?9RYk;yB^<9cdlYD zF4b+}Km;@&st5)%M^j;Eb&)E1_9eNf^{aBk?k2|EwzB4#?b zT^R2pA!^U%$KsG343I~2gT9GJoTL)x|CAF4Y==9)e~tjJyqvhK9zE$j1o}Snxn@ul zP=dqoDGQZCQV}VansFfr)AM|gG_|X86RO^Qvtv1Q1SVYpo@_p7**@!uAdM40 zdyv8I~uYGZ#XI!`=dw|7f8pY$dGs?piNvU>5%GKENjaz&Y=Dn5MtFf`}vj}fmN@fZCS;dHCnG3F@L{^a@RYcRjxsENn zpA>fH%>OV67wPd?&mkXTmO3JDht7++<~{*1I}BbctI_oIGgL4e{=*@6>kVVqB>HD~ zgHhDLNI(ctA9y8m%rI}QdrzXSWA*HezQ_Lm??ZVJ;D^V&={&v*9c2@ZG_m?|EURu1 z*ws`f7J_6va?U)EG@eF{wsL!zuK`hwNpiSFgD{ZbGqiA_A6qc4gyPyB13L`9qdQiLLfcLvEyLk>aWqyo%sG?1Oxv zb!1)lt%Rgk=$)l?Oe7#X8b(RtI3`y%=xGDH{0cwonQAv0>BhLo{xztQ65d&RWrB~_{o34dszbV zEMuUr;;e}Y?+u9pmRuw78xH6=Hr%Dw2(}LCqa$uW61*he8P@n4iO4cZqM=jTZU=f5~W&)I)@0XY-yY_-F=rC@6 z`?}%K21G`Bi8o0$#9F>5m~J;xan~n#YC@Z2O|uI4P(Mz&ZB71sGoUlGa^qWe-Ze9i zCj*mwbEm_STL2QmP&q+XOJpRJWN+Hs$$`T7YB9s$rxtlAKwyBVa!0QH#F8Z;@{k>* zGBzXC(vwLj2;wCm`dKz>2I|B)$822ddxo`h6&3p12R6fVB)X;^(}(KWgUtQMrDGbk zIwVougiX}VL-S|-aKf#y4XhW97x&J0YM*N$3HWU9r%fFxaXLP+fy78W@|tr!%}7B8 zQfS$#*20&#d*yt<9uZ|bJUJrC-1k!l>NX5fBJ=#3i=mU#;*5_avsGly3uHpCKWs4j zWKBPf+PppmCliB%Kws@4rBm3ylov$uCgchZwyB~38l^20@7`Zh+tDN$$R9li1WEtk z8VL%)|HkMO&N@cGXR|1P^&aoQ2!di6D~lO&^N;vqynz9@p7jG#nM1m@FVWc~lrq<+ zC4EX^@t=2jM1-zeRn1kk#@sL`h0u7F5yAgG@Mp0}z?=jv-*Y z{5>eG8s!Bn-yh^A>MnG&v!vj9^Yf~2r5#~#H9+MOY@(Z98V1m)#uo&ee(aG#g9LHh ztuwLkL*~%KpIx$c!u|^kBr(X3{Di6r_XZ`d7Ew?|`z{J&^gJf?8tN`bMU+#bgzWTP ztrr9g@oAF$TH!aYPolZ+)0tfTz8Q|G%b~UVsDf`Za#TA`Xgj7As@#jxqQ-Hw7gA#! zB-j60c>?_2lS2uI?bt)B`9%hmvGc zs_r_&9kTGU9K{ddVNrCkG#sZ(_88Dv46}*0ILbVO>3*e(y4z(^#Ty>H2`h9%#ls}2 z7(9sC5RdyC%9-$bI7!~@`YoE~7Is(kxJmweOo^dGBfkS2W|uO=HE`QNePd}1CWgIS$UzjqUAKXs;{d+Y1EwcMI(J@uQ-PD1%N(V@bTh&62QxuoB;U zKS1Qy6w0=|5@V8)065MTb_as&Mz-#LM>c_ig$|-v^bz26H}ldITibkAB&`d<@KbQc zOM*-WbRgP1CPoB7b9NIK`-&@qL|-6Krp12-HjbTp8DyFO?iiNT=0s!NsXZ^}A1Ghf zr9D<*eXF6|JgoyAqTkQ(yfp4XCGuY^m~}aFnOF_{i%!jW+sAxB&^6$~My(8G>6;tI zDo!Zct!*l%%L}PL>+P37wDNO7S7;2*@?$F;cQh#D@D@rfr52_5%j-R&MfBAY?ejKdG~-+i&T6Ys7|7{F4$O)~ zVL%p5kIr~!JX@AV7T4%pNgzYQ-rV0;AY~u@APKf;_w8t=X5QbL+a+Y%X=a*aP~GZh5{Q_IpQrF7 zUH91~!ve04Nf}gR@>5FnAa$=7(L$GbtvVgirE*$hU7htIHU~YTl9vlO3;z(|O-*oG z^O9nqyI%J$5eX>7)bqterCO%~m&D(aL&5(ME+8FswaUh4k#d;$DpOgjT2!4k1O!o) z$HQ~2ZN(LM;1hRJaPvECo7P>x^xm9wwl9j=K9{_|0PrTop--!I^C_yB$uShqd5YIa zDS6fQK#r{~5;owS-Mx;GAJ~!#(4KM&8U6|S|24D+J+d_}k!&Y=MC;g(5u$y(5b#85IxZKE;2V@PMZ;*dvtNAi*} zDTp={ui+Y*=VtJ{VanZh>$`=+Ib*8!NTqbm|50kU z9&i3rhhl$ibrCuaW|>H?aaZkpnBHqz&i0)R)Qzo0_u|nYBXu4J{E`d=i3`Dt za33*_=(qlI(%K6=cf~?Dy5a>58@H%CaQNqNqZ$_$?PskB59nORa3_3W(2Pa87~Poj z8}X`6g(Um&u|3|#7hfrrZ`yRrFXmDN+ z-{*5tVFD9m^hGAY1Z*NZn7JV@xO7UhNN3>I`_0V0i~bOE?Z@0U?i>rLk!*%ek9M$? zbI5@U&RU{WQL!6_H3Y6O!@uGuzPPwdy>}}&b3p>H-M+OeUHo9^q~A;a29Fgapy|Db zU%fdzmmRK|VbQTSBc+P@C*d-}HJhn@Y_HKC=j2$UxlKp)yU%KFI z#y=vI`{TL;sD^V{lU^=8gLah3twubLA#g=-?2zX+|FD7CT3ZMXYb}W&169K5e?*Mc zLJpv_=1Lqoz>hdE53!6JNdy@_dO_+lvg77puXh-PQvbk}UoHcaB-EnO{gElt`O<24 zA&x(oWVCsmiUXR5Opc84Dc~zH2q%LSM#^;cwU%tET|EZm8?gB9YIHi)dKdg*sUmC; zm0tzs%I1A0S}e$*zDZE=+oze@r&o+(4P=Ma$rsMCLgs@3?sU}N_i<=HR2@+iGDvF` zMsPWe&5}x$f(d3)IDDJ$la09$$Yeo4v5T>0cVPomJ$$fiGD%*qya1&&ohGZt0xwmM z4HvQD@A@p5#r=N*R#G=ccTKwI=V1Y@3_q3ER~MxmH|IGm8rkIS`r)!eOJtN*qOQ-K zOx;4nsyw`C2eo-GtRxMh4CR=j&%HH&Gj2lBUZS#H+Ph`J0?VmUmQ8Gz(+50kOt2dj zC@b{tk4JbmR0l+%{X}o?T~RA`6X)2_W}mCYfhhmF_0Jeb09NRscB*1&bi(1w_Cvc=jhm7mUp#=gfh$ zwH0P`yt`|xFfJfbu-5%!s)FSxUPxg@*!zfE*2ti7B~nAFt3@Nc)Mjs6qTZ-!$b`nS z8fmI?>1iNRUBFrPDYZPlsfAV(U9l=-KN4co-%TZc->Fw=#TC3BOVJizeJO-b0vK0@ z$G^G@X!-RZmTVQq6Gmw|_!_c)rsGyu@ewAxx@qpq#8p>*mx{F?!zc<{_MO^QYcBZ# zGa6W>!Z&GXj7)Un=xyLhnsIvG#!n7PDs5rB(*3XKgox-c6Gj=7*$*~kFdaq&1`o7U zWeSs9&grID6s~DS7hI426&9)eU}7Rxq}twVoi3(!7!PX@J@n8(v4~`S zf)~x#2{4N%_$Yjq_pGP7jVz#uzakzHARdpJ4JfZ_vU!uZB`Ou}3~yYGsJ`kfsx)Sa zb<7w}qX20?YAVK}ZF`quViTx;&D5Bc9gNHhc9m2COlKg=l@7wo8js@ePQ}5eek%IS zaYAlwW6u_SRb0g1Jbg>T{N@-@(@v#=?IZp-6-`VCo}QwHbsaPhb#w}(?}Tbn`w~q9 zk|WBjcUcB}K8XIut3ITu`A6-D1)Yw3l6OGyb`*YOa@Zj;rPd48ZUSqN?}pBsgmz>F zCz#dYX?6z{56+Uh?7L^@naKYV4g$*XxM_mb+kk$NV%)7AojdL#ox#=n zgn}@C$4qvRkVoH(SF{TXBGxKm*CK}pI>V$_hkrVl;ZHe4#bVQ z3n>rf8T*3*zo(j4n+5K+Ezxh2vL`EfsHmT@1vNs+awjVPP<0s+hB)1(`IRPh1TtLt zS_NQN$$P!%^EosZS4senKfK9+t>+oq93Tm0yEnu&pmXXQ90BgrxwH+t zqu*`hT|j70B`O|M@WqPEN6oU%pZE!1qh=fFrd$>-LquBoVKE`qUYXvo0JXECAEmB38F+M8J#bh18Q-(bH2v0 zobQyg6RW&n*EcZU%isK(u`#z+-RVYSxjWZdzw>07V!GOt1w$glw>07~g3fe!)>dzI zc}SEWkqM)>9;Ly?S<@BDabt705c;Lzb=-iGj)*#1_l!M84pVLT1DBie)_0#NQdPCd z$|$NQUP_wdu|T+W0tSDR>_*^1bgDAXFd~>$ReMO~b-EJ~1hDaGq9&H$^!;KP0x2jO zo$i#MqJ;je_A94Oj&F@4!NDcEmTBN%U?MiQq51I0)gUhjrxLD{dBWU5Z5cX zBtY`PkFtCzZytLW+qJkZ(Q5-Ms8-T(X&=ba9{n#tz3UvAb3i`+V^oRpoxeA`OBKo( zioc0a4uU1hmbXfe4X53xi`5W;{DIXUJRv3R$rZMIij?hr?FAexIlMAU1E07(y zYvzq_gs&d6$Fytdq5u z%aUd<@jqiPF7&6(_Ik~nr-p!B!f=tRLzG5RqV zT8>jLwCm0@-E5jHKWZ8p`gaw7>LkMv8(TjQrB9bAs#3lM1H&bqW8_elT#-V6tz{h@ z_A1IodMmf84R-J`a;=fOtb&<*tW8RHj!krif;^Im|3WahjBW2IKg}Ru>ia>!0L8D=2ywJ)46l;7Nv7ZS;6E`;8Sttz~7p#Ghrn=l3lY>_D=dL^ zOmt%TifU#7M2 zy#g{P)fG)7Aj$~i`;krJ&_IV?64VfbAtH>CLTr54NOmA$@ZrN2wA3b84sjXS`dk2OVOc)K|1f>$L6$MZc z=&`0Q2ZG9ZC7nm#TLVSSu9jU$qL%T5-;GeYaEjTOz(D;~@>ir$5uGH|UWb`pmwgPj zG|J4rkDIuG5GKWikE3l(p}V4ga5*PKXpin5g}*heGNTD{OIKemzO4DM?9Tah-i^~F zb=_IF-tmG+e)4QcKB6}Un_Hsf=H4Yi(1220H1rG`E4cbux9xLz}VUu0JgOTI? zU|PtqxWmmdYsa8(xUmVA>v~^N-t27l7_fwP){;8)W!f2Bx2KJ|U5~r9MRv-{O`5!7 zT|a!VGEx19cu(!W?`UhXyp%L7d#D;l!~coja)#%nJ(Uq*BWp^;UP|0EIbPkP2A5gl zPX%bEy;K#e@DRj3B9q|Rdc^0oypfaWy4AJKqQ&Li5Tm&&IU6Tt>S&S2bZxEd)#dk- zDyOtgFs`K{nR7@K#HdQdK_-M*b^}A4U6kCw&srtGm+Hg*=k&B!?JtEjAWYc!N#}=phQrp#s?BrBMUa*np5t$5yoWPV%2a)A-poUw;i$LW1=p@n4{z4FNnFB3ck19t@)w zm_omvi~t$Z0W5JhV1+I^X0n+-UJN6b z3-^SeV=U9tXVnURBK340r5+cRc0mlS0Oa&%5V*dUE~9DiFOCY+3q*T(zC6Km3if#z_~*co%*sa6}qf_js$^ANT2S5LS2agJSi7 z`%T~J9^SYu>OUtgeRb#-85oZ3u>n4kYRwFZdVV0X}n!65n>D zSs(_W+8Pt7T7*<=1P>IcYjH+0o~o?A6y-7WcoDXospi$ay__}xmoB$v&ZEM~FUU-V z*wxn_d0dQR6wQWj5{dq1jJzJN>cK{Qg5e%z;E7m*rVNfZwD$7gJTu7Rc!g5;tyQ>~4O`&qMaAID3W&!ha<}j#Q+kw_kTP>ds9VAih z_PF_5t?17<-1eA#SG;n=7l4oILWl1;*vbf&5_@$P+PGg~z^X6` z`?Q8hvS>86L7L}UL$QoYt)B?fEjIdLJJqKgGol?^E-=Dmj1g$Z@It-|hFf6jp;bCM zAZ03cH1fbPD7&iuNFTUG=;XYl)J%mNyF5lnZaZD1fGE2#cq@&|Eu!(H^L+rEeNuuf z``AKJF%PQkuLf$c!0*4orup$pw!#7>|S2AEP{LVF&}^{{Q=&S4jllFr97w~xM}VCHoI diff --git a/Examples/ServiceExamples/ExampleStreaming.unity b/Examples/ServiceExamples/ExampleStreaming.unity index 0e3017dfc..412e14582 100644 --- a/Examples/ServiceExamples/ExampleStreaming.unity +++ b/Examples/ServiceExamples/ExampleStreaming.unity @@ -112,6 +112,47 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &249853924 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 249853926} + - component: {fileID: 249853925} + m_Layer: 0 + m_Name: ExampleStreamingChunked + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &249853925 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 249853924} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3f827eb7b6004438d9b3ae3bb063c1a2, type: 3} + m_Name: + m_EditorClassIdentifier: + ResultsField: {fileID: 1671634727} +--- !u!4 &249853926 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 249853924} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &278297820 GameObject: m_ObjectHideFlags: 0 @@ -198,8 +239,9 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1863902090} + - {fileID: 1671634730} m_Father: {fileID: 0} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -419,7 +461,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 4 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1646685149 GameObject: @@ -462,6 +504,94 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1671634726 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1671634730} + - component: {fileID: 1671634729} + - component: {fileID: 1671634727} + - component: {fileID: 1671634728} + m_Layer: 5 + m_Name: TextStreamingChunked + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1671634727 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1671634726} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.75, g: 0.75, b: 0.75, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Watson Speech to Text +--- !u!114 &1671634728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1671634726} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1741964061, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!222 &1671634729 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1671634726} +--- !u!224 &1671634730 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1671634726} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -15, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 278297824} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -15} + m_SizeDelta: {x: 147, y: 16} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1863902089 GameObject: m_ObjectHideFlags: 0 @@ -474,7 +604,7 @@ GameObject: - component: {fileID: 1863902092} - component: {fileID: 1863902091} m_Layer: 5 - m_Name: Text + m_Name: TextStreaming m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -487,7 +617,7 @@ RectTransform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1863902089} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 15, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 278297824} @@ -495,7 +625,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 15} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1863902091 diff --git a/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs b/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs index 4d940c072..bfdc9157f 100644 --- a/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs +++ b/Examples/ServiceExamples/Scripts/ExampleAlchemyDataNews.cs @@ -50,17 +50,17 @@ private IEnumerator Examples() queryFields.Add(Fields.EnrichedUrlCleanedtitle, "Washington"); string[] returnFields = { Fields.EnrichedUrlEntities, Fields.EnrichedUrlKeywords }; if (!_alchemyAPI.GetNews(OnGetNews, returnFields, queryFields)) - Log.Debug("ExampleAlchemyDataNews", "Failed to get news!"); + Log.Debug("ExampleAlchemyDataNews.GetNews()", "Failed to get news!"); while (!_getNewsTested) yield return null; - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news examples complete!"); + Log.Debug("ExampleAlchemyDataNews.Examples()", "Alchemy data news examples complete!"); } private void OnGetNews(NewsResponse newsData, string data) { - Log.Debug("ExampleAlchemyDataNews", "Alchemy data news - Get news Response: {0}", data); + Log.Debug("ExampleAlchemyDataNews.OnGetNews()", "Alchemy data news - Get news Response: {0}", data); _getNewsTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs b/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs index b4b04c17c..f3e777f13 100644 --- a/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs +++ b/Examples/ServiceExamples/Scripts/ExampleAlchemyLanguage.cs @@ -119,568 +119,568 @@ private IEnumerator Examples() { // Get Author URL POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors URL POST!"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors URL POST!"); while (!_getAuthorsURLTested) yield return null; //Get Author HTML POST if (!_alchemyAPI.GetAuthors(OnGetAuthorsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get authors HTML POST!"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors HTML POST!"); while (!_getAuthorsHTMLTested) yield return null; ////Get Concepts Text POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts Text POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts Text POST!"); while (!_getRankedConceptsTextTested) yield return null; //Get Concepts HTML POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts HTML POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts HTML POST!"); while (!_getRankedConceptsHTMLTested) yield return null; //Get Concepts URL POST if (!_alchemyAPI.GetRankedConcepts(OnGetConceptsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts url POST!"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts url POST!"); while (!_getRankedConceptsURLTested) yield return null; //Get Date URL POST if (!_alchemyAPI.GetDates(OnGetDatesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by URL POST"); while (!_getDatesURLTested) yield return null; //Get Date Text POST if (!_alchemyAPI.GetDates(OnGetDatesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by text POST"); while (!_getDatesTextTested) yield return null; //Get Date HTML POST if (!_alchemyAPI.GetDates(OnGetDatesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get dates by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetDates()", "Failed to get dates by HTML POST"); while (!_getDatesHTMLTested) yield return null; //Get Emotions URL POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsUrl, _exampleURL_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by URL POST"); while (!_getEmotionURLTested) yield return null; //Get Emotions Text POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsText, _exampleText_watsonJeopardy, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by text POST"); while (!_getEmotionTextTested) yield return null; //Get Emotions HTML POST if (!_alchemyAPI.GetEmotions(OnGetEmotionsHtml, _watson_beats_jeopardy_html, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions by HTML POST"); while (!_getEmotionHTMLTested) yield return null; //Extract Entities URL POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by URL POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by URL POST"); while (!_getEntityExtractionURLTested) yield return null; //Extract Entities Text POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by text POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by text POST"); while (!_getEntityExtractionTextTested) yield return null; //Extract Entities HTML POST if (!_alchemyAPI.ExtractEntities(OnExtractEntitiesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get entities by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get entities by HTML POST"); while (!_getEntityExtractionHTMLTested) yield return null; //Detect Feeds URL POST if (!_alchemyAPI.DetectFeeds(OnDetectFeedsUrl, "http://time.com/newsfeed/")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by URL POST"); + Log.Debug("ExampleAlchemyLanguage.DetectFeeds()", "Failed to get feeds by URL POST"); while (!_detectFeedsURLTested) yield return null; ////Detect Feeds HTML POST //if (!_alchemyAPI.DetectFeeds(OnDetectFeedsHtml, ycombinator_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds by HTML POST"); + // Log.Debug("ExampleAlchemyLanguage.DetectFeeds()", "Failed to get feeds by HTML POST"); //while (!_detectFeedsHTMLTested) // yield return null; //Extract Keywords URL POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by URL POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by URL POST"); while (!_getKeywordExtractionURLTested) yield return null; //Extract Keywords Text POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by text POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by text POST"); while (!_getKeywordExtractionTextTested) yield return null; //Extract Keywords HTML POST if (!_alchemyAPI.ExtractKeywords(OnExtractKeywordsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.ExtractKeywords()", "Failed to get keywords by HTML POST"); while (!_getKeywordExtractionHTMLTested) yield return null; //Extract Languages URL POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageURLTested) yield return null; //Extract Languages Text POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by text POST"); while (!_getLanguageTextTested) yield return null; //Extract Languages HTML POST if (!_alchemyAPI.GetLanguages(OnGetLanguagesHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages by HTML POST"); while (!_getLanguageHTMLTested) yield return null; //Get Microformats URL POST if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsUrl, _exampleURL_microformats)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); while (!_getMicroformatURLTested) yield return null; //Get Microformats HTML POST //if (!_alchemyAPI.GetMicroformats(OnGetMicroformatsHtml, microformats_html)) - // Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats by text POST"); + // Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats by text POST"); //while (!_getMicroformatHTMLTested) // yield return null; //Get PublicationDate URL POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by url POST"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by url POST"); while (!_getPubDateURLTested) yield return null; //Get PublicationDate HTML POST if (!_alchemyAPI.GetPublicationDate(OnGetPublicationDateHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates by html POST"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates by html POST"); while (!_getPubDateHTMLTested) yield return null; //Get Relations URL POST if (!_alchemyAPI.GetRelations(OnGetRelationsUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsURLTested) yield return null; //Get Relations Text POST if (!_alchemyAPI.GetRelations(OnGetRelationsText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by text POST"); while (!_getRelationsTextTested) yield return null; //Get Relations HTML POST if (!_alchemyAPI.GetRelations(OnGetRelationsHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations by HTML POST"); while (!_getRelationsHTMLTested) yield return null; //Get Sentiment URL POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentURLTested) yield return null; //Get Sentiment Text POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by text POST"); while (!_getTextSentimentTextTested) yield return null; //Get Sentiment HTML POST if (!_alchemyAPI.GetTextSentiment(OnGetTextSentimentHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment by HTML POST"); while (!_getTextSentimentHTMLTested) yield return null; //Get Targeted Sentiment URL POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentUrl, _exampleURL_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentURLTested) yield return null; //Get Targeted Sentiment Text POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentText, _exampleText_watsonJeopardy, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by text POST"); while (!_getTargetedSentimentTextTested) yield return null; //Get Targeted Sentiment HTML POST if (!_alchemyAPI.GetTargetedSentiment(OnGetTargetedSentimentHtml, _watson_beats_jeopardy_html, "Jeopardy|Jennings|Watson")) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment by HTML POST"); while (!_getTargetedSentimentHTMLTested) yield return null; //Get Taxonomy URL POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyURLTested) yield return null; //Get Taxonomy Text POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyText, _exampleText_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy9", "Failed to get ranked taxonomy by text POST"); while (!_getRankedTaxonomyTextTested) yield return null; //Get Taxonomy HTML POST if (!_alchemyAPI.GetRankedTaxonomy(OnGetRankedTaxonomyHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy by HTML POST"); while (!_getRankedTaxonomyHTMLTested) yield return null; //Get Text HTML POST if (!_alchemyAPI.GetText(OnGetTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextHTMLTested) yield return null; //Get Text URL POST if (!_alchemyAPI.GetText(OnGetTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text POST"); while (!_getTextURLTested) yield return null; //Get Raw Text HTML POST if (!_alchemyAPI.GetRawText(OnGetRawTextHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextHTMLTested) yield return null; //Get Raw Text URL POST if (!_alchemyAPI.GetRawText(OnGetRawTextUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text POST"); while (!_getRawTextURLTested) yield return null; //Get Title HTML POST if (!_alchemyAPI.GetTitle(OnGetTitleHtml, _watson_beats_jeopardy_html)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleHTMLTested) yield return null; //Get Title URL POST if (!_alchemyAPI.GetTitle(OnGetTitleUrl, _exampleURL_watsonJeopardy)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); while (!_getTitleURLTested) yield return null; // Get Combined Data URL POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataUrl, _exampleURL_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataURLTested) yield return null; //Get Combined Data Text POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataText, _exampleText_watsonJeopardy, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by text POST"); while (!_getCombinedDataTextTested) yield return null; //Get Combined Data HTML POST if (!_alchemyAPI.GetCombinedData(OnGetCombinedDataHtml, _watson_beats_jeopardy_html, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true)) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by HTML POST"); + Log.Debug("ExampleAlchemyLanguage.GetCombinedData()", "Failed to get combined data by HTML POST"); while (!_getCombinedDataHTMLTested) yield return null; - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language examples complete"); + Log.Debug("ExampleAlchemyLanguage.Examples()", "Alchemy Language examples complete"); } private void OnGetAuthorsHtml(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsHtml()", "Alchemy Language - Get authors response html: {0}", data); _getAuthorsHTMLTested = true; } private void OnGetAuthorsUrl(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsUrl()", "Alchemy Language - Get authors response url: {0}", data); _getAuthorsURLTested = true; } private void OnGetConceptsHtml(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthorsUrl()", "Alchemy Language - Get ranked concepts response html: {0}", data); _getRankedConceptsHTMLTested = true; } private void OnGetConceptsUrl(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConceptsUrl()", "Alchemy Language - Get ranked concepts response url: {0}", data); _getRankedConceptsURLTested = true; } private void OnGetConceptsText(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConceptsText()", "Alchemy Language - Get ranked concepts response text: {0}", data); _getRankedConceptsTextTested = true; } private void OnGetDatesHtml(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesHtml()", "Alchemy Language - Get dates response html: {0}", data); _getDatesHTMLTested = true; } private void OnGetDatesUrl(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesUrl()", "Alchemy Language - Get dates response url: {0}", data); _getDatesURLTested = true; } private void OnGetDatesText(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDatesText()", "Alchemy Language - Get dates response text: {0}", data); _getDatesTextTested = true; } private void OnGetEmotionsHtml(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsHtml()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionHTMLTested = true; } private void OnGetEmotionsUrl(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsUrl()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionURLTested = true; } private void OnGetEmotionsText(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotionsText()", "Alchemy Language - Get emotions response html: {0}", data); _getEmotionTextTested = true; } private void OnExtractEntitiesHtml(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesHtml()", "Alchemy Language - Extract entities response html: {0}", data); _getEntityExtractionHTMLTested = true; } private void OnExtractEntitiesUrl(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesUrl()", "Alchemy Language - Extract entities response url: {0}", data); _getEntityExtractionURLTested = true; } private void OnExtractEntitiesText(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntitiesText()", "Alchemy Language - Extract entities response text: {0}", data); _getEntityExtractionTextTested = true; } //private void OnDetectFeedsHtml(FeedData feedData, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response html: {0}", data); + // Log.Debug("ExampleAlchemyLanguage.OnDetectFeedsHtml()", "Alchemy Language - Detect feeds response html: {0}", data); // _detectFeedsHTMLTested = true; //} private void OnDetectFeedsUrl(FeedData feedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnDetectFeedsUrl()", "Alchemy Language - Detect feeds response url: {0}", data); _detectFeedsURLTested = true; } private void OnExtractKeywordsHtml(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsHtml()", "Alchemy Language - Extract keywords response html: {0}", data); _getKeywordExtractionHTMLTested = true; } private void OnExtractKeywordsUrl(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsUrl()", "Alchemy Language - Extract keywords response url: {0}", data); _getKeywordExtractionURLTested = true; } private void OnExtractKeywordsText(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywordsText()", "Alchemy Language - Extract keywords response text: {0}", data); _getKeywordExtractionTextTested = true; } private void OnGetLanguagesHtml(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesHtml()", "Alchemy Language - Get languages response html: {0}", data); _getLanguageHTMLTested = true; } private void OnGetLanguagesUrl(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesUrl()", "Alchemy Language - Get languages response url: {0}", data); _getLanguageURLTested = true; } private void OnGetLanguagesText(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguagesText()", "Alchemy Language - Get languages response text: {0}", data); _getLanguageTextTested = true; } //private void OnGetMicroformatsHtml(MicroformatData microformats, string data) //{ - // Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response html: {0}", data); + // Log.Debug("ExampleAlchemyLanguage.OnGetMicroformatsHtml()", "Alchemy Language - Get microformats response html: {0}", data); // _getMicroformatHTMLTested = true; //} private void OnGetMicroformatsUrl(MicroformatData microformats, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetMicroformatsUrl()", "Alchemy Language - Get microformats response url: {0}", data); _getMicroformatURLTested = true; } private void OnGetPublicationDateHtml(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDateHtml()", "Alchemy Language - Get publication date response html: {0}", data); _getPubDateHTMLTested = true; } private void OnGetPublicationDateUrl(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDateUrl()", "Alchemy Language - Get publication date response url: {0}", data); _getPubDateURLTested = true; } private void OnGetRelationsHtml(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsHtml()", "Alchemy Language - Get relations response html: {0}", data); _getRelationsHTMLTested = true; } private void OnGetRelationsUrl(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsUrl()", "Alchemy Language - Get relations response url: {0}", data); _getRelationsURLTested = true; } private void OnGetRelationsText(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelationsText()", "Alchemy Language - Get relations response text: {0}", data); _getRelationsTextTested = true; } private void OnGetTextSentimentHtml(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentHtml()", "Alchemy Language - Get text sentiment response html: {0}", data); _getTextSentimentHTMLTested = true; } private void OnGetTextSentimentUrl(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentUrl()", "Alchemy Language - Get text sentiment response url: {0}", data); _getTextSentimentURLTested = true; } private void OnGetTextSentimentText(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentimentText()", "Alchemy Language - Get text sentiment response text: {0}", data); _getTextSentimentTextTested = true; } private void OnGetTargetedSentimentHtml(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentHtml()", "Alchemy Language - Get targeted sentiment response html: {0}", data); _getTargetedSentimentHTMLTested = true; } private void OnGetTargetedSentimentUrl(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentUrl()", "Alchemy Language - Get targeted sentiment response url: {0}", data); _getTargetedSentimentURLTested = true; } private void OnGetTargetedSentimentText(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentimentText()", "Alchemy Language - Get targeted sentiment response text: {0}", data); _getTargetedSentimentTextTested = true; } private void OnGetRankedTaxonomyHtml(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyHtml()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); _getRankedTaxonomyHTMLTested = true; } private void OnGetRankedTaxonomyUrl(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyUrl()", "Alchemy Language - Get ranked taxonomy response url: {0}", data); _getRankedTaxonomyURLTested = true; } private void OnGetRankedTaxonomyText(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomyText()", "Alchemy Language - Get ranked taxonomy response text: {0}", data); _getRankedTaxonomyTextTested = true; } private void OnGetTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextHtml()", "Alchemy Language - Get Text HTML response: {0}", data); _getTextHTMLTested = true; } private void OnGetTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextUrl()", "Alchemy Language - Get Text Url response: {0}", data); _getTextURLTested = true; } private void OnGetRawTextHtml(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawTextHtml()", "Alchemy Language - Get raw text HTML response: {0}", data); _getRawTextHTMLTested = true; } private void OnGetRawTextUrl(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawTextUrl()", "Alchemy Language - Get raw text Url response: {0}", data); _getRawTextURLTested = true; } private void OnGetTitleHtml(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitleHtml()", "Alchemy Language - Get Title HTML response: {0}", data); _getTitleHTMLTested = true; } private void OnGetTitleUrl(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitleUrl()", "Alchemy Language - Get Title Url response: {0}", data); _getTitleURLTested = true; } private void OnGetCombinedDataHtml(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataHtml()", "Alchemy Language - Get Combined Data HTML response: {0}", data); _getCombinedDataHTMLTested = true; } private void OnGetCombinedDataUrl(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataUrl()", "Alchemy Language - Get Combined Data Url response: {0}", data); _getCombinedDataURLTested = true; } private void OnGetCombinedDataText(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedDataText()", "Alchemy Language - Get Combined Data Text response: {0}", data); _getCombinedDataTextTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleConversation.cs b/Examples/ServiceExamples/Scripts/ExampleConversation.cs index e5b71c67c..1f3bff23d 100644 --- a/Examples/ServiceExamples/Scripts/ExampleConversation.cs +++ b/Examples/ServiceExamples/Scripts/ExampleConversation.cs @@ -55,7 +55,7 @@ void Start() private IEnumerator Examples() { if (!_conversation.Message(OnMessage, _workspaceId, "hello")) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); while (_waitingForResponse) yield return null; @@ -89,7 +89,7 @@ private IEnumerator Examples() while (_waitingForResponse) yield return null; - Log.Debug("ExampleConversation", "Conversation examples complete."); + Log.Debug("ExampleConversation.Examples()", "Conversation examples complete."); } private void AskQuestion() @@ -104,12 +104,12 @@ private void AskQuestion() }; if (!_conversation.Message(OnMessage, _workspaceId, messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.AskQuestion()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); // Convert resp to fsdata fsData fsdata = null; @@ -131,7 +131,7 @@ private void OnMessage(object resp, string data) if (_tempContext != null) _context = _tempContext as Dictionary; else - Log.Debug("ExampleConversation", "Failed to get context"); + Log.Debug("ExampleConversation.OnMessage()", "Failed to get context"); _waitingForResponse = false; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs b/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs index 3f42204d3..2b6877b90 100644 --- a/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs +++ b/Examples/ServiceExamples/Scripts/ExampleDiscoveryV1.cs @@ -82,16 +82,16 @@ private void Start() private IEnumerator Examples() { // Get Environments - Log.Debug("ExampleDiscoveryV1", "Attempting to get environments"); + Log.Debug("ExampleDiscoveryV1.Examples()", "Attempting to get environments"); if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environments"); + Log.Debug("ExampleDiscoveryV1.GetEnvironments()", "Failed to get environments"); while (!_getEnvironmentsTested) yield return null; // AddEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to add environment"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add environment"); if (!_discovery.AddEnvironment(OnAddEnvironment, "unity-testing-AddEnvironment-do-not-delete-until-active", "Testing addEnvironment in Unity SDK. Please do not delete this environment until the status is 'active'", 1)) - Log.Debug("ExampleDiscoveryV1", "Failed to add environment"); + Log.Debug("ExampleDiscovery.AddEnvironment()", "Failed to add environment"); while (!_addEnvironmentTested) yield return null; @@ -101,165 +101,165 @@ private IEnumerator Examples() yield return null; // GetEnvironment - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get environment"); if (!_discovery.GetEnvironment(OnGetEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environment"); + Log.Debug("ExampleDiscovery.GetEnvironment()", "Failed to get environment"); while (!_getEnvironmentTested) yield return null; // Get Configurations - Log.Debug("ExampleDiscoveryV1", "Attempting to get configurations"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get configurations"); if (!_discovery.GetConfigurations(OnGetConfigurations, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configurations"); + Log.Debug("ExampleDiscovery.GetConfigurations()", "Failed to get configurations"); while (!_getConfigurationsTested) yield return null; // Add Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to add configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add configuration"); if (!_discovery.AddConfiguration(OnAddConfiguration, _createdEnvironmentID, _configurationJsonPath)) - Log.Debug("ExampleDiscoveryV1", "Failed to add configuration"); + Log.Debug("ExampleDiscovery.AddConfiguration()", "Failed to add configuration"); while (!_addConfigurationTested) yield return null; // Get Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to get configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get configuration"); if (!_discovery.GetConfiguration(OnGetConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to get configuration"); + Log.Debug("ExampleDiscovery.GetConfiguration()", "Failed to get configuration"); while (!_getConfigurationTested) yield return null; // Preview Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to preview configuration"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to preview configuration"); if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, _createdEnvironmentID, _createdConfigurationID, null, _filePathToIngest, _metadata)) - Log.Debug("ExampleDiscoveryV1", "Failed to preview configuration"); + Log.Debug("ExampleDiscovery.PreviewConfiguration()", "Failed to preview configuration"); while (!_previewConfigurationTested) yield return null; // Get Collections - Log.Debug("ExampleDiscoveryV1", "Attempting to get collections"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get collections"); if (!_discovery.GetCollections(OnGetCollections, _createdEnvironmentID)) - Log.Debug("ExampleDiscovery", "Failed to get collections"); + Log.Debug("ExampleDiscovery.GetCollections()", "Failed to get collections"); while (!_getCollectionsTested) yield return null; // Add Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to add collection"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add collection"); if (!_discovery.AddCollection(OnAddCollection, _createdEnvironmentID, _createdCollectionName, _createdCollectionDescription, _createdConfigurationID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.AddCollection()", "Failed to add collection"); while (!_addCollectionTested) yield return null; // Get Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to get collection"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get collection"); if (!_discovery.GetCollection(OnGetCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get collection"); + Log.Debug("ExampleDiscovery.GetCollection()", "Failed to get collection"); while (!_getCollectionTested) yield return null; // Get fields if (!_discovery.GetFields(OnGetFields, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to get fields"); + Log.Debug("ExampleDiscovery.GetFields()", "Failed to get fields"); while (!_getFieldsTested) yield return null; // Add Document - Log.Debug("ExampleDiscoveryV1", "Attempting to add document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to add document"); if (!_discovery.AddDocument(OnAddDocument, _createdEnvironmentID, _createdCollectionID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to add document"); + Log.Debug("ExampleDiscovery.AddDocument()", "Failed to add document"); while (!_addDocumentTested) yield return null; // Get Document - Log.Debug("ExampleDiscoveryV1", "Attempting to get document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get document"); if (!_discovery.GetDocument(OnGetDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to get document"); + Log.Debug("ExampleDiscovery.GetDocument()", "Failed to get document"); while (!_getDocumentTested) yield return null; // Update Document - Log.Debug("ExampleDiscoveryV1", "Attempting to update document"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to update document"); if (!_discovery.UpdateDocument(OnUpdateDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID, _documentFilePath, _createdConfigurationID, null)) - Log.Debug("ExampleDiscovery", "Failed to update document"); + Log.Debug("ExampleDiscovery.UpdateDocument()", "Failed to update document"); while (!_updateDocumentTested) yield return null; // Query - Log.Debug("ExampleDiscoveryV1", "Attempting to query"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to query"); if (!_discovery.Query(OnQuery, _createdEnvironmentID, _createdCollectionID, null, _query, null, 10, null, 0)) - Log.Debug("ExampleDiscovery", "Failed to query"); + Log.Debug("ExampleDiscovery.Query()", "Failed to query"); while (!_queryTested) yield return null; // Delete Document - Log.Debug("ExampleDiscoveryV1", "Attempting to delete document {0}", _createdDocumentID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete document {0}", _createdDocumentID); if (!_discovery.DeleteDocument(OnDeleteDocument, _createdEnvironmentID, _createdCollectionID, _createdDocumentID)) - Log.Debug("ExampleDiscovery", "Failed to delete document"); + Log.Debug("ExampleDiscovery.DeleteDocument()", "Failed to delete document"); while (!_deleteDocumentTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete collection for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete collection for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Collection - Log.Debug("ExampleDiscoveryV1", "Attempting to delete collection {0}", _createdCollectionID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete collection {0}", _createdCollectionID); if (!_discovery.DeleteCollection(OnDeleteCollection, _createdEnvironmentID, _createdCollectionID)) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.DeleteCollection()", "Failed to add collection"); while (!_deleteCollectionTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete configuration for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete configuration for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Configuration - Log.Debug("ExampleDiscoveryV1", "Attempting to delete configuration {0}", _createdConfigurationID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete configuration {0}", _createdConfigurationID); if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, _createdEnvironmentID, _createdConfigurationID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete configuration"); + Log.Debug("ExampleDiscovery.DeleteConfiguration()", "Failed to delete configuration"); while (!_deleteConfigurationTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", "Delaying delete environment for 10 sec"); + Log.Debug("ExampleDiscovery.Examples()", "Delaying delete environment for 10 sec"); Invoke("Delay", 10f); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete Environment - Log.Debug("ExampleDiscoveryV1", "Attempting to delete environment {0}", _createdEnvironmentID); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to delete environment {0}", _createdEnvironmentID); if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, _createdEnvironmentID)) - Log.Debug("ExampleDiscoveryV1", "Failed to delete environment"); + Log.Debug("ExampleDiscovery.DeleteEnvironment()", "Failed to delete environment"); while (!_deleteEnvironmentTested) yield return null; - Log.Debug("ExampleDiscoveryV1", "Discovery examples complete."); + Log.Debug("ExampleDiscovery.Examples()", "Discovery examples complete."); } #region Check State private void CheckEnvironmentState() { - Log.Debug("ExampleDiscoveryV1", "Attempting to get environment state"); + Log.Debug("ExampleDiscovery.Examples()", "Attempting to get environment state"); try { _discovery.GetEnvironment(HandleCheckEnvironmentState, _createdEnvironmentID); } catch (System.Exception e) { - Log.Debug("ExampleDiscoveryV1", string.Format("Failed to get environment state: {0}", e.Message)); + Log.Debug("ExampleDiscovery.Examples()", string.Format("Failed to get environment state: {0}", e.Message)); CheckEnvironmentState(); } } private void HandleCheckEnvironmentState(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Environment {0} is {1}", resp.environment_id, resp.status); + Log.Debug("ExampleDiscovery.Examples()", "Environment {0} is {1}", resp.environment_id, resp.status); if (resp.status.ToLower() == "active") _isEnvironmentReady = true; @@ -277,39 +277,39 @@ private void Delay() private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); _getEnvironmentsTested = true; } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); _getEnvironmentTested = true; } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); _createdEnvironmentID = resp.environment_id; _addEnvironmentTested = true; } private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); _getConfigurationsTested = true; } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); _getConfigurationTested = true; } private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); _createdConfigurationID = resp.configuration_id; _addConfigurationTested = true; } @@ -317,56 +317,56 @@ private void OnAddConfiguration(Configuration resp, string data) private void OnPreviewConfiguration(TestDocument resp, string data) { _previewConfigurationTested = true; - Log.Debug("ExampleDiscoveryV1", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); } private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get collections Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get collections Response: {0}", data); _getCollectionsTested = true; } private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); _getCollectionTested = true; } private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); _createdCollectionID = resp.collection_id; _addCollectionTested = true; } private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); _getFieldsTested = true; } private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); _createdDocumentID = resp.document_id; _addDocumentTested = true; } private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); _getDocumentTested = true; } private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); _updateDocumentTested = true; } private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); if (success) _createdDocumentID = default(string); @@ -376,7 +376,7 @@ private void OnDeleteDocument(bool success, string data) private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); if (success) _createdCollectionID = default(string); @@ -386,7 +386,7 @@ private void OnDeleteCollection(bool success, string data) private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteConfiguration Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteConfiguration()", "Discovery - DeleteConfiguration Response: deleted:{0}", success); if (success) _createdConfigurationID = default(string); @@ -396,7 +396,7 @@ private void OnDeleteConfiguration(bool success, string data) private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteEnvironment Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteEnvironment()", "Discovery - DeleteEnvironment Response: deleted:{0}", success); if (success) _createdEnvironmentID = default(string); @@ -406,7 +406,7 @@ private void OnDeleteEnvironment(bool success, string data) private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); _queryTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs b/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs index 18c6641c9..a719179e2 100644 --- a/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs +++ b/Examples/ServiceExamples/Scripts/ExampleDocumentConversion.cs @@ -48,17 +48,17 @@ void Start() private IEnumerator Examples() { if (!_documentConversion.ConvertDocument(OnConvertDocument, _examplePath, _conversionTarget)) - Log.Debug("ExampleDocumentConversion", "Document conversion failed!"); + Log.Debug("ExampleDocumentConversion.ConvertDocument()", "Document conversion failed!"); while (!_convertDocumentTested) yield return null; - Log.Debug("ExampleDoucmentConversion", "Document conversion examples complete."); + Log.Debug("ExampleDoucmentConversion.Examples()", "Document conversion examples complete."); } private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) { - Log.Debug("ExampleDoucmentConversion", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); + Log.Debug("ExampleDoucmentConversion.OnConvertDocument()", "DocumentConversion - Convert document Response: {0}", documentConversionResponse.htmlContent); _convertDocumentTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleGetToken.cs b/Examples/ServiceExamples/Scripts/ExampleGetToken.cs index 833dab86c..484004c54 100644 --- a/Examples/ServiceExamples/Scripts/ExampleGetToken.cs +++ b/Examples/ServiceExamples/Scripts/ExampleGetToken.cs @@ -42,7 +42,7 @@ private IEnumerator Example() { // Get token if (!Utility.GetToken(OnGetToken, _url, _username, _password)) - Log.Debug("ExampleGetToken", "Failed to get token."); + Log.Debug("ExampleGetToken.GetToken()", "Failed to get token."); while (!_receivedAuthToken) yield return null; @@ -54,14 +54,14 @@ private IEnumerator Example() private void OnGetToken(AuthenticationToken authenticationToken, string customData) { _authenticationToken = authenticationToken; - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.OnGetToken()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); _receivedAuthToken = true; } private IEnumerator GetTokenTimeRemaining(float time) { yield return new WaitForSeconds(time); - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.GetTokenTimeRemaining()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); } private void Message() @@ -80,7 +80,7 @@ private void Message() private void OnMessage(object resp, string customData) { - Log.Debug("ExampleGetToken", "message response: {0}", customData); + Log.Debug("ExampleGetToken.OnMessage()", "message response: {0}", customData); // Check token time remaining Runnable.Run(GetTokenTimeRemaining(0f)); diff --git a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs index 81dbcd414..c9ba0bb65 100644 --- a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs +++ b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslation.cs @@ -18,6 +18,7 @@ using UnityEngine; using IBM.Watson.DeveloperCloud.Services.LanguageTranslation.v2; using IBM.Watson.DeveloperCloud.Utilities; +using IBM.Watson.DeveloperCloud.Logging; public class ExampleLanguageTranslation : MonoBehaviour { @@ -33,13 +34,13 @@ void Start() Credentials credentials = new Credentials(_username, _password, _url); _languageTranslation = new LanguageTranslation(credentials); - Debug.Log("English Phrase to translate: " + _pharseToTranslate); + Log.Debug("ExampleLangaugeTranslation.Start()", "English Phrase to translate: " + _pharseToTranslate); _languageTranslation.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation); } private void OnGetTranslation(Translations translation, string customData) { if (translation != null && translation.translations.Length > 0) - Debug.Log("Spanish Translation: " + translation.translations[0].translation); + Log.Debug("ExampleLangaugeTranslation.OnGetTranslation()", "Spanish Translation: " + translation.translations[0].translation); } } diff --git a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs index 4dc273d57..573bb45b2 100644 --- a/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs +++ b/Examples/ServiceExamples/Scripts/ExampleLanguageTranslator.cs @@ -59,84 +59,84 @@ void Start() private IEnumerator Examples() { if (!_languageTranslator.GetTranslation(_pharseToTranslate, "en", "es", OnGetTranslation)) - Log.Debug("TestLanguageTranslator", "Failed to translate."); + Log.Debug("ExampleLanguageTranslator.GetTranslation()", "Failed to translate."); while (!_getTranslationTested) yield return null; if (!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslator", "Failed to get models."); + Log.Debug("ExampleLanguageTranslator.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; if (!_languageTranslator.CreateModel(OnCreateModel, _baseModelName, _customModelName, _forcedGlossaryFilePath)) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("ExampleLanguageTranslator.CreateModel()", "Failed to create model."); while (!_createModelTested) yield return null; if (!_languageTranslator.GetModel(OnGetModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to get model."); + Log.Debug("ExampleLanguageTranslator.GetModel()", "Failed to get model."); while (!_getModelTested) yield return null; if (!_languageTranslator.DeleteModel(OnDeleteModel, _customLanguageModelId)) - Log.Debug("TestLanguageTranslator", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslator.DeleteModel()", "Failed to delete model."); while (!_deleteModelTested) yield return null; if (!_languageTranslator.Identify(OnIdentify, _pharseToIdentify)) - Log.Debug("TestLanguageTranslator", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslator.Identify()", "Failed to identify language."); while (!_identifyTested) yield return null; if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslator", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslator.GetLanguages()", "Failed to get languages."); while (!_getLanguagesTested) yield return null; - Log.Debug("TestLanguageTranslator", "Language Translator examples complete."); + Log.Debug("ExampleLanguageTranslator.Examples()", "Language Translator examples complete."); } private void OnGetModels(TranslationModels models, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", customData); _getModelsTested = true; } private void OnCreateModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", customData); _customLanguageModelId = model.model_id; _createModelTested = true; } private void OnGetModel(TranslationModel model, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", customData); _getModelTested = true; } private void OnDeleteModel(bool success, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); _customLanguageModelId = null; _deleteModelTested = true; } private void OnGetTranslation(Translations translation, string customData) { - Log.Debug("TestLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", customData); _getTranslationTested = true; } private void OnIdentify(string lang, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", customData); _identifyTested = true; } private void OnGetLanguages(Languages languages, string customData) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", customData); _getLanguagesTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs index e9cedba3e..3705c9745 100644 --- a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs +++ b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageClassifier.cs @@ -67,13 +67,13 @@ private IEnumerator Examples() { // Get classifiers if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifiers!"); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); while (!_getClassifiersTested) yield return null; if (_classifierIds.Count == 0) - Log.Debug("ExampleNaturalLanguageClassifier", "There are no trained classifiers. Please train a classifier..."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "There are no trained classifiers. Please train a classifier..."); if (_classifierIds.Count > 0) { @@ -81,7 +81,7 @@ private IEnumerator Examples() foreach (string classifierId in _classifierIds) { if (!naturalLanguageClassifier.GetClassifier(classifierId, OnGetClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifier {0}!", classifierId); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } while (!_getClassifierTested) @@ -89,14 +89,14 @@ private IEnumerator Examples() } if (!_areAnyClassifiersAvailable && _classifierIds.Count > 0) - Log.Debug("ExampleNaturalLanguageClassifier", "All classifiers are training..."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "All classifiers are training..."); // Train classifier #if TRAIN_CLASSIFIER string dataPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/weather_data_train.csv"; var trainingContent = File.ReadAllText(dataPath); if (!naturalLanguageClassifier.TrainClassifier(_classifierName + "/" + DateTime.Now.ToString(), "en", trainingContent, OnTrainClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to train clasifier!"); + Log.Debug("ExampleNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); while (!_trainClassifierTested) yield return null; @@ -105,25 +105,25 @@ private IEnumerator Examples() #if DELETE_TRAINED_CLASSIFIER if (!string.IsNullOrEmpty(_classifierToDelete)) if (!naturalLanguageClassifier.DeleteClassifer(_classifierToDelete, OnDeleteTrainedClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to delete clasifier {0}!", _classifierToDelete); + Log.Debug("ExampleNaturalLanguageClassifier.DeleteClassifer()", "Failed to delete clasifier {0}!", _classifierToDelete); #endif // Classify if (_areAnyClassifiersAvailable) { if (!naturalLanguageClassifier.Classify(_classifierId, _inputString, OnClassify)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to classify!"); + Log.Debug("ExampleNaturalLanguageClassifier.Classify()", "Failed to classify!"); while (!_classifyTested) yield return null; } - Log.Debug("ExampleNaturalLanguageClassifier", "Natural language classifier examples complete."); + Log.Debug("ExampleNaturalLanguageClassifier.Examples()", "Natural language classifier examples complete."); } private void OnGetClassifiers(Classifiers classifiers, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); foreach (Classifier classifier in classifiers.classifiers) _classifierIds.Add(classifier.classifier_id); @@ -133,14 +133,14 @@ private void OnGetClassifiers(Classifiers classifiers, string data) private void OnClassify(ClassifyResult result, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); _classifyTested = true; } #if TRAIN_CLASSIFIER private void OnTrainClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; #endif @@ -150,7 +150,7 @@ private void OnTrainClassifier(Classifier classifier, string data) private void OnGetClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); // Get any classifier that is available if (!string.IsNullOrEmpty(classifier.status) && classifier.status.ToLower() == "available") @@ -166,7 +166,7 @@ private void OnGetClassifier(Classifier classifier, string data) #if DELETE_TRAINED_CLASSIFIER private void OnDeleteTrainedClassifier(bool success, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", _classifierToDelete, success, data); } #endif } diff --git a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs index 72b4a81c8..f9bbd4bd3 100644 --- a/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs +++ b/Examples/ServiceExamples/Scripts/ExampleNaturalLanguageUnderstandingV1.cs @@ -48,9 +48,9 @@ void Start() private IEnumerator Examples() { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to get models..."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "attempting to get models..."); if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); while (!_getModelsTested) yield return null; @@ -76,20 +76,20 @@ private IEnumerator Examples() } }; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "attempting to analyze..."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "attempting to analyze..."); if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, parameters)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); while (!_analyzeTested) yield return null; - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Natural language understanding examples complete."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "Natural language understanding examples complete."); } private void OnGetModels(ListModelsResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "ListModelsResult: {0}", data.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "ListModelsResult: {0}", data.ToString()); _getModelsTested = true; } @@ -98,7 +98,7 @@ private void OnAnalyze(AnalysisResults resp, string customData) { fsData data = null; _serializer.TrySerialize(resp, out data).AssertSuccess(); - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "AnalysisResults: {0}", data.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.Examples()", "AnalysisResults: {0}", data.ToString()); _analyzeTested = true; } diff --git a/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs b/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs index e6c4df56c..b41fc75d3 100644 --- a/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs +++ b/Examples/ServiceExamples/Scripts/ExamplePersonalityInsightsV3.cs @@ -55,27 +55,27 @@ void Start() private IEnumerator Examples() { if (!_personalityInsights.GetProfile(OnGetProfileJson, _dataPath, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileJsonTested) yield return null; if (!_personalityInsights.GetProfile(OnGetProfileText, _testString, ContentType.TextHtml, ContentLanguage.English, ContentType.ApplicationJson, AcceptLanguage.English, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); while (!_getProfileTextTested) yield return null; - Log.Debug("ExamplePersonalityInsights", "Personality insights examples complete."); + Log.Debug("ExamplePersonalityInsights.Examples()", "Personality insights examples complete."); } private void OnGetProfileText(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileText Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileText()", "Personality Insights - GetProfileText Response: {0}", data); _getProfileTextTested = true; } private void OnGetProfileJson(Profile profile, string data) { - Log.Debug("ExamplePersonaltyInsights", "Personality Insights - GetProfileJson Response: {0}", data); + Log.Debug("ExamplePersonaltyInsights.OnGetProfileJson()", "Personality Insights - GetProfileJson Response: {0}", data); _getProfileJsonTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs b/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs index 4fa734812..552d99645 100644 --- a/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs +++ b/Examples/ServiceExamples/Scripts/ExampleRetrieveAndRank.cs @@ -92,17 +92,17 @@ void Start() private IEnumerator Examples() { // Get clusters - Log.Debug("ExampleRetrieveAndRank", "Attempting to get clusters."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get clusters."); if (!_retrieveAndRank.GetClusters(OnGetClusters)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get clusters!"); + Log.Debug("ExampleRetrieveAndRank.GetClusters()", "Failed to get clusters!"); while (!_getClustersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to create cluster."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create cluster."); if (!_retrieveAndRank.CreateCluster(OnCreateCluster, "unity-test-cluster", "1")) - Log.Debug("ExampleRetrieveAndRank", "Failed to create cluster!"); + Log.Debug("ExampleRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); while (!_createClusterTested || !_readyToContinue) yield return null; @@ -113,78 +113,78 @@ private IEnumerator Examples() _readyToContinue = false; // List cluster configs - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster configs."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster configs."); if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster configs!"); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); while (!_getClusterConfigsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Upload cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to upload cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to upload cluster config."); if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, _clusterToDelete, _testClusterConfigName, _testClusterConfigPath)) - Log.Debug("ExampleRetrieveAndRank", "Failed to upload cluster config {0}!", _testClusterConfigPath); + Log.Debug("ExampleRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", _testClusterConfigPath); while (!_uploadClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster."); if (!_retrieveAndRank.GetCluster(OnGetCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster!"); + Log.Debug("ExampleRetrieveAndRank.GetCluster()", "Failed to get cluster!"); while (!_getClusterTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get cluster config - Log.Debug("ExampleRetrieveAndRank", "Attempting to get cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get cluster config."); if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, _clusterToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster config {0}!", _testClusterConfigName); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", _testClusterConfigName); while (!_getClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // List Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to get collections."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get collections."); if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, _clusterToDelete, CollectionsAction.List)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); while (!_getCollectionsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to create collection."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create collection."); if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, _clusterToDelete, CollectionsAction.Create, _collectionNameToDelete, _testClusterConfigName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); while (!_createCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Index documents - Log.Debug("ExampleRetrieveAndRank", "Attempting to index documents."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to index documents."); if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, _indexDataPath, _clusterToDelete, _collectionNameToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to index documents!"); + Log.Debug("ExampleRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); while (!_indexDocumentsTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRankers(OnGetRankers)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get rankers!"); + Log.Debug("ExampleRetrieveAndRank.GetRankers()", "Failed to get rankers!"); while (!_getRankersTested || !_readyToContinue) yield return null; _readyToContinue = false; // Create ranker - Log.Debug("ExampleRetrieveAndRank", "Attempting to create ranker."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to create ranker."); if (!_retrieveAndRank.CreateRanker(OnCreateRanker, _testRankerTrainingPath, _createdRankerName)) - Log.Debug("ExampleRetrieveAndRank", "Failed to create ranker!"); + Log.Debug("ExampleRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); while (!_createRankerTested || !_readyToContinue) yield return null; // Wait for ranker status to be `Available`. - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Checking ranker status in 10 seconds"); CheckRankerStatus(); while (!_isRankerReady || !_readyToContinue) yield return null; @@ -192,74 +192,74 @@ private IEnumerator Examples() _readyToContinue = false; // Standard Search string[] fl = { "title", "id", "body", "author", "bibliography" }; - Log.Debug("ExampleRetrieveAndRank", "Attempting to search standard."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to search standard."); if (!_retrieveAndRank.Search(OnSearchStandard, _clusterToDelete, _collectionNameToDelete, _testQuery, fl)) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); while (!_searchStandardTested || !_readyToContinue) yield return null; _readyToContinue = false; // Rank - Log.Debug("ExampleRetrieveAndRank", "Attempting to rank."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to rank."); if (!_retrieveAndRank.Rank(OnRank, _rankerIdToDelete, _testAnswerDataPath)) - Log.Debug("ExampleRetriveAndRank", "Failed to rank!"); + Log.Debug("ExampleRetrieveAndRank.Rank()", "Failed to rank!"); while (!_rankTested || !_readyToContinue) yield return null; _readyToContinue = false; // Get ranker info - Log.Debug("ExampleRetrieveAndRank", "Attempting to get rankers."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to get rankers."); if (!_retrieveAndRank.GetRanker(OnGetRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get ranker!"); + Log.Debug("ExampleRetrieveAndRank.GetRanker()", "Failed to get ranker!"); while (!_getRankerTested) yield return null; _readyToContinue = false; // Delete rankers - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete ranker {0}.", _rankerIdToDelete); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete ranker {0}.", _rankerIdToDelete); if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, _rankerIdToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete ranker {0}!", _rankerIdToDelete); + Log.Debug("ExampleRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", _rankerIdToDelete); while (!_deleteRankerTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete Collection request - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete collection {0}.", "TestCollectionToDelete"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete collection {0}.", "TestCollectionToDelete"); if (!_retrieveAndRank.ForwardCollectionRequest(OnDeleteCollection, _clusterToDelete, CollectionsAction.Delete, "TestCollectionToDelete")) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); while (!_deleteCollectionTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster config string clusterConfigToDelete = "test-config"; - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster config."); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete cluster config."); if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, _clusterToDelete, clusterConfigToDelete)) - Log.Debug("ExampleRetriveAndRank", "Failed to delete cluster config {0}", clusterConfigToDelete); + Log.Debug("ExampleRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", clusterConfigToDelete); while (!_deleteClusterConfigTested || !_readyToContinue) yield return null; _readyToContinue = false; // Delete cluster - Log.Debug("ExampleRetrieveAndRank", "Attempting to delete cluster {0}.", _clusterToDelete); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Attempting to delete cluster {0}.", _clusterToDelete); if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, _clusterToDelete)) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete cluster!"); + Log.Debug("ExampleRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); while (!_deleteClusterTested || !_readyToContinue) yield return null; - Log.Debug("ExampleRetrieveAndRank", "Retrieve and rank examples complete!"); + Log.Debug("ExampleRetrieveAndRank.Examples()", "Retrieve and rank examples complete!"); } private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get clusters response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "Retrieve and rank - Get clusters response: {0}", data); _getClustersTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCluster()", "Retrieve and rank - Create cluster response: {0}", data); _clusterToDelete = resp.solr_cluster_id; _createClusterTested = true; Invoke("ReadyToContinue", _waitTime); @@ -267,28 +267,28 @@ private void OnCreateCluster(SolrClusterResponse resp, string data) private void OnDeleteCluster(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCluster()", "Retrieve and rank - Delete cluster response: {0}", data); _deleteClusterTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "Retrieve and rank - Get cluster response: {0}", data); _getClusterTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "Retrieve and rank - Get cluster config response: {0}", data); _getClusterConfigsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteClusterConfig(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Deletecluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteClusterConfig()", "Retrieve and rank - Deletecluster config response: {0}", data); _deleteClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); } @@ -297,9 +297,9 @@ private void OnDeleteClusterConfig(bool success, string data) private void OnGetClusterConfig(byte[] respData, string data) { #if UNITY_EDITOR - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "Retrieve and rank - Get cluster config response: {0}", data); #else - Log.Debug("ExampleRetrieveAndRank", "Not in editor - skipping download."); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "Not in editor - skipping download."); #endif _getClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); @@ -307,49 +307,49 @@ private void OnGetClusterConfig(byte[] respData, string data) private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Upload cluster config response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "Retrieve and rank - Upload cluster config response: {0}", data); _uploadClusterConfigTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "Retrieve and rank - Get collections response: {0}", data); _getCollectionsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "Retrieve and rank - Get collections response: {0}", data); _createCollectionTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteCollection(CollectionsResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get collections response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCollection()", "Retrieve and rank - Get collections response: {0}", data); _deleteCollectionTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Index documents response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "Retrieve and rank - Index documents response: {0}", data); _indexDocumentsTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get rankers response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "Retrieve and rank - Get rankers response: {0}", data); _getRankersTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Create ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "Retrieve and rank - Create ranker response: {0}", data); _rankerIdToDelete = resp.ranker_id; _createRankerTested = true; Invoke("ReadyToContinue", _waitTime); @@ -357,28 +357,28 @@ private void OnCreateRanker(RankerStatusPayload resp, string data) private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Rank response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnRank()", "Retrieve and rank - Rank response: {0}", data); _rankTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Get ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "Retrieve and rank - Get ranker response: {0}", data); _getRankerTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnDeleteRanker(bool success, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Delete ranker response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnDeleteRanker()", "Retrieve and rank - Delete ranker response: {0}", data); _deleteRankerTested = true; Invoke("ReadyToContinue", _waitTime); } private void OnSearchStandard(SearchResponse resp, string data) { - Log.Debug("\tExampleRetrieveAndRank", "Retrieve and rank - Search standard response: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSearchStandard()", "Retrieve and rank - Search standard response: {0}", data); _searchStandardTested = true; Invoke("ReadyToContinue", _waitTime); } @@ -387,10 +387,10 @@ private void CheckClusterStatus() { if (!_retrieveAndRank.GetCluster((SolrClusterResponse resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr cluster status is '{0}'", resp.solr_cluster_status); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Solr cluster status is '{0}'", resp.solr_cluster_status); if (resp.solr_cluster_status.ToLower() != "ready") { - Log.Debug("ExampleRetrieveAndRank", "Checking cluster status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Checking cluster status in 10 seconds"); Invoke("CheckClusterStatus", 10f); } else @@ -398,17 +398,17 @@ private void CheckClusterStatus() _isClusterReady = true; } }, _clusterToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get cluster"); + Log.Debug("ExampleRetrieveAndRank.CheckClusterStatus()", "Failed to get cluster"); } private void CheckRankerStatus() { if (!_retrieveAndRank.GetRanker((RankerStatusPayload resp, string data) => { - Log.Debug("\tExampleRetrieveAndRank", "Solr ranker status is '{0}'", resp.status); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Solr ranker status is '{0}'", resp.status); if (resp.status.ToLower() != "available") { - Log.Debug("ExampleRetrieveAndRank", "Checking ranker status in 10 seconds"); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Checking ranker status in 10 seconds"); Invoke("CheckRankerStatus", 10f); } else @@ -416,7 +416,7 @@ private void CheckRankerStatus() _isRankerReady = true; } }, _rankerIdToDelete)) - Log.Debug("\tExampleRetrieveAndRank", "Failed to get ranker"); + Log.Debug("ExampleRetrieveAndRank.CheckRankerStatus()", "Failed to get ranker"); } private void ReadyToContinue() diff --git a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs index 4943382fa..6b404dbfd 100644 --- a/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs +++ b/Examples/ServiceExamples/Scripts/ExampleSpeechToText.cs @@ -111,7 +111,7 @@ private IEnumerator Examples() yield return null; // Recognize - Log.Debug("ExampleSpeechToText", "Attempting to recognize"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to recognize"); List keywords = new List(); keywords.Add("speech"); _speechToText.KeywordsThreshold = 0.5f; @@ -128,50 +128,50 @@ private IEnumerator Examples() yield return null; // Get models - Log.Debug("ExampleSpeechToText", "Attempting to get models"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get models"); _speechToText.GetModels(HandleGetModels); while (!_getModelsTested) yield return null; // Get model - Log.Debug("ExampleSpeechToText", "Attempting to get model {0}", _modelNameToGet); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get model {0}", _modelNameToGet); _speechToText.GetModel(HandleGetModel, _modelNameToGet); while (!_getModelTested) yield return null; // Get customizations - Log.Debug("ExampleSpeechToText", "Attempting to get customizations"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get customizations"); _speechToText.GetCustomizations(HandleGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create customization - Log.Debug("ExampleSpeechToText", "Attempting create customization"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting create customization"); _speechToText.CreateCustomization(HandleCreateCustomization, "unity-test-customization", "en-US_BroadbandModel", "Testing customization unity"); while (!_createCustomizationsTested) yield return null; // Get customization - Log.Debug("ExampleSpeechToText", "Attempting to get customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get customization {0}", _createdCustomizationID); _speechToText.GetCustomization(HandleGetCustomization, _createdCustomizationID); while (!_getCustomizationTested) yield return null; // Get custom corpora - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpora for {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom corpora for {0}", _createdCustomizationID); _speechToText.GetCustomCorpora(HandleGetCustomCorpora, _createdCustomizationID); while (!_getCustomCorporaTested) yield return null; // Add custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); string corpusData = File.ReadAllText(_customCorpusFilePath); _speechToText.AddCustomCorpus(HandleAddCustomCorpus, _createdCustomizationID, _createdCorpusName, true, corpusData); while (!_addCustomCorpusTested) yield return null; // Get custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.GetCustomCorpus(HandleGetCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_getCustomCorpusTested) yield return null; @@ -182,13 +182,13 @@ private IEnumerator Examples() yield return null; // Get custom words - Log.Debug("ExampleSpeechToText", "Attempting to get custom words."); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom words."); _speechToText.GetCustomWords(HandleGetCustomWords, _createdCustomizationID); while (!_getCustomWordsTested) yield return null; // Add custom words from path - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom words in customization {0} using Words json path {1}", _createdCustomizationID, _customWordsFilePath); string customWords = File.ReadAllText(_customWordsFilePath); _speechToText.AddCustomWords(HandleAddCustomWordsFromPath, _createdCustomizationID, customWords); while (!_addCustomWordsFromPathTested) @@ -223,7 +223,7 @@ private IEnumerator Examples() wordList.Add(w2); words.words = wordList.ToArray(); - Log.Debug("ExampleSpeechToText", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to add custom words in customization {0} using Words object", _createdCustomizationID); _speechToText.AddCustomWords(HandleAddCustomWordsFromObject, _createdCustomizationID, words); while (!_addCustomWordsFromObjectTested) yield return null; @@ -235,13 +235,13 @@ private IEnumerator Examples() yield return null; // Get custom word - Log.Debug("ExampleSpeechToText", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get custom word {1} in customization {0}", _createdCustomizationID, words.words[0].word); _speechToText.GetCustomWord(HandleGetCustomWord, _createdCustomizationID, words.words[0].word); while (!_getCustomWordTested) yield return null; // Train customization - Log.Debug("ExampleSpeechToText", "Attempting to train customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to train customization {0}", _createdCustomizationID); _speechToText.TrainCustomization(HandleTrainCustomization, _createdCustomizationID); while (!_trainCustomizationTested) yield return null; @@ -253,77 +253,81 @@ private IEnumerator Examples() yield return null; // Upgrade customization - not currently implemented in service - //Log.Debug("ExampleSpeechToText", "Attempting to upgrade customization {0}", _createdCustomizationID); + //Log.Debug("ExampleSpeechToText.Examples()", "Attempting to upgrade customization {0}", _createdCustomizationID); //_speechToText.UpgradeCustomization(HandleUpgradeCustomization, _createdCustomizationID); //while (!_upgradeCustomizationTested) // yield return null; // Delete custom word - Log.Debug("ExampleSpeechToText", "Attempting to delete custom wreord {1} in customization {0}", _createdCustomizationID, words.words[2].word); + Log.Debug("ExampleSpeechToText", "Attempting to delete custom word {1} in customization {0}", _createdCustomizationID, words.words[2].word); _speechToText.DeleteCustomWord(HandleDeleteCustomWord, _createdCustomizationID, words.words[2].word); while (!_deleteCustomWordTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete custom corpus - Log.Debug("ExampleSpeechToText", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete custom corpus {1} in customization {0}", _createdCustomizationID, _createdCorpusName); _speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, _createdCustomizationID, _createdCorpusName); while (!_deleteCustomCorpusTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Reset customization - Log.Debug("ExampleSpeechToText", "Attempting to reset customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to reset customization {0}", _createdCustomizationID); _speechToText.ResetCustomization(HandleResetCustomization, _createdCustomizationID); while (!_resetCustomizationTested) yield return null; // Delay - Log.Debug("ExampleDiscovery", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete environment for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; _readyToContinue = false; // Delete customization - Log.Debug("ExampleSpeechToText", "Attempting to delete customization {0}", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete customization {0}", _createdCustomizationID); _speechToText.DeleteCustomization(HandleDeleteCustomization, _createdCustomizationID); while (!_deleteCustomizationsTested) yield return null; // List acoustic customizations - Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customizations"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get acoustic customizations"); _speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels); while (!_getAcousticCustomizationsTested) yield return null; // Create acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to create acoustic customization"); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to create acoustic customization"); _speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, _createdAcousticModelName); while (!_createAcousticCustomizationsTested) yield return null; // Get acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to get acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get acoustic customization {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, _createdAcousticModelId); while (!_getAcousticCustomizationTested) yield return null; + while (!_isAudioLoaded) + yield return null; + // Create acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); - _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, _acousticResourceMimeType, _acousticResourceMimeType, true, _acousticResourceData); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to create audio resource {1} on {0}", _createdAcousticModelId, _acousticResourceName); + string mimeType = Utility.GetMimeType(Path.GetExtension(_acousticResourceUrl)); + _speechToText.AddAcousticResource(HandleAddAcousticResource, _createdAcousticModelId, _acousticResourceName, mimeType, mimeType, true, _acousticResourceData); while (!_addAcousticResourcesTested) yield return null; @@ -334,19 +338,19 @@ private IEnumerator Examples() yield return null; // List acoustic resources - Log.Debug("ExampleSpeechToText", "Attempting to get audio resources {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get audio resources {0}", _createdAcousticModelId); _speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, _createdAcousticModelId); while (!_getAcousticResourcesTested) yield return null; // Train acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to train acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to train acoustic customization {0}", _createdAcousticModelId); _speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, _createdAcousticModelId, null, true); while (!_trainAcousticCustomizationsTested) yield return null; // Get acoustic resource - Log.Debug("ExampleSpeechToText", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to get audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, _createdAcousticModelId, _acousticResourceName); while (!_getAcousticResourceTested) yield return null; @@ -358,13 +362,13 @@ private IEnumerator Examples() yield return null; // Reset acoustic customization - Log.Debug("ExampleSpeechToText", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to reset acoustic customization {0}", _createdAcousticModelId); _speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, _createdAcousticModelId); while (!_resetAcousticCustomizationsTested) yield return null; // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete acoustic resource for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -373,7 +377,7 @@ private IEnumerator Examples() DeleteAcousticResource(); // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying delete acoustic customization for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; @@ -384,37 +388,37 @@ private IEnumerator Examples() yield return null; // Delay - Log.Debug("ExampleSpeechToText", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); + Log.Debug("ExampleSpeechToText.Examples()", string.Format("Delaying complete for {0} sec", _delayTimeInSeconds)); Runnable.Run(Delay(_delayTimeInSeconds)); while (!_readyToContinue) yield return null; - Log.Debug("ExampleSpeechToText", "Speech to Text examples complete."); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text examples complete."); } private void DeleteAcousticResource() { - Log.Debug("ExampleSpeechToText", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete audio resource {1} from {0}", _createdAcousticModelId, _acousticResourceName); _speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, _createdAcousticModelId, _acousticResourceName); } private void DeleteAcousticCustomization() { - Log.Debug("ExampleSpeechToText", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); + Log.Debug("ExampleSpeechToText.Examples()", "Attempting to delete acoustic customization {0}", _createdAcousticModelId); _speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, _createdAcousticModelId); } private void HandleGetModels(ModelSet result, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text - Get models response: {0}", customData); _modelNameToGet = (result.models[UnityEngine.Random.Range(0, result.models.Length - 1)] as Model).name; _getModelsTested = true; } private void HandleGetModel(Model model, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText.Examples()", "Speech to Text - Get model response: {0}", customData); _getModelTested = true; } @@ -427,7 +431,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("ExampleSpeechToText.HandleOnRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -437,7 +441,7 @@ private void HandleOnRecognize(SpeechRecognitionEvent result) { foreach (var keyword in res.keywords_result.keyword) { - Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + Log.Debug("ExampleSpeechToText.HandleOnRecognize()", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } } @@ -472,20 +476,20 @@ private void HandleOnRecognizeOgg(SpeechRecognitionEvent result) private void HandleGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", customData); _getCustomizationsTested = true; } private void HandleCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Create customization response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Create customization response: {0}", customData); _createdCustomizationID = customizationID.customization_id; _createCustomizationsTested = true; } private void HandleGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", customData); _getCustomizationTested = true; } @@ -493,12 +497,12 @@ private void HandleDeleteCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomization()", "Speech to Text - Get customization response: Deleted customization {0}!", _createdCustomizationID); _createdCustomizationID = default(string); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete customization!"); + Log.Debug("ExampleSpeechToText.Examples()", "Failed to delete customization!"); } _deleteCustomizationsTested = true; @@ -508,11 +512,11 @@ private void HandleTrainCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Trained customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Trained customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to train customization!"); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Failed to train customization!"); } _trainCustomizationTested = true; @@ -522,11 +526,11 @@ private void HandleTrainCustomization(bool success, string customData) //{ // if (success) // { - // Log.Debug("ExampleSpeechToText", "Upgrade customization {0}!", _createdCustomizationID); + // Log.Debug("ExampleSpeechToText.HandleUpgradeCustomization()", "Upgrade customization {0}!", _createdCustomizationID); // } // else // { - // Log.Debug("ExampleSpeechToText", "Failed to upgrade customization!"); + // Log.Debug("ExampleSpeechToText.HandleUpgradeCustomization()", "Failed to upgrade customization!"); // } // _upgradeCustomizationTested = true; @@ -536,11 +540,11 @@ private void HandleResetCustomization(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Reset customization {0}!", _createdCustomizationID); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Reset customization {0}!", _createdCustomizationID); } else { - Log.Debug("ExampleSpeechToText", "Failed to reset customization!"); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Failed to reset customization!"); } _resetCustomizationTested = true; @@ -548,7 +552,7 @@ private void HandleResetCustomization(bool success, string customData) private void HandleGetCustomCorpora(Corpora corpora, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customData); _getCustomCorporaTested = true; } @@ -556,11 +560,11 @@ private void HandleDeleteCustomCorpus(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - delete custom coprus response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - delete custom coprus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Failed to delete custom corpus!"); } _deleteCustomCorpusTested = true; @@ -570,11 +574,11 @@ private void HandleAddCustomCorpus(bool success, string customData) { if(success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to add custom corpus!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Failed to add custom corpus!"); } _addCustomCorpusTested = true; @@ -582,13 +586,13 @@ private void HandleAddCustomCorpus(bool success, string customData) private void HandleGetCustomCorpus(Corpus corpus, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customData); _getCustomCorpusTested = true; } private void HandleGetCustomWords(WordsList wordList, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", customData); _getCustomWordsTested = true; } @@ -596,11 +600,11 @@ private void HandleAddCustomWordsFromPath(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from path response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromPath()", "Speech to Text - Add custom words from path response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromPath()", "Failed to delete custom word!"); } _addCustomWordsFromPathTested = true; @@ -610,11 +614,11 @@ private void HandleAddCustomWordsFromObject(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words from object response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromObject()", "Speech to Text - Add custom words from object response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleAddCustomWordsFromObject()", "Failed to delete custom word!"); } _addCustomWordsFromObjectTested = true; @@ -624,11 +628,11 @@ private void HandleDeleteCustomWord(bool success, string customData) { if (success) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: succeeded!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: succeeded!"); } else { - Log.Debug("ExampleSpeechToText", "Failed to delete custom word!"); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Failed to delete custom word!"); } _deleteCustomWordTested = true; @@ -636,67 +640,67 @@ private void HandleDeleteCustomWord(bool success, string customData) private void HandleGetCustomWord(WordData word, string customData) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", customData); _getCustomWordTested = true; } private void HandleGetCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) { - Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModels()", "acousticCustomizations: {0}", customData); _getAcousticCustomizationsTested = true; } private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", customData); _createdAcousticModelId = customizationID.customization_id; _createAcousticCustomizationsTested = true; } private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) { - Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", customData); _getAcousticCustomizationTested = true; } private void HandleTrainAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); _trainAcousticCustomizationsTested = true; } private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) { - Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", customData); _getAcousticResourcesTested = true; } private void HandleAddAcousticResource(string customData) { - Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", customData); _addAcousticResourcesTested = true; } private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) { - Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", customData); _getAcousticResourceTested = true; } private void HandleResetAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); _resetAcousticCustomizationsTested = true; } private void HandleDeleteAcousticResource(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } private void HandleDeleteAcousticCustomization(bool success, string customData) { - Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); if (success) _deleteAcousticCustomizationsTested = true; else @@ -705,7 +709,7 @@ private void HandleDeleteAcousticCustomization(bool success, string customData) private IEnumerator CheckCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking customization status in {0} seconds...", delay.ToString()); + Log.Debug("ExampleSpeechToText.CheckCustomizationStatus()", "Checking customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -716,7 +720,7 @@ private void OnCheckCustomizationStatus(Customization customization, string cust { if (customization != null) { - Log.Debug("TestSpeechToText", "Customization status: {0}", customization.status); + Log.Debug("ExampleSpeechToText.OnCheckCustomizationStatus()", "Customization status: {0}", customization.status); if (customization.status != "ready" && customization.status != "available") Runnable.Run(CheckCustomizationStatus(customData, 5f)); else @@ -724,13 +728,13 @@ private void OnCheckCustomizationStatus(Customization customization, string cust } else { - Log.Debug("TestSpeechToText", "Check customization status failed!"); + Log.Debug("ExampleSpeechToText.OnCheckCustomizationStatus()", "Check customization status failed!"); } } private IEnumerator CheckAcousticCustomizationStatus(string customizationID, float delay = 0.1f) { - Log.Debug("TestSpeechToText", "Checking acoustic customization status in {0} seconds...", delay.ToString()); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Checking acoustic customization status in {0} seconds...", delay.ToString()); yield return new WaitForSeconds(delay); // passing customizationID in custom data @@ -741,7 +745,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu { if (acousticCustomization != null) { - Log.Debug("TestSpeechToText", "Acoustic customization status: {0}", acousticCustomization.status); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Acoustic customization status: {0}", acousticCustomization.status); if (acousticCustomization.status != "ready" && acousticCustomization.status != "available") Runnable.Run(CheckAcousticCustomizationStatus(customData, 5f)); else @@ -749,7 +753,7 @@ private void OnCheckAcousticCustomizationStatus(AcousticCustomization acousticCu } else { - Log.Debug("TestSpeechToText", "Check acoustic customization status failed!"); + Log.Debug("ExampleSpeechToText.CheckAcousticCustomizationStatus()", "Check acoustic customization status failed!"); } } @@ -761,11 +765,11 @@ private IEnumerator Delay(float delayTime) private IEnumerator DownloadAcousticResource() { - Log.Debug("ExampleSpeechToText", "downloading acoustic resource from {0}", _acousticResourceUrl); + Log.Debug("ExampleSpeechToText.DownloadAcousticResource()", "downloading acoustic resource from {0}", _acousticResourceUrl); WWW www = new WWW(_acousticResourceUrl); yield return www; - - Log.Debug("ExampleSpeechToText", "acoustic resource downloaded"); + + Log.Debug("ExampleSpeechToText.DownloadAcousticResource()", "acoustic resource downloaded"); _acousticResourceData = www.bytes; _isAudioLoaded = true; www.Dispose(); @@ -782,4 +786,4 @@ private IEnumerator DownloadOggResource() _isOggLoaded = true; www.Dispose(); } -} \ No newline at end of file +} diff --git a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs index ed2fa3270..5e634dc1b 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreaming.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreaming.cs @@ -15,9 +15,6 @@ * */ -// Uncomment to test chunked -#define CHUNK_BUFFER - using UnityEngine; using System.Collections; using IBM.Watson.DeveloperCloud.Logging; @@ -32,6 +29,7 @@ public class ExampleStreaming : MonoBehaviour private string _username = null; private string _password = null; private string _url = null; + public Text ResultsField; private int _recordingRoutine = 0; @@ -39,7 +37,6 @@ public class ExampleStreaming : MonoBehaviour private AudioClip _recording = null; private int _recordingBufferSize = 1; private int _recordingHZ = 22050; - private int _chunkCount = 50; private SpeechToText _speechToText; @@ -75,12 +72,6 @@ public bool Active _speechToText.SmartFormatting = true; _speechToText.SpeakerLabels = false; _speechToText.WordAlternativesThreshold = null; - //List keywords = new List(); - //keywords.Add("hello"); - //keywords.Add("testing"); - //keywords.Add("watson"); - //_speechToText.KeywordsThreshold = 0.5f; - //_speechToText.Keywords = keywords.ToArray(); _speechToText.StartListening(OnRecognize, OnRecognizeSpeaker); } else if (!value && _speechToText.IsListening) @@ -113,113 +104,12 @@ private void OnError(string error) { Active = false; - Log.Debug("ExampleStreaming", "Error! {0}", error); + Log.Debug("ExampleStreaming.OnError()", "Error! {0}", error); } -#if CHUNK_BUFFER - - private IEnumerator RecordingHandler() - { - Log.Debug("ExampleStreamingChunks", "devices: {0}", Microphone.devices); - // Start recording - _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); - yield return null; - - if (_recording == null) - { - StopRecording(); - yield break; - } - -#if ENABLE_TIME_LOGGING - // Set a reference to now to check timing - DateTime now = DateTime.Now; -#endif - - // Current chunk number - int chunkNum = 0; - - // Size of the chunk in samples - int chunkSize = _recording.samples / _chunkCount; - - // Init samples - float[] samples = null; - - while (_recordingRoutine != 0 && _recording != null) - { - // Get the mic position - int microphonePosition = Microphone.GetPosition(_microphoneID); - if (microphonePosition > _recording.samples || !Microphone.IsRecording(_microphoneID)) - { - Log.Error("ExampleStreaming", "Microphone disconnected."); - - StopRecording(); - yield break; - } - - int sampleStart = chunkSize * chunkNum; - int sampleEnd = chunkSize * (chunkNum + 1); - -#if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingChunks", "microphonePosition: {0} | sampleStart: {1} | sampleEnd: {2} | chunkNum: {3}", - microphonePosition.ToString(), - sampleStart.ToString(), - sampleEnd.ToString(), - chunkNum.ToString()); -#endif - //If the write position is past the end of the chunk or if write position is before the start of the chunk - while (microphonePosition > sampleEnd || microphonePosition < sampleStart) - { - // Init samples - samples = new float[chunkSize]; - // Write data from recording into samples starting from the chunkStart - _recording.GetData(samples, sampleStart); - - // Create AudioData and use the samples we just created - AudioData record = new AudioData(); - record.MaxLevel = Mathf.Max(Mathf.Abs(Mathf.Min(samples)), Mathf.Max(samples)); - record.Clip = AudioClip.Create("Recording", chunkSize, _recording.channels, _recordingHZ, false); - record.Clip.SetData(samples, 0); - - // Send the newly created AudioData to the service - _speechToText.OnListen(record); - - // Iterate or reset chunkNum - if (chunkNum < _chunkCount - 1) - { - chunkNum++; -#if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingChunks", "Iterating chunkNum: {0}", chunkNum); -#endif - } - else - { - chunkNum = 0; -#if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingChunks", "Resetting chunkNum: {0}", chunkNum); -#endif - } - -#if ENABLE_TIME_LOGGING - Log.Debug("ExampleStreamingChunks", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); - now = DateTime.Now; -#endif - sampleStart = chunkSize * chunkNum; - sampleEnd = chunkSize * (chunkNum + 1); - } - - yield return 0; - } - - yield break; - } - - -#else - private IEnumerator RecordingHandler() { - Log.Debug("ExampleStreaming", "devices: {0}", Microphone.devices); + Log.Debug("ExampleStreaming.RecordingHandler()", "devices: {0}", Microphone.devices); _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); yield return null; // let _recordingRoutine get set.. @@ -238,7 +128,7 @@ private IEnumerator RecordingHandler() int writePos = Microphone.GetPosition(_microphoneID); if (writePos > _recording.samples || !Microphone.IsRecording(_microphoneID)) { - Log.Error("MicrophoneWidget", "Microphone disconnected."); + Log.Error("ExampleStreaming.RecordingHandler()", "Microphone disconnected."); StopRecording(); yield break; @@ -274,7 +164,6 @@ private IEnumerator RecordingHandler() yield break; } -#endif private void OnRecognize(SpeechRecognitionEvent result) { @@ -285,7 +174,7 @@ private void OnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); - Log.Debug("ExampleStreaming", text); + Log.Debug("ExampleStreaming.OnRecognize()", text); ResultsField.text = text; } @@ -293,7 +182,7 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var keyword in res.keywords_result.keyword) { - Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + Log.Debug("ExampleStreaming.OnRecognize()", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } @@ -301,9 +190,9 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var wordAlternative in res.word_alternatives) { - Log.Debug("ExampleSpeechToText", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); - foreach (var alternative in wordAlternative.alternatives) - Log.Debug("ExampleSpeechToText", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); + Log.Debug("ExampleStreaming.OnRecognize()", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); + foreach(var alternative in wordAlternative.alternatives) + Log.Debug("ExampleStreaming.OnRecognize()", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); } } } @@ -316,8 +205,8 @@ private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) { foreach (SpeakerLabelsResult labelResult in result.speaker_labels) { - Log.Debug("ExampleStreaming", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); + Log.Debug("ExampleStreaming.OnRecognize()", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); } } } -} \ No newline at end of file +} diff --git a/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs b/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs new file mode 100644 index 000000000..4c45f7633 --- /dev/null +++ b/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs @@ -0,0 +1,251 @@ +/** +* Copyright 2015 IBM Corp. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +using UnityEngine; +using System.Collections; +using IBM.Watson.DeveloperCloud.Logging; +using IBM.Watson.DeveloperCloud.Services.SpeechToText.v1; +using IBM.Watson.DeveloperCloud.Utilities; +using IBM.Watson.DeveloperCloud.DataTypes; +using System.Collections.Generic; +using UnityEngine.UI; + +public class ExampleStreamingChunked : MonoBehaviour +{ + private string _username = null; + private string _password = null; + private string _url = null; + + public Text ResultsField; + + private int _recordingRoutine = 0; + private string _microphoneID = null; + private AudioClip _recording = null; + private int _recordingBufferSize = 1; + private int _recordingHZ = 22050; + private int _chunkCount = 50; + + private SpeechToText _speechToText; + + void Start() + { + LogSystem.InstallDefaultReactors(); + + // Create credential and instantiate service + Credentials credentials = new Credentials(_username, _password, _url); + + _speechToText = new SpeechToText(credentials); + Active = true; + + StartRecording(); + } + + public bool Active + { + get { return _speechToText.IsListening; } + set + { + if (value && !_speechToText.IsListening) + { + _speechToText.DetectSilence = true; + _speechToText.EnableWordConfidence = true; + _speechToText.EnableTimestamps = true; + _speechToText.SilenceThreshold = 0.01f; + _speechToText.MaxAlternatives = 0; + _speechToText.EnableInterimResults = true; + _speechToText.OnError = OnError; + _speechToText.InactivityTimeout = -1; + _speechToText.ProfanityFilter = false; + _speechToText.SmartFormatting = true; + _speechToText.SpeakerLabels = false; + _speechToText.WordAlternativesThreshold = null; + _speechToText.StartListening(OnRecognize, OnRecognizeSpeaker); + } + else if (!value && _speechToText.IsListening) + { + _speechToText.StopListening(); + } + } + } + + private void StartRecording() + { + if (_recordingRoutine == 0) + { + UnityObjectUtil.StartDestroyQueue(); + _recordingRoutine = Runnable.Run(RecordingHandler()); + } + } + + private void StopRecording() + { + if (_recordingRoutine != 0) + { + Microphone.End(_microphoneID); + Runnable.Stop(_recordingRoutine); + _recordingRoutine = 0; + } + } + + private void OnError(string error) + { + Active = false; + + Log.Debug("ExampleStreaming", "Error! {0}", error); + } + + private IEnumerator RecordingHandler() + { + Log.Debug("ExampleStreamingChunks", "devices: {0}", Microphone.devices); + // Start recording + _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); + yield return null; + + if (_recording == null) + { + StopRecording(); + yield break; + } + +#if ENABLE_TIME_LOGGING + // Set a reference to now to check timing + DateTime now = DateTime.Now; +#endif + + // Current chunk number + int chunkNum = 0; + + // Size of the chunk in samples + int chunkSize = _recording.samples / _chunkCount; + + // Init samples + float[] samples = null; + + while (_recordingRoutine != 0 && _recording != null) + { + // Get the mic position + int microphonePosition = Microphone.GetPosition(_microphoneID); + if (microphonePosition > _recording.samples || !Microphone.IsRecording(_microphoneID)) + { + Log.Error("ExampleStreaming", "Microphone disconnected."); + + StopRecording(); + yield break; + } + + int sampleStart = chunkSize * chunkNum; + int sampleEnd = chunkSize * (chunkNum + 1); + +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "microphonePosition: {0} | sampleStart: {1} | sampleEnd: {2} | chunkNum: {3}", + microphonePosition.ToString(), + sampleStart.ToString(), + sampleEnd.ToString(), + chunkNum.ToString()); +#endif + //If the write position is past the end of the chunk or if write position is before the start of the chunk + while (microphonePosition > sampleEnd || microphonePosition < sampleStart) + { + // Init samples + samples = new float[chunkSize]; + // Write data from recording into samples starting from the chunkStart + _recording.GetData(samples, sampleStart); + + // Create AudioData and use the samples we just created + AudioData record = new AudioData(); + record.MaxLevel = Mathf.Max(Mathf.Abs(Mathf.Min(samples)), Mathf.Max(samples)); + record.Clip = AudioClip.Create("Recording", chunkSize, _recording.channels, _recordingHZ, false); + record.Clip.SetData(samples, 0); + + // Send the newly created AudioData to the service + _speechToText.OnListen(record); + + // Iterate or reset chunkNum + if (chunkNum < _chunkCount - 1) + { + chunkNum++; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "Iterating chunkNum: {0}", chunkNum); +#endif + } + else + { + chunkNum = 0; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingChunks", "Resetting chunkNum: {0}", chunkNum); +#endif + } + +#if ENABLE_TIME_LOGGING + Log.Debug("ExampleStreamingChunks", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); + now = DateTime.Now; +#endif + sampleStart = chunkSize * chunkNum; + sampleEnd = chunkSize * (chunkNum + 1); + } + + yield return 0; + } + + yield break; + } + + private void OnRecognize(SpeechRecognitionEvent result) + { + if (result != null && result.results.Length > 0) + { + foreach (var res in result.results) + { + foreach (var alt in res.alternatives) + { + string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); + Log.Debug("ExampleStreaming", text); + ResultsField.text = text; + } + + if (res.keywords_result != null && res.keywords_result.keyword != null) + { + foreach (var keyword in res.keywords_result.keyword) + { + Log.Debug("ExampleSpeechToText", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + } + } + + if (res.word_alternatives != null) + { + foreach (var wordAlternative in res.word_alternatives) + { + Log.Debug("ExampleSpeechToText", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); + foreach (var alternative in wordAlternative.alternatives) + Log.Debug("ExampleSpeechToText", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); + } + } + } + } + } + + private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) + { + if (result != null) + { + foreach (SpeakerLabelsResult labelResult in result.speaker_labels) + { + Log.Debug("ExampleStreaming", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); + } + } + } +} \ No newline at end of file diff --git a/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs.meta b/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs.meta new file mode 100644 index 000000000..fc0984d8c --- /dev/null +++ b/Examples/ServiceExamples/Scripts/ExampleStreamingChunked.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 3f827eb7b6004438d9b3ae3bb063c1a2 +timeCreated: 1510255716 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs b/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs index 7a57a19d7..d25f236fc 100644 --- a/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs +++ b/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs @@ -66,51 +66,51 @@ void Start() private IEnumerator Examples() { // Synthesize - Log.Debug("ExampleTextToSpeech", "Attempting synthesize."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting synthesize."); _textToSpeech.Voice = VoiceType.en_US_Allison; _textToSpeech.ToSpeech(_testString, HandleToSpeechCallback, true); while (!_synthesizeTested) yield return null; // Get Voices - Log.Debug("ExampleTextToSpeech", "Attempting to get voices."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get voices."); _textToSpeech.GetVoices(OnGetVoices); while (!_getVoicesTested) yield return null; // Get Voice - Log.Debug("ExampleTextToSpeech", "Attempting to get voice {0}.", VoiceType.en_US_Allison); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get voice {0}.", VoiceType.en_US_Allison); _textToSpeech.GetVoice(OnGetVoice, VoiceType.en_US_Allison); while (!_getVoiceTested) yield return null; // Get Pronunciation - Log.Debug("ExampleTextToSpeech", "Attempting to get pronunciation of {0}", _testWord); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get pronunciation of {0}", _testWord); _textToSpeech.GetPronunciation(OnGetPronunciation, _testWord, VoiceType.en_US_Allison); while (!_getPronuciationTested) yield return null; // Get Customizations - Log.Debug("ExampleTextToSpeech", "Attempting to get a list of customizations"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a list of customizations"); _textToSpeech.GetCustomizations(OnGetCustomizations); while (!_getCustomizationsTested) yield return null; // Create Customization - Log.Debug("ExampleTextToSpeech", "Attempting to create a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to create a customization"); _textToSpeech.CreateCustomization(OnCreateCustomization, _customizationName, _customizationLanguage, _customizationDescription); while (!_createCustomizationTested) yield return null; // Get Customization - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a customization"); if (!_textToSpeech.GetCustomization(OnGetCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to get custom voice model!"); + Log.Debug("ExampleTextToSpeech.Examples()", "Failed to get custom voice model!"); while (!_getCustomizationTested) yield return null; // Update Customization - Log.Debug("ExampleTextToSpeech", "Attempting to update a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to update a customization"); Word[] wordsToUpdateCustomization = { new Word() @@ -138,19 +138,19 @@ private IEnumerator Examples() }; if (!_textToSpeech.UpdateCustomization(OnUpdateCustomization, _createdCustomizationId, _customVoiceUpdate)) - Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); + Log.Debug("ExampleTextToSpeech.Examples()", "Failed to update customization!"); while (!_updateCustomizationTested) yield return null; // Get Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to get a customization's words"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get a customization's words"); if (!_textToSpeech.GetCustomizationWords(OnGetCustomizationWords, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to get {0} words!", _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.GetCustomizationWords()", "Failed to get {0} words!", _createdCustomizationId); while (!_getCustomizationWordsTested) yield return null; // Add Customization Words - Log.Debug("ExampleTextToSpeech", "Attempting to add words to a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to add words to a customization"); Word[] wordArrayToAddToCustomization = { new Word() @@ -176,34 +176,34 @@ private IEnumerator Examples() }; if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, _createdCustomizationId, wordsToAddToCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to add words to {0}!", _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.AddCustomizationWords()", "Failed to add words to {0}!", _createdCustomizationId); while (!_addCustomizationWordsTested) yield return null; // Get Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to get the translation of a custom voice model's word."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to get the translation of a custom voice model's word."); string customIdentifierWord = wordsToUpdateCustomization[0].word; if (!_textToSpeech.GetCustomizationWord(OnGetCustomizationWord, _createdCustomizationId, customIdentifierWord)) - Log.Debug("ExampleTextToSpeech", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.GetCustomizationWord()", "Failed to get the translation of {0} from {1}!", customIdentifierWord, _createdCustomizationId); while (!_getCustomizationWordTested) yield return null; // Delete Customization Word - Log.Debug("ExampleTextToSpeech", "Attempting to delete customization word from custom voice model."); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to delete customization word from custom voice model."); string wordToDelete = "goodbye"; if (!_textToSpeech.DeleteCustomizationWord(OnDeleteCustomizationWord, _createdCustomizationId, wordToDelete)) - Log.Debug("ExampleTextToSpeech", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); + Log.Debug("ExampleTextToSpeech.DeleteCustomizationWord()", "Failed to delete {0} from {1}!", wordToDelete, _createdCustomizationId); while (!_deleteCustomizationWordTested) yield return null; // Delete Customization - Log.Debug("ExampleTextToSpeech", "Attempting to delete a customization"); + Log.Debug("ExampleTextToSpeech.Examples()", "Attempting to delete a customization"); if (!_textToSpeech.DeleteCustomization(OnDeleteCustomization, _createdCustomizationId)) - Log.Debug("ExampleTextToSpeech", "Failed to delete custom voice model!"); + Log.Debug("ExampleTextToSpeech.DeleteCustomization()", "Failed to delete custom voice model!"); while (!_deleteCustomizationTested) yield return null; - Log.Debug("ExampleTextToSpeech", "Text to Speech examples complete."); + Log.Debug("ExampleTextToSpeech.Examples()", "Text to Speech examples complete."); } void HandleToSpeechCallback(AudioClip clip, string customData) @@ -230,75 +230,75 @@ private void PlayClip(AudioClip clip) private void OnGetVoices(Voices voices, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", customData); _getVoicesTested = true; } private void OnGetVoice(Voice voice, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", customData); _getVoiceTested = true; } private void OnGetPronunciation(Pronunciation pronunciation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", customData); _getPronuciationTested = true; } private void OnGetCustomizations(Customizations customizations, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", customData); _getCustomizationsTested = true; } private void OnCreateCustomization(CustomizationID customizationID, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", customData); _createdCustomizationId = customizationID.customization_id; _createCustomizationTested = true; } private void OnDeleteCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomization()", "Text to Speech - Delete customization response: {0}", customData); _createdCustomizationId = null; _deleteCustomizationTested = true; } private void OnGetCustomization(Customization customization, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", customData); _getCustomizationTested = true; } private void OnUpdateCustomization(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", customData); _updateCustomizationTested = true; } private void OnGetCustomizationWords(Words words, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization words response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizationWords()", "Text to Speech - Get customization words response: {0}", customData); _getCustomizationWordsTested = true; } private void OnAddCustomizationWords(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Add customization words response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnAddCustomizationWords()", "Text to Speech - Add customization words response: {0}", customData); _addCustomizationWordsTested = true; } private void OnDeleteCustomizationWord(bool success, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Delete customization word response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomizationWord()", "Text to Speech - Delete customization word response: {0}", customData); _deleteCustomizationWordTested = true; } private void OnGetCustomizationWord(Translation translation, string customData) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization word response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizationWord()", "Text to Speech - Get customization word response: {0}", customData); _getCustomizationWordTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs b/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs index 415b08e83..b3d9b8274 100644 --- a/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs +++ b/Examples/ServiceExamples/Scripts/ExampleToneAnalyzer.cs @@ -50,17 +50,17 @@ private IEnumerator Examples() { // Analyze tone if (!_toneAnalyzer.GetToneAnalyze(OnGetToneAnalyze, _stringToTestTone)) - Log.Debug("ExampleToneAnalyzer", "Failed to analyze!"); + Log.Debug("ExampleToneAnalyzer.Examples()", "Failed to analyze!"); while (!_analyzeToneTested) yield return null; - Log.Debug("ExampleToneAnalyzer", "Tone analyzer examples complete."); + Log.Debug("ExampleToneAnalyzer.Examples()", "Tone analyzer examples complete."); } private void OnGetToneAnalyze(ToneAnalyzerResponse resp, string data) { - Log.Debug("ExampleToneAnalyzer", "Tone Analyzer - Analyze Response: {0}", data); + Log.Debug("ExampleToneAnalyzer.OnGetToneAnalyze()", "Tone Analyzer - Analyze Response: {0}", data); _analyzeToneTested = true; } } diff --git a/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs b/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs index 68981839f..443989b90 100644 --- a/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs +++ b/Examples/ServiceExamples/Scripts/ExampleTradeoffAnalytics.cs @@ -124,12 +124,12 @@ private IEnumerator Examples() while(!_GetDillemaTested) yield return null; - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff analytics examples complete."); + Log.Debug("ExampleTradeoffAnalyitics.Examples()", "Tradeoff analytics examples complete."); } private void OnGetDilemma(DilemmasResponse resp, string data) { - Log.Debug("ExampleTradeoffAnalyitics", "Tradeoff Analytics - Get Dillema: {0}", data); + Log.Debug("ExampleTradeoffAnalyitics.OnGetDilemma()", "Tradeoff Analytics - Get Dillema: {0}", data); _GetDillemaTested = true; } diff --git a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs index 365b722c8..321530a0f 100644 --- a/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs +++ b/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs @@ -73,84 +73,84 @@ void Start() private IEnumerator Examples() { // Get all classifiers - Log.Debug("ExampleVisualRecognition", "Attempting to get all classifiers"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to get all classifiers"); if (!_visualRecognition.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleVisualRecognition", "Failed to get all classifiers!"); + Log.Debug("ExampleVisualRecognition.GetClassifiers()", "Failed to get all classifiers!"); while (!_getClassifiersTested) yield return null; #if TRAIN_CLASSIFIER // Train classifier - Log.Debug("ExampleVisualRecognition", "Attempting to train classifier"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to train classifier"); string positiveExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_positive_examples.zip"; string negativeExamplesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/negative_examples.zip"; Dictionary positiveExamples = new Dictionary(); positiveExamples.Add("giraffe", positiveExamplesPath); if (!_visualRecognition.TrainClassifier(OnTrainClassifier, "unity-test-classifier-example", positiveExamples, negativeExamplesPath)) - Log.Debug("ExampleVisualRecognition", "Failed to train classifier!"); + Log.Debug("ExampleVisualRecognition.TrainClassifier()", "Failed to train classifier!"); while (!_trainClassifierTested) yield return null; // Find classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to find classifier by ID"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to find classifier by ID"); if (!_visualRecognition.GetClassifier(OnGetClassifier, _classifierID)) - Log.Debug("ExampleVisualRecognition", "Failed to get classifier!"); + Log.Debug("ExampleVisualRecognition.GetClassifier()", "Failed to get classifier!"); while (!_getClassifierTested) yield return null; #endif // Classify get - Log.Debug("ExampleVisualRecognition", "Attempting to get classify via URL"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to get classify via URL"); if (!_visualRecognition.Classify(OnClassifyGet, _imageURL)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyGetTested) yield return null; // Classify post image - Log.Debug("ExampleVisualRecognition", "Attempting to classify via image on file system"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to classify via image on file system"); string imagesPath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/giraffe_to_classify.jpg"; string[] owners = { "IBM", "me" }; string[] classifierIDs = { "default", _classifierID }; if (!_visualRecognition.Classify(imagesPath, OnClassifyPost, owners, classifierIDs, 0.5f)) - Log.Debug("ExampleVisualRecognition", "Classify image failed!"); + Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); while (!_classifyPostTested) yield return null; // Detect faces get - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via URL"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to detect faces via URL"); if (!_visualRecognition.DetectFaces(OnDetectFacesGet, _imageURL)) - Log.Debug("ExampleVisualRecogntiion", "Detect faces failed!"); + Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesGetTested) yield return null; // Detect faces post image - Log.Debug("ExampleVisualRecognition", "Attempting to detect faces via image"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to detect faces via image"); string faceExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/obama.jpg"; if (!_visualRecognition.DetectFaces(faceExamplePath, OnDetectFacesPost)) - Log.Debug("ExampleVisualRecognition", "Detect faces failed!"); + Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); while (!_detectFacesPostTested) yield return null; //// Recognize text get - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via URL"); - //if (!_visualRecognition.RecognizeText(OnRecognizeTextGet, _imageTextURL)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + //Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to recognizeText via URL"); + //if (!_visualRecognition.(OnRecognizeTextGet, _imageTextURL)) + // Log.Debug("ExampleVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextGetTested) // yield return null; //// Recognize text post image - //Log.Debug("ExampleVisualRecognition", "Attempting to recognizeText via image"); + //Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to recognizeText via image"); //string textExamplePath = Application.dataPath + "/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers/from_platos_apology.png"; //if (!_visualRecognition.RecognizeText(textExamplePath, OnRecognizeTextPost)) - // Log.Debug("ExampleVisualRecognition", "Recognize text failed!"); + // Log.Debug("ExampleVisualRecognition.RecognizeText()", "Recognize text failed!"); //while (!_recognizeTextPostTested) // yield return null; @@ -164,34 +164,34 @@ private IEnumerator Examples() #endregion // Delete classifier by ID - Log.Debug("ExampleVisualRecognition", "Attempting to delete classifier"); + Log.Debug("ExampleVisualRecognition.Examples()", "Attempting to delete classifier"); if (!_visualRecognition.DeleteClassifier(OnDeleteClassifier, _classifierToDelete)) - Log.Debug("ExampleVisualRecognition", "Failed to delete classifier!"); + Log.Debug("ExampleVisualRecognition.DeleteClassifier()", "Failed to delete classifier!"); while (!_deleteClassifierTested) yield return null; #endif - Log.Debug("ExampleVisualRecognition", "Visual Recogition tests complete"); + Log.Debug("ExampleVisualRecognition.Examples()", "Visual Recogition tests complete"); } private void OnGetClassifiers(GetClassifiersTopLevelBrief classifiers, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifiers Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifiers()", "VisualRecognition - GetClassifiers Response: {0}", data); _getClassifiersTested = true; } private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - GetClassifier Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifier()", "VisualRecognition - GetClassifier Response: {0}", data); _getClassifierTested = true; } #if DELETE_TRAINED_CLASSIFIER private void OnDeleteClassifier(bool success, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DeleteClassifier Response: {0}", success); + Log.Debug("ExampleVisualRecognition.OnDeleteClassifier()", "VisualRecognition - DeleteClassifier Response: {0}", success); _deleteClassifierTested = true; } #endif @@ -199,7 +199,7 @@ private void OnDeleteClassifier(bool success, string data) #if TRAIN_CLASSIFIER private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - TrainClassifier Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnTrainClassifier()", "VisualRecognition - TrainClassifier Response: {0}", data); #if DELETE_TRAINED_CLASSIFIER _classifierToDelete = classifier.classifier_id; @@ -211,38 +211,38 @@ private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, st private void OnClassifyGet(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyGet Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnClassifyGet()", "VisualRecognition - ClassifyGet Response: {0}", data); _classifyGetTested = true; } private void OnClassifyPost(ClassifyTopLevelMultiple classify, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - ClassifyPost Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnClassifyPost()", "VisualRecognition - ClassifyPost Response: {0}", data); _classifyPostTested = true; } private void OnDetectFacesGet(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesGet Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDetectFacesGet()", "VisualRecognition - DetectFacesGet Response: {0}", data); _detectFacesGetTested = true; } private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data) { - Log.Debug("ExampleVisualRecognition", "VisualRecognition - DetectFacesPost Response: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDetectFacesPost()", "VisualRecognition - DetectFacesPost Response: {0}", data); _detectFacesPostTested = true; } //private void OnRecognizeTextGet(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextGet Response: {0}", data); + // Log.Debug("ExampleVisualRecognition.OnRecognizeTextGet()", "VisualRecognition - RecognizeTextGet Response: {0}", data); // _recognizeTextGetTested = true; //} //private void OnRecognizeTextPost(TextRecogTopLevelMultiple multipleImages, string data) //{ - // Log.Debug("ExampleVisualRecognition", "VisualRecognition - RecognizeTextPost Response: {0}", data); + // Log.Debug("ExampleVisualRecognition.OnRecognizeTextPost()", "VisualRecognition - RecognizeTextPost Response: {0}", data); // _recognizeTextPostTested = true; //} @@ -255,7 +255,7 @@ private void OnDetectFacesPost(FacesTopLevelMultiple multipleImages, string data private IEnumerator Delay(float delayTime) { _isWaitingForDelay = true; - Log.Debug("TestVisualRecognition", "Delaying for {0} seconds....", delayTime); + Log.Debug("ExampleVisualRecognition.Delay()", "Delaying for {0} seconds....", delayTime); yield return new WaitForSeconds(delayTime); _isWaitingForDelay = false; } diff --git a/README.md b/README.md index f93eeb896..e28219fec 100755 --- a/README.md +++ b/README.md @@ -127,13 +127,13 @@ AuthenticationToken _authenticationToken; void Start() { if (!Utility.GetToken(OnGetToken, , , )) - Log.Debug("ExampleGetToken", "Failed to get token."); + Log.Debug("ExampleGetToken.Start()", "Failed to get token."); } private void OnGetToken(AuthenticationToken authenticationToken, string customData) { _authenticationToken = authenticationToken; - Log.Debug("ExampleGetToken", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); + Log.Debug("ExampleGetToken.OnGetToken()", "created: {0} | time to expiration: {1} minutes | token: {2}", _authenticationToken.Created, _authenticationToken.TimeUntilExpiration, _authenticationToken.Token); } ``` diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index 02093cb8d..458d16bb0 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -41,6 +41,9 @@ public class RESTConnector { public const string AUTHENTICATION_TOKEN_AUTHORIZATION_HEADER = "X-Watson-Authorization-Token"; public const string AUTHENTICATION_AUTHORIZATION_HEADER = "Authorization"; + public const long HTTP_STATUS_OK = 200; + public const long HTTP_STATUS_CREATED = 201; + public const long HTTP_STATUS_NO_CONTENT = 204; #region Public Types ///

/// This delegate type is declared for a Response handler function. @@ -334,9 +337,9 @@ private IEnumerator ProcessRequestQueue() else if (value is Int32 || value is Int64 || value is UInt32 || value is UInt64 || value is float || value is bool) value = value.ToString(); else if (value != null) - Log.Warning("RESTConnector", "Unsupported parameter value type {0}", value.GetType().Name); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Unsupported parameter value type {0}", value.GetType().Name); else - Log.Error("RESTConnector", "Parameter {0} value is null", key); + Log.Error("RESTConnector.ProcessRequestQueue()", "Parameter {0} value is null", key); if (args == null) args = new StringBuilder(); @@ -374,14 +377,14 @@ private IEnumerator ProcessRequestQueue() else if (formData.Value.BoxedObject is int) form.AddField(formData.Key, (int)formData.Value.BoxedObject); else if (formData.Value.BoxedObject != null) - Log.Warning("RESTConnector", "Unsupported form field type {0}", formData.Value.BoxedObject.GetType().ToString()); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Unsupported form field type {0}", formData.Value.BoxedObject.GetType().ToString()); } foreach (var headerData in form.headers) req.Headers[headerData.Key] = headerData.Value; } catch (Exception e) { - Log.Error("RESTConnector", "Exception when initializing WWWForm: {0}", e.ToString()); + Log.Error("RESTConnector.ProcessRequestQueue()", "Exception when initializing WWWForm: {0}", e.ToString()); } www = new WWW(url, form.data, req.Headers); } @@ -421,14 +424,14 @@ private IEnumerator ProcessRequestQueue() bool bError = false; if (!string.IsNullOrEmpty(www.error)) { - int nErrorCode = -1; + long nErrorCode = -1; int nSeperator = www.error.IndexOf(' '); - if (nSeperator > 0 && int.TryParse(www.error.Substring(0, nSeperator).Trim(), out nErrorCode)) + if (nSeperator > 0 && long.TryParse(www.error.Substring(0, nSeperator).Trim(), out nErrorCode)) { switch (nErrorCode) { - case 200: - case 201: + case HTTP_STATUS_OK: + case HTTP_STATUS_CREATED: bError = false; break; default: @@ -438,20 +441,20 @@ private IEnumerator ProcessRequestQueue() } if (bError) - Log.Error("RESTConnector", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, + Log.Error("RESTConnector.ProcessRequestQueue()", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, string.IsNullOrEmpty(www.text) ? "" : www.text); else - Log.Warning("RESTConnector", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, + Log.Warning("RESTConnector.ProcessRequestQueue()", "URL: {0}, ErrorCode: {1}, Error: {2}, Response: {3}", url, nErrorCode, www.error, string.IsNullOrEmpty(www.text) ? "" : www.text); } if (!www.isDone) { - Log.Error("RESTConnector", "Request timed out for URL: {0}", url); + Log.Error("RESTConnector.ProcessRequestQueue()", "Request timed out for URL: {0}", url); bError = true; } /*if (!bError && (www.bytes == null || www.bytes.Length == 0)) { - Log.Warning("RESTConnector", "No data recevied for URL: {0}", url); + Log.Warning("RESTConnector.ProcessRequestQueue()", "No data recevied for URL: {0}", url); bError = true; }*/ @@ -473,7 +476,7 @@ private IEnumerator ProcessRequestQueue() // if the response is over a threshold, then log with status instead of debug if (resp.ElapsedTime > LogResponseTime) - Log.Warning("RESTConnector", "Request {0} completed in {1} seconds.", url, resp.ElapsedTime); + Log.Warning("RESTConnector.ProcessRequestQueue()", "Request {0} completed in {1} seconds.", url, resp.ElapsedTime); if (req.OnResponse != null) req.OnResponse(req, resp); @@ -484,7 +487,7 @@ private IEnumerator ProcessRequestQueue() { #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "Delete Request URL: {0}", url); + Log.Debug("RESTConnector.ProcessRequestQueue90", "Delete Request URL: {0}", url); #endif #if UNITY_EDITOR @@ -507,7 +510,7 @@ private IEnumerator ProcessRequestQueue() resp.Success = deleteReq.Success; #else - Log.Warning( "RESTConnector", "DELETE method is supported in the editor only." ); + Log.Warning( "RESTConnector.ProcessRequestQueue()", "DELETE method is supported in the editor only." ); resp.Success = false; #endif resp.ElapsedTime = (float)(DateTime.Now - startTime).TotalSeconds; @@ -531,7 +534,7 @@ private class DeleteRequest public IEnumerator Send(string url, Dictionary headers) { #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, Send: {0}, _thread:{1}", url, _thread); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, Send: {0}, _thread:{1}", url, _thread); #endif URL = url; @@ -542,32 +545,34 @@ public IEnumerator Send(string url, Dictionary headers) Headers[kp.Key] = kp.Value; } +#if !NETFX_CORE // This fixes the exception thrown by self-signed certificates. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); +#endif #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, ProcessRequest {0}", URL); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, ProcessRequest {0}", URL); #endif UnityWebRequest deleteReq = UnityWebRequest.Delete(URL); deleteReq.method = UnityWebRequest.kHttpVerbDELETE; foreach (var kp in Headers) deleteReq.SetRequestHeader(kp.Key, kp.Value); -#if UNITY_2017_1_OR_NEWER +#if UNITY_2017_2_OR_NEWER deleteReq.SendWebRequest(); #else deleteReq.Send(); #endif #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DeleteRequest, sending deletereq {0}", deleteReq); + Log.Debug("DeleteRequest.Send()", "DeleteRequest, sending deletereq {0}", deleteReq); #endif while (!deleteReq.isDone) yield return null; #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DELETE Request SENT: {0}", URL); + Log.Debug("DeleteRequest.Send()", "DELETE Request SENT: {0}", URL); #endif - Success = deleteReq.responseCode == (long)HttpStatusCode.OK || deleteReq.responseCode == (long)HttpStatusCode.NoContent; + Success = deleteReq.responseCode == HTTP_STATUS_OK || deleteReq.responseCode == HTTP_STATUS_OK || deleteReq.responseCode == HTTP_STATUS_NO_CONTENT; #if ENABLE_DEBUGGING - Log.Debug("RESTConnector", "DELETE Request COMPLETE: {0}", URL); + Log.Debug("DeleteRequest.Send()", "DELETE Request COMPLETE: {0}", URL); #endif IsComplete = true; } diff --git a/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs b/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs index 82a5e4c27..58e2f2689 100644 --- a/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs +++ b/Scripts/Services/AlchemyAPI/v1/AlchemyAPI.cs @@ -151,7 +151,7 @@ public AlchemyAPI(Credentials credentials) } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetAuthors!"); + Log.Error("AlchemyAPI.GetAuthors()", "Either a URL or a html page source is required for GetAuthors!"); return false; } @@ -198,7 +198,7 @@ private void OnGetAuthorsResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetAuthorsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyAPI.OnGetAuthorsResponse()", "OnGetAuthorsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -326,7 +326,7 @@ private void OnGetRankedConceptsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRankedConceptsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRankedConceptsResponse()", "OnGetRankedConceptsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -447,7 +447,7 @@ private void OnGetDatesResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnDatesResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetDatesResponse()", "OnDatesResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -571,7 +571,7 @@ private void OnGetEmotionsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEmotionsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetEmotionsResponse()", "OnGetEmotionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -714,7 +714,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEntitiesResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetEntitiesResponse()", "OnGetEntitiesResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -769,7 +769,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } else if (source.StartsWith(Application.dataPath) && !normalizedSource.StartsWith("http://") && !normalizedSource.StartsWith("https://")) { - Log.Error("Alchemy Language", "A URL source is required for DetectFeeds!"); + Log.Error("AlchemyAPI.DetectFeeds()", "A URL source is required for DetectFeeds!"); return false; // service = SERVICE_DETECT_FEEDS_HTML; // string htmlData = default(string); @@ -778,7 +778,7 @@ private void OnGetEntitiesResponse(RESTConnector.Request req, RESTConnector.Resp } else { - Log.Error("Alchemy Language", "A URL source is required for DetectFeeds!"); + Log.Error("AlchemyAPI.DetectFeeds()", "A URL source is required for DetectFeeds!"); return false; } @@ -825,7 +825,7 @@ private void OnDetectFeedsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnDetectFeedsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnDetectFeedsResponse()", "OnDetectFeedsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -954,7 +954,7 @@ private void OnGetKeywordsResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetKeywordsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetKeywordsResponse()", "OnGetKeywordsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1071,7 +1071,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetEmotionsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetLanguagesResponse()", "OnGetEmotionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1126,7 +1126,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } else if (source.StartsWith(Application.dataPath) && !normalizedSource.StartsWith("http://") && !normalizedSource.StartsWith("https://")) { - Log.Error("Alchemy Language", "A URL source is required for GetMicroformats!"); + Log.Error("AlchemyAPI.GetMicroformats()", "A URL source is required for GetMicroformats!"); return false; // service = SERVICE_GET_MICROFORMAT_HTML; // string htmlData = default(string); @@ -1135,7 +1135,7 @@ private void OnGetLanguagesResponse(RESTConnector.Request req, RESTConnector.Res } else { - Log.Error("Alchemy Language", "A URL source is required for GetMicroformats!"); + Log.Error("AlchemyAPI.GetMicroformats()", "A URL source is required for GetMicroformats!"); return false; } @@ -1182,7 +1182,7 @@ private void OnGetMicroformatsResponse(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetMicroformatsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetMicroformatsResponse()", "OnGetMicroformatsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1249,7 +1249,7 @@ private void OnGetMicroformatsResponse(RESTConnector.Request req, RESTConnector. } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetPublicationDate!"); + Log.Error("AlchemyAPI.GetPublicationDate()", "Either a URL or a html page source is required for GetPublicationDate!"); return false; } @@ -1296,7 +1296,7 @@ private void OnGetPublicationDateResponse(RESTConnector.Request req, RESTConnect } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetPublicationDateResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetPublicationDateResponse()", "OnGetPublicationDateResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1446,7 +1446,7 @@ private void OnGetRelationsResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRelationsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRelationsResponse()", "OnGetRelationsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1563,7 +1563,7 @@ private void OnGetTextSentimentResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTextSentimentResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTextSentimentResponse()", "OnGetTextSentimentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1684,7 +1684,7 @@ private void OnGetTargetedSentimentResponse(RESTConnector.Request req, RESTConne } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTargetedSentimentResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTargetedSentimentResponse()", "OnGetTargetedSentimentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1801,7 +1801,7 @@ private void OnGetRankedTaxonomyResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetRankedTaxonomyResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetRankedTaxonomyResponse()", "OnGetRankedTaxonomyResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1872,7 +1872,7 @@ private void OnGetRankedTaxonomyResponse(RESTConnector.Request req, RESTConnecto } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetText!"); + Log.Error("AlchemyAPI.GetText()", "Either a URL or a html page source is required for GetText!"); return false; } @@ -1919,7 +1919,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTextResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTextResponse()", "OnGetTextResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1981,7 +1981,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetRawText!"); + Log.Error("AlchemyAPI.GetRawText()", "Either a URL or a html page source is required for GetRawText!"); return false; } @@ -2052,7 +2052,7 @@ private void OnGetTextResponse(RESTConnector.Request req, RESTConnector.Response } else { - Log.Error("Alchemy Language", "Either a URL or a html page source is required for GetTitle!"); + Log.Error("AlchemyAPI.GetTitle()", "Either a URL or a html page source is required for GetTitle!"); return false; } @@ -2099,7 +2099,7 @@ private void OnGetTitleResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnGetTitleResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnGetTitleResponse()", "OnGetTitleResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2292,7 +2292,7 @@ private void OnCombinedCallResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("AlchemyLanguage", "OnCombinedCallResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyApi.OnCombinedCallResponse()", "OnCombinedCallResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2398,7 +2398,7 @@ private void OnGetNewsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("AlchemyDataNews", "OnGetNewsResponse Exception: {0}", e.ToString()); + Log.Error("AlchemyAPI.OnGetNewsResponse()", "OnGetNewsResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/AlchemyAPI/v1/README.md b/Scripts/Services/AlchemyAPI/v1/README.md index ebb005e9b..7c0e5dd9e 100644 --- a/Scripts/Services/AlchemyAPI/v1/README.md +++ b/Scripts/Services/AlchemyAPI/v1/README.md @@ -22,12 +22,12 @@ You can extract Authors from a URL or HTML source. private void GetAuthors() { if(!_alchemyApi.GetAuthors(OnGetAuthors, )) - Log.Debug("Failed to get authors"); + Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors"); } private void OnGetAuthors(AuthorsData authors, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthors()", "Alchemy Language - Get authors response html: {0}", data); } ``` @@ -37,12 +37,12 @@ You can get Concepts from a URL, HTML or Text source. private void GetRankedConcepts() { if(!_alchemyApi.GetRankedConcepts(OnGetConcepts, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } private void OnGetConcepts(ConceptsData concepts, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConcepts()", "Alchemy Language - Get ranked concepts response text: {0}", data); } ``` @@ -52,12 +52,12 @@ You can extract Dates from a URL, HTML or Text source. private void GetRankedConcepts() { if(!_alchemyApi.GetDates(OnGetConcepts, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get concepts"); + Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } private void OnGetDates(DateData dates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDates()", "Alchemy Language - Get dates response html: {0}", data); } ``` @@ -67,12 +67,12 @@ You can get Emotions from a URL, HTML or Text source. private void GetEmotions() { if(!_alchemyApi.GetEmotions(OnGetEmotions, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions"); + Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions"); } private void OnGetEmotions(EmotionData emotions, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotions()", "Alchemy Language - Get emotions response html: {0}", data); } ``` @@ -82,12 +82,12 @@ You can extract Entities from a URL, HTML or Text source. private void ExtractEntities() { if(!_alchemyApi.ExtractEntities(OnExtractEntities, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get emotions"); + Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get emotions"); } private void OnExtractEntities(EntityData entityData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntities()", "Alchemy Language - Extract entities response html: {0}", data); } ``` @@ -97,12 +97,12 @@ You can detect RSS Feeds from a URL source. private void GetFeeds() { if(!m_AlchemyLanguage.DetectFeeds(OnDetectFeeds, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get feeds."); + Log.Debug("ExampleAlchemyLanguage.GetFeeds()", "Failed to get feeds."); } private void OnDetectFeeds(FeedData feedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnDetectFeeds()", "Alchemy Language - Detect feeds response url: {0}", data); } ``` @@ -112,12 +112,12 @@ You can extract Keywords form a URL, HTML or Text source. private void GetKeywords() { if(!m_AlchemyLanguage.ExtractKeywords(OnExtractKeywords, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get keywords by URL POST"); + Log.Debug("ExampleAlchemyLanguage.GetKeywords()", "Failed to get keywords by URL POST"); } private void OnExtractKeywords(KeywordData keywordData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywords()", "Alchemy Language - Extract keywords response html: {0}", data); } ``` @@ -127,12 +127,12 @@ You can extract the language of a URL, HTML or Text source. private void GetLanguages() { if(!m_AlchemyLanguage.GetLanguages(OnGetLanguages, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get languages"); + Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages"); } private void OnGetLanguages(LanguageData languages, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguages()", "Alchemy Language - Get languages response html: {0}", data); } ``` @@ -142,12 +142,12 @@ You can get the Microformat of a URL source. private void GetMicroformats() { if(!m_AlchemyLanguage.GetMicroformats(OnGetMicroformats, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get microformats"); + Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats"); } private void OnGetMicroformats(MicroformatData microformats, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetMicroformats()", "Alchemy Language - Get microformats response url: {0}", data); } ``` @@ -157,12 +157,12 @@ You can extract the publication date from a URL or HTML source. private void GetPublicationDate() { if(!m_AlchemyLanguage.GetPublicationDate(OnGetPublicationDate, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get publication dates"); + Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates"); } private void OnGetPublicationDate(PubDateData pubDates, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDate()", "Alchemy Language - Get publication date response url: {0}", data); } ``` @@ -172,12 +172,12 @@ You can extract Relations from a URL, HTML or Text source. private void GetRelations() { if(!m_AlchemyLanguage.GetRelations(OnGetRelations, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get relations"); + Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations"); } private void OnGetRelations(RelationsData relationsData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelations()", "Alchemy Language - Get relations response html: {0}", data); } ``` @@ -187,12 +187,12 @@ You can extract the Sentiment from a URL, HTML or Text source. private void GetTextSentiment() { if(!m_AlchemyLanguage.GetTextSentiment(OnGetTextSentiment, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get sentiment"); + Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment"); } private void OnGetTextSentiment(SentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentiment()", "Alchemy Language - Get text sentiment response html: {0}", data); } ``` @@ -202,12 +202,12 @@ You can extract a Targeted Sentiment from a URL, HTML or Text source. Targets ar private void GetTargetedSentiment() { if(!m_AlchemyLanguage.GetTargetedSentiment(OnGetTargetedSentiment, , )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get targeted sentiment"); + Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment"); } private void OnGetTargetedSentiment(TargetedSentimentData sentimentData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentiment()", "Alchemy Language - Get targeted sentiment response html: {0}", data); } ``` @@ -217,12 +217,12 @@ You can get the Taxonomy of entities from a URL, HTML or Text source. private void GetRankedTaxonomy() { if(!m_AlchemyLanguage.GetRankedTaxonomy(OnGetRankedTaxonomy, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get ranked taxonomy"); + Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy"); } private void OnGetRankedTaxonomy(TaxonomyData taxonomyData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomy()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); } ``` @@ -232,12 +232,12 @@ You can exctract the Text from a URL or HTML source. private void GetText() { if(!m_AlchemyLanguage.GetText(OnGetText, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get text by text"); + Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text"); } private void OnGetText(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetText()", "Alchemy Language - Get Text HTML response: {0}", data); } ``` @@ -247,12 +247,12 @@ You can exctract the Raw Text from a URL or HTML source. private void GetRawText() { if(!m_AlchemyLanguage.GetRawText(OnGetText, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get raw text by text"); + Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text"); } private void OnGetRawText(TextData textData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawText()", "Alchemy Language - Get raw text HTML response: {0}", data); } ``` @@ -262,12 +262,12 @@ You can extract the Title form a URL or HTML source. private void GetTitle() { if(!m_AlchemyLanguage.GetTitle(OnGetTitle, )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get title by text POST"); + Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); } private void OnGetTitle(Title titleData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitle()", "Alchemy Language - Get Title Url response: {0}", data); } ``` @@ -277,12 +277,12 @@ You can combine multiple requests into one call using a Combined Data call from private void CombinedCall() { if(!m_AlchemyLanguage.GetCombinedData(OnGetCombinedData, , , , , , , , , , , , , , , , )) - Log.Debug("ExampleAlchemyLanguage", "Failed to get combined data by text POST"); + Log.Debug("ExampleAlchemyLanguage.CombinedCall()", "Failed to get combined data by text POST"); } private void OnGetCombinedData(CombinedCallData combinedData, string data) { - Log.Debug("ExampleAlchemyLanguage", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedData()", "Alchemy Language - Get Combined Data Text response: {0}", data); } ``` diff --git a/Scripts/Services/Conversation/v1/Conversation.cs b/Scripts/Services/Conversation/v1/Conversation.cs index f74ad7a33..0ff029233 100644 --- a/Scripts/Services/Conversation/v1/Conversation.cs +++ b/Scripts/Services/Conversation/v1/Conversation.cs @@ -222,7 +222,7 @@ private void MessageResp(RESTConnector.Request req, RESTConnector.Response resp) } catch (Exception e) { - Log.Error("Conversation", "MessageResp Exception: {0}", e.ToString()); + Log.Error("Conversation.MessageResp()", "MessageResp Exception: {0}", e.ToString()); data = e.Message; resp.Success = false; } diff --git a/Scripts/Services/Conversation/v1/README.md b/Scripts/Services/Conversation/v1/README.md index f36138aa9..3eb085f99 100755 --- a/Scripts/Services/Conversation/v1/README.md +++ b/Scripts/Services/Conversation/v1/README.md @@ -29,12 +29,12 @@ Send a message to the Conversation instance private void Message() { if (!_conversation.Message(OnMessage, , )) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); } ``` ```cs @@ -50,12 +50,12 @@ private void Message() }; if (!_conversation.Message(OnMessage, , messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); } ``` ```cs @@ -65,12 +65,12 @@ Dictionary _context; // context to persist private void Message0() { if (!_conversation.Message(OnMessage, , )) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message()", "Failed to message!"); } private void OnMessage0(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage0()", "Conversation: Message Response: {0}", data); // Set context for next round of messaging object _tempContext = null; @@ -79,7 +79,7 @@ private void OnMessage0(object resp, string data) if (_tempContext != null) _context = _tempContext as Dictionary; else - Log.Debug("ExampleConversation", "Failed to get context"); + Log.Debug("ExampleConversation.OnMessage0()", "Failed to get context"); } private void Message1() @@ -94,12 +94,12 @@ private void Message1() }; if (!_conversation.Message(OnMessage, , messageRequest)) - Log.Debug("ExampleConversation", "Failed to message!"); + Log.Debug("ExampleConversation.Message1()", "Failed to message!"); } private void OnMessage1(object resp, string data) { - Log.Debug("ExampleConversation", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage1()", "Conversation: Message Response: {0}", data); } ``` diff --git a/Scripts/Services/Discovery/v1/Discovery.cs b/Scripts/Services/Discovery/v1/Discovery.cs index cd348b34f..b5a209b88 100644 --- a/Scripts/Services/Discovery/v1/Discovery.cs +++ b/Scripts/Services/Discovery/v1/Discovery.cs @@ -172,7 +172,7 @@ private void OnGetEnvironmentsResponse(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("Discovery", "OnGetEnvironmentsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetEnvironmentsResponse()", "OnGetEnvironmentsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -277,7 +277,7 @@ private void OnAddEnvironmentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnAddEnvironmentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddEnvironmentResponse()", "OnAddEnvironmentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -353,7 +353,7 @@ private void OnGetEnvironmentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnGetEnvironmentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetEnvironmentResponse()", "OnGetEnvironmentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -491,7 +491,7 @@ private void OnGetConfigurationsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetConfigurationsResponse()", "OnGetConfigurationsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -604,7 +604,7 @@ private void OnAddConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddConfigurationResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -684,7 +684,7 @@ private void OnGetConfigurationResponse(RESTConnector.Request req, RESTConnector } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetConfigurationResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -925,7 +925,7 @@ private void OnPreviewConfigurationResponse(RESTConnector.Request req, RESTConne } catch (Exception e) { - Log.Error("Discovery", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnPreviewConfigurationResponse()", "OnPreviewConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1009,7 +1009,7 @@ private void OnGetCollectionsResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnGetCollectionsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetCollectionsResponse()", "OnGetCollectionsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1119,7 +1119,7 @@ private void OnAddCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery", "OnGetConfigurationResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddCollectionResponse()", "OnGetConfigurationResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1199,7 +1199,7 @@ private void OnGetCollectionResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Discovery", "OnGetCollectionResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetCollectionResponse()", "OnGetCollectionResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1339,7 +1339,7 @@ private void OnGetFieldsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery", "OnGetFieldsResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetFieldsResponse()", "OnGetFieldsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1627,7 +1627,7 @@ private void OnAddDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "OnAddDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAddDocumentResponse()", "OnAddDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1778,7 +1778,7 @@ private void OnGetDocumentResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "OnGetDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetDocumentResponse()", "OnGetDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2065,7 +2065,7 @@ private void OnUpdateDocumentResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("Discovery", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnUpdateDocumentResponse()", "OnUpdateDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2188,7 +2188,7 @@ private void OnQueryResponse(RESTConnector.Request req, RESTConnector.Response r } catch (Exception e) { - Log.Error("Discovery", "OnQueryResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnQueryResponse()", "OnQueryResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/Discovery/v1/README.md b/Scripts/Services/Discovery/v1/README.md index 5b0dcb04c..852bca8e4 100755 --- a/Scripts/Services/Discovery/v1/README.md +++ b/Scripts/Services/Discovery/v1/README.md @@ -27,12 +27,12 @@ Creates an environment for the service instance. Note: You can create only one e private void CreateEnvironment() { if (!_discovery.AddEnvironment(OnAddEnvironment, , , )) - Log.Debug("ExampleDiscoveryV1", "Failed to add environment"); + Log.Debug("ExampleDiscovery.CreateEnvironment()", "Failed to add environment"); } private void OnAddEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); } ``` @@ -47,12 +47,12 @@ List existing environments for the service instance. private void GetEnvironments() { if (!_discovery.GetEnvironments(OnGetEnvironments)) - Log.Debug("ExampleDiscoveryV1", "Failed to get environments"); + Log.Debug("ExampleDiscovery.GetEnvironments()", "Failed to get environments"); } private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); } ``` @@ -67,12 +67,12 @@ Gets detailed information about the specified environment. private void GetEnvironment() { if (!_discovery.GetEnvironment(OnGetEnvironment, )) - Log.Debug("ExampleDiscoveryV1", "Failed to get environment"); + Log.Debug("ExampleDiscovery.GetEnvironment()", "Failed to get environment"); } private void OnGetEnvironment(Environment resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); } ``` @@ -88,12 +88,12 @@ Deletes an existing environment. private void DeleteEnvironment() { if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, )) - Log.Debug("ExampleDiscoveryV1", "Failed to delete environment"); + Log.Debug("ExampleDiscovery.DeleteEnvironment()", "Failed to delete environment"); } private void OnDeleteEnvironment(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteEnvironment Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteEnvironment()", "Discovery - DeleteEnvironment Response: deleted:{0}", success); } ``` @@ -108,12 +108,12 @@ Adds a configuration to the service instance. private void AddConfiguration() { if (!_discovery.AddConfiguration(OnAddConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to add configuration"); + Log.Debug("ExampleDiscovery.AddConfiguration()", "Failed to add configuration"); } private void OnAddConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); } ``` @@ -128,12 +128,12 @@ Lists existing configurations for the service instance. private void GetConfigurations() { if (!_discovery.GetConfigurations(OnGetConfigurations, )) - Log.Debug("ExampleDiscoveryV1", "Failed to get configurations"); + Log.Debug("ExampleDiscovery.GetConfigurations()", "Failed to get configurations"); } private void OnGetConfigurations(GetConfigurationsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); } ``` @@ -148,12 +148,12 @@ Get information about the specified configuration. private void GetConfiguration() { if (!_discovery.GetConfiguration(OnGetConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to get configuration"); + Log.Debug("ExampleDiscovery.GetConfiguration()", "Failed to get configuration"); } private void OnGetConfiguration(Configuration resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); } ``` @@ -168,12 +168,12 @@ Runs a sample document through the default or your configuration and returns dia private void PreviewConfiguration() { if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, , , null, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to preview configuration"); + Log.Debug("ExampleDiscovery.PreviewConfiguration()", "Failed to preview configuration"); } private void OnPreviewConfiguration(TestDocument resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); } ``` @@ -190,12 +190,12 @@ The delete operation is performed unconditionally. A delete request succeeds eve private void DeleteConfiguration() { if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, , )) - Log.Debug("ExampleDiscoveryV1", "Failed to delete configuration"); + Log.Debug("ExampleDiscovery.DeleteConfiguration()", "Failed to delete configuration"); } private void OnDeleteConfiguration(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - DeleteConfiguration Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteConfiguration()", "Discovery - DeleteConfiguration Response: deleted:{0}", success); } ``` @@ -210,12 +210,12 @@ Creates a new collection for storing documents. private void AddCollection() { if (!_discovery.AddCollection(OnAddCollection, , , , )) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.AddCollection()", "Failed to add collection"); } private void OnAddCollection(CollectionRef resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); } ``` @@ -230,12 +230,12 @@ Display a list of existing collections. private void GetCollections() { if (!_discovery.GetCollections(OnGetCollections, )) - Log.Debug("ExampleDiscovery", "Failed to get collections"); + Log.Debug("ExampleDiscovery.GetCollections()", "Failed to get collections"); } private void OnGetCollections(GetCollectionsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletions Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get colletions Response: {0}", data); } ``` @@ -250,12 +250,12 @@ Show detailed information about an existing collection. private void GetCollection() { if (!_discovery.GetCollection(OnGetCollection, , )) - Log.Debug("ExampleDiscovery", "Failed to get collection"); + Log.Debug("ExampleDiscovery.GetCollection()", "Failed to get collection"); } private void OnGetCollection(Collection resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); } ``` @@ -270,12 +270,12 @@ Gets a list of the unique fields, and each field's type, that are stored in a co private void GetFields() { if (!_discovery.GetFields(OnGetFields, , )) - Log.Debug("ExampleDiscovery", "Failed to get fields"); + Log.Debug("ExampleDiscovery.GetFields()", "Failed to get fields"); } private void OnGetFields(GetFieldsResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); } ``` @@ -290,12 +290,12 @@ Deletes an existing collection. private void DeleteCollection() { if (!_discovery.DeleteCollection(OnDeleteCollection, , )) - Log.Debug("ExampleDiscovery", "Failed to add collection"); + Log.Debug("ExampleDiscovery.DeleteCollection()", "Failed to add collection"); } private void OnDeleteCollection(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete collection Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); } ``` @@ -311,12 +311,12 @@ Add a document to your collection. private void AddDocument() { if (!_discovery.AddDocument(OnAddDocument, , , , , null)) - Log.Debug("ExampleDiscovery", "Failed to add document"); + Log.Debug("ExampleDiscovery.AddDocument()", "Failed to add document"); } private void OnAddDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); } ``` @@ -332,12 +332,12 @@ Update or partially update a document to create or replace an existing document. private void UpdateDocument() { if (!_discovery.UpdateDocument(OnUpdateDocument, , , , , , null)) - Log.Debug("ExampleDiscovery", "Failed to update document"); + Log.Debug("ExampleDiscovery.UpdateDocument()", "Failed to update document"); } private void OnUpdateDocument(DocumentAccepted resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); } ``` @@ -353,12 +353,12 @@ Display status information about a submitted document. private void GetDocument() { if (!_discovery.GetDocument(OnGetDocument, , , )) - Log.Debug("ExampleDiscovery", "Failed to get document"); + Log.Debug("ExampleDiscovery.GetDocument()", "Failed to get document"); } private void OnGetDocument(DocumentStatus resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); } ``` @@ -373,12 +373,12 @@ Delete a document from a collection. private void DeleteDocument() { if (!_discovery.DeleteDocument(OnDeleteDocument, , , )) - Log.Debug("ExampleDiscovery", "Failed to delete document"); + Log.Debug("ExampleDiscovery.DeleteDocument()", "Failed to delete document"); } private void OnDeleteDocument(bool success, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Delete document Response: deleted:{0}", success); + Log.Debug("ExampleDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); } ``` @@ -395,12 +395,12 @@ Once your content is uploaded and enriched by the Discovery service, you can bui private void Query() { if (!_discovery.Query(OnQuery, , , null, , null, 10, null, 0)) - Log.Debug("ExampleDiscovery", "Failed to query"); + Log.Debug("ExampleDiscovery.Query()", "Failed to query"); } private void OnQuery(QueryResponse resp, string data) { - Log.Debug("ExampleDiscoveryV1", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); } ``` diff --git a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs index 47b7ed0ee..d6b315e2e 100644 --- a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs +++ b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs @@ -146,7 +146,7 @@ public bool ConvertDocument(OnConvertDocument callback, string documentPath, str } if (documentData == null) - Log.Error("DocumentConversion", "Failed to upload {0}!", documentPath); + Log.Error("DocumentConversion.ConvertDocument()", "Failed to upload {0}!", documentPath); } if (documentData != null) @@ -191,7 +191,7 @@ private void ConvertDocumentResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("DocumentConversion", "ConvertDocumentResponse Exception: {0}", e.ToString()); + Log.Error("DocumentConversion.ConvertDocumentResponse()", "ConvertDocumentResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/DocumentConversion/v1/README.md b/Scripts/Services/DocumentConversion/v1/README.md index e4316b9d4..5a98e36c1 100755 --- a/Scripts/Services/DocumentConversion/v1/README.md +++ b/Scripts/Services/DocumentConversion/v1/README.md @@ -25,12 +25,12 @@ Converts a document to answer units, HTML or text. This method accepts a multipa void ConvertDocument () { if (!m_DocumentConversion.ConvertDocument(OnConvertDocument, , )) - Log.Debug("ExampleDocumentConversion", "Document conversion failed!"); + Log.Debug("ExampleDocumentConversion.ConvertDocument()", "Document conversion failed!"); } private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) { - Log.Debug("ExampleDocumentConversion", "DocuemntConversion - ConvertDocument Response: {0}", data); + Log.Debug("ExampleDocumentConversion.OnConvertDocument()", "DocuemntConversion - ConvertDocument Response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs b/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs index 33c3abb90..a8d569fa4 100644 --- a/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs +++ b/Scripts/Services/LanguageTranslation/v2/LanguageTranslation.cs @@ -198,7 +198,7 @@ private void TranslateResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetTranslation Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.TranslateResponse()", "GetTranslation Exception: {0}", e.ToString()); resp.Success = false; } } @@ -289,7 +289,7 @@ private void GetModelsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModels Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetModelsResponse()", "GetModels Exception: {0}", e.ToString()); resp.Success = false; } } @@ -347,7 +347,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModel Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetModelResponse()", "GetModel Exception: {0}", e.ToString()); resp.Success = false; } } @@ -403,7 +403,7 @@ private void GetLanguagesResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetLanguages Exception: {0}", e.ToString()); + Log.Error("LanguageTranslation.GetLanguagesResponse()", "GetLanguages Exception: {0}", e.ToString()); resp.Success = false; } } @@ -458,7 +458,7 @@ private void OnIdentifyResponse(RESTConnector.Request r, RESTConnector.Response } else { - Log.Error("Translate", "Identify() failed: {0}", resp.Error); + Log.Error("LanguageTranslation.OnIdentifyResponse()", "Identify() failed: {0}", resp.Error); if (req.Callback != null) req.Callback(null); } diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md index 3b38ef81c..5754a1553 100755 --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslation.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslation", "Failed to get models."); + Log.Debug("ExampleLanguageTranslation.GetModels()", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string customData) +private void OnGetModels(TranslationModels models, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnGetModels()", "Language Translation - Get models response: {0}", data); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslation.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslation", "Failed to create model."); + Log.Debug("ExampleLanguageTranslation.CreateModel()", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string customData) +private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnCreateModel()", "Language Translation - Create model response: {0}", data); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslation.GetModel(OnGetModel, )) - Log.Debug("TestLanguageTranslation", "Failed to get model."); + Log.Debug("ExampleLanguageTranslation.GetModel()", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string customData) +private void OnGetModel(TranslationModel model, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnGetModel()", "Language Translation - Get model response: {0}", data); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslation.DeleteModel(OnDeleteModel, )) - Log.Debug("TestLanguageTranslation", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslation.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslation.OnDeleteModel()", "Language Translation - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslation.GetTranslation(, , , OnGetTranslation)) - Log.Debug("TestLanguageTranslation", "Failed to translate."); + Log.Debug("ExampleLanguageTranslation.Translate()", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string customData) +private void OnGetTranslation(Translations translation, string data) { - Log.Debug("TestLanguageTranslation", "Langauge Translation - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnGetTranslation()", "Langauge Translation - Translate Response: {0}", data); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslation.Identify(OnIdentify, )) - Log.Debug("TestLanguageTranslation", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslation.Identify()", "Failed to identify language."); } -private void OnIdentify(string lang, string customData) +private void OnIdentify(string lang, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnIdentify()", "Language Translation - Identify response: {0}", data); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslation.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslation", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslation.GetLanguages()", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string customData) +private void OnGetLanguages(Languages languages, string data) { - Log.Debug("TestLanguageTranslation", "Language Translation - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslation.OnGetLanguages()", "Language Translation - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs index 62aabd1cc..03963be66 100644 --- a/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs +++ b/Scripts/Services/LanguageTranslator/v2/LanguageTranslator.cs @@ -210,7 +210,7 @@ private void TranslateResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetTranslation Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.TranslateResponse()", "GetTranslation Exception: {0}", e.ToString()); resp.Success = false; } } @@ -303,7 +303,7 @@ private void GetModelsResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModels Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetModelsResponse()", "GetModels Exception: {0}", e.ToString()); resp.Success = false; } } @@ -364,7 +364,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetModel Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetModelResponse()", "GetModel Exception: {0}", e.ToString()); resp.Success = false; } } @@ -427,7 +427,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch(Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the forced glossary file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the forced glossary file: {0}", e.Message); } } @@ -439,7 +439,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the parallel corpus file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the parallel corpus file: {0}", e.Message); } } @@ -451,7 +451,7 @@ private void GetModelResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Debug("LanguageTranslator", "There was an error loading the monolingual corpus file: {0}", e.Message); + Log.Debug("LanguageTranslator.CreateModel()", "There was an error loading the monolingual corpus file: {0}", e.Message); } } @@ -502,7 +502,7 @@ private void OnCreateModelResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Discovery", "Create model Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.OnCreateModelResponse()", "Create model Exception: {0}", e.ToString()); resp.Success = false; } } @@ -599,7 +599,7 @@ private void GetLanguagesResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetLanguages Exception: {0}", e.ToString()); + Log.Error("LanguageTranslator.GetLanguagesResponse()", "GetLanguages Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md index eb1d0432a..12f5a5965 100755 --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -28,12 +28,12 @@ Lists available models for language translation with option to filter by source private void GetModels() { if (!_languageTranslator.GetModels(OnGetModels)) - Log.Debug("TestLanguageTranslator", "Failed to get models."); + Log.Debug("ExampleLanguageTranslator.GetModels()", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string customData) +private void OnGetModels(TranslationModels models, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get models response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", data); } ``` @@ -47,12 +47,12 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. private void CreateModel() { if (!_languageTranslator.CreateModel(OnCreateModel, , , )) - Log.Debug("TestLanguageTranslator", "Failed to create model."); + Log.Debug("ExampleLanguageTranslator.CreateModel()", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string customData) +private void OnCreateModel(TranslationModel model, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Create model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", data); } ``` @@ -66,12 +66,12 @@ Returns information, including training status, about a specified translation mo private void GetModel() { if (!_languageTranslator.GetModel(OnGetModel, )) - Log.Debug("TestLanguageTranslator", "Failed to get model."); + Log.Debug("ExampleLanguageTranslator.GetModel()", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string customData) +private void OnGetModel(TranslationModel model, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get model response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", data); } ``` @@ -85,12 +85,12 @@ Deletes trained translation models. private void DeleteModel() { if (!_languageTranslator.DeleteModel(OnDeleteModel, )) - Log.Debug("TestLanguageTranslator", "Failed to delete model."); + Log.Debug("ExampleLanguageTranslator.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Delete model response: success: {0}", success); + Log.Debug("ExampleLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); } ``` @@ -104,12 +104,12 @@ Translates input text from the source language to the target language. private void Translate() { if (!_languageTranslator.GetTranslation(, , , OnGetTranslation)) - Log.Debug("TestLanguageTranslator", "Failed to translate."); + Log.Debug("ExampleLanguageTranslator.Translate()", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string customData) +private void OnGetTranslation(Translations translation, string data) { - Log.Debug("TestLanguageTranslator", "Langauge Translator - Translate Response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", data); } ``` @@ -122,12 +122,12 @@ Identify the language in which a text is written. private void Identify() { if (!_languageTranslator.Identify(OnIdentify, )) - Log.Debug("TestLanguageTranslator", "Failed to identify language."); + Log.Debug("ExampleLanguageTranslator.Identify()", "Failed to identify language."); } -private void OnIdentify(string lang, string customData) +private void OnIdentify(string lang, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Identify response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", data); } ``` @@ -141,12 +141,12 @@ Return the list of languages it can detect. private void GetLanguages() { if (!_languageTranslator.GetLanguages(OnGetLanguages)) - Log.Debug("TestLanguageTranslator", "Failed to get languages."); + Log.Debug("ExampleLanguageTranslator.GetLanguages()", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string customData) +private void OnGetLanguages(Languages languages, string data) { - Log.Debug("TestLanguageTranslator", "Language Translator - Get languages response: {0}", customData); + Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", data); } ``` diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs b/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs index 093a5c4b6..cb00f4e12 100644 --- a/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs +++ b/Scripts/Services/NaturalLanguageClassifier/v2/NaturalLanguageClassifier.cs @@ -163,7 +163,7 @@ private void OnGetClassifiersResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnGetClassifiersResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -225,7 +225,7 @@ private void OnGetClassifierResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnGetClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -300,7 +300,7 @@ private void OnTrainClassifierResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnTrainClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); resp.Success = false; } } @@ -414,7 +414,7 @@ private void OnClassifyResp(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("Natural Language Classifier", "GetClassifiers Exception: {0}", e.ToString()); + Log.Error("NaturalLanguageClassifier.OnTrainClassifierResp()", "GetClassifiers Exception: {0}", e.ToString()); } } diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/README.md b/Scripts/Services/NaturalLanguageClassifier/v2/README.md index b54258a12..689d1fd33 100755 --- a/Scripts/Services/NaturalLanguageClassifier/v2/README.md +++ b/Scripts/Services/NaturalLanguageClassifier/v2/README.md @@ -24,12 +24,12 @@ Returns an empty array if no classifiers are available. private void GetClassifiers() { if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifiers!"); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); } private void OnGetClassifiers(Classifiers classifiers, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); } ``` @@ -42,12 +42,12 @@ The status must be Available before you can use the classifier to classify calls private void Classify() { if (!naturalLanguageClassifier.Classify(, , OnClassify)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to classify!"); + Log.Debug("ExampleNaturalLanguageClassifier.Classify()", "Failed to classify!"); } private void OnClassify(ClassifyResult result, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); } ``` @@ -60,12 +60,12 @@ Sends data to create and train a classifier and returns information about the ne private void TrainClassifier() { if (!naturalLanguageClassifier.TrainClassifier(, , , OnTrainClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to train clasifier!"); + Log.Debug("ExampleNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); } private void OnTrainClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); } ``` @@ -77,12 +77,12 @@ Returns status and other information about a classifier private void GetClassifier() { if (!naturalLanguageClassifier.GetClassifier(, OnGetClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to get classifier {0}!", classifierId); + Log.Debug("ExampleNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } private void OnGetClassifier(Classifier classifier, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); } ``` @@ -95,12 +95,12 @@ Deletes a classifier private void DeleteClassifier() { if (!naturalLanguageClassifier.DeleteClassifer(, OnDeleteTrainedClassifier)) - Log.Debug("ExampleNaturalLanguageClassifier", "Failed to delete clasifier {0}!", ); + Log.Debug("ExampleNaturalLanguageClassifier.DeleteClassifier()", "Failed to delete clasifier {0}!", ); } private void OnDeleteTrainedClassifier(bool success, string data) { - Log.Debug("ExampleNaturalLanguageClassifier", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", , success, data); + Log.Debug("ExampleNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", , success, data); } ``` diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs index 97cce3399..2aa3873a2 100644 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding.cs @@ -165,7 +165,7 @@ private void OnAnalyzeResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("Discovery", "OnAnalyzeResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnAnalyzeResponse()", "OnAnalyzeResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -236,7 +236,7 @@ private void OnGetModelsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Discovery", "OnGetModelssResponse Exception: {0}", e.ToString()); + Log.Error("Discovery.OnGetModelsResponse()", "OnGetModelssResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md index d8a5fc0be..91a46d7ae 100755 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -26,12 +26,12 @@ Analyze features of natural language content. private void Analyze() { if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, )) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); } -private void OnAnalyze(AnalysisResults resp, string customData) +private void OnAnalyze(AnalysisResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "AnalysisResults: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", data); } ``` @@ -43,12 +43,12 @@ List available custom models. private void GetModels() { if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to get models."); + Log.Debug("ExampleNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); } -private void OnGetModels(ListModelsResults resp, string customData) +private void OnGetModels(ListModelsResults resp, string data) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "ListModelsResult: {0}", customData.ToString()); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnGetModels()", "ListModelsResult: {0}", data); } ``` @@ -60,12 +60,12 @@ Delete a custom model. private void DeleteModel() { if (!_naturalLanguageUnderstanding.DeleteModel(OnDeleteModel, )) - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "Failed to delete model."); + Log.Debug("ExampleNaturalLanguageUnderstanding.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string customData) +private void OnDeleteModel(bool success, string data) { - Log.Debug("ExampleNaturalLanguageUnderstandingV1", "DeleteModelResult: {0}", success); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnDeleteModel()", "DeleteModelResult: {0}", success); } ``` diff --git a/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs b/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs index fcacb662f..28c0a7400 100644 --- a/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs +++ b/Scripts/Services/PersonalityInsights/v3/PersonalityInsights.cs @@ -190,7 +190,7 @@ private void GetProfileResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("PersonalityInsights", "GetProfileResponse Exception: {0}", e.ToString()); + Log.Error("PersonalityInsights.GetProfileResponse()", "GetProfileResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/PersonalityInsights/v3/README.md b/Scripts/Services/PersonalityInsights/v3/README.md index c86db1fc2..575231c8e 100755 --- a/Scripts/Services/PersonalityInsights/v3/README.md +++ b/Scripts/Services/PersonalityInsights/v3/README.md @@ -28,12 +28,12 @@ Extract personality characteristics based on how a person writes. private void GetProfile() { if(!m_personalityInsights.GetProfile(OnGetProfileJson, dataPath, ContentType.TEXT_HTML, ContentLanguage.ENGLISH, ContentType.APPLICATION_JSON, AcceptLanguage.ENGLISH, true, true, true)) - Log.Debug("ExamplePersonalityInsights", "Failed to get profile!"); + Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); } private void OnGetProfile(Profile profile, string data) { - Log.Debug("ExamplePersonalityInsights", "Profile result: {0}", data); + Log.Debug("ExamplePersonalityInsights.OnGetProfile()", "Profile result: {0}", data); } ``` diff --git a/Scripts/Services/RetrieveAndRank/v1/README.md b/Scripts/Services/RetrieveAndRank/v1/README.md index 0d7167937..f5f9d6ade 100755 --- a/Scripts/Services/RetrieveAndRank/v1/README.md +++ b/Scripts/Services/RetrieveAndRank/v1/README.md @@ -26,12 +26,12 @@ Retrieves the list of Solr clusters for the service instance. void GetClusters() { if (!_retrieveAndRank.GetClusters(OnGetClusters)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get clusters!"); + Log.Debug("ExampleRetrieveAndRank.GetClusters()", "Failed to get clusters!"); } private void OnGetClusters(SolrClusterListResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusters results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "GetClusters results: {0}", data); } ``` @@ -42,12 +42,12 @@ Provisions a Solr cluster asynchronously. When the operation is successful, the void CreateCluster() { if (!_retrieveAndRank.CreateCluster(OnCreateCluster, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create cluster!"); + Log.Debug("ExampleRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); } private void OnCreateCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateCluster results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnCreateClusterMethod()", "CreateCluster results: {0}", data); } ``` @@ -58,12 +58,12 @@ Stops and deletes a Solr Cluster asynchronously. void DeleteCluster() { if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete cluster!"); + Log.Debug("ExampleRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); } private void OnDeleteCluster(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteCluster results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteCluster()", "DeleteCluster results: {0}", success); } ``` @@ -75,12 +75,12 @@ Returns status and other information about a cluster. void GetCluster() { if (!_retrieveAndRank.GetCluster(OnGetCluster, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster!"); + Log.Debug("ExampleRetrieveAndRank.GetCluster()", "Failed to get cluster!"); } private void OnGetCluster(SolrClusterResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetCluster results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "GetCluster results: {0}", data); } ``` @@ -91,12 +91,12 @@ Retrieves all configurations for a cluster. void GetClusterConfigs() { if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster configs!"); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); } private void OnGetClusterConfigs(SolrConfigList resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfigs results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "GetClusterConfigs results: {0}", data); } ``` @@ -107,12 +107,12 @@ Deletes the configuration for a cluster. Before you delete the configuration, de void DeleteClusterConfig() { if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, , )) - Log.Debug("ExampleRetriveAndRank", "Failed to delete cluster config {0}", ); + Log.Debug("ExampleRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", ); } private void OnDeleteClusterConfig(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteClusterConfig results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteClusterConfig()", "DeleteClusterConfig results: {0}", success); } ``` @@ -123,12 +123,12 @@ Retrieves the configuration for a cluster by its name. void GetClusterConfig() { if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get cluster config {0}!", ); + Log.Debug("ExampleRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", ); } private void OnGetClusterConfig(byte[] respData, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "GetClusterConfig results: {0}", data); } ``` @@ -138,12 +138,12 @@ Saves the cluster config void SaveClusterConfig() { if(!_retrieveAndRank.SaveConfig(OnSaveConfig, , , data)) - Log.Debug("ExampleRetrieveAndRank", "Failed to save cluster config!"); + Log.Debug("ExampleRetrieveAndRank.SaveConfig()", "Failed to save cluster config!"); } private void OnSaveConfig(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "SaveClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnSaveConfig()", "SaveClusterConfig results: {0}", data); } ``` @@ -154,12 +154,12 @@ Uploads a zip file containing the configuration files for your Solr collection. void UploadClusterConfig() { if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, , , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to upload cluster config {0}!", ); + Log.Debug("ExampleRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", ); } private void OnUploadClusterConfig(UploadResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "UploadClusterConfig results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "UploadClusterConfig results: {0}", data); } ``` @@ -170,12 +170,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void ListCollections() { if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.LIST)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "ListCollections results: {0}", data); } ``` @@ -186,12 +186,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void CreateCollection() { if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, , CollectionsAction.CREATE, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); } private void OnCreateCollection(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "ListCollections results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "ListCollections results: {0}", data); } ``` @@ -202,12 +202,12 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki void DeleteCollection() { if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.DELETE, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete collections!"); + Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); } private void OnGetCollections(CollectionsResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteCollection results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "DeleteCollection results: {0}", data); } ``` @@ -222,12 +222,12 @@ You must commit your documents to the index to search for them. For more informa void IndexDocuments() { if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, , , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to index documents!"); + Log.Debug("ExampleRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); } private void OnIndexDocuments(IndexResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "IndexDocuments results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "IndexDocuments results: {0}", data); } ``` @@ -240,17 +240,17 @@ void Search() // Standard search string[] fl = { "title", "id", "body", "author", "bibliography" }; if (!_retrieveAndRank.Search(OnSearch, , , , fl)) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); // Ranked search string[] fl = { "title", "id", "body", "author", "bibliography" }; if (!_retrieveAndRank.Search(OnSearch, , , , fl, true, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to search!"); + Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); } private void OnSearch(SearchResponse resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Search results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnSearch()", "Search results: {0}", data); } ``` @@ -261,12 +261,12 @@ Retrieves the list of rankers for the service instance. void GetRankers() { if (!_retrieveAndRank.GetRankers(OnGetRankers)) - Log.Debug("ExampleRetrieveAndRank", "Failed to get rankers!"); + Log.Debug("ExampleRetrieveAndRank.GetRankers()", "Failed to get rankers!"); } private void OnGetRankers(ListRankersPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRankers results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "GetRankers results: {0}", data); } ``` @@ -279,12 +279,12 @@ When the operation is successful, the status of the ranker is set to Training. T void CreateRanker() { if (!_retrieveAndRank.CreateRanker(OnCreateRanker, , )) - Log.Debug("ExampleRetrieveAndRank", "Failed to create ranker!"); + Log.Debug("ExampleRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); } private void OnCreateRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "CreateRanker results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "CreateRanker results: {0}", data); } ``` @@ -297,12 +297,12 @@ Use this method to return answers when you train the ranker with custom features void Rank() { if (!_retrieveAndRank.Rank(OnRank, , )) - Log.Debug("ExampleRetriveAndRank", "Failed to rank!"); + Log.Debug("ExampleRetrieveAndRank.Rank()", "Failed to rank!"); } private void OnRank(RankerOutputPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "Rank results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnRank()", "Rank results: {0}", data); } ``` @@ -313,12 +313,12 @@ Deletes a ranker. void DeleteRanker() { if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to delete ranker {0}!", ); + Log.Debug("ExampleRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", ); } private void OnDeleteRanker(bool success, string data) { - Log.Debug("ExampleRetrieveAndRank", "DeleteRanker results: {0}", success); + Log.Debug("ExampleRetrieveAndRank.OnDeleteRanker()", "DeleteRanker results: {0}", success); } ``` @@ -329,12 +329,12 @@ Returns status and other information about a ranker. void GetRanker() { if (!_retrieveAndRank.GetRanker(OnGetRanker, )) - Log.Debug("ExampleRetrieveAndRank", "Failed to get ranker!"); + Log.Debug("ExampleRetrieveAndRank.GetRanker()", "Failed to get ranker!"); } private void OnGetRanker(RankerStatusPayload resp, string data) { - Log.Debug("ExampleRetrieveAndRank", "GetRanker results: {0}", data.ToString()); + Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "GetRanker results: {0}", data); } ``` [retrieve-and-rank-service]: https://www.ibm.com/watson/services/retrieve-and-rank/ diff --git a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs index fb0e65d7c..e2384872e 100644 --- a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs +++ b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs @@ -196,7 +196,7 @@ private void OnGetClustersResponse(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClustersResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClustersResponse()", "OnGetClustersResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -288,7 +288,7 @@ private void OnCreateClusterResponse(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("RetriveAndRank", "OnCreateClusterResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnCreateClusterResponse()", "OnCreateClusterResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -448,7 +448,7 @@ private void OnGetClusterResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClusterResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClusterResponse()", "OnGetClusterResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -540,7 +540,7 @@ private void OnGetClusterConfigsResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetClusterConfigsResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetClusterConfigsResponse()", "OnGetClusterConfigsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -730,7 +730,7 @@ public void SaveConfig(OnSaveClusterConfig callback, byte[] configData, string c catch (Exception e) { success = false; - Log.Error("RetrieveAndRank", "Caught exception: {0}", e.ToString()); + Log.Error("RetrieveAndRank.SaveConfig()", "Caught exception: {0}", e.ToString()); } } @@ -788,7 +788,7 @@ public void SaveConfig(OnSaveClusterConfig callback, byte[] configData, string c } if (configData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", configPath); + Log.Error("RetrieveAndRank.UploadClusterConfig()", "Failed to upload {0}!", configPath); req.Headers["Content-Type"] = "application/zip"; req.Send = configData; @@ -839,7 +839,7 @@ private void UploadClusterConfigResponse(RESTConnector.Request req, RESTConnecto } catch (Exception e) { - Log.Error("RetriveAndRank", "UploadClusterConfigResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.UploadClusterConfigResponse()", "UploadClusterConfigResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -968,7 +968,7 @@ private void OnForwardCollectionRequestResponse(RESTConnector.Request req, RESTC } catch (Exception e) { - Log.Error("RetriveAndRank", "OnForwardCollectionRequestResponse exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnForwardCollectionRequestResponse()", "OnForwardCollectionRequestResponse exception: {0}", e.ToString()); resp.Success = false; } } @@ -1028,7 +1028,7 @@ private void OnForwardCollectionRequestResponse(RESTConnector.Request req, RESTC } if (indexData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", indexDataPath); + Log.Error("RetrieveAndRank.IndexDocuments()", "Failed to upload {0}!", indexDataPath); RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(CollectionUpdateEndpoint, clusterID, collectionName)); if (connector == null) @@ -1078,7 +1078,7 @@ private void OnIndexDocumentsResponse(RESTConnector.Request req, RESTConnector.R try { string json = Encoding.UTF8.GetString(resp.Data); - Log.Debug("RetriveAndRank", "json: {0}", json); + Log.Debug("RetriveAndRank.OnIndexDocumentsResponse()", "json: {0}", json); fsResult r = fsJsonParser.Parse(json, out data); if (!r.Succeeded) throw new WatsonException(r.FormattedMessages); @@ -1089,7 +1089,7 @@ private void OnIndexDocumentsResponse(RESTConnector.Request req, RESTConnector.R } catch (Exception e) { - Log.Error("RetriveAndRank", "OnIndexDocumentsResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnIndexDocumentsResponse()", "OnIndexDocumentsResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1214,7 +1214,7 @@ private void OnSearchResponse(RESTConnector.Request req, RESTConnector.Response } catch (Exception e) { - Log.Error("RetriveAndRank", "OnSearchResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnSearchResponse()", "OnSearchResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1292,7 +1292,7 @@ private void OnGetRankersResponse(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetRankersResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetRankersResponse()", "OnGetRankersResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1348,7 +1348,7 @@ private void OnGetRankersResponse(RESTConnector.Request req, RESTConnector.Respo } if (trainingData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", trainingDataPath); + Log.Error("RetrieveAndRank.CreateRanker()", "Failed to upload {0}!", trainingDataPath); RESTConnector connector = RESTConnector.GetConnector(Credentials, RankersEndpoint); if (connector == null) @@ -1408,7 +1408,7 @@ private void OnCreateRankerResponse(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("RetriveAndRank", "OnCreateRankerResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnCreateRankerResponse()", "OnCreateRankerResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1464,7 +1464,7 @@ private void OnCreateRankerResponse(RESTConnector.Request req, RESTConnector.Res } if (searchResultData == null) - Log.Error("RetrieveAndRank", "Failed to upload {0}!", searchResultData); + Log.Error("RetrieveAndRank.Rank()", "Failed to upload {0}!", searchResultData); RESTConnector connector = RESTConnector.GetConnector(Credentials, string.Format(RankEndpoint, rankerID)); if (connector == null) @@ -1528,7 +1528,7 @@ private void OnRankResponse(RESTConnector.Request req, RESTConnector.Response re } catch (Exception e) { - Log.Error("RetriveAndRank", "OnRankResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnRankResponse()", "OnRankResponse Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1688,7 +1688,7 @@ private void OnGetRankerResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("RetriveAndRank", "OnGetRankerResponse Exception: {0}", e.ToString()); + Log.Error("RetriveAndRank.OnGetRankerResponse()", "OnGetRankerResponse Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/SpeechToText/v1/DataModels.cs b/Scripts/Services/SpeechToText/v1/DataModels.cs index d650a69e1..b6d9bfeec 100644 --- a/Scripts/Services/SpeechToText/v1/DataModels.cs +++ b/Scripts/Services/SpeechToText/v1/DataModels.cs @@ -295,6 +295,10 @@ public class SpeakerLabelsResult [fsObject] public class KeywordResult { + /// + /// Original keyword requested by user. + /// + public string keyword { get; set; } /// /// Specified keyword normalized to the spoken phrase that matched in the audio input. /// diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md index 693bba898..234afcf8c 100755 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -40,12 +40,12 @@ Retrieves a list of all models available for use with the service. The informati private void GetModels() { if(!_speechToText.GetModels(HandleGetModels)) - Log.Debug("ExampleSpeechToText", "Failed to get models"); + Log.Debug("ExampleSpeechToText.GetModels()", "Failed to get models"); } -private void HandleGetModels(ModelSet result, string customData) +private void HandleGetModels(ModelSet result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get models response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetModels()", "Speech to Text - Get models response: {0}", data); } ``` @@ -58,12 +58,12 @@ Retrieves information about a single specified model that is available for use w private void GetModel() { if(!_speechToText.GetModel(HandleGetModel, )) - Log.Debug("ExampleSpeechToText", "Failed to get model"); + Log.Debug("ExampleSpeechToText.GetModel()", "Failed to get model"); } -private void HandleGetModel(Model result, string customData) +private void HandleGetModel(Model result, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetModel()", "Speech to Text - Get model response: {0}", data); } ``` @@ -132,7 +132,7 @@ private void Recognize() _audioClip = WaveFile.ParseWAV(, ); if(!_speechToText.Recognize(HandleRecognize)) - Log.Debug("ExampleSpeechToText", "Failed to recognize!"); + Log.Debug("ExampleSpeechToText.Recognize()", "Failed to recognize!"); } private void HandleRecognize(SpeechRecognitionEvent result) @@ -144,7 +144,7 @@ private void HandleRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = alt.transcript; - Log.Debug("ExampleSpeechToText", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); + Log.Debug("ExampleSpeechToText.HandleRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); if (res.final) _recognizeTested = true; @@ -163,12 +163,12 @@ Lists information about all custom language models that are owned by the calling private void GetCustomizations() { if(!_speechToText.GetCustomizations(HandleGetCustomizations)) - Log.Debug("ExampleSpeechToText", "Failed to get customizations"); + Log.Debug("ExampleSpeechToText.GetCustomizations()", "Failed to get customizations"); } -private void HandleGetCustomizations(Customizations customizations, string customData) +private void HandleGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customizations response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", data); } ``` @@ -181,12 +181,12 @@ Lists information about a custom language model. Only the owner of a custom mode private void GetCustomization() { if(!_speechToText.GetCustomization(HandleGetCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to get customization"); + Log.Debug("ExampleSpeechToText.GetCustomization()", "Failed to get customization"); } -private void HandleGetCustomization(Customization customization, string customData) +private void HandleGetCustomization(Customization customization, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get customization response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", data); } ``` @@ -199,12 +199,12 @@ Creates a new custom language model for a specified base language model. The cus private void CreateModel() { if(!_speechToText.CreateCustomization(HandleCreateCustomization, , , )) - Log.Debug("ExampleSpeechToText", "Failed to create custom model"); + Log.Debug("ExampleSpeechToText.CreateCustomization()", "Failed to create custom model"); } -private void HandleCreateCustomization(CustomizationID customizationID, string customData) +private void HandleCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get model response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Get model response: {0}", data); } ``` @@ -217,12 +217,12 @@ Initiates the training of a custom language model with new corpora, words, or bo private void TrainModel() { if(!_speechToText.TrainCustomization(HandleTrainCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.TrainCustomization()", "Failed to train custom model"); } -private void HandleTrainCustomization(bool success, string customData) +private void HandleTrainCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Train model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Speech to Text - Train model response: {0}", success); } ``` @@ -236,12 +236,12 @@ Resets a custom language model by removing all corpora and words from the model. private void ResetModel() { if(!_speechToText.ResetCustomization(HandleResetCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.ResetCustomization()", "Failed to train custom model"); } -private void HandleResetCustomization(bool success, string customData) +private void HandleResetCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Reset model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Speech to Text - Reset model response: {0}", success); } ``` @@ -254,12 +254,12 @@ Upgrades a custom language model to the latest release level of the Speech to Te private void UpgradeModel() { if(!_speechToText.UpgradeCustomization(HandleUpgradeCustomizationh, )) - Log.Debug("ExampleSpeechToText", "Failed to train custom model"); + Log.Debug("ExampleSpeechToText.UpgradeCustomization()", "Failed to train custom model"); } -private void HandleUpgradeCustomizationh(bool success, string customData) +private void HandleUpgradeCustomizationh(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Upgrade model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleUpgradeCustomizationh()", "Speech to Text - Upgrade model response: {0}", success); } ``` --> @@ -272,12 +272,12 @@ Deletes an existing custom language model. The custom model cannot be deleted if private void DeleteModel() { if(!_speechToText.DeleteCustomization(HandleDeleteCustomization, )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); + Log.Debug("ExampleSpeechToText.DeleteCustomization()", "Failed to delete custom model"); } -private void HandleDeleteCustomization(bool success, string customData) +private void HandleDeleteCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete model response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomization()", "Speech to Text - Delete model response: {0}", success); } ``` @@ -291,12 +291,12 @@ Adds a single corpus text file of new training data to the custom language model private void AddCustomCorpus() { if(!_speechToText.AddCustomCorpus(HandleAddCustomCorpus, , , , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom model"); + Log.Debug("ExampleSpeechToText.AddCustomCorpus()", "Failed to delete custom model"); } -private void HandleAddCustomCorpus(bool success, string customData) +private void HandleAddCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom corpus response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: {0}", success); } ``` @@ -310,12 +310,12 @@ Lists information about all corpora that have been added to the specified custom private void GetCorpora() { if(!_speechToText.GetCustomCorpora(HandleGetCustomCorpora, )) - Log.Debug("ExampleSpeechToText", "Failed to get custom corpora"); + Log.Debug("ExampleSpeechToText.GetCustomCorpora()", "Failed to get custom corpora"); } -private void HandleGetCustomCorpora(Corpora corpora, string customData) +private void HandleGetCustomCorpora(Corpora corpora, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpora response: {0}", customdData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customdData); } ``` @@ -329,12 +329,12 @@ Lists information about a single specified corpus. The information includes the private void GetCorpus() { if(!_speechToText.GetCustomCorpus(HandleGetCustomCorpus, , )) - Log.Debug("ExampleSpeechToText", "Failed to get custom corpus"); + Log.Debug("ExampleSpeechToText.GetCustomCorpus()", "Failed to get custom corpus"); } -private void HandleGetCustomCorpus(Corpus corpus, string customData) +private void HandleGetCustomCorpus(Corpus corpus, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom corpus response: {0}", customdData); + Log.Debug("ExampleSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customdData); } ``` @@ -348,12 +348,12 @@ Deletes an existing corpus from a custom language model. The service removes any private void DeleteCorpus() { if(!_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom corpus"); + Log.Debug("ExampleSpeechToText.DeleteCustomCorpus()", "Failed to delete custom corpus"); } -private void HandleDeleteCustomCorpus(bool success, string customData) +private void HandleDeleteCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom corpus response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - Delete custom corpus response: {0}", success); } ``` @@ -402,19 +402,19 @@ var words = new Words() private void AddCustomWordsUsingObject() { if(!_speechToText.AddCustomWords(HandleAddCustomWords, , words)) - Log.Debug("ExampleSpeechToText", "Failed to add custom words"); + Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } // Add custom words using words file private void AddCustomWordsUsingFile() { if(!_speechToText.AddCustomWords(HandleAddCustomWords, , )) - Log.Debug("ExampleSpeechToText", "Failed to add custom words"); + Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } -private void HandleAddCustomCorpus(bool success, string customData) +private void HandleAddCustomCorpus(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Add custom words response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom words response: {0}", success); } ``` @@ -427,12 +427,12 @@ Lists information about all custom words from a custom language model. You can l private void GetCustomWords() { if(!_speechToText.GetCustomWords(HandleGetCustomWords, )) - Log.Debug("ExampleSpeechToText", "Failed to get custom words"); + Log.Debug("ExampleSpeechToText.GetCustomWordsMethod()", "Failed to get custom words"); } -private void HandleGetCustomWords(WordsList wordList, string customData) +private void HandleGetCustomWords(WordsList wordList, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom words response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", data); } ``` @@ -446,12 +446,12 @@ Lists information about a custom word from a custom language model. Only the own private void GetCustomWord() { if(!_speechToText.GetCustomWord(HandleGetCustomWord, , )) - Log.Debug("ExampleSpeechToText", "Failed to get custom word"); + Log.Debug("ExampleSpeechToText.GetCustomWord()", "Failed to get custom word"); } -private void HandleGetCustomWord(WordData word, string customData) +private void HandleGetCustomWord(WordData word, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Get custom word response: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", data); } ``` @@ -467,12 +467,12 @@ Removing a custom word does not affect the custom model until you train the mode private void DeleteCustomWord() { if(!_speechToText.DeleteCustomWord(HandleDeleteCustomWord, , )) - Log.Debug("ExampleSpeechToText", "Failed to delete custom word"); + Log.Debug("ExampleSpeechToText.DeleteCustomWord()", "Failed to delete custom word"); } -private void HandleDeleteCustomWord(bool success, string customData) +private void HandleDeleteCustomWord(bool success, string data) { - Log.Debug("ExampleSpeechToText", "Speech to Text - Delete custom word response: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: {0}", success); } ``` @@ -484,12 +484,12 @@ Lists information about all custom acoustic models that are owned by an instance private void ListCustomAcousticModels() { if(!_speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels)) - Log.Debug("ExampleSpeechToText", "Failed to list custom acoustic models"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticModels()", "Failed to list custom acoustic models"); } -private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string customData) +private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomizations: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleListCustomAcousticModels()", "acousticCustomizations: {0}", data); } ``` @@ -502,12 +502,12 @@ Creates a new custom acoustic model for a specified base model. The custom acous private void CreateAcousticCustomization() { if(!_speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to create acoustic customization"); + Log.Debug("ExampleSpeechToText.CreateAcousticCustomization()", "Failed to create acoustic customization"); } -private void HandleCreateAcousticCustomization(CustomizationID customizationID, string customData) +private void HandleCreateAcousticCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleSpeechToText", "customizationId: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", data); } ``` @@ -522,12 +522,12 @@ Deletes an existing custom acoustic model. The custom model cannot be deleted if private void DeleteAcousticCustomization() { if(!_speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to delete acoustic customization"); + Log.Debug("ExampleSpeechToText.DeleteAcousticCustomization()", "Failed to delete acoustic customization"); } -private void HandleDeleteAcousticCustomization(bool success, string customData) +private void HandleDeleteAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "deleted acoustic customization: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); } ``` @@ -541,12 +541,12 @@ Lists information about a specified custom acoustic model. You must use credenti private void GetCustomAcousticModel() { if(!_speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic model"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticModel()", "Failed to get custom acoustic model"); } -private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string customData) +private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string data) { - Log.Debug("ExampleSpeechToText", "acousticCustomization: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", data); } ``` @@ -571,12 +571,12 @@ Training can fail to start for the following reasons: private void TrainAcousticCustomization() { if(!_speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, "", "", "")) - Log.Debug("ExampleSpeechToText", "Failed to train acoustic customization"); + Log.Debug("ExampleSpeechToText.TrainAcousticCustomization()", "Failed to train acoustic customization"); } -private void HandleTrainAcousticCustomization(bool success, string customData) +private void HandleTrainAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "train customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); } ``` @@ -590,12 +590,12 @@ Resets a custom acoustic model by removing all audio resources from the model. R private void ResetAcousticCustomization() { if(!_speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, "")) - Log.Debug("ExampleSpeechToText", "Failed to reset acoustic customizations"); + Log.Debug("ExampleSpeechToText.ResetAcousticCustomization()", "Failed to reset acoustic customizations"); } -private void HandleResetAcousticCustomization(bool success, string customData) +private void HandleResetAcousticCustomization(bool success, string data) { - Log.Debug("ExampleSpeechToText", "reset customization success: {0}", success); + Log.Debug("ExampleSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); } ``` @@ -609,12 +609,12 @@ Lists information about all audio resources from a custom acoustic model. The in private void GetCustomAcousticResources() { if(!_speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resources"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticResources()", "Failed to get custom acoustic resources"); } -private void HandleGetCustomAcousticResources(AudioResources audioResources, string customData) +private void HandleGetCustomAcousticResources(AudioResources audioResources, string data) { - Log.Debug("ExampleSpeechToText", "audioResources: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", data); } ``` @@ -628,12 +628,12 @@ Deletes an existing audio resource from a custom acoustic model. Deleting an arc private void DeleteAcousticResource() { if(!_speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, "", "")) - Log.Debug("ExampleSpeechToText", "Failed to delete acoustic resource"); + Log.Debug("ExampleSpeechToText.DeleteAcousticResource()", "Failed to delete acoustic resource"); } -private void HandleDeleteAcousticResource(bool success, string customData) +private void HandleDeleteAcousticResource(bool success, string data) { - Log.Debug("ExampleSpeechToText", "deleted acoustic resource: {0}", success); + Log.Debug("ExampleSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } ``` @@ -652,12 +652,12 @@ The information includes the status of the specified audio resource, which is im private void GetCustomAcousticResource() { if(!_speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, "", "")) - Log.Debug("ExampleSpeechToText", "Failed to get custom acoustic resource"); + Log.Debug("ExampleSpeechToText.GetCustomAcousticResource()", "Failed to get custom acoustic resource"); } -private void HandleGetCustomAcousticResource(AudioListing audioListing, string customData) +private void HandleGetCustomAcousticResource(AudioListing audioListing, string data) { - Log.Debug("ExampleSpeechToText", "audioListing: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", data); } ``` @@ -685,12 +685,12 @@ private void AddAcousticResource() { string mimeType = Utility.GetMimeType(Path.GetExtension("")); if(!_speechToText.AddAcousticResource(HandleAddAcousticResource, "", "", mimeType, mimeType, true, "") - Log.Debug("ExampleSpeechToText", "Failed to add acoustic resource"); + Log.Debug("ExampleSpeechToText.AddAcousticResourceMethod()", "Failed to add acoustic resource"); } -private void HandleAddAcousticResource(string customData) +private void HandleAddAcousticResource(string data) { - Log.Debug("ExampleSpeechToText", "added acoustic resource: {0}", customData); + Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", data); } ``` diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index 9dd7bf61d..d2ac253d0 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -326,11 +326,11 @@ private void OnGetModelsResponse(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("SpeechToText", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); + Log.Error("SpeechToText.OnGetModelsResponse()", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); } if (resp == null) - Log.Error("SpeechToText", "Failed to parse GetModel response."); + Log.Error("SpeechToText.OnGetModelsResponse()", "Failed to parse GetModel response."); } string customData = ((GetModelsRequest)req).Data; @@ -398,11 +398,11 @@ private void OnGetModelResponse(RESTConnector.Request req, RESTConnector.Respons } catch (Exception e) { - Log.Error("SpeechToText", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); + Log.Error("SpeechToText.OnGetModelResponse()", "Caught exception {0} when parsing GetModel() response: {1}", e.ToString(), Encoding.UTF8.GetString(resp.Data)); } if (resp == null) - Log.Error("SpeechToText", "Failed to parse GetModel response."); + Log.Error("SpeechToText.OnGetModelResponse()", "Failed to parse GetModel response."); } string customData = ((GetModelRequest)req).Data; @@ -493,7 +493,7 @@ public void OnListen(AudioData clip) // check the length of this queue and do something if it gets too full. if (_listenRecordings.Count > MaxQueuedRecordings) { - Log.Error("SpeechToText", "Recording queue is full."); + Log.Error("SpeechToText.OnListen()", "Recording queue is full."); StopListening(); if (OnError != null) @@ -511,7 +511,7 @@ public void OnListen(AudioData clip) // by LISTEN_TIMEOUT. If not, then stop listening and record the error. if (!_listenActive && (DateTime.Now - _lastStartSent).TotalSeconds > ListenTimeout) { - Log.Error("SpeechToText", "Failed to enter listening state."); + Log.Error("SpeechToText.OnListen()", "Failed to enter listening state."); StopListening(); if (OnError != null) @@ -572,7 +572,7 @@ private bool CreateListenConnector() else { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Created listen socket. Model: {0}, parsedParams: {1}", WWW.EscapeURL(_recognizeModel), parsedParams); + Log.Debug("SpeechToText.CreateListenConnector()", "Created listen socket. Model: {0}, parsedParams: {1}", WWW.EscapeURL(_recognizeModel), parsedParams); #endif } @@ -615,7 +615,7 @@ private void SendStart() _listenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "SendStart() with the following params: {0}", Json.Serialize(start)); + Log.Debug("SpeechToText.SendStart()", "SendStart() with the following params: {0}", Json.Serialize(start)); #endif _lastStartSent = DateTime.Now; } @@ -650,7 +650,7 @@ private IEnumerator KeepAlive() AudioClip _keepAliveClip = Resources.Load("highHat"); #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Sending keep alive."); + Log.Debug("SpeechToText.KeepAlive()", "Sending keep alive."); #endif _listenSocket.Send(new WSConnector.BinaryMessage(AudioClipUtil.GetL16(_keepAliveClip))); _keepAliveClip = null; @@ -658,7 +658,7 @@ private IEnumerator KeepAlive() _lastKeepAlive = DateTime.Now; } } - Log.Debug("SpeechToText", "KeepAlive exited."); + Log.Debug("SpeechToText.KeepAlive()", "KeepAlive exited."); } private void OnListenMessage(WSConnector.Message msg) @@ -677,7 +677,7 @@ private void OnListenMessage(WSConnector.Message msg) { //// when we get results, start listening for the next block .. if (results.HasFinalResult()) - Log.Debug("SpeechToText", "final json response: {0}", tm.Text); + Log.Debug("SpeechToText.OnListenMessage()", "final json response: {0}", tm.Text); // SendStart(); if (_listenCallback != null) @@ -686,14 +686,14 @@ private void OnListenMessage(WSConnector.Message msg) StopListening(); // automatically stop listening if our callback is destroyed. } else - Log.Error("SpeechToText", "Failed to parse results: {0}", tm.Text); + Log.Error("SpeechToText.OnListenMessage()", "Failed to parse results: {0}", tm.Text); } else if (json.Contains("state")) { string state = (string)json["state"]; #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "Server state is {0}", state); + Log.Debug("SpeechToText.OnListenMessage()", "Server state is {0}", state); #endif if (state == "listening") { @@ -726,7 +726,7 @@ private void OnListenMessage(WSConnector.Message msg) else if (json.Contains("error")) { string error = (string)json["error"]; - Log.Error("SpeechToText", "Error: {0}", error); + Log.Error("SpeechToText.OnListenMessage()", "Error: {0}", error); StopListening(); if (OnError != null) @@ -734,12 +734,12 @@ private void OnListenMessage(WSConnector.Message msg) } else { - Log.Warning("SpeechToText", "Unknown message: {0}", tm.Text); + Log.Warning("SpeechToText.OnListenMessage()", "Unknown message: {0}", tm.Text); } } else { - Log.Error("SpeechToText", "Failed to parse JSON from server: {0}", tm.Text); + Log.Error("SpeechToText.OnListenMessage()", "Failed to parse JSON from server: {0}", tm.Text); } } } @@ -747,7 +747,7 @@ private void OnListenMessage(WSConnector.Message msg) private void OnListenClosed(WSConnector connector) { #if ENABLE_DEBUGGING - Log.Debug("SpeechToText", "OnListenClosed(), State = {0}", connector.State.ToString()); + Log.Debug("SpeechToText.OnListenClosed()", "OnListenClosed(), State = {0}", connector.State.ToString()); #endif _listenActive = false; @@ -811,7 +811,7 @@ public bool Recognize(byte[] audioData, string contentType, OnRecognize callback req.Send = audioData; if (req.Send.Length > MaxRecognizeClipSize) { - Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); + Log.Error("SpeechToText.Recognize()", "AudioClip is too large for Recognize()."); return false; } if (!string.IsNullOrEmpty(AcousticCustomizationId)) @@ -859,7 +859,7 @@ private void OnRecognizeResponse(RESTConnector.Request req, RESTConnector.Respon result = ParseRecognizeResponse(resp.Data); if (result == null) { - Log.Error("SpeechToText", "Failed to parse json response: {0}", + Log.Error("SpeechToText.OnRecognizeResponse()", "Failed to parse json response: {0}", resp.Data != null ? Encoding.UTF8.GetString(resp.Data) : ""); } else @@ -870,7 +870,7 @@ private void OnRecognizeResponse(RESTConnector.Request req, RESTConnector.Respon } else { - Log.Error("SpeechToText", "Recognize Error: {0}", resp.Error); + Log.Error("SpeechToText.OnRecognizeResponse()", "Recognize Error: {0}", resp.Error); } if (recognizeReq.Callback != null) @@ -924,7 +924,7 @@ private SpeakerRecognitionEvent ParseSpeakerRecognitionResponse(IDictionary resp } catch (Exception e) { - Log.Error("SpeechToText", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); + Log.Error("SpeechToText.ParseSpeakerRecognitionResponse()", "ParseSpeakerRecognitionResponse exception: {0}", e.ToString()); return null; } } @@ -1072,6 +1072,7 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) { IDictionary iKeywordDictionary = k as IDictionary; KeywordResult keywordResult = new KeywordResult(); + keywordResult.keyword = keyword; keywordResult.confidence = (double)iKeywordDictionary["confidence"]; keywordResult.end_time = (double)iKeywordDictionary["end_time"]; keywordResult.start_time = (double)iKeywordDictionary["start_time"]; @@ -1090,7 +1091,7 @@ private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp) } catch (Exception e) { - Log.Error("SpeechToText", "ParseJsonResponse exception: {0}", e.ToString()); + Log.Error("SpeechToText.ParseRecognizeResponse()", "ParseJsonResponse exception: {0}", e.ToString()); return null; } } @@ -1161,7 +1162,7 @@ private void OnGetCustomizationsResp(RESTConnector.Request req, RESTConnector.Re } catch (Exception e) { - Log.Error("Speech To Text", "GetCustomizations Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomizationsResp()", "GetCustomizations Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1249,7 +1250,7 @@ private void OnCreateCustomizationResp(RESTConnector.Request req, RESTConnector. } catch (Exception e) { - Log.Error("Speech To Text", "CreateCustomization Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnCreateCustomizationResp()", "CreateCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1374,7 +1375,7 @@ private void OnGetCustomizationResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Speech To Text", "GetCustomization Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomizationResp()", "GetCustomization Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1617,7 +1618,7 @@ private void OnGetCustomCorporaResp(RESTConnector.Request req, RESTConnector.Res } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomCorporaResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomCorporaResp()", "OnGetCustomCorporaResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1697,7 +1698,7 @@ private void OnGetCustomCorpusResp(RESTConnector.Request req, RESTConnector.Resp } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomCorpusResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomCorpusResp()", "OnGetCustomCorpusResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -1923,7 +1924,7 @@ private void OnGetCustomWordsResp(RESTConnector.Request req, RESTConnector.Respo } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomWordsResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomWordsResp()", "OnGetCustomWordsResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2159,7 +2160,7 @@ private void OnGetCustomWordResp(RESTConnector.Request req, RESTConnector.Respon } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomWordResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomWordResp()", "OnGetCustomWordResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2227,7 +2228,7 @@ private void OnGetCustomAcousticModelsResp(RESTConnector.Request req, RESTConnec } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticModelsResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticModelsResp()", "OnGetCustomAcousticModelsResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2314,7 +2315,7 @@ private void OnCreateAcousticCustomizationResp(RESTConnector.Request req, RESTCo } catch (Exception e) { - Log.Error("Speech To Text", "OnCreateAcousticCustomizationResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnCreateAcousticCustomizationResp()", "OnCreateAcousticCustomizationResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2434,7 +2435,7 @@ private void OnGetCustomAcousticModelResp(RESTConnector.Request req, RESTConnect } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticModelResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticModelResp()", "OnGetCustomAcousticModelResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2604,7 +2605,7 @@ private void OnGetCustomAcousticResourcesResp(RESTConnector.Request req, RESTCon } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticResourcesResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticResourcesResp()", "OnGetCustomAcousticResourcesResp Exception: {0}", e.ToString()); resp.Success = false; } } @@ -2732,7 +2733,7 @@ private void OnGetCustomAcousticResourceResp(RESTConnector.Request req, RESTConn } catch (Exception e) { - Log.Error("Speech To Text", "OnGetCustomAcousticResourceResp Exception: {0}", e.ToString()); + Log.Error("SpeechToText.OnGetCustomAcousticResourceResp()", "OnGetCustomAcousticResourceResp Exception: {0}", e.ToString()); resp.Success = false; } } diff --git a/Scripts/Services/TextToSpeech/v1/README.md b/Scripts/Services/TextToSpeech/v1/README.md index 136ad7f4b..f3a589834 100755 --- a/Scripts/Services/TextToSpeech/v1/README.md +++ b/Scripts/Services/TextToSpeech/v1/README.md @@ -64,12 +64,12 @@ Retrieves a list of all voices available for use with the service. The informati private void GetVoices() { if(!_textToSpeech.GetVoices(OnGetVoices)) - Log.Debug("ExampleTextToSpeech", "Failed to get voices!"); + Log.Debug("ExampleTextToSpeech.GetVoices()", "Failed to get voices!"); } -private void OnGetVoices(Voices voices, string customData) +private void OnGetVoices(Voices voices, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voices response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", data); } ``` @@ -84,12 +84,12 @@ Lists information about the specified voice. Specify a customization_id to obtai private void GetVoice() { if(!_textToSpeech.GetVoice(OnGetVoice, )) - Log.Debug("ExampleTextToSpeech", "Failed to get voice!"); + Log.Debug("ExampleTextToSpeech.GetVoice()", "Failed to get voice!"); } -private void OnGetVoice(Voice voice, string customData) +private void OnGetVoice(Voice voice, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get voice response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", data); } ``` @@ -112,10 +112,10 @@ private void Synthesize() { _textToSpeech.Voice = ; if(!_textToSpeech.ToSpeech(, OnSynthesize, )) - Log.Debug("ExampleTextToSpeech", "Failed to synthesize!"); + Log.Debug("ExampleTextToSpeech.ToSpeech()", "Failed to synthesize!"); } -private void OnSynthesize(AudioClip clip, string customData) +private void OnSynthesize(AudioClip clip, string data) { PlayClip(clip); } @@ -159,12 +159,12 @@ Returns the phonetic pronunciation for the specified word. You can request the p private void GetPronunciation() { if(!_textToSpeech.GetPronunciation(OnGetPronunciation, , )) - Log.Debug("ExampleTextToSpeech", "Failed to get pronunication!"); + Log.Debug("ExampleTextToSpeech.GetPronunciation()", "Failed to get pronunication!"); } -private void OnGetPronunciation(Pronunciation pronunciation, string customData) +private void OnGetPronunciation(Pronunciation pronunciation, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get pronunciation response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", data); } ``` @@ -179,12 +179,12 @@ Creates a new empty custom voice model that is owned by the requesting user. private void CreateCustomization() { if(!_textToSpeech.CreateCustomization(OnCreateCustomization, , , )) - Log.Debug("ExampleTextToSpeech", "Failed to create customization!"); + Log.Debug("ExampleTextToSpeech.CreateCustomization()", "Failed to create customization!"); } -private void OnCreateCustomization(CustomizationID customizationID, string customData) +private void OnCreateCustomization(CustomizationID customizationID, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Create customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", data); } ``` @@ -206,12 +206,12 @@ private void UpdateCustomization() } if(!_textToSpeech.UpdateCustomization(OnUpdateCustomization, , _customVoiceUpdate)) - Log.Debug("ExampleTextToSpeech", "Failed to update customization!"); + Log.Debug("ExampleTextToSpeech.UpdateCustomization()", "Failed to update customization!"); } -private void OnUpdateCustomization(bool success, string customData) +private void OnUpdateCustomization(bool success, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Update customization response: {0}", success); + Log.Debug("ExampleTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", success); } ``` @@ -226,12 +226,12 @@ Lists metadata such as the name and description for all custom voice models that private void GetCustomizations() { if(!_textToSpeech.GetCustomizations(OnGetCustomizations)) - Log.Debug("ExampleTextToSpeech", "Failed to get customizations!"); + Log.Debug("ExampleTextToSpeech.GetCustomizations()", "Failed to get customizations!"); } -private void OnGetCustomizations(Customizations customizations, string customData) +private void OnGetCustomizations(Customizations customizations, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customizations response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", data); } ``` @@ -246,12 +246,12 @@ Lists all information about the specified custom voice model. In addition to met private void GetCustomization() { if(!_textToSpeech.GetCustomization(OnGetCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to get customization!"); + Log.Debug("ExampleTextToSpeech.GetCustomization()", "Failed to get customization!"); } -private void OnGetCustomization(Customization customization, string customData) +private void OnGetCustomization(Customization customization, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", customData); + Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", data); } ``` @@ -266,12 +266,12 @@ Deletes the custom voice model with the specified customization_id. Only the own private void DeleteCustomization() { if(!_textToSpeech.DeleteCustomization(OnDeleteCustomization, )) - Log.Debug("ExampleTextToSpeech", "Failed to delete customization!"); + Log.Debug("ExampleTextToSpeech.DeleteCustomization()", "Failed to delete customization!"); } -private void OnDeleteCustomization(bool success, string customData) +private void OnDeleteCustomization(bool success, string data) { - Log.Debug("ExampleTextToSpeech", "Text to Speech - Get customization response: {0}", success); + Log.Debug("ExampleTextToSpeech.OnDeleteCustomization()", "Text to Speech - Get customization response: {0}", success); } ``` @@ -308,7 +308,7 @@ Words wordsToAddToCustomization = new Words() }; if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, , _wordsToAddToCustomization)) - Log.Debug("ExampleTextToSpeech", "Failed to add words customization!"); + Log.Debug("ExampleTextToSpeech.AddCustomizationWords()", "Failed to add words customization!"); ``` ??!t?dqsI!d0C;PP?7`M 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 z +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

@ulPZ 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

*&njw>-vT>1%pVo~>RZCirT7jI>|AMooU(w0;`? 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


OlZ1y;hV@I3qh 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
+^Hi;rGQ!u@$4*;$A$%!p>VCCd>D5 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 Date: Fri, 17 Nov 2017 10:24:05 -0600 Subject: [PATCH 094/100] log tests on success --- Travis/runTests.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Travis/runTests.sh b/Travis/runTests.sh index cdeb7123c..10cf8a60e 100644 --- a/Travis/runTests.sh +++ b/Travis/runTests.sh @@ -21,10 +21,12 @@ echo "Attempting to run UnitySDK integration Tests..." -quit if [ $? = 0 ] ; then echo "UnitTest COMPLETED! Exited with $?" + echo 'Test logs' + cat $(pwd)/integrationTests.log exit 0 else echo "UnitTest FAILED! Exited with $?" - echo 'Logs tests' + echo 'Test logs' cat $(pwd)/integrationTests.log exit 1 fi From 9ae91cdf16518a9561806fab671cc57849e46acc Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 17 Nov 2017 11:59:31 -0600 Subject: [PATCH 095/100] update main readme with callback and customdata documentation, incorrect ifdef for restconnector security import, incorrect name in document conversion --- README.md | 114 +++++++++++++++--- Scripts/Connection/RESTConnector.cs | 2 +- .../v1/DocumentConversion.cs | 4 +- 3 files changed, 101 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e28219fec..3d6ac9bb1 100755 --- a/README.md +++ b/README.md @@ -54,6 +54,23 @@ The credentials for each service contain either a `username`, `password` and end **WARNING:** You are responsible for securing your own credentials. Any user with your service credentials can access your service instances! +## Watson Services +To get started with the Watson Services in Unity, click on each service below to read through each of their `README.md`'s and their codes. +* [Alchemy Language](/Scripts/Services/AlchemyAPI/v1) +* [Conversation](/Scripts/Services/Conversation/v1) +* [Discovery](/Scripts/Services/Discovery/v1) +* [Document Conversion](/Scripts/Services/DocumentConversion/v1) **Deprecated** +* [Language Translator](/Scripts/Services/LanguageTranslator/v2) +* [Natural Language Classifier](/Scripts/Services/NaturalLanguageClassifier/v2) +* [Natural Language Understanding](/Scripts/Services/NaturalLanguageUnderstanding/v1) +* [Personality Insights](/Scripts/Services/PersonalityInsights/v3) +* [Retrieve and Rank](/Scripts/Services/RetrieveAndRank/v1) **Deprecated** +* [Speech to Text](/Scripts/Services/SpeechToText/v1) +* [Text to Speech](/Scripts/Services/TextToSpeech/v1) +* [Tone Analyzer](/Scripts/Services/ToneAnalyzer/v3) +* [Tradeoff Analytics](/Scripts/Services/TradeoffAnalytics/v1) +* [Visual Recognition](/Scripts/Services/VisualRecognition/v3) + ## Authentication Before you can use a service, it must be authenticated with the service instance's `username`, `password` and `url`. @@ -81,22 +98,87 @@ void Start() } ``` -## Watson Services -To get started with the Watson Services in Unity, click on each service below to read through each of their `README.md`'s and their codes. -* [Alchemy Language](/Scripts/Services/AlchemyAPI/v1) -* [Conversation](/Scripts/Services/Conversation/v1) -* [Discovery](/Scripts/Services/Discovery/v1) -* [Document Conversion](/Scripts/Services/DocumentConversion/v1) **Deprecated** -* [Language Translator](/Scripts/Services/LanguageTranslator/v2) -* [Natural Language Classifier](/Scripts/Services/NaturalLanguageClassifier/v2) -* [Natural Language Understanding](/Scripts/Services/NaturalLanguageUnderstanding/v1) -* [Personality Insights](/Scripts/Services/PersonalityInsights/v3) -* [Retrieve and Rank](/Scripts/Services/RetrieveAndRank/v1) **Deprecated** -* [Speech to Text](/Scripts/Services/SpeechToText/v1) -* [Text to Speech](/Scripts/Services/TextToSpeech/v1) -* [Tone Analyzer](/Scripts/Services/ToneAnalyzer/v3) -* [Tradeoff Analytics](/Scripts/Services/TradeoffAnalytics/v1) -* [Visual Recognition](/Scripts/Services/VisualRecognition/v3) +## Callbacks +Success and failure callbacks are required. You can specify the return type in the callback. +```cs +private void Example() +{ + // Call with sepcific callbacks + conversation.Message(OnMessage, OnGetEnvironmentsFail, _workspaceId, ""); + discovery.GetEnvironments(OnGetEnvironments, OnFail); +} + +// OnMessage callback +private void OnMessage(object resp, Dictionary customData) +{ + Log.Debug("ExampleCallback.OnMessage()", "Response received: {0}", customData["json"].ToString()); +} + +// OnGetEnvironments callback +private void OnGetEnvironments(GetEnvironmentsResponse resp, Dictionary customData) +{ + Log.Debug("ExampleCallback.OnGetEnvironments()", "Response received: {0}", customData["json"].ToString()); +} + +// OnMessageFail callback +private void OnMessageFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleCallback.OnMessageFail()", "Error received: {0}", error.ToString()); +} + +// OnGetEnvironmentsFail callback +private void OnGetEnvironmentsFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleCallback.OnGetEnvironmentsFail()", "Error received: {0}", error.ToString()); +} +``` + +Since the success callback signature is generic and the failure callback always has the same signature, you can use a single set of callbacks to handle multiple calls. +```cs +private void Example() +{ + // Call with generic callbacks + conversation.Message(OnSuccess, OnMessageFail, "", ""); + discovery.GetEnvironments(OnSuccess, OnFail); +} + +// Generic success callback +private void OnSuccess(T resp, Dictionary customData) +{ + Log.Debug("ExampleCallback.OnSuccess()", "Response received: {0}", customData["json"].ToString()); +} + +// Generic fail callback +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleCallback.OnFail()", "Error received: {0}", error.ToString()); +} +``` + +## Custom data +Custom data can be passed through a `Dictionary customData` in each call. In most cases, the raw json response is returned in the customData under `"json"` entry. In cases where there is no returned json, the entry will contain the success and http response code of the call. + +```cs +void Example() +{ + Dictionary customData = new Dictionary(); + customData.Add("foo", "bar"); + conversation.Message(OnSuccess, OnFail, "", "", customData); +} + +// Generic success callback +private void OnSuccess(T resp, Dictionary customData) +{ + Log.Debug("ExampleCustomData.OnSuccess()", "Custom Data: {0}", customData["foo"].ToString()); // returns "bar" +} + +// Generic fail callback +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleCustomData.OnFail()", "Error received: {0}", error.ToString()); // returns error string + Log.Debug("ExampleCustomData.OnFail()", "Custom Data: {0}", customData["foo"].ToString()); // returns "bar" +} +``` ## Authentication Tokens You use tokens to write applications that make authenticated requests to IBM Watson™ services without embedding service credentials in every call. diff --git a/Scripts/Connection/RESTConnector.cs b/Scripts/Connection/RESTConnector.cs index f265ebe9d..76e9c6ac8 100644 --- a/Scripts/Connection/RESTConnector.cs +++ b/Scripts/Connection/RESTConnector.cs @@ -27,7 +27,7 @@ using UnityEngine; using UnityEngine.Networking; -#if UNITY_EDITOR +#if !NETFX_CORE using System.Net; using System.Net.Security; #endif diff --git a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs index a7e1f896c..718c82648 100644 --- a/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs +++ b/Scripts/Services/DocumentConversion/v1/DocumentConversion.cs @@ -228,7 +228,7 @@ private void ConvertDocumentResponse(RESTConnector.Request req, RESTConnector.Re else if ((req as ConvertDocumentRequest).ConversionTarget == ConversionTarget.NormalizedHtml) { #if NETFX_CORE - response.htmlContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); + result.htmlContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); #else result.htmlContent = System.Text.Encoding.Default.GetString(resp.Data); #endif @@ -237,7 +237,7 @@ private void ConvertDocumentResponse(RESTConnector.Request req, RESTConnector.Re else if ((req as ConvertDocumentRequest).ConversionTarget == ConversionTarget.NormalizedText) { #if NETFX_CORE - response.textContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); + result.textContent = System.Text.Encoding.GetEncoding(0).GetString(resp.Data); #else result.textContent = System.Text.Encoding.Default.GetString(resp.Data); #endif From 1d6cee72ec9c598685135cd57b43da2586746c3a Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 17 Nov 2017 13:18:30 -0600 Subject: [PATCH 096/100] Fixed callbacks --- Examples/ServiceExamples/Scripts/ExampleCallback.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleCallback.cs b/Examples/ServiceExamples/Scripts/ExampleCallback.cs index a53da6bc2..b02c66f51 100644 --- a/Examples/ServiceExamples/Scripts/ExampleCallback.cs +++ b/Examples/ServiceExamples/Scripts/ExampleCallback.cs @@ -51,12 +51,12 @@ void Start() discovery.VersionDate = "2016-12-01"; // Call with generic callbacks - conversation.Message(OnSuccess, OnMessageFail, _workspaceId, ""); + conversation.Message(OnSuccess, OnFail, _workspaceId, ""); discovery.GetEnvironments(OnSuccess, OnFail); // Call with sepcific callbacks - conversation.Message(OnMessage, OnGetEnvironmentsFail, _workspaceId, ""); - discovery.GetEnvironments(OnGetEnvironments, OnFail); + conversation.Message(OnMessage, OnMessageFail, _workspaceId, ""); + discovery.GetEnvironments(OnGetEnvironments, OnGetEnvironmentsFail); } // Generic success callback From 3c8ae13ddaddd24d9bef78ccdddfee0114d047a6 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Fri, 17 Nov 2017 15:21:24 -0600 Subject: [PATCH 097/100] updated readme --- Scripts/Services/AlchemyAPI/v1/README.md | 117 ++++----- Scripts/Services/Conversation/v1/README.md | 33 ++- Scripts/Services/Discovery/v1/README.md | 115 ++++----- .../Services/DocumentConversion/v1/README.md | 11 +- .../Services/LanguageTranslation/v2/README.md | 49 ++-- .../Services/LanguageTranslator/v2/README.md | 48 ++-- .../NaturalLanguageClassifier/v2/README.md | 31 ++- .../NaturalLanguageUnderstanding/v1/README.md | 25 +- .../Services/PersonalityInsights/v3/README.md | 11 +- Scripts/Services/RetrieveAndRank/v1/README.md | 118 +++++----- Scripts/Services/SpeechToText/v1/README.md | 195 +++++++-------- Scripts/Services/TextToSpeech/v1/README.md | 69 +++--- Scripts/Services/ToneAnalyzer/v3/README.md | 11 +- .../Services/TradeoffAnalytics/v1/README.md | 11 +- .../Services/VisualRecognition/v3/README.md | 222 +++--------------- 15 files changed, 485 insertions(+), 581 deletions(-) diff --git a/Scripts/Services/AlchemyAPI/v1/README.md b/Scripts/Services/AlchemyAPI/v1/README.md index 7c0e5dd9e..d2224ee76 100644 --- a/Scripts/Services/AlchemyAPI/v1/README.md +++ b/Scripts/Services/AlchemyAPI/v1/README.md @@ -16,18 +16,27 @@ void Start() } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleAlchemyLanguage.OnFail()", "Error received: {0}", error.ToString()); +} +``` + ### Get Authors You can extract Authors from a URL or HTML source. ```cs private void GetAuthors() { - if(!_alchemyApi.GetAuthors(OnGetAuthors, )) + if(!_alchemyApi.GetAuthors(OnGetAuthors, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetAuthors()", "Failed to get authors"); } -private void OnGetAuthors(AuthorsData authors, string data) +private void OnGetAuthors(AuthorsData authors, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetAuthors()", "Alchemy Language - Get authors response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetAuthors()", "Alchemy Language - Get authors response html: {0}", customData["json"].ToString()); } ``` @@ -36,13 +45,13 @@ You can get Concepts from a URL, HTML or Text source. ```cs private void GetRankedConcepts() { - if(!_alchemyApi.GetRankedConcepts(OnGetConcepts, )) + if(!_alchemyApi.GetRankedConcepts(OnGetConcepts, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } -private void OnGetConcepts(ConceptsData concepts, string data) +private void OnGetConcepts(ConceptsData concepts, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetConcepts()", "Alchemy Language - Get ranked concepts response text: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetConcepts()", "Alchemy Language - Get ranked concepts response text: {0}", customData["json"].ToString()); } ``` @@ -51,13 +60,13 @@ You can extract Dates from a URL, HTML or Text source. ```cs private void GetRankedConcepts() { - if(!_alchemyApi.GetDates(OnGetConcepts, )) + if(!_alchemyApi.GetDates(OnGetConcepts, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetRankedConcepts()", "Failed to get concepts"); } -private void OnGetDates(DateData dates, string data) +private void OnGetDates(DateData dates, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetDates()", "Alchemy Language - Get dates response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetDates()", "Alchemy Language - Get dates response html: {0}", customData["json"].ToString()); } ``` @@ -66,13 +75,13 @@ You can get Emotions from a URL, HTML or Text source. ```cs private void GetEmotions() { - if(!_alchemyApi.GetEmotions(OnGetEmotions, )) + if(!_alchemyApi.GetEmotions(OnGetEmotions, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetEmotions()", "Failed to get emotions"); } -private void OnGetEmotions(EmotionData emotions, string data) +private void OnGetEmotions(EmotionData emotions, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetEmotions()", "Alchemy Language - Get emotions response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetEmotions()", "Alchemy Language - Get emotions response html: {0}", customData["json"].ToString()); } ``` @@ -81,13 +90,13 @@ You can extract Entities from a URL, HTML or Text source. ```cs private void ExtractEntities() { - if(!_alchemyApi.ExtractEntities(OnExtractEntities, )) + if(!_alchemyApi.ExtractEntities(OnExtractEntities, OnFail, )) Log.Debug("ExampleAlchemyLanguage.ExtractEntities()", "Failed to get emotions"); } -private void OnExtractEntities(EntityData entityData, string data) +private void OnExtractEntities(EntityData entityData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnExtractEntities()", "Alchemy Language - Extract entities response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractEntities()", "Alchemy Language - Extract entities response html: {0}", customData["json"].ToString()); } ``` @@ -96,13 +105,13 @@ You can detect RSS Feeds from a URL source. ```cs private void GetFeeds() { - if(!m_AlchemyLanguage.DetectFeeds(OnDetectFeeds, )) + if(!m_AlchemyLanguage.DetectFeeds(OnDetectFeeds, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetFeeds()", "Failed to get feeds."); } -private void OnDetectFeeds(FeedData feedData, string data) +private void OnDetectFeeds(FeedData feedData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnDetectFeeds()", "Alchemy Language - Detect feeds response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnDetectFeeds()", "Alchemy Language - Detect feeds response url: {0}", customData["json"].ToString()); } ``` @@ -111,13 +120,13 @@ You can extract Keywords form a URL, HTML or Text source. ```cs private void GetKeywords() { - if(!m_AlchemyLanguage.ExtractKeywords(OnExtractKeywords, )) + if(!m_AlchemyLanguage.ExtractKeywords(OnExtractKeywords, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetKeywords()", "Failed to get keywords by URL POST"); } -private void OnExtractKeywords(KeywordData keywordData, string data) +private void OnExtractKeywords(KeywordData keywordData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnExtractKeywords()", "Alchemy Language - Extract keywords response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnExtractKeywords()", "Alchemy Language - Extract keywords response html: {0}", customData["json"].ToString()); } ``` @@ -126,13 +135,13 @@ You can extract the language of a URL, HTML or Text source. ```cs private void GetLanguages() { - if(!m_AlchemyLanguage.GetLanguages(OnGetLanguages, )) + if(!m_AlchemyLanguage.GetLanguages(OnGetLanguages, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetLanguages()", "Failed to get languages"); } -private void OnGetLanguages(LanguageData languages, string data) +private void OnGetLanguages(LanguageData languages, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetLanguages()", "Alchemy Language - Get languages response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetLanguages()", "Alchemy Language - Get languages response html: {0}", customData["json"].ToString()); } ``` @@ -141,13 +150,13 @@ You can get the Microformat of a URL source. ```cs private void GetMicroformats() { - if(!m_AlchemyLanguage.GetMicroformats(OnGetMicroformats, )) + if(!m_AlchemyLanguage.GetMicroformats(OnGetMicroformats, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetMicroformats()", "Failed to get microformats"); } -private void OnGetMicroformats(MicroformatData microformats, string data) +private void OnGetMicroformats(MicroformatData microformats, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetMicroformats()", "Alchemy Language - Get microformats response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetMicroformats()", "Alchemy Language - Get microformats response url: {0}", customData["json"].ToString()); } ``` @@ -156,13 +165,13 @@ You can extract the publication date from a URL or HTML source. ```cs private void GetPublicationDate() { - if(!m_AlchemyLanguage.GetPublicationDate(OnGetPublicationDate, )) + if(!m_AlchemyLanguage.GetPublicationDate(OnGetPublicationDate, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetPublicationDate()", "Failed to get publication dates"); } -private void OnGetPublicationDate(PubDateData pubDates, string data) +private void OnGetPublicationDate(PubDateData pubDates, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDate()", "Alchemy Language - Get publication date response url: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetPublicationDate()", "Alchemy Language - Get publication date response url: {0}", customData["json"].ToString()); } ``` @@ -171,13 +180,13 @@ You can extract Relations from a URL, HTML or Text source. ```cs private void GetRelations() { - if(!m_AlchemyLanguage.GetRelations(OnGetRelations, )) + if(!m_AlchemyLanguage.GetRelations(OnGetRelations, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetRelations()", "Failed to get relations"); } -private void OnGetRelations(RelationsData relationsData, string data) +private void OnGetRelations(RelationsData relationsData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetRelations()", "Alchemy Language - Get relations response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRelations()", "Alchemy Language - Get relations response html: {0}", customData["json"].ToString()); } ``` @@ -186,13 +195,13 @@ You can extract the Sentiment from a URL, HTML or Text source. ```cs private void GetTextSentiment() { - if(!m_AlchemyLanguage.GetTextSentiment(OnGetTextSentiment, )) + if(!m_AlchemyLanguage.GetTextSentiment(OnGetTextSentiment, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetTextSentiment()", "Failed to get sentiment"); } -private void OnGetTextSentiment(SentimentData sentimentData, string data) +private void OnGetTextSentiment(SentimentData sentimentData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetTextSentiment()", "Alchemy Language - Get text sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTextSentiment()", "Alchemy Language - Get text sentiment response html: {0}", customData["json"].ToString()); } ``` @@ -201,13 +210,13 @@ You can extract a Targeted Sentiment from a URL, HTML or Text source. Targets ar ```cs private void GetTargetedSentiment() { - if(!m_AlchemyLanguage.GetTargetedSentiment(OnGetTargetedSentiment, , )) + if(!m_AlchemyLanguage.GetTargetedSentiment(OnGetTargetedSentiment, OnFail, , )) Log.Debug("ExampleAlchemyLanguage.GetTargetedSentiment()", "Failed to get targeted sentiment"); } -private void OnGetTargetedSentiment(TargetedSentimentData sentimentData, string data) +private void OnGetTargetedSentiment(TargetedSentimentData sentimentData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentiment()", "Alchemy Language - Get targeted sentiment response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTargetedSentiment()", "Alchemy Language - Get targeted sentiment response html: {0}", customData["json"].ToString()); } ``` @@ -216,13 +225,13 @@ You can get the Taxonomy of entities from a URL, HTML or Text source. ```cs private void GetRankedTaxonomy() { - if(!m_AlchemyLanguage.GetRankedTaxonomy(OnGetRankedTaxonomy, )) + if(!m_AlchemyLanguage.GetRankedTaxonomy(OnGetRankedTaxonomy, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetRankedTaxonomy()", "Failed to get ranked taxonomy"); } -private void OnGetRankedTaxonomy(TaxonomyData taxonomyData, string data) +private void OnGetRankedTaxonomy(TaxonomyData taxonomyData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomy()", "Alchemy Language - Get ranked taxonomy response html: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRankedTaxonomy()", "Alchemy Language - Get ranked taxonomy response html: {0}", customData["json"].ToString()); } ``` @@ -231,13 +240,13 @@ You can exctract the Text from a URL or HTML source. ```cs private void GetText() { - if(!m_AlchemyLanguage.GetText(OnGetText, )) + if(!m_AlchemyLanguage.GetText(OnGetText, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetText()", "Failed to get text by text"); } -private void OnGetText(TextData textData, string data) +private void OnGetText(TextData textData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetText()", "Alchemy Language - Get Text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetText()", "Alchemy Language - Get Text HTML response: {0}", customData["json"].ToString()); } ``` @@ -246,13 +255,13 @@ You can exctract the Raw Text from a URL or HTML source. ```cs private void GetRawText() { - if(!m_AlchemyLanguage.GetRawText(OnGetText, )) + if(!m_AlchemyLanguage.GetRawText(OnGetText, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetRawText()", "Failed to get raw text by text"); } -private void OnGetRawText(TextData textData, string data) +private void OnGetRawText(TextData textData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetRawText()", "Alchemy Language - Get raw text HTML response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetRawText()", "Alchemy Language - Get raw text HTML response: {0}", customData["json"].ToString()); } ``` @@ -261,13 +270,13 @@ You can extract the Title form a URL or HTML source. ```cs private void GetTitle() { - if(!m_AlchemyLanguage.GetTitle(OnGetTitle, )) + if(!m_AlchemyLanguage.GetTitle(OnGetTitle, OnFail, )) Log.Debug("ExampleAlchemyLanguage.GetTitle()", "Failed to get title by text POST"); } -private void OnGetTitle(Title titleData, string data) +private void OnGetTitle(Title titleData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetTitle()", "Alchemy Language - Get Title Url response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetTitle()", "Alchemy Language - Get Title Url response: {0}", customData["json"].ToString()); } ``` @@ -276,13 +285,13 @@ You can combine multiple requests into one call using a Combined Data call from ```cs private void CombinedCall() { - if(!m_AlchemyLanguage.GetCombinedData(OnGetCombinedData, , , , , , , , , , , , , , , , )) + if(!m_AlchemyLanguage.GetCombinedData(OnGetCombinedData, OnFail, , , , , , , , , , , , , , , , )) Log.Debug("ExampleAlchemyLanguage.CombinedCall()", "Failed to get combined data by text POST"); } -private void OnGetCombinedData(CombinedCallData combinedData, string data) +private void OnGetCombinedData(CombinedCallData combinedData, Dictionary customData) { - Log.Debug("ExampleAlchemyLanguage.OnGetCombinedData()", "Alchemy Language - Get Combined Data Text response: {0}", data); + Log.Debug("ExampleAlchemyLanguage.OnGetCombinedData()", "Alchemy Language - Get Combined Data Text response: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/Conversation/v1/README.md b/Scripts/Services/Conversation/v1/README.md index 3eb085f99..ceb2732a7 100755 --- a/Scripts/Services/Conversation/v1/README.md +++ b/Scripts/Services/Conversation/v1/README.md @@ -22,19 +22,28 @@ void Start() } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleConversation.OnFail()", "Error received: {0}", error.ToString()); +} +``` + ### Message Send a message to the Conversation instance ```cs // Send a simple message using a string private void Message() { - if (!_conversation.Message(OnMessage, , )) + if (!_conversation.Message(OnMessage, OnFail, , )) Log.Debug("ExampleConversation.Message()", "Failed to message!"); } -private void OnMessage(object resp, string data) +private void OnMessage(object resp, Dictionary customData) { - Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", customData["json"].ToString()); } ``` ```cs @@ -49,13 +58,13 @@ private void Message() } }; - if (!_conversation.Message(OnMessage, , messageRequest)) + if (!_conversation.Message(OnMessage, OnFail, , messageRequest)) Log.Debug("ExampleConversation.Message()", "Failed to message!"); } -private void OnMessage(object resp, string data) +private void OnMessage(object resp, Dictionary customData) { - Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage()", "Conversation: Message Response: {0}", customData["json"].ToString()); } ``` ```cs @@ -64,13 +73,13 @@ Dictionary _context; // context to persist // Initiate a conversation private void Message0() { - if (!_conversation.Message(OnMessage, , )) + if (!_conversation.Message(OnMessage, OnFail, , )) Log.Debug("ExampleConversation.Message()", "Failed to message!"); } -private void OnMessage0(object resp, string data) +private void OnMessage0(object resp, Dictionary customData) { - Log.Debug("ExampleConversation.OnMessage0()", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage0()", "Conversation: Message Response: {0}", customData["json"].ToString()); // Set context for next round of messaging object _tempContext = null; @@ -93,13 +102,13 @@ private void Message1() context = _context }; - if (!_conversation.Message(OnMessage, , messageRequest)) + if (!_conversation.Message(OnMessage, OnFail, , messageRequest)) Log.Debug("ExampleConversation.Message1()", "Failed to message!"); } -private void OnMessage1(object resp, string data) +private void OnMessage1(object resp, Dictionary customData) { - Log.Debug("ExampleConversation.OnMessage1()", "Conversation: Message Response: {0}", data); + Log.Debug("ExampleConversation.OnMessage1()", "Conversation: Message Response: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/Discovery/v1/README.md b/Scripts/Services/Discovery/v1/README.md index 852bca8e4..404d4dd89 100755 --- a/Scripts/Services/Discovery/v1/README.md +++ b/Scripts/Services/Discovery/v1/README.md @@ -17,7 +17,14 @@ void Start() } ``` - +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleDiscovery.OnFail()", "Error received: {0}", error.ToString()); +} +``` @@ -26,13 +33,13 @@ Creates an environment for the service instance. Note: You can create only one e ```cs private void CreateEnvironment() { - if (!_discovery.AddEnvironment(OnAddEnvironment, , , )) + if (!_discovery.AddEnvironment(OnAddEnvironment, OnFail, , , )) Log.Debug("ExampleDiscovery.CreateEnvironment()", "Failed to add environment"); } -private void OnAddEnvironment(Environment resp, string data) +private void OnAddEnvironment(Environment resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddEnvironment()", "Discovery - AddEnvironment Response: {0}", customData["json"].ToString()); } ``` @@ -46,13 +53,13 @@ List existing environments for the service instance. ```cs private void GetEnvironments() { - if (!_discovery.GetEnvironments(OnGetEnvironments)) + if (!_discovery.GetEnvironments(OnGetEnvironments, OnFail)) Log.Debug("ExampleDiscovery.GetEnvironments()", "Failed to get environments"); } -private void OnGetEnvironments(GetEnvironmentsResponse resp, string data) +private void OnGetEnvironments(GetEnvironmentsResponse resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironments()", "Discovery - GetEnvironments Response: {0}", customData["json"].ToString()); } ``` @@ -66,13 +73,13 @@ Gets detailed information about the specified environment. ```cs private void GetEnvironment() { - if (!_discovery.GetEnvironment(OnGetEnvironment, )) + if (!_discovery.GetEnvironment(OnGetEnvironment, OnFail, )) Log.Debug("ExampleDiscovery.GetEnvironment()", "Failed to get environment"); } -private void OnGetEnvironment(Environment resp, string data) +private void OnGetEnvironment(Environment resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetEnvironment()", "Discovery - GetEnvironment Response: {0}", customData["json"].ToString()); } ``` @@ -87,11 +94,11 @@ Deletes an existing environment. ```cs private void DeleteEnvironment() { - if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, )) + if (!_discovery.DeleteEnvironment(OnDeleteEnvironment, OnFail, )) Log.Debug("ExampleDiscovery.DeleteEnvironment()", "Failed to delete environment"); } -private void OnDeleteEnvironment(bool success, string data) +private void OnDeleteEnvironment(bool success, Dictionary customData) { Log.Debug("ExampleDiscovery.OnDeleteEnvironment()", "Discovery - DeleteEnvironment Response: deleted:{0}", success); } @@ -107,13 +114,13 @@ Adds a configuration to the service instance. ```cs private void AddConfiguration() { - if (!_discovery.AddConfiguration(OnAddConfiguration, , )) + if (!_discovery.AddConfiguration(OnAddConfiguration, OnFail, , )) Log.Debug("ExampleDiscovery.AddConfiguration()", "Failed to add configuration"); } -private void OnAddConfiguration(Configuration resp, string data) +private void OnAddConfiguration(Configuration resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddConfiguration()", "Discovery - AddConfiguration Response: {0}", customData["json"].ToString()); } ``` @@ -127,13 +134,13 @@ Lists existing configurations for the service instance. ```cs private void GetConfigurations() { - if (!_discovery.GetConfigurations(OnGetConfigurations, )) + if (!_discovery.GetConfigurations(OnGetConfigurations, OnFail, )) Log.Debug("ExampleDiscovery.GetConfigurations()", "Failed to get configurations"); } -private void OnGetConfigurations(GetConfigurationsResponse resp, string data) +private void OnGetConfigurations(GetConfigurationsResponse resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfigurations()", "Discovery - GetConfigurations Response: {0}", customData["json"].ToString()); } ``` @@ -147,13 +154,13 @@ Get information about the specified configuration. ```cs private void GetConfiguration() { - if (!_discovery.GetConfiguration(OnGetConfiguration, , )) + if (!_discovery.GetConfiguration(OnGetConfiguration, OnFail, , )) Log.Debug("ExampleDiscovery.GetConfiguration()", "Failed to get configuration"); } -private void OnGetConfiguration(Configuration resp, string data) +private void OnGetConfiguration(Configuration resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetConfiguration()", "Discovery - GetConfiguration Response: {0}", customData["json"].ToString()); } ``` @@ -167,13 +174,13 @@ Runs a sample document through the default or your configuration and returns dia ```cs private void PreviewConfiguration() { - if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, , , null, , )) + if (!_discovery.PreviewConfiguration(OnPreviewConfiguration, OnFail, , , null, , )) Log.Debug("ExampleDiscovery.PreviewConfiguration()", "Failed to preview configuration"); } -private void OnPreviewConfiguration(TestDocument resp, string data) +private void OnPreviewConfiguration(TestDocument resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", data); + Log.Debug("ExampleDiscovery.OnPreviewConfiguration()", "Discovery - Preview configuration Response: {0}", customData["json"].ToString()); } ``` @@ -189,11 +196,11 @@ The delete operation is performed unconditionally. A delete request succeeds eve ```cs private void DeleteConfiguration() { - if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, , )) + if (!_discovery.DeleteConfiguration(OnDeleteConfiguration, OnFail, , )) Log.Debug("ExampleDiscovery.DeleteConfiguration()", "Failed to delete configuration"); } -private void OnDeleteConfiguration(bool success, string data) +private void OnDeleteConfiguration(bool success, Dictionary customData) { Log.Debug("ExampleDiscovery.OnDeleteConfiguration()", "Discovery - DeleteConfiguration Response: deleted:{0}", success); } @@ -209,13 +216,13 @@ Creates a new collection for storing documents. ```cs private void AddCollection() { - if (!_discovery.AddCollection(OnAddCollection, , , , )) + if (!_discovery.AddCollection(OnAddCollection, OnFail, , , , )) Log.Debug("ExampleDiscovery.AddCollection()", "Failed to add collection"); } -private void OnAddCollection(CollectionRef resp, string data) +private void OnAddCollection(CollectionRef resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddCollection()", "Discovery - Add collection Response: {0}", customData["json"].ToString()); } ``` @@ -229,13 +236,13 @@ Display a list of existing collections. ```cs private void GetCollections() { - if (!_discovery.GetCollections(OnGetCollections, )) + if (!_discovery.GetCollections(OnGetCollections, OnFail, )) Log.Debug("ExampleDiscovery.GetCollections()", "Failed to get collections"); } -private void OnGetCollections(GetCollectionsResponse resp, string data) +private void OnGetCollections(GetCollectionsResponse resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get colletions Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollections()", "Discovery - Get colletions Response: {0}", customData["json"].ToString()); } ``` @@ -249,13 +256,13 @@ Show detailed information about an existing collection. ```cs private void GetCollection() { - if (!_discovery.GetCollection(OnGetCollection, , )) + if (!_discovery.GetCollection(OnGetCollection, OnFail, , )) Log.Debug("ExampleDiscovery.GetCollection()", "Failed to get collection"); } -private void OnGetCollection(Collection resp, string data) +private void OnGetCollection(Collection resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetCollection()", "Discovery - Get colletion Response: {0}", customData["json"].ToString()); } ``` @@ -269,13 +276,13 @@ Gets a list of the unique fields, and each field's type, that are stored in a co ```cs private void GetFields() { - if (!_discovery.GetFields(OnGetFields, , )) + if (!_discovery.GetFields(OnGetFields, OnFail, , )) Log.Debug("ExampleDiscovery.GetFields()", "Failed to get fields"); } -private void OnGetFields(GetFieldsResponse resp, string data) +private void OnGetFields(GetFieldsResponse resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetFields()", "Discovery - Get fields Response: {0}", customData["json"].ToString()); } ``` @@ -289,11 +296,11 @@ Deletes an existing collection. ```cs private void DeleteCollection() { - if (!_discovery.DeleteCollection(OnDeleteCollection, , )) + if (!_discovery.DeleteCollection(OnDeleteCollection, OnFail, , )) Log.Debug("ExampleDiscovery.DeleteCollection()", "Failed to add collection"); } -private void OnDeleteCollection(bool success, string data) +private void OnDeleteCollection(bool success, Dictionary customData) { Log.Debug("ExampleDiscovery.OnDeleteCollection()", "Discovery - Delete collection Response: deleted:{0}", success); } @@ -310,13 +317,13 @@ Add a document to your collection. ```cs private void AddDocument() { - if (!_discovery.AddDocument(OnAddDocument, , , , , null)) + if (!_discovery.AddDocument(OnAddDocument, OnFail, , , , , null)) Log.Debug("ExampleDiscovery.AddDocument()", "Failed to add document"); } -private void OnAddDocument(DocumentAccepted resp, string data) +private void OnAddDocument(DocumentAccepted resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnAddDocument()", "Discovery - Add document Response: {0}", customData["json"].ToString()); } ``` @@ -331,13 +338,13 @@ Update or partially update a document to create or replace an existing document. ```cs private void UpdateDocument() { - if (!_discovery.UpdateDocument(OnUpdateDocument, , , , , , null)) + if (!_discovery.UpdateDocument(OnUpdateDocument, OnFail, , , , , , null)) Log.Debug("ExampleDiscovery.UpdateDocument()", "Failed to update document"); } -private void OnUpdateDocument(DocumentAccepted resp, string data) +private void OnUpdateDocument(DocumentAccepted resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnUpdateDocument()", "Discovery - Update document Response: {0}", customData["json"].ToString()); } ``` @@ -352,13 +359,13 @@ Display status information about a submitted document. ```cs private void GetDocument() { - if (!_discovery.GetDocument(OnGetDocument, , , )) + if (!_discovery.GetDocument(OnGetDocument, OnFail, , , )) Log.Debug("ExampleDiscovery.GetDocument()", "Failed to get document"); } -private void OnGetDocument(DocumentStatus resp, string data) +private void OnGetDocument(DocumentStatus resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", data); + Log.Debug("ExampleDiscovery.OnGetDocument()", "Discovery - Get document Response: {0}", customData["json"].ToString()); } ``` @@ -372,11 +379,11 @@ Delete a document from a collection. ```cs private void DeleteDocument() { - if (!_discovery.DeleteDocument(OnDeleteDocument, , , )) + if (!_discovery.DeleteDocument(OnDeleteDocument, OnFail, , , )) Log.Debug("ExampleDiscovery.DeleteDocument()", "Failed to delete document"); } -private void OnDeleteDocument(bool success, string data) +private void OnDeleteDocument(bool success, Dictionary customData) { Log.Debug("ExampleDiscovery.OnDeleteDocument()", "Discovery - Delete document Response: deleted:{0}", success); } @@ -394,13 +401,13 @@ Once your content is uploaded and enriched by the Discovery service, you can bui ```cs private void Query() { - if (!_discovery.Query(OnQuery, , , null, , null, 10, null, 0)) + if (!_discovery.Query(OnQuery, OnFail, , , null, , null, 10, null, 0)) Log.Debug("ExampleDiscovery.Query()", "Failed to query"); } -private void OnQuery(QueryResponse resp, string data) +private void OnQuery(QueryResponse resp, Dictionary customData) { - Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", data); + Log.Debug("ExampleDiscovery.OnQuery()", "Discovery - Query Response: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/DocumentConversion/v1/README.md b/Scripts/Services/DocumentConversion/v1/README.md index 5a98e36c1..ec8d72f04 100755 --- a/Scripts/Services/DocumentConversion/v1/README.md +++ b/Scripts/Services/DocumentConversion/v1/README.md @@ -24,13 +24,18 @@ Converts a document to answer units, HTML or text. This method accepts a multipa ```cs void ConvertDocument () { - if (!m_DocumentConversion.ConvertDocument(OnConvertDocument, , )) + if (!m_DocumentConversion.ConvertDocument(OnConvertDocument, OnFail, , )) Log.Debug("ExampleDocumentConversion.ConvertDocument()", "Document conversion failed!"); } -private void OnConvertDocument(ConvertedDocument documentConversionResponse, string data) +private void OnConvertDocument(ConvertedDocument documentConversionResponse, Dictionary customData) { - Log.Debug("ExampleDocumentConversion.OnConvertDocument()", "DocuemntConversion - ConvertDocument Response: {0}", data); + Log.Debug("ExampleDocumentConversion.OnConvertDocument()", "DocuemntConversion - ConvertDocument Response: {0}", customData["json"].ToString()); +} + +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleDocumentConversion.OnFail()", "Error received: {0}", error.ToString()); } ``` diff --git a/Scripts/Services/LanguageTranslation/v2/README.md b/Scripts/Services/LanguageTranslation/v2/README.md index 5754a1553..2c6a99149 100755 --- a/Scripts/Services/LanguageTranslation/v2/README.md +++ b/Scripts/Services/LanguageTranslation/v2/README.md @@ -19,7 +19,14 @@ void Start() ``` - +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleLanguageTranslation.OnFail()", "Error received: {0}", error.ToString()); +} +``` ### List models @@ -27,13 +34,13 @@ Lists available models for language translation with option to filter by source ```cs private void GetModels() { - if (!_languageTranslation.GetModels(OnGetModels)) + if (!_languageTranslation.GetModels(OnGetModels, OnFail)) Log.Debug("ExampleLanguageTranslation.GetModels()", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string data) +private void OnGetModels(TranslationModels models, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnGetModels()", "Language Translation - Get models response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetModels()", "Language Translation - Get models response: {0}", customData["json"].ToString()); } ``` @@ -46,13 +53,13 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. ```cs private void CreateModel() { - if (!_languageTranslation.CreateModel(OnCreateModel, , , )) + if (!_languageTranslation.CreateModel(OnCreateModel, OnFail, , , )) Log.Debug("ExampleLanguageTranslation.CreateModel()", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string data) +private void OnCreateModel(TranslationModel model, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnCreateModel()", "Language Translation - Create model response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnCreateModel()", "Language Translation - Create model response: {0}", customData["json"].ToString()); } ``` @@ -65,13 +72,13 @@ Returns information, including training status, about a specified translation mo ```cs private void GetModel() { - if (!_languageTranslation.GetModel(OnGetModel, )) + if (!_languageTranslation.GetModel(OnGetModel, OnFail, )) Log.Debug("ExampleLanguageTranslation.GetModel()", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string data) +private void OnGetModel(TranslationModel model, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnGetModel()", "Language Translation - Get model response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetModel()", "Language Translation - Get model response: {0}", customData["json"].ToString()); } ``` @@ -84,11 +91,11 @@ Deletes trained translation models. ```cs private void DeleteModel() { - if (!_languageTranslation.DeleteModel(OnDeleteModel, )) + if (!_languageTranslation.DeleteModel(OnDeleteModel, OnFail, )) Log.Debug("ExampleLanguageTranslation.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string data) +private void OnDeleteModel(bool success, Dictionary customData) { Log.Debug("ExampleLanguageTranslation.OnDeleteModel()", "Language Translation - Delete model response: success: {0}", success); } @@ -103,13 +110,13 @@ Translates input text from the source language to the target language. ```cs private void Translate() { - if (!_languageTranslation.GetTranslation(, , , OnGetTranslation)) + if (!_languageTranslation.GetTranslation(OnGetTranslation, OnFail, , , )) Log.Debug("ExampleLanguageTranslation.Translate()", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string data) +private void OnGetTranslation(Translations translation, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnGetTranslation()", "Langauge Translation - Translate Response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetTranslation()", "Langauge Translation - Translate Response: {0}", customData["json"].ToString()); } ``` @@ -121,13 +128,13 @@ Identify the language in which a text is written. ```cs private void Identify() { - if (!_languageTranslation.Identify(OnIdentify, )) + if (!_languageTranslation.Identify(OnIdentify, OnFail, )) Log.Debug("ExampleLanguageTranslation.Identify()", "Failed to identify language."); } -private void OnIdentify(string lang, string data) +private void OnIdentify(string lang, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnIdentify()", "Language Translation - Identify response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnIdentify()", "Language Translation - Identify response: {0}", customData["json"].ToString()); } ``` @@ -140,13 +147,13 @@ Return the list of languages it can detect. ```cs private void GetLanguages() { - if (!_languageTranslation.GetLanguages(OnGetLanguages)) + if (!_languageTranslation.GetLanguages(OnGetLanguages, OnFail)) Log.Debug("ExampleLanguageTranslation.GetLanguages()", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string data) +private void OnGetLanguages(Languages languages, Dictionary customData) { - Log.Debug("ExampleLanguageTranslation.OnGetLanguages()", "Language Translation - Get languages response: {0}", data); + Log.Debug("ExampleLanguageTranslation.OnGetLanguages()", "Language Translation - Get languages response: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/LanguageTranslator/v2/README.md b/Scripts/Services/LanguageTranslator/v2/README.md index 12f5a5965..87a73dc28 100755 --- a/Scripts/Services/LanguageTranslator/v2/README.md +++ b/Scripts/Services/LanguageTranslator/v2/README.md @@ -19,6 +19,14 @@ void Start() ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleLanguageTranslator.OnFail()", "Error received: {0}", error.ToString()); +} +``` @@ -27,13 +35,13 @@ Lists available models for language translation with option to filter by source ```cs private void GetModels() { - if (!_languageTranslator.GetModels(OnGetModels)) + if (!_languageTranslator.GetModels(OnGetModels, OnFail)) Log.Debug("ExampleLanguageTranslator.GetModels()", "Failed to get models."); } -private void OnGetModels(TranslationModels models, string data) +private void OnGetModels(TranslationModels models, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetModels()", "Language Translator - Get models response: {0}", customData["json"].ToString()); } ``` @@ -46,13 +54,13 @@ Uploads a TMX glossary file on top of a domain to customize a translation model. ```cs private void CreateModel() { - if (!_languageTranslator.CreateModel(OnCreateModel, , , )) + if (!_languageTranslator.CreateModel(OnCreateModel, OnFail, , , )) Log.Debug("ExampleLanguageTranslator.CreateModel()", "Failed to create model."); } -private void OnCreateModel(TranslationModel model, string data) +private void OnCreateModel(TranslationModel model, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnCreateModel()", "Language Translator - Create model response: {0}", customData["json"].ToString()); } ``` @@ -65,13 +73,13 @@ Returns information, including training status, about a specified translation mo ```cs private void GetModel() { - if (!_languageTranslator.GetModel(OnGetModel, )) + if (!_languageTranslator.GetModel(OnGetModel, OnFail, )) Log.Debug("ExampleLanguageTranslator.GetModel()", "Failed to get model."); } -private void OnGetModel(TranslationModel model, string data) +private void OnGetModel(TranslationModel model, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetModel()", "Language Translator - Get model response: {0}", customData["json"].ToString()); } ``` @@ -84,11 +92,11 @@ Deletes trained translation models. ```cs private void DeleteModel() { - if (!_languageTranslator.DeleteModel(OnDeleteModel, )) + if (!_languageTranslator.DeleteModel(OnDeleteModel, OnFail, )) Log.Debug("ExampleLanguageTranslator.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string data) +private void OnDeleteModel(bool success, Dictionary customData) { Log.Debug("ExampleLanguageTranslator.OnDeleteModel()", "Language Translator - Delete model response: success: {0}", success); } @@ -103,13 +111,13 @@ Translates input text from the source language to the target language. ```cs private void Translate() { - if (!_languageTranslator.GetTranslation(, , , OnGetTranslation)) + if (!_languageTranslator.GetTranslation(OnGetTranslation, OnFail, , , )) Log.Debug("ExampleLanguageTranslator.Translate()", "Failed to translate."); } -private void OnGetTranslation(Translations translation, string data) +private void OnGetTranslation(Translations translation, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetTranslation()", "Langauge Translator - Translate Response: {0}", customData["json"].ToString()); } ``` @@ -121,13 +129,13 @@ Identify the language in which a text is written. ```cs private void Identify() { - if (!_languageTranslator.Identify(OnIdentify, )) + if (!_languageTranslator.Identify(OnIdentify, OnFail, )) Log.Debug("ExampleLanguageTranslator.Identify()", "Failed to identify language."); } -private void OnIdentify(string lang, string data) +private void OnIdentify(string lang, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnIdentify()", "Language Translator - Identify response: {0}", customData["json"].ToString()); } ``` @@ -140,13 +148,13 @@ Return the list of languages it can detect. ```cs private void GetLanguages() { - if (!_languageTranslator.GetLanguages(OnGetLanguages)) + if (!_languageTranslator.GetLanguages(OnGetLanguages, OnFail)) Log.Debug("ExampleLanguageTranslator.GetLanguages()", "Failed to get languages."); } -private void OnGetLanguages(Languages languages, string data) +private void OnGetLanguages(Languages languages, Dictionary customData) { - Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", data); + Log.Debug("ExampleLanguageTranslator.OnGetLanguages()", "Language Translator - Get languages response: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/NaturalLanguageClassifier/v2/README.md b/Scripts/Services/NaturalLanguageClassifier/v2/README.md index 689d1fd33..009a3277e 100755 --- a/Scripts/Services/NaturalLanguageClassifier/v2/README.md +++ b/Scripts/Services/NaturalLanguageClassifier/v2/README.md @@ -18,18 +18,29 @@ void Start() } ``` + +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleNaturalLanguageClassifier.OnFail()", "Error received: {0}", error.ToString()); +} +``` + + ### Listing Classifiers Returns an empty array if no classifiers are available. ```cs private void GetClassifiers() { - if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers)) + if (!naturalLanguageClassifier.GetClassifiers(OnGetClassifiers, OnFail)) Log.Debug("ExampleNaturalLanguageClassifier.GetClassifiers()", "Failed to get classifiers!"); } -private void OnGetClassifiers(Classifiers classifiers, string data) +private void OnGetClassifiers(Classifiers classifiers, Dictionary customData) { - Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifiers()", "Natural Language Classifier - GetClassifiers Response: {0}", customData["json"].ToString()); } ``` @@ -41,13 +52,13 @@ The status must be Available before you can use the classifier to classify calls ```cs private void Classify() { - if (!naturalLanguageClassifier.Classify(, , OnClassify)) + if (!naturalLanguageClassifier.Classify(OnClassify, OnFail, , )) Log.Debug("ExampleNaturalLanguageClassifier.Classify()", "Failed to classify!"); } -private void OnClassify(ClassifyResult result, string data) +private void OnClassify(ClassifyResult result, Dictionary customData) { - Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnClassify()", "Natural Language Classifier - Classify Response: {0}", customData["json"].ToString()); } ``` @@ -63,9 +74,9 @@ private void TrainClassifier() Log.Debug("ExampleNaturalLanguageClassifier.TrainClassifier()", "Failed to train clasifier!"); } -private void OnTrainClassifier(Classifier classifier, string data) +private void OnTrainClassifier(Classifier classifier, Dictionary customData) { - Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", data); + Log.Debug("ExampleNaturalLanguageClassifier.OnTrainClassifier()", "Natural Language Classifier - Train Classifier: {0}", customData["json"].ToString()); } ``` @@ -80,7 +91,7 @@ private void GetClassifier() Log.Debug("ExampleNaturalLanguageClassifier.GetClassifier()", "Failed to get classifier {0}!", classifierId); } -private void OnGetClassifier(Classifier classifier, string data) +private void OnGetClassifier(Classifier classifier, Dictionary customData) { Log.Debug("ExampleNaturalLanguageClassifier.OnGetClassifier()", "Natural Language Classifier - Get Classifier {0}: {1}", classifier.classifier_id, data); } @@ -98,7 +109,7 @@ private void DeleteClassifier() Log.Debug("ExampleNaturalLanguageClassifier.DeleteClassifier()", "Failed to delete clasifier {0}!", ); } -private void OnDeleteTrainedClassifier(bool success, string data) +private void OnDeleteTrainedClassifier(bool success, Dictionary customData) { Log.Debug("ExampleNaturalLanguageClassifier.OnDeleteTrainedClassifier()", "Natural Language Classifier - Delete Trained Classifier {0} | success: {1} {2}", , success, data); } diff --git a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md index 91a46d7ae..f15aa06b0 100755 --- a/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md +++ b/Scripts/Services/NaturalLanguageUnderstanding/v1/README.md @@ -20,18 +20,27 @@ void Start() } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleNaturalLanguageUnderstanding.OnFail()", "Error received: {0}", error.ToString()); +} +``` + ### Analyze Analyze features of natural language content. ```cs private void Analyze() { - if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, )) + if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, OnFail, )) Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models."); } -private void OnAnalyze(AnalysisResults resp, string data) +private void OnAnalyze(AnalysisResults resp, Dictionary customData) { - Log.Debug("ExampleNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", data); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", customData["json"].ToString()); } ``` @@ -42,13 +51,13 @@ List available custom models. ```cs private void GetModels() { - if (!_naturalLanguageUnderstanding.GetModels(OnGetModels)) + if (!_naturalLanguageUnderstanding.GetModels(OnGetModels, OnFail)) Log.Debug("ExampleNaturalLanguageUnderstanding.GetModels()", "Failed to get models."); } -private void OnGetModels(ListModelsResults resp, string data) +private void OnGetModels(ListModelsResults resp, Dictionary customData) { - Log.Debug("ExampleNaturalLanguageUnderstanding.OnGetModels()", "ListModelsResult: {0}", data); + Log.Debug("ExampleNaturalLanguageUnderstanding.OnGetModels()", "ListModelsResult: {0}", customData["json"].ToString()); } ``` @@ -59,11 +68,11 @@ Delete a custom model. ```cs private void DeleteModel() { - if (!_naturalLanguageUnderstanding.DeleteModel(OnDeleteModel, )) + if (!_naturalLanguageUnderstanding.DeleteModel(OnDeleteModel, OnFail, )) Log.Debug("ExampleNaturalLanguageUnderstanding.DeleteModel()", "Failed to delete model."); } -private void OnDeleteModel(bool success, string data) +private void OnDeleteModel(bool success, Dictionary customData) { Log.Debug("ExampleNaturalLanguageUnderstanding.OnDeleteModel()", "DeleteModelResult: {0}", success); } diff --git a/Scripts/Services/PersonalityInsights/v3/README.md b/Scripts/Services/PersonalityInsights/v3/README.md index 575231c8e..a019f221c 100755 --- a/Scripts/Services/PersonalityInsights/v3/README.md +++ b/Scripts/Services/PersonalityInsights/v3/README.md @@ -27,13 +27,18 @@ Extract personality characteristics based on how a person writes. ```cs private void GetProfile() { - if(!m_personalityInsights.GetProfile(OnGetProfileJson, dataPath, ContentType.TEXT_HTML, ContentLanguage.ENGLISH, ContentType.APPLICATION_JSON, AcceptLanguage.ENGLISH, true, true, true)) + if(!m_personalityInsights.GetProfile(OnGetProfileJson, OnFail, dataPath, ContentType.TEXT_HTML, ContentLanguage.ENGLISH, ContentType.APPLICATION_JSON, AcceptLanguage.ENGLISH, true, true, true)) Log.Debug("ExamplePersonalityInsights.GetProfile()", "Failed to get profile!"); } -private void OnGetProfile(Profile profile, string data) +private void OnGetProfile(Profile profile, Dictionary customData) { - Log.Debug("ExamplePersonalityInsights.OnGetProfile()", "Profile result: {0}", data); + Log.Debug("ExamplePersonalityInsights.OnGetProfile()", "Profile result: {0}", customData["json"].ToString()); +} + +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExamplePersonalityInsights.OnFail()", "Error received: {0}", error.ToString()); } ``` diff --git a/Scripts/Services/RetrieveAndRank/v1/README.md b/Scripts/Services/RetrieveAndRank/v1/README.md index f5f9d6ade..1b6da54b5 100755 --- a/Scripts/Services/RetrieveAndRank/v1/README.md +++ b/Scripts/Services/RetrieveAndRank/v1/README.md @@ -18,6 +18,14 @@ void Start() } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleRetrieveAndRank.OnFail()", "Error received: {0}", error.ToString()); +} +``` ### Getting clusters Retrieves the list of Solr clusters for the service instance. @@ -25,13 +33,13 @@ Retrieves the list of Solr clusters for the service instance. ```cs void GetClusters() { - if (!_retrieveAndRank.GetClusters(OnGetClusters)) + if (!_retrieveAndRank.GetClusters(OnGetClusters, OnFail)) Log.Debug("ExampleRetrieveAndRank.GetClusters()", "Failed to get clusters!"); } -private void OnGetClusters(SolrClusterListResponse resp, string data) +private void OnGetClusters(SolrClusterListResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "GetClusters results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusters()", "GetClusters results: {0}", customData["json"].ToString()); } ``` @@ -41,13 +49,13 @@ Provisions a Solr cluster asynchronously. When the operation is successful, the ```cs void CreateCluster() { - if (!_retrieveAndRank.CreateCluster(OnCreateCluster, , )) + if (!_retrieveAndRank.CreateCluster(OnCreateCluster, OnFail, , )) Log.Debug("ExampleRetrieveAndRank.CreateCluster()", "Failed to create cluster!"); } -private void OnCreateCluster(SolrClusterResponse resp, string data) +private void OnCreateCluster(SolrClusterResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnCreateClusterMethod()", "CreateCluster results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateClusterMethod()", "CreateCluster results: {0}", customData["json"].ToString()); } ``` @@ -57,11 +65,11 @@ Stops and deletes a Solr Cluster asynchronously. ```cs void DeleteCluster() { - if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, )) + if (!_retrieveAndRank.DeleteCluster(OnDeleteCluster, OnFail, )) Log.Debug("ExampleRetrieveAndRank.DeleteCluster()", "Failed to delete cluster!"); } -private void OnDeleteCluster(bool success, string data) +private void OnDeleteCluster(bool success, Dictionary customData) { Log.Debug("ExampleRetrieveAndRank.OnDeleteCluster()", "DeleteCluster results: {0}", success); } @@ -74,13 +82,13 @@ Returns status and other information about a cluster. ```cs void GetCluster() { - if (!_retrieveAndRank.GetCluster(OnGetCluster, )) + if (!_retrieveAndRank.GetCluster(OnGetCluster, OnFail, )) Log.Debug("ExampleRetrieveAndRank.GetCluster()", "Failed to get cluster!"); } -private void OnGetCluster(SolrClusterResponse resp, string data) +private void OnGetCluster(SolrClusterResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "GetCluster results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCluster()", "GetCluster results: {0}", customData["json"].ToString()); } ``` @@ -90,13 +98,13 @@ Retrieves all configurations for a cluster. ```cs void GetClusterConfigs() { - if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, )) + if (!_retrieveAndRank.GetClusterConfigs(OnGetClusterConfigs, OnFail, )) Log.Debug("ExampleRetrieveAndRank.GetClusterConfigs()", "Failed to get cluster configs!"); } -private void OnGetClusterConfigs(SolrConfigList resp, string data) +private void OnGetClusterConfigs(SolrConfigList resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "GetClusterConfigs results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfigs()", "GetClusterConfigs results: {0}", customData["json"].ToString()); } ``` @@ -106,11 +114,11 @@ Deletes the configuration for a cluster. Before you delete the configuration, de ```cs void DeleteClusterConfig() { - if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, , )) + if (!_retrieveAndRank.DeleteClusterConfig(OnDeleteClusterConfig, OnFail, , )) Log.Debug("ExampleRetrieveAndRank.DeleteClusterConfig()", "Failed to delete cluster config {0}", ); } -private void OnDeleteClusterConfig(bool success, string data) +private void OnDeleteClusterConfig(bool success, Dictionary customData) { Log.Debug("ExampleRetrieveAndRank.OnDeleteClusterConfig()", "DeleteClusterConfig results: {0}", success); } @@ -122,13 +130,13 @@ Retrieves the configuration for a cluster by its name. ```cs void GetClusterConfig() { - if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, , )) + if (!_retrieveAndRank.GetClusterConfig(OnGetClusterConfig, OnFail, , )) Log.Debug("ExampleRetrieveAndRank.GetClusterConfig()", "Failed to get cluster config {0}!", ); } -private void OnGetClusterConfig(byte[] respData, string data) +private void OnGetClusterConfig(byte[] respData, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "GetClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetClusterConfig()", "GetClusterConfig results: {0}", customData["json"].ToString()); } ``` @@ -137,13 +145,13 @@ Saves the cluster config ```cs void SaveClusterConfig() { - if(!_retrieveAndRank.SaveConfig(OnSaveConfig, , , data)) + if(!_retrieveAndRank.SaveConfig(OnSaveConfig, OnFail, , , data)) Log.Debug("ExampleRetrieveAndRank.SaveConfig()", "Failed to save cluster config!"); } -private void OnSaveConfig(bool success, string data) +private void OnSaveConfig(bool success, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnSaveConfig()", "SaveClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSaveConfig()", "SaveClusterConfig results: {0}", customData["json"].ToString()); } ``` @@ -153,13 +161,13 @@ Uploads a zip file containing the configuration files for your Solr collection. ```cs void UploadClusterConfig() { - if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, , , )) + if (!_retrieveAndRank.UploadClusterConfig(OnUploadClusterConfig, OnFail, , , )) Log.Debug("ExampleRetrieveAndRank.UploadClusterConfig()", "Failed to upload cluster config {0}!", ); } -private void OnUploadClusterConfig(UploadResponse resp, string data) +private void OnUploadClusterConfig(UploadResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "UploadClusterConfig results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnUploadClusterConfig()", "UploadClusterConfig results: {0}", customData["json"].ToString()); } ``` @@ -169,13 +177,13 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki ```cs void ListCollections() { - if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.LIST)) + if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, OnFail, , CollectionsAction.LIST)) Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to get collections!"); } -private void OnGetCollections(CollectionsResponse resp, string data) +private void OnGetCollections(CollectionsResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "ListCollections results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "ListCollections results: {0}", customData["json"].ToString()); } ``` @@ -185,13 +193,13 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki ```cs void CreateCollection() { - if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, , CollectionsAction.CREATE, , )) + if (!_retrieveAndRank.ForwardCollectionRequest(OnCreateCollection, OnFail, , CollectionsAction.CREATE, , )) Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to create collections!"); } -private void OnCreateCollection(CollectionsResponse resp, string data) +private void OnCreateCollection(CollectionsResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "ListCollections results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateCollection()", "ListCollections results: {0}", customData["json"].ToString()); } ``` @@ -201,13 +209,13 @@ An example of a method that forwards to the [Solr Collections API](https://cwiki ```cs void DeleteCollection() { - if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, , CollectionsAction.DELETE, )) + if (!_retrieveAndRank.ForwardCollectionRequest(OnGetCollections, OnFail, , CollectionsAction.DELETE, )) Log.Debug("ExampleRetrieveAndRank.ForwardCollectionRequest()", "Failed to delete collections!"); } -private void OnGetCollections(CollectionsResponse resp, string data) +private void OnGetCollections(CollectionsResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "DeleteCollection results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetCollections()", "DeleteCollection results: {0}", customData["json"].ToString()); } ``` @@ -221,13 +229,13 @@ You must commit your documents to the index to search for them. For more informa ```cs void IndexDocuments() { - if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, , , )) + if (!_retrieveAndRank.IndexDocuments(OnIndexDocuments, OnFail, , , )) Log.Debug("ExampleRetrieveAndRank.IndexDocuments()", "Failed to index documents!"); } -private void OnIndexDocuments(IndexResponse resp, string data) +private void OnIndexDocuments(IndexResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "IndexDocuments results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnIndexDocuments()", "IndexDocuments results: {0}", customData["json"].ToString()); } ``` @@ -239,18 +247,18 @@ void Search() { // Standard search string[] fl = { "title", "id", "body", "author", "bibliography" }; - if (!_retrieveAndRank.Search(OnSearch, , , , fl)) + if (!_retrieveAndRank.Search(OnSearch, OnFail, , , , fl)) Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); // Ranked search string[] fl = { "title", "id", "body", "author", "bibliography" }; - if (!_retrieveAndRank.Search(OnSearch, , , , fl, true, )) + if (!_retrieveAndRank.Search(OnSearch, OnFail, , , , fl, true, )) Log.Debug("ExampleRetrieveAndRank.Search()", "Failed to search!"); } -private void OnSearch(SearchResponse resp, string data) +private void OnSearch(SearchResponse resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnSearch()", "Search results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnSearch()", "Search results: {0}", customData["json"].ToString()); } ``` @@ -260,13 +268,13 @@ Retrieves the list of rankers for the service instance. ```cs void GetRankers() { - if (!_retrieveAndRank.GetRankers(OnGetRankers)) + if (!_retrieveAndRank.GetRankers(OnGetRankers, OnFail)) Log.Debug("ExampleRetrieveAndRank.GetRankers()", "Failed to get rankers!"); } -private void OnGetRankers(ListRankersPayload resp, string data) +private void OnGetRankers(ListRankersPayload resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "GetRankers results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRankers()", "GetRankers results: {0}", customData["json"].ToString()); } ``` @@ -278,13 +286,13 @@ When the operation is successful, the status of the ranker is set to Training. T ```cs void CreateRanker() { - if (!_retrieveAndRank.CreateRanker(OnCreateRanker, , )) + if (!_retrieveAndRank.CreateRanker(OnCreateRanker, OnFail, , )) Log.Debug("ExampleRetrieveAndRank.CreateRanker()", "Failed to create ranker!"); } -private void OnCreateRanker(RankerStatusPayload resp, string data) +private void OnCreateRanker(RankerStatusPayload resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "CreateRanker results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnCreateRanker()", "CreateRanker results: {0}", customData["json"].ToString()); } ``` @@ -296,13 +304,13 @@ Use this method to return answers when you train the ranker with custom features ```cs void Rank() { - if (!_retrieveAndRank.Rank(OnRank, , )) + if (!_retrieveAndRank.Rank(OnRank, OnFail, , )) Log.Debug("ExampleRetrieveAndRank.Rank()", "Failed to rank!"); } -private void OnRank(RankerOutputPayload resp, string data) +private void OnRank(RankerOutputPayload resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnRank()", "Rank results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnRank()", "Rank results: {0}", customData["json"].ToString()); } ``` @@ -312,11 +320,11 @@ Deletes a ranker. ```cs void DeleteRanker() { - if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, )) + if (!_retrieveAndRank.DeleteRanker(OnDeleteRanker, OnFail, )) Log.Debug("ExampleRetrieveAndRank.DeleteRanker()", "Failed to delete ranker {0}!", ); } -private void OnDeleteRanker(bool success, string data) +private void OnDeleteRanker(bool success, Dictionary customData) { Log.Debug("ExampleRetrieveAndRank.OnDeleteRanker()", "DeleteRanker results: {0}", success); } @@ -328,13 +336,13 @@ Returns status and other information about a ranker. ```cs void GetRanker() { - if (!_retrieveAndRank.GetRanker(OnGetRanker, )) + if (!_retrieveAndRank.GetRanker(OnGetRanker, OnFail, )) Log.Debug("ExampleRetrieveAndRank.GetRanker()", "Failed to get ranker!"); } -private void OnGetRanker(RankerStatusPayload resp, string data) +private void OnGetRanker(RankerStatusPayload resp, Dictionary customData) { - Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "GetRanker results: {0}", data); + Log.Debug("ExampleRetrieveAndRank.OnGetRanker()", "GetRanker results: {0}", customData["json"].ToString()); } ``` [retrieve-and-rank-service]: https://www.ibm.com/watson/services/retrieve-and-rank/ diff --git a/Scripts/Services/SpeechToText/v1/README.md b/Scripts/Services/SpeechToText/v1/README.md index 234afcf8c..48f4f3137 100755 --- a/Scripts/Services/SpeechToText/v1/README.md +++ b/Scripts/Services/SpeechToText/v1/README.md @@ -34,18 +34,28 @@ void Start() } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleSpeechToText.OnFail()", "Error received: {0}", error.ToString()); +} +``` + + ### Get models Retrieves a list of all models available for use with the service. The information includes the name of the model and its minimum sampling rate in Hertz, among other things. ```cs private void GetModels() { - if(!_speechToText.GetModels(HandleGetModels)) + if(!_speechToText.GetModels(HandleGetModels, OnFail)) Log.Debug("ExampleSpeechToText.GetModels()", "Failed to get models"); } -private void HandleGetModels(ModelSet result, string data) +private void HandleGetModels(ModelSet result, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetModels()", "Speech to Text - Get models response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetModels()", "Speech to Text - Get models response: {0}", customData["json"].ToString()); } ``` @@ -57,53 +67,21 @@ Retrieves information about a single specified model that is available for use w ```cs private void GetModel() { - if(!_speechToText.GetModel(HandleGetModel, )) + if(!_speechToText.GetModel(HandleGetModel, OnFail, )) Log.Debug("ExampleSpeechToText.GetModel()", "Failed to get model"); } -private void HandleGetModel(Model result, string data) +private void HandleGetModel(Model result, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetModel()", "Speech to Text - Get model response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetModel()", "Speech to Text - Get model response: {0}", customData["json"].ToString()); } ``` ### Recognize audio #### Accessing the device microphone and sending data to the Speech to Text instance -You can access the microphone of a device using Unity's Microphone class. - -```cs -_speechToText.StartListening(OnRecognize); -_recording = Microphone.Start(, , , ); -``` - -AudioData can be created using the resulting AudioClip -```cs -int midPoint = _recording.samples / 2; -samples = new float[midPoint]; -_recording.GetData(samples, 0); - -AudioData record = new AudioData(); -record.MaxLevel = Mathf.Max(samples); -record.Clip = AudioClip.Create("Recording", midPoint, _recording.channels, _recordingHZ, false); -record.Clip.SetData(samples, 0); -``` - -The AudioData can be sent to the Speech to Text service and handled by the OnRecognize callback -```cs - _speechToText.OnListen(record); -``` - -```cs -private void OnRecognize(SpeechRecognitionEvent result) -{ - // do something -} -``` - Please see `ExampleStreaming` scene for an example. #### Streaming mode - For requests to transcribe live audio as it becomes available or to transcribe multiple audio files with multipart requests, you must set the Transfer-Encoding header to chunked to use streaming mode. In streaming mode, the server closes the connection (status code 408) if the service receives no data chunk for 30 seconds and the service has no audio to transcribe for 30 seconds. The server also closes the connection (status code 400) if no speech is detected for inactivity_timeout seconds of audio (not processing time); use the inactivity_timeout parameter to change the default of 30 seconds. An example of streaming from the Unity microphone is provided in the Examples directory. #### Non-multipart requests @@ -131,26 +109,13 @@ private void Recognize() // create AudioClip with clip bytearray data _audioClip = WaveFile.ParseWAV(, ); - if(!_speechToText.Recognize(HandleRecognize)) + if(!_speechToText.Recognize(HandleRecognize, OnFail)) Log.Debug("ExampleSpeechToText.Recognize()", "Failed to recognize!"); } -private void HandleRecognize(SpeechRecognitionEvent result) +private void HandleRecognize(SpeechRecognitionEvent result, Dictionary customData) { - if (result != null && result.results.Length > 0) - { - foreach (var res in result.results) - { - foreach (var alt in res.alternatives) - { - string text = alt.transcript; - Log.Debug("ExampleSpeechToText.HandleRecognize()", string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence)); - - if (res.final) - _recognizeTested = true; - } - } - } + Log.Debug("ExampleSpeechToText.HandleRecognize()", "Speech to Text - Get model response: {0}", customData["json"].ToString()); } ``` @@ -162,13 +127,13 @@ Lists information about all custom language models that are owned by the calling ```cs private void GetCustomizations() { - if(!_speechToText.GetCustomizations(HandleGetCustomizations)) + if(!_speechToText.GetCustomizations(HandleGetCustomizations, OnFail)) Log.Debug("ExampleSpeechToText.GetCustomizations()", "Failed to get customizations"); } -private void HandleGetCustomizations(Customizations customizations, string data) +private void HandleGetCustomizations(Customizations customizations, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomizations()", "Speech to Text - Get customizations response: {0}", customData["json"].ToString()); } ``` @@ -180,13 +145,13 @@ Lists information about a custom language model. Only the owner of a custom mode ```cs private void GetCustomization() { - if(!_speechToText.GetCustomization(HandleGetCustomization, )) + if(!_speechToText.GetCustomization(HandleGetCustomization, OnFail, )) Log.Debug("ExampleSpeechToText.GetCustomization()", "Failed to get customization"); } -private void HandleGetCustomization(Customization customization, string data) +private void HandleGetCustomization(Customization customization, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomization()", "Speech to Text - Get customization response: {0}", customData["json"].ToString()); } ``` @@ -198,13 +163,13 @@ Creates a new custom language model for a specified base language model. The cus ```cs private void CreateModel() { - if(!_speechToText.CreateCustomization(HandleCreateCustomization, , , )) + if(!_speechToText.CreateCustomization(HandleCreateCustomization, OnFail, , , )) Log.Debug("ExampleSpeechToText.CreateCustomization()", "Failed to create custom model"); } -private void HandleCreateCustomization(CustomizationID customizationID, string data) +private void HandleCreateCustomization(CustomizationID customizationID, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Get model response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleCreateCustomization()", "Speech to Text - Get model response: {0}", customData["json"].ToString()); } ``` @@ -216,11 +181,11 @@ Initiates the training of a custom language model with new corpora, words, or bo ```cs private void TrainModel() { - if(!_speechToText.TrainCustomization(HandleTrainCustomization, )) + if(!_speechToText.TrainCustomization(HandleTrainCustomization, OnFail, )) Log.Debug("ExampleSpeechToText.TrainCustomization()", "Failed to train custom model"); } -private void HandleTrainCustomization(bool success, string data) +private void HandleTrainCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleTrainCustomization()", "Speech to Text - Train model response: {0}", success); } @@ -235,11 +200,11 @@ Resets a custom language model by removing all corpora and words from the model. ```cs private void ResetModel() { - if(!_speechToText.ResetCustomization(HandleResetCustomization, )) + if(!_speechToText.ResetCustomization(HandleResetCustomization, OnFail, )) Log.Debug("ExampleSpeechToText.ResetCustomization()", "Failed to train custom model"); } -private void HandleResetCustomization(bool success, string data) +private void HandleResetCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleResetCustomization()", "Speech to Text - Reset model response: {0}", success); } @@ -253,11 +218,11 @@ Upgrades a custom language model to the latest release level of the Speech to Te ```cs private void UpgradeModel() { - if(!_speechToText.UpgradeCustomization(HandleUpgradeCustomizationh, )) + if(!_speechToText.UpgradeCustomization(HandleUpgradeCustomization, OnFail, )) Log.Debug("ExampleSpeechToText.UpgradeCustomization()", "Failed to train custom model"); } -private void HandleUpgradeCustomizationh(bool success, string data) +private void HandleUpgradeCustomizationh(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleUpgradeCustomizationh()", "Speech to Text - Upgrade model response: {0}", success); } @@ -271,11 +236,11 @@ Deletes an existing custom language model. The custom model cannot be deleted if ```cs private void DeleteModel() { - if(!_speechToText.DeleteCustomization(HandleDeleteCustomization, )) + if(!_speechToText.DeleteCustomization(HandleDeleteCustomization, OnFail, )) Log.Debug("ExampleSpeechToText.DeleteCustomization()", "Failed to delete custom model"); } -private void HandleDeleteCustomization(bool success, string data) +private void HandleDeleteCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleDeleteCustomization()", "Speech to Text - Delete model response: {0}", success); } @@ -290,11 +255,11 @@ Adds a single corpus text file of new training data to the custom language model ```cs private void AddCustomCorpus() { - if(!_speechToText.AddCustomCorpus(HandleAddCustomCorpus, , , , )) + if(!_speechToText.AddCustomCorpus(HandleAddCustomCorpus, OnFail, , , , )) Log.Debug("ExampleSpeechToText.AddCustomCorpus()", "Failed to delete custom model"); } -private void HandleAddCustomCorpus(bool success, string data) +private void HandleAddCustomCorpus(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom corpus response: {0}", success); } @@ -309,11 +274,11 @@ Lists information about all corpora that have been added to the specified custom ```cs private void GetCorpora() { - if(!_speechToText.GetCustomCorpora(HandleGetCustomCorpora, )) + if(!_speechToText.GetCustomCorpora(HandleGetCustomCorpora, OnFail, )) Log.Debug("ExampleSpeechToText.GetCustomCorpora()", "Failed to get custom corpora"); } -private void HandleGetCustomCorpora(Corpora corpora, string data) +private void HandleGetCustomCorpora(Corpora corpora, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleGetCustomCorpora()", "Speech to Text - Get custom corpora response: {0}", customdData); } @@ -328,11 +293,11 @@ Lists information about a single specified corpus. The information includes the ```cs private void GetCorpus() { - if(!_speechToText.GetCustomCorpus(HandleGetCustomCorpus, , )) + if(!_speechToText.GetCustomCorpus(HandleGetCustomCorpus, OnFail, , )) Log.Debug("ExampleSpeechToText.GetCustomCorpus()", "Failed to get custom corpus"); } -private void HandleGetCustomCorpus(Corpus corpus, string data) +private void HandleGetCustomCorpus(Corpus corpus, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleGetCustomCorpus()", "Speech to Text - Get custom corpus response: {0}", customdData); } @@ -347,11 +312,11 @@ Deletes an existing corpus from a custom language model. The service removes any ```cs private void DeleteCorpus() { - if(!_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, , )) + if(!_speechToText.DeleteCustomCorpus(HandleDeleteCustomCorpus, OnFail, , )) Log.Debug("ExampleSpeechToText.DeleteCustomCorpus()", "Failed to delete custom corpus"); } -private void HandleDeleteCustomCorpus(bool success, string data) +private void HandleDeleteCustomCorpus(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleDeleteCustomCorpus()", "Speech to Text - Delete custom corpus response: {0}", success); } @@ -401,18 +366,18 @@ var words = new Words() private void AddCustomWordsUsingObject() { - if(!_speechToText.AddCustomWords(HandleAddCustomWords, , words)) + if(!_speechToText.AddCustomWords(HandleAddCustomWords, OnFail, , words)) Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } // Add custom words using words file private void AddCustomWordsUsingFile() { - if(!_speechToText.AddCustomWords(HandleAddCustomWords, , )) + if(!_speechToText.AddCustomWords(HandleAddCustomWords, OnFail, , )) Log.Debug("ExampleSpeechToText.AddCustomWords()", "Failed to add custom words"); } -private void HandleAddCustomCorpus(bool success, string data) +private void HandleAddCustomCorpus(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleAddCustomCorpus()", "Speech to Text - Add custom words response: {0}", success); } @@ -426,13 +391,13 @@ Lists information about all custom words from a custom language model. You can l ```cs private void GetCustomWords() { - if(!_speechToText.GetCustomWords(HandleGetCustomWords, )) + if(!_speechToText.GetCustomWords(HandleGetCustomWords, OnFail, )) Log.Debug("ExampleSpeechToText.GetCustomWordsMethod()", "Failed to get custom words"); } -private void HandleGetCustomWords(WordsList wordList, string data) +private void HandleGetCustomWords(WordsList wordList, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomWords()", "Speech to Text - Get custom words response: {0}", customData["json"].ToString()); } ``` @@ -445,13 +410,13 @@ Lists information about a custom word from a custom language model. Only the own ```cs private void GetCustomWord() { - if(!_speechToText.GetCustomWord(HandleGetCustomWord, , )) + if(!_speechToText.GetCustomWord(HandleGetCustomWord, OnFail, , )) Log.Debug("ExampleSpeechToText.GetCustomWord()", "Failed to get custom word"); } -private void HandleGetCustomWord(WordData word, string data) +private void HandleGetCustomWord(WordData word, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomWord()", "Speech to Text - Get custom word response: {0}", customData["json"].ToString()); } ``` @@ -466,11 +431,11 @@ Removing a custom word does not affect the custom model until you train the mode ```cs private void DeleteCustomWord() { - if(!_speechToText.DeleteCustomWord(HandleDeleteCustomWord, , )) + if(!_speechToText.DeleteCustomWord(HandleDeleteCustomWord, OnFail, , )) Log.Debug("ExampleSpeechToText.DeleteCustomWord()", "Failed to delete custom word"); } -private void HandleDeleteCustomWord(bool success, string data) +private void HandleDeleteCustomWord(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleDeleteCustomWord()", "Speech to Text - Delete custom word response: {0}", success); } @@ -483,13 +448,13 @@ Lists information about all custom acoustic models that are owned by an instance ```cs private void ListCustomAcousticModels() { - if(!_speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels)) + if(!_speechToText.GetCustomAcousticModels(HandleGetCustomAcousticModels, OnFail)) Log.Debug("ExampleSpeechToText.GetCustomAcousticModels()", "Failed to list custom acoustic models"); } -private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, string data) +private void HandleListCustomAcousticModels(AcousticCustomizations acousticCustomizations, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleListCustomAcousticModels()", "acousticCustomizations: {0}", data); + Log.Debug("ExampleSpeechToText.HandleListCustomAcousticModels()", "acousticCustomizations: {0}", customData["json"].ToString()); } ``` @@ -501,13 +466,13 @@ Creates a new custom acoustic model for a specified base model. The custom acous ```cs private void CreateAcousticCustomization() { - if(!_speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, "")) + if(!_speechToText.CreateAcousticCustomization(HandleCreateAcousticCustomization, OnFail, "")) Log.Debug("ExampleSpeechToText.CreateAcousticCustomization()", "Failed to create acoustic customization"); } -private void HandleCreateAcousticCustomization(CustomizationID customizationID, string data) +private void HandleCreateAcousticCustomization(CustomizationID customizationID, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", data); + Log.Debug("ExampleSpeechToText.HandleCreateAcousticCustomization()", "customizationId: {0}", customData["json"].ToString()); } ``` @@ -521,11 +486,11 @@ Deletes an existing custom acoustic model. The custom model cannot be deleted if ```cs private void DeleteAcousticCustomization() { - if(!_speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, "")) + if(!_speechToText.DeleteAcousticCustomization(HandleDeleteAcousticCustomization, OnFail, "")) Log.Debug("ExampleSpeechToText.DeleteAcousticCustomization()", "Failed to delete acoustic customization"); } -private void HandleDeleteAcousticCustomization(bool success, string data) +private void HandleDeleteAcousticCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleDeleteAcousticCustomization()", "deleted acoustic customization: {0}", success); } @@ -540,13 +505,13 @@ Lists information about a specified custom acoustic model. You must use credenti ```cs private void GetCustomAcousticModel() { - if(!_speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, "")) + if(!_speechToText.GetCustomAcousticModel(HandleGetCustomAcousticModel, OnFail, "")) Log.Debug("ExampleSpeechToText.GetCustomAcousticModel()", "Failed to get custom acoustic model"); } -private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, string data) +private void HandleGetCustomAcousticModel(AcousticCustomization acousticCustomization, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticModel()", "acousticCustomization: {0}", customData["json"].ToString()); } ``` @@ -570,11 +535,11 @@ Training can fail to start for the following reasons: ```cs private void TrainAcousticCustomization() { - if(!_speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, "", "", "")) + if(!_speechToText.TrainAcousticCustomization(HandleTrainAcousticCustomization, OnFail, "", "", "")) Log.Debug("ExampleSpeechToText.TrainAcousticCustomization()", "Failed to train acoustic customization"); } -private void HandleTrainAcousticCustomization(bool success, string data) +private void HandleTrainAcousticCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleTrainAcousticCustomization()", "train customization success: {0}", success); } @@ -589,11 +554,11 @@ Resets a custom acoustic model by removing all audio resources from the model. R ```cs private void ResetAcousticCustomization() { - if(!_speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, "")) + if(!_speechToText.ResetAcousticCustomization(HandleResetAcousticCustomization, OnFail, "")) Log.Debug("ExampleSpeechToText.ResetAcousticCustomization()", "Failed to reset acoustic customizations"); } -private void HandleResetAcousticCustomization(bool success, string data) +private void HandleResetAcousticCustomization(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleResetAcousticCustomization()", "reset customization success: {0}", success); } @@ -608,13 +573,13 @@ Lists information about all audio resources from a custom acoustic model. The in ```cs private void GetCustomAcousticResources() { - if(!_speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, "")) + if(!_speechToText.GetCustomAcousticResources(HandleGetCustomAcousticResources, OnFail, "")) Log.Debug("ExampleSpeechToText.GetCustomAcousticResources()", "Failed to get custom acoustic resources"); } -private void HandleGetCustomAcousticResources(AudioResources audioResources, string data) +private void HandleGetCustomAcousticResources(AudioResources audioResources, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResources()", "audioResources: {0}", customData["json"].ToString()); } ``` @@ -627,11 +592,11 @@ Deletes an existing audio resource from a custom acoustic model. Deleting an arc ```cs private void DeleteAcousticResource() { - if(!_speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, "", "")) + if(!_speechToText.DeleteAcousticResource(HandleDeleteAcousticResource, OnFail, "", "")) Log.Debug("ExampleSpeechToText.DeleteAcousticResource()", "Failed to delete acoustic resource"); } -private void HandleDeleteAcousticResource(bool success, string data) +private void HandleDeleteAcousticResource(bool success, Dictionary customData) { Log.Debug("ExampleSpeechToText.HandleDeleteAcousticResource()", "deleted acoustic resource: {0}", success); } @@ -651,13 +616,13 @@ The information includes the status of the specified audio resource, which is im ```cs private void GetCustomAcousticResource() { - if(!_speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, "", "")) + if(!_speechToText.GetCustomAcousticResource(HandleGetCustomAcousticResource, OnFail, "", "")) Log.Debug("ExampleSpeechToText.GetCustomAcousticResource()", "Failed to get custom acoustic resource"); } -private void HandleGetCustomAcousticResource(AudioListing audioListing, string data) +private void HandleGetCustomAcousticResource(AudioListing audioListing, Dictionary customData) { - Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", data); + Log.Debug("ExampleSpeechToText.HandleGetCustomAcousticResource()", "audioListing: {0}", customData["json"].ToString()); } ``` @@ -684,13 +649,13 @@ To determine the status of the service's analysis of the audio, use the `GET /v1 private void AddAcousticResource() { string mimeType = Utility.GetMimeType(Path.GetExtension("")); - if(!_speechToText.AddAcousticResource(HandleAddAcousticResource, "", "", mimeType, mimeType, true, "") + if(!_speechToText.AddAcousticResource(HandleAddAcousticResource, OnFail, "", "", mimeType, mimeType, true, "") Log.Debug("ExampleSpeechToText.AddAcousticResourceMethod()", "Failed to add acoustic resource"); } private void HandleAddAcousticResource(string data) { - Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", data); + Log.Debug("ExampleSpeechToText.HandleAddAcousticResource()", "added acoustic resource: {0}", customData["json"].ToString()); } ``` diff --git a/Scripts/Services/TextToSpeech/v1/README.md b/Scripts/Services/TextToSpeech/v1/README.md index f3a589834..684acdc17 100755 --- a/Scripts/Services/TextToSpeech/v1/README.md +++ b/Scripts/Services/TextToSpeech/v1/README.md @@ -53,7 +53,14 @@ void Start() } ``` - +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleTextToSpeech.OnFail()", "Error received: {0}", error.ToString()); +} +``` @@ -63,13 +70,13 @@ Retrieves a list of all voices available for use with the service. The informati ```cs private void GetVoices() { - if(!_textToSpeech.GetVoices(OnGetVoices)) + if(!_textToSpeech.GetVoices(OnGetVoices, OnFail)) Log.Debug("ExampleTextToSpeech.GetVoices()", "Failed to get voices!"); } -private void OnGetVoices(Voices voices, string data) +private void OnGetVoices(Voices voices, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetVoices()", "Text to Speech - Get voices response: {0}", customData["json"].ToString()); } ``` @@ -83,13 +90,13 @@ Lists information about the specified voice. Specify a customization_id to obtai ```cs private void GetVoice() { - if(!_textToSpeech.GetVoice(OnGetVoice, )) + if(!_textToSpeech.GetVoice(OnGetVoice, OnFail, )) Log.Debug("ExampleTextToSpeech.GetVoice()", "Failed to get voice!"); } -private void OnGetVoice(Voice voice, string data) +private void OnGetVoice(Voice voice, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetVoice()", "Text to Speech - Get voice response: {0}", customData["json"].ToString()); } ``` @@ -111,11 +118,11 @@ With either request method, you can provide plain text or text that is annotated private void Synthesize() { _textToSpeech.Voice = ; - if(!_textToSpeech.ToSpeech(, OnSynthesize, )) + if(!_textToSpeech.ToSpeech(OnSynthesize, OnFail, , )) Log.Debug("ExampleTextToSpeech.ToSpeech()", "Failed to synthesize!"); } -private void OnSynthesize(AudioClip clip, string data) +private void OnSynthesize(AudioClip clip, Dictionary customData) { PlayClip(clip); } @@ -158,13 +165,13 @@ Returns the phonetic pronunciation for the specified word. You can request the p ```cs private void GetPronunciation() { - if(!_textToSpeech.GetPronunciation(OnGetPronunciation, , )) + if(!_textToSpeech.GetPronunciation(OnGetPronunciation, OnFail, , )) Log.Debug("ExampleTextToSpeech.GetPronunciation()", "Failed to get pronunication!"); } -private void OnGetPronunciation(Pronunciation pronunciation, string data) +private void OnGetPronunciation(Pronunciation pronunciation, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetPronunciation()", "Text to Speech - Get pronunciation response: {0}", customData["json"].ToString()); } ``` @@ -178,13 +185,13 @@ Creates a new empty custom voice model that is owned by the requesting user. ```cs private void CreateCustomization() { - if(!_textToSpeech.CreateCustomization(OnCreateCustomization, , , )) + if(!_textToSpeech.CreateCustomization(OnCreateCustomization, OnFail, , , )) Log.Debug("ExampleTextToSpeech.CreateCustomization()", "Failed to create customization!"); } -private void OnCreateCustomization(CustomizationID customizationID, string data) +private void OnCreateCustomization(CustomizationID customizationID, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnCreateCustomization()", "Text to Speech - Create customization response: {0}", customData["json"].ToString()); } ``` @@ -205,11 +212,11 @@ private void UpdateCustomization() name = } - if(!_textToSpeech.UpdateCustomization(OnUpdateCustomization, , _customVoiceUpdate)) + if(!_textToSpeech.UpdateCustomization(OnUpdateCustomization, OnFail, , _customVoiceUpdate)) Log.Debug("ExampleTextToSpeech.UpdateCustomization()", "Failed to update customization!"); } -private void OnUpdateCustomization(bool success, string data) +private void OnUpdateCustomization(bool success, Dictionary customData) { Log.Debug("ExampleTextToSpeech.OnUpdateCustomization()", "Text to Speech - Update customization response: {0}", success); } @@ -225,13 +232,13 @@ Lists metadata such as the name and description for all custom voice models that ```cs private void GetCustomizations() { - if(!_textToSpeech.GetCustomizations(OnGetCustomizations)) + if(!_textToSpeech.GetCustomizations(OnGetCustomizations, OnFail)) Log.Debug("ExampleTextToSpeech.GetCustomizations()", "Failed to get customizations!"); } -private void OnGetCustomizations(Customizations customizations, string data) +private void OnGetCustomizations(Customizations customizations, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetCustomizations()", "Text to Speech - Get customizations response: {0}", customData["json"].ToString()); } ``` @@ -245,13 +252,13 @@ Lists all information about the specified custom voice model. In addition to met ```cs private void GetCustomization() { - if(!_textToSpeech.GetCustomization(OnGetCustomization)) + if(!_textToSpeech.GetCustomization(OnGetCustomization, OnFail)) Log.Debug("ExampleTextToSpeech.GetCustomization()", "Failed to get customization!"); } -private void OnGetCustomization(Customization customization, string data) +private void OnGetCustomization(Customization customization, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetCustomization()", "Text to Speech - Get customization response: {0}", customData["json"].ToString()); } ``` @@ -265,11 +272,11 @@ Deletes the custom voice model with the specified customization_id. Only the own ```cs private void DeleteCustomization() { - if(!_textToSpeech.DeleteCustomization(OnDeleteCustomization, )) + if(!_textToSpeech.DeleteCustomization(OnDeleteCustomization, OnFail, )) Log.Debug("ExampleTextToSpeech.DeleteCustomization()", "Failed to delete customization!"); } -private void OnDeleteCustomization(bool success, string data) +private void OnDeleteCustomization(bool success, Dictionary customData) { Log.Debug("ExampleTextToSpeech.OnDeleteCustomization()", "Text to Speech - Get customization response: {0}", success); } @@ -307,7 +314,7 @@ Words wordsToAddToCustomization = new Words() words = wordArrayToAddToCustomization }; -if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, , _wordsToAddToCustomization)) +if (!_textToSpeech.AddCustomizationWords(OnAddCustomizationWords, OnFail, , _wordsToAddToCustomization)) Log.Debug("ExampleTextToSpeech.AddCustomizationWords()", "Failed to add words customization!"); ``` @@ -326,13 +333,13 @@ Lists all of the words and their translations for the specified custom voice mod ```cs private void GetCustomizationWords() { - if(!_textToSpeech.GetCustomizationWords(OnGetCustomizationWords, )) + if(!_textToSpeech.GetCustomizationWords(OnGetCustomizationWords, OnFail, )) Log.Debug("ExampleTextToSpeech.GetCustomizationWords()", "Failed to get customization words!"); } -private void OnGetCustomizationWords(Words words, string data) +private void OnGetCustomizationWords(Words words, Dictionary customData) { - Log.Debug("ExampleTextToSpeech.OnGetCustomizationWords()", "Text to Speech - Get customization words response: {0}", data); + Log.Debug("ExampleTextToSpeech.OnGetCustomizationWords()", "Text to Speech - Get customization words response: {0}", customData["json"].ToString()); } ``` @@ -351,11 +358,11 @@ Deletes a single word from the specified custom voice model. Only the owner of a ```cs private void DeleteCustomizationWord() { - if(!_textToSpeech.DeleteCustomizationWords(OnDeleteCustomizationWords, , )) + if(!_textToSpeech.DeleteCustomizationWords(OnDeleteCustomizationWords, OnFail, , )) Log.Debug("ExampleTextToSpeech.DeleteCustomizationWord()", "Failed to get delete word!"); } -private void OnDeleteCustomizationWords(bool success, string data) +private void OnDeleteCustomizationWords(bool success, Dictionary customData) { Log.Debug("ExampleTextToSpeech.OnDeleteCustomizationWords()", "Text to Speech - Delete customization word response: {0}", success); } diff --git a/Scripts/Services/ToneAnalyzer/v3/README.md b/Scripts/Services/ToneAnalyzer/v3/README.md index fd7a6b8d5..6217c07a8 100755 --- a/Scripts/Services/ToneAnalyzer/v3/README.md +++ b/Scripts/Services/ToneAnalyzer/v3/README.md @@ -24,13 +24,18 @@ Analyzes the tone of a piece of text. The message is analyzed for several tones ```cs private void AnalyzeTone() { - if (!_toneAnalyzer.GetToneAnalyze(OnGetToneAnalyze, _stringToTestTone)) + if (!_toneAnalyzer.GetToneAnalyze(OnGetToneAnalyze, OnFail, _stringToTestTone)) Log.Debug("ExampleToneAnalyzer.GetToneAnalyze()", "Failed to analyze!"); } -private void OnGetToneAnalyze(ToneAnalyzerResponse resp, string data) +private void OnGetToneAnalyze(ToneAnalyzerResponse resp, Dictionary customData) { - Log.Debug("ExampleToneAnalyzer.OnGetToneAnalyze()", "Tone Analyzer - Analyze Response: {0}", data); + Log.Debug("ExampleToneAnalyzer.OnGetToneAnalyze()", "Tone Analyzer - Analyze Response: {0}", customData["json"].ToString()); +} + +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleToneAnalyzer.OnFail()", "Error received: {0}", error.ToString()); } ``` diff --git a/Scripts/Services/TradeoffAnalytics/v1/README.md b/Scripts/Services/TradeoffAnalytics/v1/README.md index e5aa46397..431610033 100755 --- a/Scripts/Services/TradeoffAnalytics/v1/README.md +++ b/Scripts/Services/TradeoffAnalytics/v1/README.md @@ -98,13 +98,18 @@ private void GetDillema() problemToSolve.options = listOption.ToArray(); - if(!_tradeoffAnalytics.GetDilemma(OnGetDilemma, problemToSolve, false)) + if(!_tradeoffAnalytics.GetDilemma(OnGetDilemma, OnFail, problemToSolve, false)) Log.Debug("ExampleTradeoffAnalytics.GetDilemma()", "Failed to get dillema!"); } -private void OnGetDillema(DilemmasResponse resp, string data) +private void OnGetDillema(DilemmasResponse resp, Dictionary customData) { - Log.Debug("ExampleTradeoffAnalytics.OnGetDillema()", "Get dillema result: {0}", data); + Log.Debug("ExampleTradeoffAnalytics.OnGetDillema()", "Get dillema result: {0}", customData["json"].ToString()); +} + +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleTradeoffAnalytics.OnFail()", "Error received: {0}", error.ToString()); } public class TestDataValue : IBM.Watson.DeveloperCloud.Services.TradeoffAnalytics.v1.ApplicationDataValue diff --git a/Scripts/Services/VisualRecognition/v3/README.md b/Scripts/Services/VisualRecognition/v3/README.md index 478931235..6ad295307 100755 --- a/Scripts/Services/VisualRecognition/v3/README.md +++ b/Scripts/Services/VisualRecognition/v3/README.md @@ -12,11 +12,20 @@ using IBM.Watson.DeveloperCloud.Utilities; void Start() { - Credentials credentials = new Credentials(, ); + Credentials credentials = new Credentials("", ""); VisualRecognition _visualRecognition = new VisualRecognition(credentials); } ``` +### Fail handler +These examples use a common fail handler. +```cs +private void OnFail(RESTConnector.Error error, Dictionary customData) +{ + Log.Error("ExampleVisualRecognition.OnFail()", "Error received: {0}", error.ToString()); +} +``` + ### Classify an image Upload images or URLs to identify classes by default. To identify custom classifiers, include the classifier_ids or owners parameters. Images must be in .jpeg, or .png format. @@ -25,17 +34,17 @@ For each image, the response includes a score for each class within each selecte void Classify() { // Classify using image url - if(!_visualRecognition.Classify(, OnClassify)) + if(!_visualRecognition.Classify("", OnClassify, OnFail)) Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); // Classify using image path - if(!_visualRecognition.Classify(OnClassify, , , , 0.5f)) + if(!_visualRecognition.Classify(OnClassify, OnFail, "", "", "", 0.5f)) Log.Debug("ExampleVisualRecognition.Classify()", "Classify image failed!"); } -private void OnClassify(ClassifyTopLevelMultiple classify) +private void OnClassify(ClassifyTopLevelMultiple classify, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnClassify()", "Classify result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnClassify()", "Classify result: {0}", customData["json"].ToString()); } ``` @@ -47,17 +56,17 @@ For each image, the response includes face location, a minimum and maximum estim void DetectFaces() { // Classify using image url - if(!_visualRecognition.DetectFaces(, OnDetectFaces)) + if(!_visualRecognition.DetectFaces("", OnDetectFaces, OnFail)) Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); // Classify using image path - if(!_visualRecognition.DetectFaces(OnDetectFaces, )) + if(!_visualRecognition.DetectFaces(OnDetectFaces, OnFail, "")) Log.Debug("ExampleVisualRecognition.DetectFaces()", "Detect faces failed!"); } -private void OnDetectFaces(FacesTopLevelMultiple multipleImages) +private void OnDetectFaces(FacesTopLevelMultiple multipleImages, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnDetectFaces()", "Detect faces result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDetectFaces()", "Detect faces result: {0}", customData["json"].ToString()); } ``` @@ -70,13 +79,13 @@ The compressed file containing negative examples is not used to create a class w ```cs void TrainClassifier() { - if(!_visualRecognition.TrainClassifier(, , , , OnTrainClassifier)) + if(!_visualRecognition.TrainClassifier(OnTrainClassifier, OnFail, "", "", "", "")) Log.Debug("ExampleVisualRecognition.TrainClassifier()", "Train classifier failed!"); } -private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, string data) +private void OnTrainClassifier(GetClassifiersPerClassifierVerbose classifier, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnTrainClassifier()", "Train classifier result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnTrainClassifier()", "Train classifier result: {0}", customData["json"].ToString()); } ``` @@ -85,13 +94,13 @@ Retrieve a list of user-created classifiers. ```cs void GetClassifiers() { - if(!_visualRecognition.GetClassifiers(OnGetClassifiers)) + if(!_visualRecognition.GetClassifiers(OnGetClassifiers, OnFail)) Log.Debug("ExampleVisualRecognition.GetClassifiers()", "Getting classifiers failed!"); } -private void OnGetClassifiers(GetClassifiersTopLevelBrief classifiers, string data) +private void OnGetClassifiers(GetClassifiersTopLevelBrief classifiers, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnGetClassifiers()", "Get classifiers result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifiers()", "Get classifiers result: {0}", customData["json"].ToString()); } ``` @@ -100,13 +109,13 @@ Retrieve information about a specific classifier. ```cs void GetClassifier() { - if(!_visualRecognition.GetClassifier(, OnGetClassifier)) + if(!_visualRecognition.GetClassifier(OnGetClassifier, OnFail, "")) Log.Debug("ExampleVisualRecognition.GetClassifier()", "Getting classifier failed!"); } -private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, string data) +private void OnGetClassifier(GetClassifiersPerClassifierVerbose classifier, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnGetClassifier()", "Get classifier result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnGetClassifier()", "Get classifier result: {0}", customData["json"].ToString()); } ``` @@ -123,13 +132,13 @@ private VisualRecognition _visualRecognition = new VisualRecognition(); void UpdateClassifier() { - if(!_visualRecognition.UpdateClassifier(OnUpdateClassifier, , , , )) + if(!_visualRecognition.UpdateClassifier(OnUpdateClassifier, OnFail, "", "", "", "")) Log.Debug("ExampleVisualRecognition.UpdateClassifier()", "Update classifier failed!"); } -private void OnUpdateClassifier(GetClassifiersPerClassifierVerbose classifier, string data) +private void OnUpdateClassifier(GetClassifiersPerClassifierVerbose classifier, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnUpdateClassifier()", "Update classifier result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnUpdateClassifier()", "Update classifier result: {0}", customData["json"].ToString()); } ``` @@ -138,178 +147,13 @@ Delete a custom classifier with the specified classifier ID. ```cs void DeleteClassifier() { - if(!_visualRecognition.DeleteClassifier(, OnDeleteClassifier)) + if(!_visualRecognition.DeleteClassifier(OnDeleteClassifier, OnFail, "")) Log.Debug("ExampleVisualRecognition.DeleteClassifier()", "Deleting classifier failed!"); } -private void OnDeleteClassifier(bool success) -{ - Log.Debug("ExampleVisualRecognition.OnDeleteClassifier()", "Update classifier result: {0}", success); -} -``` - -### Create a collection -Create a new collection of images to search. You can create a maximum of 5 collections. -```cs -void CreateCollection() -{ - if(!_visualRecognition.CreateCollection(OnCreateCollection, )) - Log.Debug("ExampleVisualRecognition.CreateCollectionMethod()", "Failed to create collection"); -} - -private void OnCreateCollection(CreateCollection collection, string data) -{ - Log.Debug("ExampleVisualRecognition.OnCreateCollection()", "Create collection result: {0}", data); -} -``` - -### List collections -List all custom collections. -```cs -void GetCollections() -{ - if(!_visualRecognition.GetCollections(OnGetCollections)) - Log.Debug("ExampleVisualRecognition.GetCollectionsMethod()", "Failed to get collections"); -} - -private void OnGetCollections(GetCollections collections, string data) -{ - Log.Debug("ExampleVisualRecognition.OnGetCollections()", "Get collections result: {0}", data); -} -``` - -### Retrieve collection details -Retrieve information about a specific collection. -```cs -void GetCollection() -{ - if(!_visualRecognition.GetCollection(OnGetCollection, )) - Log.Debug("ExampleVisualRecognition.GetCollection()", "Failed to get collection"); -} - -private void OnGetCollection(CreateCollection collection, string data) -{ - Log.Debug("ExampleVisualRecognition.OnGetCollection()", "Get collections result: {0}", data); -} -``` - -### Delete a collection -Delete a user created collection. -```cs -void DeleteCollection() -{ - if(!_visualRecognition.DeleteCollection(OnDeleteCollection, )) - Log.Debug("ExampleVisualRecognition.DeleteCollection()", "Failed to delete collection"); -} - -private void OnDeleteCollection(bool success, string data) -{ - Log.Debug("ExampleVisualRecognition.OnDeleteCollection()", "Delete collection result: {0}", data); -} -``` - -### Add images to a collection -Add images to a collection. Each collection can contain 1000000 images. It takes 1 second to upload 1 images, so uploading 1000000 images takes 11 days. -```cs -void AddCollectionImage() -{ - if(!_visualRecognition.AddCollectionImage(OnAddImageToCollection, , , )) - Log.Debug("ExampleVisualRecognition.AddCollectionImage()", "Failed to add images to collection"); -} -private void OnAddImageToCollection(CollectionsConfig images, string data) -{ - Log.Debug("ExampleVisualRecognition.OnAddImageToCollectionMethod()", "Add collectionimage result: {0}", data); -} -``` - -### List images in a collection -List 100 images in a collection. This returns an arbitrary selection of 100 images. Each collection can contain 1000000 images. -```cs -void GetCollectionImages() -{ - if(!_visualRecognition.GetCollectionImages(OnGetCollectionImages, )) - Log.Debug("ExampleVisualRecognition.GetCollectionImages()", "Failed to get collection images"); -} - -private void OnGetCollectionImages(GetCollectionImages collections, string data) -{ - Log.Debug("ExampleVisualRecognition.OnGetCollectionImages()", "Get collection images result: {0}", data); -} -``` - -### List image details -List details about a specific image in a collection. -```cs -void GetImage() -{ - if(!_visualRecognition.GetImage(OnGetImage, , )) - Log.Debug("ExampleVisualRecognition.GetImage()", "Failed to get collection image"); -} - -private void OnGetImage(GetCollectionsBrief image, string data) -{ - Log.Debug("ExampleVisualRecognition.OnGetImage()", "Get collection image result: {0}", data); -} -``` - -### Delete an image -Delete an image from a collection. -```cs -void DeleteCollectionImage() -{ - if(!_visualRecognition.DeleteCollectionImage(OnDeleteCollectionImage, , )) - Log.Debug("ExampleVisualRecognition.DeleteCollectionImage()", "Failed to delete collection image"); -} - -private void OnDeleteCollectionImage(bool success, string data) -{ - Log.Debug("ExampleVisualRecognition.OnDeleteCollectionImage()", "Delete collection image result: {0}", data); -} -``` - -### List metadata -View the metadata for a specific image in a collection. -```cs -void GetMetadata() -{ - if(!_visualRecognition.GetMetadata(OnGetMetadata, , )) - Log.Debug("ExampleVisualRecognition.GetMetadata()", "Failed to get metadata"); -} - -private void OnGetMetadata(object responseObject, string data) -{ - Log.Debug("ExampleVisualRecognition.OnGetMetadata()", "Get metadata result: {0}", data); -} -``` - -### Delete metadata -Delete all metadata associated with an image. -```cs -void DeleteMetadata() -{ - if(!_visualRecognition.DeleteCollectionImageMetadata(OnDeleteMetadata, , ) - Log.Debug("ExampleVisualRecognition.DeleteCollectionImageMetadata()", "Failed to delete image metadata"); -} - -private void OnDeleteMetadata(bool success, string data) -{ - Log.Debug("ExampleVisualRecognition.OnDeleteMetadata()", "Delete image metadata result: {0}", success); - -} -``` - -### Find similar images -Upload an image to find similar images in your custom collection. -```cs -void FindSimilar() -{ - if(!visualRecognition.FindSimilar(OnFindSimilar, , )) - Log.Debug("ExampleVisualRecognition.FindSimilar()", "Failed to find similar images"); -} - -private void OnFindSimilar(SimilarImagesConfig images, string data) +private void OnDeleteClassifier(bool success, Dictionary customData) { - Log.Debug("ExampleVisualRecognition.OnFindSimilar()", "Find similar result: {0}", data); + Log.Debug("ExampleVisualRecognition.OnDeleteClassifier()", "Update classifier result: {0}", customData["json"].ToString()); } ``` From c2d8e77e8f2987cca030c6cd8dc333a49db2a5a4 Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Mon, 20 Nov 2017 13:37:13 -0600 Subject: [PATCH 098/100] updated changelog --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 895b9b83f..a87ed8500 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ Change Log ========== +## Version 2.0.0 +_2017-11-20_ MAJOR RELEASE, BREAKING CHANGES +* New: Implemented error callbacks in each call +* New: Implemented generic type success callbacks +* New: Implemented `Dictionary` to hold custom data for each call +* New: Support for `Hololens` +* New: Abstracted custom acoustic models for `SpeechToText` +* New: Addition of streaming example where the sample is split up to improve latency +* New: Transition to dll for `WebSocketSharp` +* New: Added support for decoding unicode characters in `TextToSpeech` +* Fixed: Transition `Delete` methods to `UnityWebRequest` +* Fixed: Improvements to `SpeechToText` streaming +* Fixed: `SpeechToText` streaming parameters +* Fixed: Improvements to `ExampleStreaming` +* Fixed: `SpeechToText` custom corpus +* Fixed: Allow empty string to be sent when invoking `Message` from the `Conversation` service +* Fixed: Standardized `Debug.Log` output throughout SDK +* Fixed: Fix all integration tests + ## Version 1.0.0 _2017-08-31_ MAJOR RELEASE, BREAKING CHANGES From 0b9c6e674592e8d7599e4b2ba06b6b5061f82def Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Mon, 20 Nov 2017 14:29:56 -0600 Subject: [PATCH 099/100] update inline documentation --- .../Scripts/ExampleStreamingSplitSamples.cs | 165 +++++++++--------- Scripts/Connection/WSConnector.cs | 2 +- .../Services/Conversation/v1/Conversation.cs | 4 + Scripts/Services/Discovery/v1/Discovery.cs | 18 +- .../PersonalityInsights/v3/DataModels.cs | 2 +- .../RetrieveAndRank/v1/RetrieveAndRank.cs | 10 +- .../Services/SpeechToText/v1/SpeechToText.cs | 65 +++---- 7 files changed, 134 insertions(+), 132 deletions(-) diff --git a/Examples/ServiceExamples/Scripts/ExampleStreamingSplitSamples.cs b/Examples/ServiceExamples/Scripts/ExampleStreamingSplitSamples.cs index d072ed70d..61e43b685 100644 --- a/Examples/ServiceExamples/Scripts/ExampleStreamingSplitSamples.cs +++ b/Examples/ServiceExamples/Scripts/ExampleStreamingSplitSamples.cs @@ -24,12 +24,18 @@ using System.Collections.Generic; using UnityEngine.UI; +/// +/// This class is an example of how to stream audio from the device microphone to the Speech to Text service in Unity. +/// public class ExampleStreamingSplitSamples : MonoBehaviour { private string _username = null; private string _password = null; private string _url = null; + /// + /// Text field to display the results of streaming. + /// public Text ResultsField; private int _recordingRoutine = 0; @@ -37,7 +43,7 @@ public class ExampleStreamingSplitSamples : MonoBehaviour private AudioClip _recording = null; private int _recordingBufferSize = 1; private int _recordingHZ = 22050; - private int _sampleSegments = 50; + private int _sampleSegments = 50; private SpeechToText _speechToText; @@ -54,6 +60,9 @@ void Start() StartRecording(); } + /// + /// Gets or sets the Active state. + /// public bool Active { get { return _speechToText.IsListening; } @@ -105,12 +114,12 @@ private void OnError(string error) { Active = false; - Log.Debug("ExampleStreamingSplitSamples.OnError()", "Error! {0}", error); + Log.Debug("ExampleStreamingSplitSamples.OnError()", "Error! {0}", error); } private IEnumerator RecordingHandler() { - Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "devices: {0}", Microphone.devices); + Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "devices: {0}", Microphone.devices); // Start recording _recording = Microphone.Start(_microphoneID, true, _recordingBufferSize, _recordingHZ); yield return null; @@ -127,82 +136,82 @@ private IEnumerator RecordingHandler() #endif // Current sample segment number - int sampleSegmentNum = 0; + int sampleSegmentNum = 0; // Size of the sample segment in samples - int sampleSegmentSize = _recording.samples / _sampleSegments; + int sampleSegmentSize = _recording.samples / _sampleSegments; // Init samples float[] samples = null; - while (_recordingRoutine != 0 && _recording != null) - { - // Get the mic position - int microphonePosition = Microphone.GetPosition(_microphoneID); - if (microphonePosition > _recording.samples || !Microphone.IsRecording(_microphoneID)) - { - Log.Error("ExampleStreamingSplitSamples.RecordingHandler()", "Microphone disconnected."); - - StopRecording(); - yield break; - } - - int sampleStart = sampleSegmentSize * sampleSegmentNum; - int sampleEnd = sampleSegmentSize * (sampleSegmentNum + 1); - - #if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingSplitSamples.RecordinHandler", "microphonePosition: {0} | sampleStart: {1} | sampleEnd: {2} | sampleSegmentNum: {3}", - microphonePosition.ToString(), - sampleStart.ToString(), - sampleEnd.ToString(), - sampleSegmentNum.ToString()); - #endif - //If the write position is past the end of the sample segment or if write position is before the start of the sample segment - while (microphonePosition > sampleEnd || microphonePosition < sampleStart) - { - // Init samples - samples = new float[sampleSegmentSize]; - // Write data from recording into samples starting from the sampleSegmentStart - _recording.GetData(samples, sampleStart); - - // Create AudioData and use the samples we just created - AudioData record = new AudioData(); - record.MaxLevel = Mathf.Max(Mathf.Abs(Mathf.Min(samples)), Mathf.Max(samples)); - record.Clip = AudioClip.Create("Recording", sampleSegmentSize, _recording.channels, _recordingHZ, false); - record.Clip.SetData(samples, 0); - - // Send the newly created AudioData to the service - _speechToText.OnListen(record); - - // Iterate or reset sampleSegmentNum - if (sampleSegmentNum < _sampleSegments - 1) - { - sampleSegmentNum++; - #if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "Iterating sampleSegmentNum: {0}", sampleSegmentNum); - #endif - } - else - { - sampleSegmentNum = 0; - #if ENABLE_DEBUGGING - Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "Resetting sampleSegmentNum: {0}", sampleSegmentNum); - #endif - } - - #if ENABLE_TIME_LOGGING - Log.Debug("ExampleStreamingSplitSamples.RecordingHandler", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); - now = DateTime.Now; - #endif - sampleStart = sampleSegmentSize * sampleSegmentNum; - sampleEnd = sampleSegmentSize * (sampleSegmentNum + 1); - } - - yield return 0; - } - - yield break; - } + while (_recordingRoutine != 0 && _recording != null) + { + // Get the mic position + int microphonePosition = Microphone.GetPosition(_microphoneID); + if (microphonePosition > _recording.samples || !Microphone.IsRecording(_microphoneID)) + { + Log.Error("ExampleStreamingSplitSamples.RecordingHandler()", "Microphone disconnected."); + + StopRecording(); + yield break; + } + + int sampleStart = sampleSegmentSize * sampleSegmentNum; + int sampleEnd = sampleSegmentSize * (sampleSegmentNum + 1); + +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingSplitSamples.RecordinHandler", "microphonePosition: {0} | sampleStart: {1} | sampleEnd: {2} | sampleSegmentNum: {3}", + microphonePosition.ToString(), + sampleStart.ToString(), + sampleEnd.ToString(), + sampleSegmentNum.ToString()); +#endif + //If the write position is past the end of the sample segment or if write position is before the start of the sample segment + while (microphonePosition > sampleEnd || microphonePosition < sampleStart) + { + // Init samples + samples = new float[sampleSegmentSize]; + // Write data from recording into samples starting from the sampleSegmentStart + _recording.GetData(samples, sampleStart); + + // Create AudioData and use the samples we just created + AudioData record = new AudioData(); + record.MaxLevel = Mathf.Max(Mathf.Abs(Mathf.Min(samples)), Mathf.Max(samples)); + record.Clip = AudioClip.Create("Recording", sampleSegmentSize, _recording.channels, _recordingHZ, false); + record.Clip.SetData(samples, 0); + + // Send the newly created AudioData to the service + _speechToText.OnListen(record); + + // Iterate or reset sampleSegmentNum + if (sampleSegmentNum < _sampleSegments - 1) + { + sampleSegmentNum++; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "Iterating sampleSegmentNum: {0}", sampleSegmentNum); +#endif + } + else + { + sampleSegmentNum = 0; +#if ENABLE_DEBUGGING + Log.Debug("ExampleStreamingSplitSamples.RecordingHandler()", "Resetting sampleSegmentNum: {0}", sampleSegmentNum); +#endif + } + +#if ENABLE_TIME_LOGGING + Log.Debug("ExampleStreamingSplitSamples.RecordingHandler", "Sending data - time since last transmission: {0} ms", Mathf.Floor((float)(DateTime.Now - now).TotalMilliseconds)); + now = DateTime.Now; +#endif + sampleStart = sampleSegmentSize * sampleSegmentNum; + sampleEnd = sampleSegmentSize * (sampleSegmentNum + 1); + } + + yield return 0; + } + + yield break; + } private void OnRecognize(SpeechRecognitionEvent result) { @@ -213,7 +222,7 @@ private void OnRecognize(SpeechRecognitionEvent result) foreach (var alt in res.alternatives) { string text = string.Format("{0} ({1}, {2:0.00})\n", alt.transcript, res.final ? "Final" : "Interim", alt.confidence); - Log.Debug("ExampleStreamingSplitSamples.OnRecognize()", text); + Log.Debug("ExampleStreamingSplitSamples.OnRecognize()", text); ResultsField.text = text; } @@ -221,7 +230,7 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var keyword in res.keywords_result.keyword) { - Log.Debug("ExampleStreamingSplitSamples.OnRecognize", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); + Log.Debug("ExampleStreamingSplitSamples.OnRecognize", "keyword: {0}, confidence: {1}, start time: {2}, end time: {3}", keyword.normalized_text, keyword.confidence, keyword.start_time, keyword.end_time); } } @@ -229,9 +238,9 @@ private void OnRecognize(SpeechRecognitionEvent result) { foreach (var wordAlternative in res.word_alternatives) { - Log.Debug("ExampleStreamingSplitSamples.OnRecognize()", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); + Log.Debug("ExampleStreamingSplitSamples.OnRecognize()", "Word alternatives found. Start time: {0} | EndTime: {1}", wordAlternative.start_time, wordAlternative.end_time); foreach (var alternative in wordAlternative.alternatives) - Log.Debug("ExampleStreamingSplitSamples.OnRecognie()", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); + Log.Debug("ExampleStreamingSplitSamples.OnRecognie()", "\t word: {0} | confidence: {1}", alternative.word, alternative.confidence); } } } @@ -244,7 +253,7 @@ private void OnRecognizeSpeaker(SpeakerRecognitionEvent result) { foreach (SpeakerLabelsResult labelResult in result.speaker_labels) { - Log.Debug("ExampleStreamingSplitSamples.OnRecongizeSpeaker()", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); + Log.Debug("ExampleStreamingSplitSamples.OnRecongizeSpeaker()", string.Format("speaker result: {0} | confidence: {3} | from: {1} | to: {2}", labelResult.speaker, labelResult.from, labelResult.to, labelResult.confidence)); } } } diff --git a/Scripts/Connection/WSConnector.cs b/Scripts/Connection/WSConnector.cs index e0b8d38c3..f996c2c84 100644 --- a/Scripts/Connection/WSConnector.cs +++ b/Scripts/Connection/WSConnector.cs @@ -185,7 +185,7 @@ public static string FixupURL(string URL) /// /// Create a WSConnector for the given service and function. /// - /// The ID of the service. + /// The credentials for the service. /// The name of the function to connect. /// Additional function arguments. /// The WSConnector object or null or error. diff --git a/Scripts/Services/Conversation/v1/Conversation.cs b/Scripts/Services/Conversation/v1/Conversation.cs index e70a2d560..5f9cd510a 100644 --- a/Scripts/Services/Conversation/v1/Conversation.cs +++ b/Scripts/Services/Conversation/v1/Conversation.cs @@ -87,6 +87,10 @@ public Credentials Credentials #endregion #region Constructor + /// + /// Conversation constructor + /// + /// The service credentials public Conversation(Credentials credentials) { if (credentials.HasCredentials() || credentials.HasAuthorizationToken()) diff --git a/Scripts/Services/Discovery/v1/Discovery.cs b/Scripts/Services/Discovery/v1/Discovery.cs index efc19da49..d3914b17f 100644 --- a/Scripts/Services/Discovery/v1/Discovery.cs +++ b/Scripts/Services/Discovery/v1/Discovery.cs @@ -96,6 +96,10 @@ public Credentials Credentials #endregion #region Constructor + /// + /// Discovery constructor. + /// + /// The service credentials. public Discovery(Credentials credentials) { if (credentials.HasCredentials() || credentials.HasAuthorizationToken()) @@ -1714,7 +1718,7 @@ private void OnGetFieldsResponse(RESTConnector.Request req, RESTConnector.Respon /// The environment identifier. /// The collection identifier. /// A byte array of content to be ingested. - /// The mimeType of the content data to be ingested./param> + /// The mimeType of the content data to be ingested. /// The file path to the configuration to use to process the document. /// If you're using the Data Crawler to upload your documents, you can test a document against the type /// of metadata that the Data Crawler might send. The maximum supported metadata file size is 1 MB. Metadata parts larger than @@ -1766,12 +1770,12 @@ private void OnGetFieldsResponse(RESTConnector.Request req, RESTConnector.Respon /// The environment identifier. /// The collection identifier. /// A byte array of content to be ingested. - /// The mimeType of the content data to be ingested./param> + /// The mimeType of the content data to be ingested. /// The configuration identifier. If this is specified, do not specify a configuration. /// A json string of the configuration to test. If this is specified, do not specify a configurationID. - /// If you're using the Data Crawler to upload your documents, you can test a document against the type - /// of metadata that the Data Crawler might send. The maximum supported metadata file size is 1 MB. Metadata parts larger than - /// 1 MB are rejected. Example: { "Creator": "Johnny Appleseed", "Subject": "Apples" } + /// If you're using the Data Crawler to upload your documents, you can test a document against the type of metadata + /// that the Data Crawler might send. The maximum supported metadata file size is 1 MB. Metadata parts larger than 1 MB are rejected. + /// Example: { "Creator": "Johnny Appleseed", "Subject": "Apples" } /// Optional custom data. /// True if the call succeeds, false if the call is unsuccessful. public bool AddDocument(SuccessCallback successCallback, FailCallback failCallback, string environmentID, string collectionID, byte[] contentData, string contentMimeType, string configurationID = default(string), string configuration = default(string), string metadata = default(string), Dictionary customData = null) @@ -2136,7 +2140,7 @@ private void OnGetDocumentResponse(RESTConnector.Request req, RESTConnector.Resp /// The collection identifier. /// The document identifier. /// A byte array of content to be ingested. - /// The mimeType of the content data to be ingested./param> + /// The mimeType of the content data to be ingested. /// The identifier of the configuration to use to process the document. /// If you're using the Data Crawler to upload your documents, you can test a document against the type /// of metadata that the Data Crawler might send. The maximum supported metadata file size is 1 MB. Metadata parts larger than @@ -2174,7 +2178,7 @@ private void OnGetDocumentResponse(RESTConnector.Request req, RESTConnector.Resp /// The collection identifier. /// The document identifier. /// A byte array of content to be ingested. - /// The mimeType of the content data to be ingested./param> + /// The mimeType of the content data to be ingested. /// The file path to the configuration to use to process /// If you're using the Data Crawler to upload your documents, you can test a document against the type /// of metadata that the Data Crawler might send. The maximum supported metadata file size is 1 MB. Metadata parts larger than diff --git a/Scripts/Services/PersonalityInsights/v3/DataModels.cs b/Scripts/Services/PersonalityInsights/v3/DataModels.cs index 5b61587bc..20a6d3ac7 100644 --- a/Scripts/Services/PersonalityInsights/v3/DataModels.cs +++ b/Scripts/Services/PersonalityInsights/v3/DataModels.cs @@ -178,7 +178,7 @@ public class Warning public string warning_id { get; set; } /// /// The message associated with the `warning_id`. For `WORD_COUNT_MESSAGE`, "There were - /// words in the input. We need a minimum of 600, preferably 1,200 or more, to + /// >number< words in the input. We need a minimum of 600, preferably 1,200 or more, to /// compute statistically significant estimates."; for `JSON_AS_TEXT`, "Request input /// was processed as text/plain as indicated, however detected a JSON input. Did you /// mean application/json?"; and for `PARTIAL_TEXT_USED`, "The text provided to compute the diff --git a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs index 731eba57e..e22a8d4f4 100644 --- a/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs +++ b/Scripts/Services/RetrieveAndRank/v1/RetrieveAndRank.cs @@ -116,6 +116,10 @@ public Credentials Credentials #endregion #region Constructor + /// + /// Retrieve and Rank constructor + /// + /// The service credentials public RetrieveAndRank(Credentials credentials) { if (credentials.HasCredentials() || credentials.HasAuthorizationToken()) @@ -235,7 +239,6 @@ private void OnGetClustersResponse(RESTConnector.Request req, RESTConnector.Resp #region CreateCluster /// - /// /// Provisions a Solr cluster asynchronously. When the operation is successful, the status of the cluster is set to NOT_AVAILABLE. The status must be READY before you can use the cluster. For information about cluster sizing see http://www.ibm.com/watson/developercloud/doc/retrieve-rank/solr_ops.shtml#sizing. /// /// The success callback. @@ -755,8 +758,7 @@ private void GetClusterConfigResponse(RESTConnector.Request req, RESTConnector.R /// /// Saves the config zip to the file system. /// - /// The success callback. - /// The fail callback. + /// The success callback. /// Byte array of the config data. /// Where to save the zip file in the file system. /// @@ -1024,7 +1026,7 @@ private void OnForwardCollectionRequestResponse(RESTConnector.Request req, RESTC /// /// The success callback. /// The fail callback. - /// Path to the file that defines the content. + /// Path to the file that defines the content. /// Cluster ID. /// Collection. /// diff --git a/Scripts/Services/SpeechToText/v1/SpeechToText.cs b/Scripts/Services/SpeechToText/v1/SpeechToText.cs index c1248a06d..b47ad7b2b 100644 --- a/Scripts/Services/SpeechToText/v1/SpeechToText.cs +++ b/Scripts/Services/SpeechToText/v1/SpeechToText.cs @@ -258,6 +258,10 @@ public Credentials Credentials #endregion #region Constructor + /// + /// Speech to Text constructor. + /// + /// The service credentials. public SpeechToText(Credentials credentials) { if (credentials.HasCredentials() || credentials.HasAuthorizationToken()) @@ -826,6 +830,7 @@ private void OnListenClosed(WSConnector connector) /// The success callback. /// The fail callback. /// The AudioClip object. + /// Optional custom data. /// public bool Recognize(SuccessCallback successCallback, FailCallback failCallback, AudioClip clip, Dictionary customData = null) { @@ -848,6 +853,7 @@ public bool Recognize(SuccessCallback successCallback, F /// The fail callback. /// The audio data. /// The content type of the audio data. + /// Optional custom data. /// public bool Recognize(SuccessCallback successCallback, FailCallback failCallback, byte[] audioData, string contentType, Dictionary customData = null) { @@ -1563,7 +1569,8 @@ private void OnGetCustomizationResp(RESTConnector.Request req, RESTConnector.Res /// /// The success callback. /// The fail callback. - /// The requested custom language model's identifier. + /// The customization ID with the corpus to be deleted. + /// The word type. /// Optional custom data. /// public bool TrainCustomization(SuccessCallback successCallback, FailCallback failCallback, string customizationID, string wordTypeToAdd = WordTypeToAdd.All, Dictionary customData = null) @@ -1778,7 +1785,7 @@ private void OnUpgradeCustomizationResp(RESTConnector.Request req, RESTConnector ///
/// The success callback. /// The fail callback. - /// The language for which custom models are to be returned. Currently, only en-US (the default) is supported. + /// The identifier of the customization you would like to add the corpora to. /// Optional custom data. /// public bool GetCustomCorpora(SuccessCallback successCallback, FailCallback failCallback, string customizationID, Dictionary customData = null) @@ -1869,7 +1876,7 @@ private void OnGetCustomCorporaResp(RESTConnector.Request req, RESTConnector.Res ///
/// The success callback. /// The fail callback. - /// The language for which custom models are to be returned. Currently, only en-US (the default) is supported. + /// The identifier of the customization you would like to get the custom corpus from. /// The name of the custom corpus to be returned. /// Optional custom data. /// @@ -2029,36 +2036,6 @@ private void OnDeleteCustomCorpusResp(RESTConnector.Request req, RESTConnector.R #region Add Custom Coprpus /// - /// Adds a single corpus text file of new training data to the custom language model. Use multiple requests to submit multiple corpus text files. Only the owner of a custom model can use this method to add a corpus to the model. - /// Submit a plain text file that contains sample sentences from the domain of interest to enable the service to extract words in context.The more sentences you add that represent the context in which speakers use words from the domain, the better the service's recognition accuracy. Adding a corpus does not affect the custom model until you train the model for the new data by using the POST /v1/customizations/{customization_id}/train method. - /// Use the following guidelines to prepare a corpus text file: - /// - Provide a plain text file that is encoded in UTF-8 if it contains non-ASCII characters.The service assumes UTF-8 encoding if it encounters such characters. - /// - Include each sentence of the corpus on its own line, terminating each line with a carriage return. Including multiple sentences on the same line can degrade accuracy. - /// - Use consistent capitalization for words in the corpus. The words resource is case-sensitive; mix upper- and lowercase letters and use capitalization only when intended. - /// - Beware of typographical errors.The service assumes that typos are new words; unless you correct them before training the model, the service adds them to the model's vocabulary. - /// The service automatically does the following: - /// - Converts numbers to their equivalent words.For example: - /// 500 becomes five hundred - /// and - /// 0.15 becomes zero point fifteen - /// - Removes the following punctuation and special characters: - /// ! @ # $ % ^ & * - + = ~ _ . , ; : ( ) < > [ ] { } - /// - Ignores phrases enclosed in ( ) (parentheses), < > (angle brackets), [] (square brackets), and { } (curly braces). - /// - Converts tokens that include certain symbols to meaningful strings.For example, the service converts a $ (dollar sign) followed by a number to its string representation: - /// $100 becomes one hundred dollars - /// and it converts a % (percent sign) preceded by a number to its string representation: - /// 100% becomes one hundred percent - /// This list is not exhaustive; the service makes similar adjustments for other characters as needed. - /// - /// The call returns an HTTP 201 response code if the corpus is valid.It then asynchronously pre-processes the contents of the corpus and automatically extracts new words that it finds.This can take on the order of a minute or two to complete depending on the total number of words and the number of new words in the corpus, as well as the current load on the service.You cannot submit requests to add additional corpora or words to the custom model, or to train the model, until the service's analysis of the corpus for the current request completes. Use the GET /v1/customizations/{customization_id}/corpora method to check the status of the analysis. - /// - /// The service auto-populates the model's words resource with any word that is not found in its base vocabulary; these are referred to as out-of-vocabulary (OOV) words. You can use the GET /v1/customizations/{customization_id}/words method to examine the words resource, using other words method to eliminate typos and modify how words are pronounced as needed. - /// - /// To add a corpus file that has the same name as an existing corpus, set the allow_overwrite query parameter to true; otherwise, the request fails.Overwriting an existing corpus causes the service to process the corpus text file and extract OOV words anew.Before doing so, it removes any OOV words associated with the existing corpus from the model's words resource unless they were also added by another corpus or they have been modified in some way with the POST /v1/customizations/{customization_id}/words or PUT /v1/customizations/{customization_id}/words/{word_name} method. - /// - /// The service limits the overall amount of data that you can add to a custom model to a maximum of 10 million total words from all corpora combined.Also, you can add no more than 30 thousand new words to a model; this includes words that the service extracts from corpora and words that you add directly. - /// Note: This method is currently a beta release that is available for US English only - /// /// Overload method for AddCustomCorpus that takes string training data. /// /// The success callback. @@ -2142,7 +2119,8 @@ private void OnAddCustomCorpusResp(RESTConnector.Request req, RESTConnector.Resp /// /// The success callback. /// The fail callback. - /// The language for which custom models are to be returned. Currently, only en-US (the default) is supported. + /// The customization ID with words you would like to get. + /// The type of the word. /// Optional custom data. /// public bool GetCustomWords(SuccessCallback successCallback, FailCallback failCallback, string customizationID, string wordType = WordType.All, Dictionary customData = null) @@ -2401,7 +2379,8 @@ private void OnAddCustomWordsResp(RESTConnector.Request req, RESTConnector.Respo ///
/// The success callback. /// The fail callback. - /// The customization ID to be deleted. + /// The customization ID with the corpus to be deleted. + /// The word to be deleted. /// Optional customization data. /// public bool DeleteCustomWord(SuccessCallback successCallback, FailCallback failCallback, string customizationID, string word, Dictionary customData = null) @@ -2472,7 +2451,8 @@ private void OnDeleteCustomWordResp(RESTConnector.Request req, RESTConnector.Res ///
/// The success callback. /// The fail callback. - /// The language for which custom models are to be returned. Currently, only en-US (the default) is supported. + /// The customization ID with the corpus to be deleted. + /// The word to get details of. /// Optional custom data. /// public bool GetCustomWord(SuccessCallback successCallback, FailCallback failCallback, string customizationID, string word, Dictionary customData = null) @@ -3306,11 +3286,14 @@ private void OnGetCustomAcousticResourceResp(RESTConnector.Request req, RESTConn /// /// The success callback. /// The fail callback. - /// The custom model name. - /// The base model name - only en-US_BroadbandModel is currently supported. - /// Descripotion of the custom model. - /// Optional custom data. - /// + /// The cutomization identifier to add the acoustic resource to. + /// The nameof the audio resrouce. + /// The content type of the audio resource upload. + /// The content type of the enclosed audio resource. + /// Can this resource be overwritten? + /// The byte[] data of the audio resource. + /// optional custom data. + /// True if the acoustic resource was sent to the service. public bool AddAcousticResource(SuccessCallback successCallback, FailCallback failCallback, string customizationId, string audioName, string contentType, string containedContentType, bool allowOverwrite, byte[] audioResource, Dictionary customData = null) { if (successCallback == null) From 59077cf7439be8b2c9c5167789b99b094b8fd17e Mon Sep 17 00:00:00 2001 From: Ajiemar Santiago Date: Mon, 20 Nov 2017 14:39:16 -0600 Subject: [PATCH 100/100] update doxyfile, added sandcastle file back --- Docs/UnitySDK.shfbproj | 221 +++++++++++++++++++++++++++++++++ Docs/UnitySDK.shfbproj.meta | 8 ++ Docs/Watson Unity SDK.odg | Bin 0 -> 16036 bytes Docs/Watson Unity SDK.odg.meta | 8 ++ Doxyfile | 2 +- 5 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 Docs/UnitySDK.shfbproj create mode 100644 Docs/UnitySDK.shfbproj.meta create mode 100644 Docs/Watson Unity SDK.odg create mode 100644 Docs/Watson Unity SDK.odg.meta diff --git a/Docs/UnitySDK.shfbproj b/Docs/UnitySDK.shfbproj new file mode 100644 index 000000000..6aeede589 --- /dev/null +++ b/Docs/UnitySDK.shfbproj @@ -0,0 +1,221 @@ + + + + + Debug + AnyCPU + 2.0 + {1aba4837-3713-4ea0-9441-e94538356d02} + 2015.6.5.0 + + Documentation + Documentation + Documentation + + .NET Framework 3.5 + ..\Scripts\Editor\Help\ + WatsonUnitySDK + en-US + + + OnlyWarningsAndErrors + HtmlHelp1 + False + False + False + True + 1.1.0.0 + 2 + False + C# + Blank + True + VS2013 + False + HashedMemberName + Watson Unity SDK + AboveNamespaces + + + + + + + + + + + + + + + + + + + + + + + + + + + Watson Unity SDK camera controls and touch interfaces. + Connection classes. + Data models for all services. + Data types for Widget communications. + Debugging classes. + Logging subsystem. + Version 1.0 of all services. + Various utility classes. + Widget classes. + Watson service classes. + Alchemy API version 1 service abstraction. + Conversation version 1 service abstraction. + Experimental Conversation service abstraction. + Deep QA version 1 service abstraction. + Dialog version 1 service abstraction. + Document Conversiont version 1 service abstraction. + Language Translator version 1 service abstraction. + Natural Language Classifier version 1 service abstraction. + Personality Insightst version 2 service abstraction. + Retrieve and Rankt version 1 service abstraction. + Speech to Text version 1 service abstraction. + Text to Speech version 1 service abstraction. + Tone Analyzer version 3 service abstraction. + Tradeoff Analytics version 1 service abstraction. + Visual Recognitionr version 3 service abstraction. + Language Translation version 1 service abstraction. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ProtectedInternalAsProtected + IBM.Watson + Summary, Parameter, Returns, AutoDocumentCtors, Namespace, TypeParameter, AutoDocumentDispose + + + 100 + + + + + + + + + + + + + + + + + + + + + + + + + + + OnBuildSuccess + + \ No newline at end of file diff --git a/Docs/UnitySDK.shfbproj.meta b/Docs/UnitySDK.shfbproj.meta new file mode 100644 index 000000000..be42a720c --- /dev/null +++ b/Docs/UnitySDK.shfbproj.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e773e215642926649ae832f7fa3d878e +timeCreated: 1450373231 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Docs/Watson Unity SDK.odg b/Docs/Watson Unity SDK.odg new file mode 100644 index 0000000000000000000000000000000000000000..86190c8feea4bd1577b614051e952c412efe0787 GIT binary patch literal 16036 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 Q4DtDo<#}DH%JEYAKhehF00000 literal 0 HcmV?d00001 diff --git a/Docs/Watson Unity SDK.odg.meta b/Docs/Watson Unity SDK.odg.meta new file mode 100644 index 000000000..b8fdb34f8 --- /dev/null +++ b/Docs/Watson Unity SDK.odg.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ce14c1eacdc10f42aacff7e5c1ff4b5 +timeCreated: 1450373231 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Doxyfile b/Doxyfile index 54e5647aa..a579ad8b7 100644 --- a/Doxyfile +++ b/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Watson Developer Cloud Unity SDK" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0.0 +PROJECT_NUMBER = 2.0.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a