private string ParseNoMoreMessages(string inputLine, string command, IEnumerator token)
        {
            UnityEngine.Debug.Log("OCMessageHandler::ParseNoMoreMessages");

            string answer = null;

            if (_state == READING_MESSAGES)
            {
                UnityEngine.Debug.Log("onLine: From [" + _messageFrom +
                                      "] to [" + _messageTo +
                                      "] Type [" + _messageType + "]: " + _message.ToString());

                OCMessage message = OCMessage.CreateMessage(_messageFrom,
                                                            _messageTo,
                                                            _messageType,
                                                            _message.ToString());

                if (message == null)
                {
                    UnityEngine.Debug.Log("Could not factory message from the following string: [" +
                                          _message.ToString() + "]");
                }
                if (_useMessageBuffer)
                {
                    UnityEngine.Debug.Log("Using message buffer...");
                    _messageBuffer.Add(message);
                    _networkElement.PullMessage(_messageBuffer);
                    _messageBuffer.Clear();
                }
                else
                {
                    UnityEngine.Debug.Log("Not using message buffer...pulling instead...");
                    _networkElement.PullMessage(message);
                }

                // reset variables to default values
                _lineCount   = 0;
                _messageTo   = "";
                _messageFrom = "";
                _messageType = OCMessage.MessageType.NONE;
                _message.Remove(0, _message.Length);
                _state = DOING_NOTHING;         // quit reading state
                answer = OCNetworkElement.OK_MESSAGE;
            }
            else
            {
                UnityEngine.Debug.Log("onLine: Unexpected command [" +
                                      command + "]. Discarding line [" +
                                      inputLine + "]");
                answer = OCNetworkElement.FAILED_MESSAGE;
            }

            return(answer);
        }
Example #2
0
        /// <summary>
        /// Pull a message from router.
        /// </summary>
        /// <param name="message">An unread message</param>
        public void PullMessage(OCMessage message)
        {
//		UnityEngine.Debug.Log ("OCNetworkElement::PullMessage(OCMessage)");
            lock (_messageQueue)
            {
//			UnityEngine.Debug.Log ("Enqueueing a message (I hate this code!!)");
                _messageQueue.Enqueue(message);
            }

            lock (_unreadMessagesLock)
            {
//			UnityEngine.Debug.Log ("Taking unreadMessagesCount from " + _unreadMessagesCount + " to " + (_unreadMessagesCount - 1).ToString() + ".");
                _unreadMessagesCount--;
            }
        }
Example #3
0
        protected bool SendMessage(OCMessage message)
        {
            string payload = message.ToString();

            if (payload.Length == 0)
            {
                UnityEngine.Debug.LogError("Invalid empty command given.");
                return(false);
            }

            string[] lineArr       = payload.Split('\n');
            int      numberOfLines = lineArr.Length;

            System.Text.StringBuilder command = new System.Text.StringBuilder("NEW_MESSAGE ");
            command.Append(message.SourceID + WHITESPACE);
            command.Append(message.TargetID + WHITESPACE);
            command.Append((int)message.Type + WHITESPACE);
            command.Append(numberOfLines + NEWLINE);

            command.Append(payload + NEWLINE);

//		if (message.Type != OCMessage.MessageType.TICK)
//			UnityEngine.Debug.Log ("Sending: " + command.ToString ());

            bool result = Send(command.ToString());

            if (result)
            {
//			UnityEngine.Debug.Log("Successful.");
            }
            else
            {
                UnityEngine.Debug.LogError("Failed to send messsage.");
                return(false);
            }

            return(true);
        }
