public static NMessageHandle.UdbusMessageHandle StructureToHandle(NMessageStruct.UdbusMessageHandle msgStruct) { UdbusMessageBuilder builder = new UdbusMessageBuilder(); builder.UdbusMessage(msgStruct.serial); string path = msgStruct.path; string destination = msgStruct.destination; string interface_ = msgStruct.interface_; string error_name = msgStruct.error_name; string method = msgStruct.method; string sender = msgStruct.sender; msgStruct.path = msgStruct.destination = msgStruct.interface_ = msgStruct.error_name = msgStruct.method = msgStruct.sender = null; Marshal.StructureToPtr(msgStruct, builder.Message.handle, false); builder .SetPath(path) .SetDestination(destination) .SetInterface(interface_) .SetErrorName(error_name) .SetMethod(method) .SetSender(sender) ; return builder.Message; }
/// <summary> /// Marshal a handle of this type into a structure. /// The IntPtr is supposed to be hidden from sight so this seems to be the only way forward. /// Not sure that referencing this.handle anywhere but "ReleaseHandle()" is permitted, /// but seriously how else is this supposed to get accomplished ? /// </summary> /// <param name="message"></param> public void HandleToStructure(out NMessageStruct.UdbusMessageHandle message) { message = this.HandleToStructure(); }
/// <summary> /// Receive a message structure. /// </summary> /// <param name="recv">Structure being received.</param> /// <returns>Zero if successful, otherwise non-zero.</returns> public int ReceiveStruct(out NMessageStruct.UdbusMessageHandle recv) { int result; using (NMessageHandle.UdbusMessageHandle recvHandle = this.ReceiveHandle(out result)) { if (result == 0 && !recvHandle.IsInvalid) // If successfully got handle { recv = recvHandle.HandleToStructure(); } // Ends if successfully got handle else // Else failed to get handle { if (result == 0) // If appeared to get handle { result = -1; } // Ends if appeared to get handle recv = NMessageStruct.UdbusMessageHandle.Initialiser; } // Ends else failed to get handle } // Ends using handle return result; }