public NativityMessage GetContextMenuItems (NativityMessage message)
		{
			var currentFilesJArray = message.Value as JArray;

			var currentFiles = currentFilesJArray.Cast<string>();
			
			var contextMenuItems = this.GetContextMenuItems(currentFiles);
			return new NativityMessage(Constants.MENU_ITEMS, contextMenuItems);
		}
		/// <summary>
		/// Triggers the appropriate registered MessageListener when messages are
		/// received from the native service.
		/// </summary>
		/// <returns>NativityMessage to send back to the native service. Returns null
		/// if no registered MessageListener is found or if no response
		/// needs to be sent back to the native service.</returns>
		/// <param name="message">NativityMessage received from the native service</param>
		public NativityMessage FireMessage (NativityMessage message)
		{
			// This causes too much SPAM in the log
			//logger.DebugFormat("Firing message: {0}", message.Command);

			MessageListener messageListener;
			lock (this.commandMap)
			{
				if (!this.commandMap.TryGetValue (message.Command, out messageListener))
				{
					logger.WarnFormat ("Can not handle message: {0}", message.Command);
					return null;
				}
			}

			return messageListener (message);
		}
		private NativityMessage GetFileIconId (NativityMessage message)
		{
			var icon = -1;

			try
			{
				if (null != message)
				{
					if (null != message.Value)
					{
						string filePath = null;
						
						if (message.Value is JArray)
						{
							var filePaths = ((JArray)message.Value).Cast<string>();
							filePath = filePaths.FirstOrDefault();
						}
						else
						{
							filePath = message.Value.ToString();
						}

						icon = this.GetIconForFile(filePath);
					}
					else
					{
						log.WarnFormat("message value is null, message: {0}\n{1}", message.Command, Environment.StackTrace);
					}
				}
				else
				{
					log.WarnFormat("message is null\n{0}", Environment.StackTrace);
				}
			}
			catch (Exception e)
			{
				log.Warn("Can not get an icon overlay", e);
			}

			return new NativityMessage(Constants.GET_FILE_ICON_ID, icon);
		}
 public override int RegisterMenuIcon (string path)
 {
     var message = new NativityMessage (Constants.REGISTER_MENU_ICON, path);
     
     var reply = nativityControl.SendMessage (message);
     
     if (string.IsNullOrEmpty (reply))
     {
         return -1;
     }
     
     int replyInt;
     if (int.TryParse (reply, out replyInt))
     {
         return replyInt;
     }
     else
     {
         return -1;
     }
 }
		public NativityMessage RaiseContextMenuItem_Selected (NativityMessage nativityMessage)
		{
			var message = nativityMessage.Value as JObject;

			if (null == message)
			{
				return null;
			}

			JToken uuidToken;
			if (message.TryGetValue("uuid", out uuidToken))
			{
				Guid uuid;
				try
				{
					uuid = (Guid)uuidToken;
				}
				catch
				{
					log.ErrorFormat("{0}, ({1}), is not a valid Guid", uuidToken, uuidToken.GetType());
					return null;
				}

				JToken filesToken;
				if (message.TryGetValue("files", out filesToken))
				{
					if (filesToken is JArray)
					{
						var files = ((JArray)filesToken).Cast<string>();
						this.RaiseContextMenu_Selected(uuid, files);
					}
				}
			}

			return null;
		}
		public override void EnableFileIcons()
		{
			var message = new NativityMessage(Constants.ENABLE_FILE_ICONS_WITH_CALLBACK, true);
			this.nativityControl.SendMessage(message);
		}
		public override void RemoveFileIcons (IEnumerable<string> paths)
		{
			var list = new List<string> (LinuxFileIconControlBaseImpl.MESSAGE_BUFFER_SIZE);
			
			foreach (var path in paths)
			{
				list.Add (path);
				
				if (list.Count >= LinuxFileIconControlBaseImpl.MESSAGE_BUFFER_SIZE)
				{
					var message = new NativityMessage (Constants.REMOVE_FILE_ICONS, list);
					this.nativityControl.SendMessage (message);
					
					list.Clear ();
				}
			}
			
			if (list.Count > 0)
			{
				var message = new NativityMessage (Constants.REMOVE_FILE_ICONS, list);
				this.nativityControl.SendMessage (message);
			}
		}
		public override void RemoveFileIcon(string path)
		{
			var message = new NativityMessage(Constants.REMOVE_FILE_ICONS, new string[] { path });
			this.nativityControl.SendMessage(message);
		}
		public override void DisableFileIcons() 
		{
			var message = new NativityMessage(Constants.ENABLE_FILE_ICONS, false);
			this.nativityControl.SendMessage(message);
		}
		public override void UnregisterIcon(int id)
		{
			var message = new NativityMessage(Constants.UNREGISTER_ICON, id);
			this.nativityControl.SendMessage(message);
		}
		public override void SetFileIcons(IDictionary<string, int> fileIconsMap)
		{
			var message = new NativityMessage(Constants.REPAINT_ALL_ICONS, string.Empty);
			this.nativityControl.SendMessage(message);
		}
		public override void CheckSocketConnection(object state)
		{
			try
			{
				if((this.commandSocket.Available == 0 && commandSocket.Client.Poll((int)SOCKETCONNECTED_POLL_TIME.TotalMilliseconds, SelectMode.SelectRead)) ||
					this.callbackSocket.Available == 0 && callbackSocket.Client.Poll((int)SOCKETCONNECTED_POLL_TIME.TotalMilliseconds, SelectMode.SelectRead))
				{
					logger.Error("CheckConnection failed restarting connection.");
					this.Disconnect();
					this.OnSocketRestart ();
					return;
				}
				else
				{
					var message = new NativityMessage(Constants.CHECK_SOCKET_CONNECTION, string.Empty);
					var checkMessageString =  JsonConvert.SerializeObject(message);
					this.callbackOutputStream.WriteLine(checkMessageString);
				}
				UnixNativityControlBaseImpl.timer.Change (this.checkSocketConnectionInterval, UnixNativityControlBaseImpl.infiniteTimeSpan);
			}
			catch(Exception ex)
			{
				logger.Error("CheckConnection failed restarting connection", ex);
				this.Disconnect();
				this.OnSocketRestart ();
			}
			return;
		}
        public override void RemoveFileIcons(IEnumerable <string> paths)
        {
            var message = new NativityMessage(Constants.REPAINT_ALL_ICONS, string.Empty);

            this.nativityControl.SendMessage(message);
        }
        public override void EnableFileIcons()
        {
            var message = new NativityMessage(Constants.ENABLE_FILE_ICONS_WITH_CALLBACK, true);

            this.nativityControl.SendMessage(message);
        }
		public override void RemoveFileIcons (IEnumerable<string> paths)
		{
			var message = new NativityMessage (Constants.REPAINT_ALL_ICONS, string.Empty);
			this.nativityControl.SendMessage (message);
		}
		public override void SetFileIcon(string path, int iconId)
		{
			var message = new NativityMessage(Constants.REPAINT_ALL_ICONS, string.Empty);
			this.nativityControl.SendMessage(message);
		}
		public override string SendMessage(NativityMessage message)
		{
			if (false == this.connected)
			{
				logger.Warn("SendMessage : LiferayNativity is not connected");
				this.Disconnect();
				this.OnSocketRestart ();
				return string.Empty;
			}
			
			try 
			{
				var messageString = JsonConvert.SerializeObject(message);
				this.commandOutputStream.WriteLine(messageString);

				/* log4net doesn't support trace
				if (_logger.isTraceEnabled()) 
				{
					_logger.trace(
						"Sent on socket {}: {}", _commandSocketPort, messageString);
				}*/
				
				var reply = this.commandBufferedReader.ReadLine();
				
				/* log4net doesn't support trace
				if (_logger.isTraceEnabled()) 
				{
					_logger.trace(
						"Received on socket {}: {}", _commandSocketPort, reply);
				}*/

				if (reply == null) 
				{
					this.commandSocket.Close();
					this.OnSocketClosed();
				}
				
				return reply;
			}
			catch (IOException e) 
			{
				logger.Error("SendMessage : LiferayNativity is not connected", e);
				this.connected = false;
				this.OnSocketClosed();

				return string.Empty;
			}
		}
		public override void RemoveAllFileIcons()
		{
			var message = new NativityMessage(Constants.REMOVE_ALL_FILE_ICONS, string.Empty);
			this.nativityControl.SendMessage(message);
		}
		public override void SetFileIcon(string path, int iconId)
		{
			var map = new Dictionary<string, int>(1);
			
			map[path] = iconId;
			
			var message = new NativityMessage(Constants.SET_FILE_ICONS, map);
			this.nativityControl.SendMessage(message);
		}
		public override void SetFileIcons(IDictionary<string, int> fileIconsMap)
		{
			var map = new Dictionary<string, int>(LinuxFileIconControlBaseImpl.MESSAGE_BUFFER_SIZE);
			
			foreach (var entry in fileIconsMap)
			{
				map[entry.Key] = entry.Value;
				
				if (map.Count >= LinuxFileIconControlBaseImpl.MESSAGE_BUFFER_SIZE)
				{
					var message = new NativityMessage(Constants.SET_FILE_ICONS, map);
					this.nativityControl.SendMessage(message);
					
					map.Clear();
				}
			}
			
			if (map.Count > 0)
			{
				var message = new NativityMessage(Constants.SET_FILE_ICONS, map);
				this.nativityControl.SendMessage(message);
			}
		}
		/// <summary>
		/// Mac only
		/// 
		/// Used by modules to send messages to the native service.
		/// </summary>
		/// <returns>response from the native service</returns>
		/// <param name="message">NativityMessage to send to the native service</param>
		public virtual string SendMessage(NativityMessage message)
		{
			return string.Empty;
		}