Example #4
0
        /// <summary>
        /// Parse a text line from message received.
        /// </summary>
        /// <param name="inputLine">
        /// The raw data that received by server socket.
        /// </param>
        /// <returns>
        /// An 'OK' string if the line was successfully parsed,
        /// a 'FAILED' string if something went wrong,
        /// null if there is still more to parse.
        /// </returns>
        public string parse(string inputLine)
        {
//			UnityEngine.Debug.Log("OldMessageHandler.parse(" + inputLine + ")");

            string answer = null;

            char   selector = inputLine[0];
            string contents = inputLine.Substring(1);

            if (selector == 'c')
            {
                string[]    tokenArr = contents.Split(' ');
                IEnumerator token    = tokenArr.GetEnumerator();
                token.MoveNext();
                string command = token.Current.ToString();

                if (command.Equals("NOTIFY_NEW_MESSAGE"))
                {
                    UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "NOTIFY_NEW_MESSAGE!");
                    if (token.MoveNext())                    // Has more elements
                    {
                        // Get new message number.
                        int numberOfMessages = int.Parse(token.Current.ToString());

                        this.ne.NotifyNewMessages(numberOfMessages);
                        answer = OCNetworkElement.OK_MESSAGE;

                        UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "Notified about [" +
                                              numberOfMessages + "] messages in Router.");
                    }
                    else
                    {
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                }
                else if (command.Equals("UNAVAILABLE_ELEMENT"))
                {
                    if (token.MoveNext())                    // Has more elements
                    {
                        // Get unavalable element id.
                        string id = token.Current.ToString();

                        System.Console.WriteLine(OCLogSymbol.DETAILEDINFO + "Unavailable element message received for [" +
                                                 id + "].");
                        this.ne.MarkAsUnavailable(id);
                        answer = OCNetworkElement.OK_MESSAGE;
                    }
                    else
                    {
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                }
                else if (command.Equals("AVAILABLE_ELEMENT"))
                {
                    if (token.MoveNext())                    // Has more elements
                    {
                        string id = token.Current.ToString();

                        UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "Available element message received for [" +
                                              id + "].");
                        this.ne.MarkAsAvailable(id);
                        answer = OCNetworkElement.OK_MESSAGE;
                    }
                    else
                    {
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                }
                else if (command.Equals("START_MESSAGE"))                // Parse a common message
                {
                    if (this.state == READING_MESSAGES)
                    {
                        // A previous message was already read.
                        UnityEngine.Debug.Log(OCLogSymbol.CONNECTION + "START_MESSAGE: From [" + this.currentMessageFrom +
                                              "] to [" + this.currentMessageTo +
                                              "] Type [" + this.currentMessageType + "]");

                        OCMessage message = OCMessage.CreateMessage(this.currentMessageFrom, this.currentMessageTo, this.currentMessageType, this.currentMessage.ToString());
                        if (message == null)
                        {
                            UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Could not factory message from the following string: " +
                                                       this.currentMessage.ToString());
                        }
                        if (this.useMessageBuffer)
                        {
                            this.messageBuffer.Add(message);
                            if (messageBuffer.Count > this.maxMessagesInBuffer)
                            {
                                this.ne.PullMessage(this.messageBuffer);
                                this.messageBuffer.Clear();
                            }
                        }
                        else
                        {
                            this.ne.PullMessage(message);
                        }

                        this.lineCount          = 0;
                        this.currentMessageTo   = "";
                        this.currentMessageFrom = "";
                        this.currentMessageType = OCMessage.MessageType.NONE;
                        this.currentMessage.Remove(0, this.currentMessage.Length);
                    }
                    else
                    {
                        if (this.state == DOING_NOTHING)
                        {
                            // Enter reading state from idle state.
                            this.state = READING_MESSAGES;
                        }
                        else
                        {
                            UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexepcted command [" +
                                                       command + "]. Discarding line [" +
                                                       inputLine + "]");
                        }
                    }

                    if (token.MoveNext())
                    {
                        this.currentMessageFrom = token.Current.ToString();

                        if (token.MoveNext())
                        {
                            this.currentMessageTo = token.Current.ToString();
                            if (token.MoveNext())
                            {
                                this.currentMessageType = (OCMessage.MessageType) int.Parse(token.Current.ToString());
                            }
                            else
                            {
                                answer = OCNetworkElement.FAILED_MESSAGE;
                            }
                        }
                        else
                        {
                            answer = OCNetworkElement.FAILED_MESSAGE;
                        }
                    }
                    else
                    {
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                    this.lineCount = 0;
                }
                else if (command.Equals("NO_MORE_MESSAGES"))
                {
                    if (this.state == READING_MESSAGES)
                    {
//						UnityEngine.Debug.Log("onLine (NO_MORE_LINES_IN_CURRENT_MESSAGE): From [" + this.currentMessageFrom +
//						          "] to [" + this.currentMessageTo +
//						          "] Type [" + this.currentMessageType + "]: " + this.currentMessage.ToString());

                        OCMessage message = OCMessage.CreateMessage(this.currentMessageFrom,
                                                                    this.currentMessageTo,
                                                                    this.currentMessageType,
                                                                    this.currentMessage.ToString());

                        if (message == null)
                        {
                            UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Could not factory message from the following string: [" +
                                                       this.currentMessage.ToString() + "]");
                        }
                        if (this.useMessageBuffer)
                        {
                            this.messageBuffer.Add(message);
                            this.ne.PullMessage(messageBuffer);
                            this.messageBuffer.Clear();
                        }
                        else
                        {
                            this.ne.PullMessage(message);
                        }

                        // reset variables to default values
                        this.lineCount          = 0;
                        this.currentMessageTo   = "";
                        this.currentMessageFrom = "";
                        this.currentMessageType = OCMessage.MessageType.NONE;
                        this.currentMessage.Remove(0, this.currentMessage.Length);
                        this.state = DOING_NOTHING;                         // quit reading state
                        answer     = OCNetworkElement.OK_MESSAGE;
                    }
                    else
                    {
                        UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexpected command [" +
                                                   command + "]. Discarding line [" +
                                                   inputLine + "]");
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                }
                else
                {
                    UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "onLine: Unexpected command [" +
                                               command + "]. Discarding line [" +
                                               inputLine + "]");
                    answer = OCNetworkElement.FAILED_MESSAGE;
                }         // end processing command.
            }             // end processing selector 'c'
            else if (selector == 'd')
            {
                if (this.state == READING_MESSAGES)
                {
                    if (this.lineCount > 0)
                    {
                        this.currentMessage.Append("\n");
                    }
                    this.currentMessage.Append(contents);
                    this.lineCount++;
                }
                else
                {
                    UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Unexpected dataline. Discarding line [" +
                                               inputLine + "]");
                    answer = OCNetworkElement.FAILED_MESSAGE;
                }
            }             // end processing selector 'd'
            else
            {
                UnityEngine.Debug.LogError(OCLogSymbol.ERROR + "Invalid selector [" + selector
                                           + "]. Discarding line [" + inputLine + "].");
                answer = OCNetworkElement.FAILED_MESSAGE;
            }             // end processing selector

            return(answer);
        }
	/**
   * Process messages that are delivered by router, overriding the method in
   * NetworkElement.
   *
   * @param message A message to be handled.
   *
   * @return false if not an exit command. (this is obsolete in this unity game, but
   * it is OK to keep it)
   */
	public override bool ProcessNextMessage(OCMessage message)
	{
//		UnityEngine.Debug.Log("OCConnectorSingleton::ProcessNextMessage: " + message.ToString());
    
		if(message.Type == OCMessage.MessageType.FEEDBACK)
		{
			// e.g. we can append the information in the console.
			OCLogger.Error("Feedback " + message.ToString());
		} else
		if(message.ToString().StartsWith(SUCCESS_LOAD))
		{
			// Format: SUCCESS LOAD NetworkElement_id avatar_id
			char[] separator = { ' ' };
			string[] tokens = message.ToString().Split(separator, System.StringSplitOptions.RemoveEmptyEntries);
            
			string neId = tokens[2];
			OCLogger.Info("Successfully loaded '" + neId + "'.");
			_isInitialized = true;
		} else
		if(message.ToString().StartsWith(SUCCESS_UNLOAD))
		{
			char[] separator = {' '};
			string[] tokens = message.ToString().Split(separator, System.StringSplitOptions.RemoveEmptyEntries);

			// Format: SUCCESS UNLOAD NetworkElement_id avatar_id
			string neId = tokens[2];
			UnityEngine.Debug.Log("!!! Successfully unloaded '" + neId + "'.");
			_isInitialized = false;
		} else
		{
//			UnityEngine.Debug.Log ("Processing an interesting message type!");
			// Get the plain text of this message(in XML format) and parse it.
			if(_isInitialized)
			{
				// Parse the message only when oac is ready.
				ParseXML(message.ToString());
			}
		}
		return false;
	}
        private string ParseStartMessage(string inputLine, string command, IEnumerator token)
        {
            UnityEngine.Debug.Log("OCMessageHandler::ParseStartMessage");

            string answer = null;

            if (_state == READING_MESSAGES)
            {
                // A previous message was already read.
                OCLogger.Debugging("onLine: From [" + _messageFrom +
                                   "] to [" + _messageTo +
                                   "] Type [" + _messageType + "]");

                OCMessage message = OCMessage.CreateMessage(_messageFrom,
                                                            _messageTo,
                                                            _messageType,
                                                            _message.ToString());
                if (message == null)
                {
                    OCLogger.Error("Could not factory message from the following string: " +
                                   _message.ToString());
                }
                if (_useMessageBuffer)
                {
                    _messageBuffer.Add(message);
                    if (_messageBuffer.Count > _maxMessagesInBuffer)
                    {
                        _networkElement.PullMessage(_messageBuffer);
                        _messageBuffer.Clear();
                    }
                }
                else
                {
                    _networkElement.PullMessage(message);
                }

                _lineCount   = 0;
                _messageTo   = "";
                _messageFrom = "";
                _messageType = OCMessage.MessageType.NONE;
                _message.Remove(0, _message.Length);
            }
            else
            {
                if (_state == DOING_NOTHING)
                {
                    // Enter reading state from idle state.
                    _state = READING_MESSAGES;
                }
                else
                {
                    OCLogger.Error("onLine: Unexepcted command [" +
                                   command + "]. Discarding line [" +
                                   inputLine + "]");
                }
            }

            if (token.MoveNext())
            {
                _messageFrom = token.Current.ToString();

                if (token.MoveNext())
                {
                    _messageTo = token.Current.ToString();
                    if (token.MoveNext())
                    {
                        _messageType = (OCMessage.MessageType) int.Parse(token.Current.ToString());
                    }
                    else
                    {
                        answer = OCNetworkElement.FAILED_MESSAGE;
                    }
                }
                else
                {
                    answer = OCNetworkElement.FAILED_MESSAGE;
                }
            }
            else
            {
                answer = OCNetworkElement.FAILED_MESSAGE;
            }
            _lineCount = 0;

            return(answer);
        }
