/// <summary> /// Register the local message port. /// </summary> /// <exception cref="System.InvalidOperationException">Thrown when portName is already used, when there is an I/O error.</exception> /// <exception cref="System.ArgumentException">Thrown when there is an invalid parameter.</exception> /// <exception cref="System.OutOfMemoryException">Thrown when out of memory.</exception> /// <example> /// <code> /// MessagePort messagePort = new MessagePort("SenderPort", true); /// messagePort.MessageReceived += MessageReceivedCallback; /// messagePort.Listen(); /// </code> /// </example> /// <since_tizen> 3 </since_tizen> public void Listen() { lock (s_lock) { if (s_portMap.Contains(_portName)) { MessagePortErrorFactory.ThrowException((int)MessagePortError.InvalidOperation, _portName + "is already used"); } _messageCallBack = (int localPortId, string remoteAppId, string remotePortName, bool trusted, IntPtr message, IntPtr userData) => { MessageReceivedEventArgs args = new MessageReceivedEventArgs(); try { args.Message = new Bundle(new SafeBundleHandle(message, false)); } catch (Exception ex) { Log.Error(LogTag, "Exception(" + ex.ToString() + ")"); args.Message = null; } if (args.Message == null) { Log.Error(LogTag, "Failed to create Bundle. message({0})", (message == IntPtr.Zero) ? "null" : message.ToString()); return; } if (!String.IsNullOrEmpty(remotePortName) && !String.IsNullOrEmpty(remoteAppId)) { args.Remote = new RemoteValues() { AppId = remoteAppId, PortName = remotePortName, Trusted = trusted }; } MessageReceived?.Invoke(this, args); }; _portId = _trusted ? Interop.MessagePort.RegisterTrustedPort(_portName, _messageCallBack, IntPtr.Zero) : Interop.MessagePort.RegisterPort(_portName, _messageCallBack, IntPtr.Zero); if (_portId <= 0) { MessagePortErrorFactory.ThrowException(_portId, "RegisterPort", _portName); } s_portMap.Add(_portName); _listening = true; } }
/// <summary> /// Register the local message port. /// </summary> /// <exception cref="System.InvalidOperationException">Thrown when portName is already used, when there is an I/O error.</exception> /// <exception cref="System.ArgumentException">Thrown when there is an invalid parameter.</exception> /// <exception cref="System.OutOfMemoryException">Thrown when out of memory.</exception> /// <example> /// <code> /// MessagePort messagePort = new MessagePort("SenderPort", true); /// messagePort.MessageReceived += MessageReceivedCallback; /// messagePort.Listen(); /// </code> /// </example> /// <since_tizen> 3 </since_tizen> public void Listen() { lock (s_lock) { if (s_portMap.Contains(_portName)) { MessagePortErrorFactory.ThrowException((int)MessagePortError.InvalidOperation, _portName + "is already used"); } _messageCallBack = (int localPortId, string remoteAppId, string remotePortName, bool trusted, IntPtr message, IntPtr userData) => { MessageReceivedEventArgs args = new MessageReceivedEventArgs() { Message = new Bundle(new SafeBundleHandle(message, false)) }; if (!String.IsNullOrEmpty(remotePortName) && !String.IsNullOrEmpty(remoteAppId)) { args.Remote = new RemoteValues() { AppId = remoteAppId, PortName = remotePortName, Trusted = trusted }; } MessageReceived?.Invoke(this, args); }; _portId = _trusted ? Interop.MessagePort.RegisterTrustedPort(_portName, _messageCallBack, IntPtr.Zero) : Interop.MessagePort.RegisterPort(_portName, _messageCallBack, IntPtr.Zero); if (_portId <= 0) { MessagePortErrorFactory.ThrowException(_portId, "RegisterPort", _portName); } s_portMap.Add(_portName); _listening = true; } }