Example #7
0
        /// <summary>
        /// Abstract method to be implemented by subclasses.
        /// </summary>
        /// <param name="message">OCMessage to be processed</param>
        /// <returns>True if the message is an "exit" command.</returns>
        public virtual bool ProcessNextMessage(OCMessage message)
        {
            UnityEngine.Debug.Log("OCNetworkElement::ProcessNextMessage (I DON'T WANT TO BE HERE!!)");

            return(false);
        }
  public void HandleOtherAgentActionResult(OCActionPlanStep step, bool status)
  {
    // don't report actions that game from us.
    // don't report actions without an action summary (these are from trying
    // to do non-existant actions).
		///TODO: Find a different way to check for this...
//    if (ar.avatar == gameObject.GetComponent<Avatar>() || ar.action == null) {
//        //Debug.LogWarning("skipping action result from " + ar.avatar);
//        return;
//    }

    // the corresponding process within OpenCog's embodiment system is in PAI::processAgentActionWithParameters

    string timestamp = GetCurrentTimestamp();
    XmlDocument doc = new XmlDocument();
    XmlElement root = MakeXMLElementRoot(doc);

    XmlElement agentSignal = (XmlElement) root.AppendChild(doc.CreateElement("agent-signal"));
    agentSignal.SetAttribute("id", gameObject.GetInstanceID().ToString());
	agentSignal.SetAttribute("type", OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE);
    agentSignal.SetAttribute("timestamp", timestamp);
    XmlElement actionElement = (XmlElement)agentSignal.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ACTION_ELEMENT));

		// note that the name and the action-instance-name are different
		// ie: name = kick , while action-instance-name = kick2342
		actionElement.SetAttribute("name", step.Arguments.ActionName);
		actionElement.SetAttribute("action-instance-name", step.Arguments.ActionName + step.ID);
		
		//bool result = (status == ActionResult.Status.SUCCESS ? true : false);
		actionElement.SetAttribute("result-state", status.ToString().ToLower()); //successful or failed
		if (step.Arguments.Source.GetInstanceID() == step.Arguments.StartTarget.GetInstanceID()) {
			actionElement.SetAttribute("target", _brainID);
		} else {
			actionElement.SetAttribute("target", step.Arguments.StartTarget.GetInstanceID().ToString());
		}

		// currently we only process the avatar and ocobject type, other types in EmbodimentXMLTages can is to be added when needed.
		// if you add other types such as BLOCK_OBJECT_TYPE, you should also modify PAI::processAgentActionWithParameters in opencog
		string targetType = step.Arguments.StartTarget.tag;
		if (targetType == "OCA" || targetType == "Player" || targetType == "OCAGI")// it's an avatar
			actionElement.SetAttribute("target-type", OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE);
		else if (targetType == "OCObject") // it's an object
			actionElement.SetAttribute("target-type",OCEmbodimentXMLTags.ORDINARY_OBJECT_TYPE);
		else
			Debug.LogWarning("Error target type: " + targetType + " in action: " + step.Arguments.ActionName);
				 
		XmlElement param = (XmlElement)actionElement.AppendChild(doc.CreateElement("param"));

		if(step.Arguments.EndTarget != null)
		{
			if(step.Arguments.EndTarget.tag == "OCObject" || step.Arguments.EndTarget.tag == "Player")
			{
				param.SetAttribute("type", "entity");
				param.SetAttribute("name", step.Arguments.EndTarget.name);
				XmlElement entityElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ENTITY_ELEMENT));
				entityElement.SetAttribute(OCEmbodimentXMLTags.ID_ATTRIBUTE, step.Arguments.EndTarget.GetInstanceID().ToString());

				if(step.Arguments.EndTarget.tag == "OCObject")
					entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, OCEmbodimentXMLTags.ORDINARY_OBJECT_TYPE);
				else
					entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, OCEmbodimentXMLTags.AVATAR_OBJECT_TYPE);
			}
			else
			{
				UnityEngine.Vector3 vec = step.Arguments.EndTarget.transform.position;
				param.SetAttribute("type", "vector");
				param.SetAttribute("name", "position");
				XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT));
				vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, vec.x.ToString());
				vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, vec.y.ToString());
				vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, vec.z.ToString());
			}
		}





//		// we can only process the parameter type defined in class ActionParamType both in opencog and unity
//		// currently they are : boolean, int, float, string, vector, rotation, entity
//		// also see opencog/opencog/embodiment/control/perceptionActionInterface/BrainProxyAxon.xsd
//    ArrayList paramList = ar.parameters;
//      
//    if (paramList != null) 
//		{
//		
//			int i;
//			if (targetType == "OCA" || targetType == "Player")
//			{
//				if (ar.action.objectID == ar.avatar.gameObject.GetInstanceID())
//					i = -1;
//				else 
//					i = 0;
//			}
//	    else
//			{
//				i = 0;
//			}
//				
//     foreach (System.Object obj in paramList)
//    	{
//      	XmlElement param = (XmlElement)actionElement.AppendChild(doc.CreateElement("param"));
//			
//				// the first param in pinfo is usually the avator does this action, so we just skip it
//				string paratype = obj.GetType().ToString();
//				if (paratype == "System.Int32") // it's a int
//				{
//					param.SetAttribute("type", "int");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					param.SetAttribute("value", obj.ToString());
//				}
//				else if (paratype == "System.Single") // it's a float
//				{
//					param.SetAttribute("type", "float");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					param.SetAttribute("value", obj.ToString());
//				}
//				else if (paratype == "System.Boolean") // it's a bool
//				{
//					param.SetAttribute("type", "boolean");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//				
//					param.SetAttribute("value", obj.ToString().ToLower());
//				}
//				else if (paratype == "System.String")// it's a string
//				{
//					param.SetAttribute("type", "string");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					param.SetAttribute("value", obj.ToString());
//				}
//				// it's an entity, we only process the ActionTarget, 
//				// if your parameter is an Entiy, please change it into ActionTarget type first
//				else if (paratype == "ActionTarget") 
//				{
//					param.SetAttribute("type", "entity");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					XmlElement entityElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.ENTITY_ELEMENT));
//					OCAction.Target entity = obj as OCAction.Target;
//					entityElement.SetAttribute(OCEmbodimentXMLTags.ID_ATTRIBUTE, entity.id.ToString());
//					entityElement.SetAttribute(OCEmbodimentXMLTags.TYPE_ATTRIBUTE, entity.type);
//					
//					// currently it seems not use of OWNER_ID_ATTRIBUTE and OWNER_NAME_ATTRIBUTE, we just skip them
//				}
//				else if ( paratype == "UnityEngine.Vector3") // it's an vector
//				{   
//					UnityEngine.Vector3 vec = (Vector3)obj ;
//					param.SetAttribute("type", "vector");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT));
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, vec.x.ToString());
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, vec.y.ToString());
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, vec.z.ToString());
//					
//				}
//				else if ( paratype ==  "IntVect") // it's an vector
//				{   
//					Vector3i vec = (Vector3i)obj ;
//					param.SetAttribute("type", "vector");
//					param.SetAttribute("name", ar.action.pinfo[i+1].Name);
//					XmlElement vectorElement = (XmlElement)param.AppendChild(doc.CreateElement(OCEmbodimentXMLTags.VECTOR_ELEMENT));
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.X_ATTRIBUTE, (vec.X + 0.5f).ToString());
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.Y_ATTRIBUTE, (vec.Y + 0.5f).ToString());
//					vectorElement.SetAttribute(OCEmbodimentXMLTags.Z_ATTRIBUTE, (vec.Z + 0.5f).ToString());
//					
//				}
//				// todo: we don't have a rotation type
//				else 
//				{
//					// we can only process the type define in ActionParamType
//					continue;
//				}
//				              
//	      i++;                
//	    }
//    }

		OCMessage message = new OCMessage(_ID, _brainID, OCMessage.MessageType.STRING, BeautifyXmlText(doc));

    OCLogger.Warn("sending action result from " + _ID + "\n" + BeautifyXmlText(doc));

    lock (_messageSendingLock)
    {
        _messagesToSend.Add(message);
    }
  }