예제 #1
0
        /// <summary>
        /// Creates instance of history item and loads its content from
        /// database.
        /// </summary>
        /// <param name="contact">
        /// Contact with whom history this item is associated.
        /// </param>
        /// <param name="hEvent">
        /// Miranda event handle.
        /// </param>
        internal static HistoryItem Load(Contact contact,
            IntPtr hEvent)
        {
            if (hEvent == IntPtr.Zero)
                throw new ArgumentException("hEvent cannot be zero.");

            // Miranda interface for freeing strings:
            var mmi = MMInterface.GetMMI();

            using (var pDbEventInfo = new AutoPtr(Marshal.AllocHGlobal(
                Marshal.SizeOf(typeof (DBEventInfo)))))
            {
                var result = Plugin.m_CallService(
                    "DB/Event/Get",
                    hEvent,
                    pDbEventInfo);
                if (result != IntPtr.Zero)
                    throw new DatabaseException();

                var eventInfo =
                    (DBEventInfo)
                        Marshal.PtrToStructure(pDbEventInfo, typeof (DBEventInfo));

                var type = (HistoryItemType)eventInfo.eventType;
                var direction = (eventInfo.flags & DBEventInfo.DBEF_SENT) != 0
                    ? HistoryItemDirection.Outgoing
                    : HistoryItemDirection.Incoming;
                var historyItem = new HistoryItem(type, direction);
                if (type == HistoryItemType.Message)
                {
                    // Get message text:
                    using (var pDbEventGetText = new AutoPtr(
                        Marshal.AllocHGlobal(Marshal.SizeOf(
                            typeof (DBEventGetText)))))
                    {
                        var getText = new DBEventGetText();
                        getText.dbei = pDbEventInfo;
                        getText.datatype = Utils.DBVT_WCHAR;

                        Marshal.StructureToPtr(getText, pDbEventGetText, false);

                        var pString = Plugin.m_CallService(
                            "DB/Event/GetText",
                            IntPtr.Zero,
                            pDbEventGetText);
                        mmi.mmi_free(pString);

                        var message = Marshal.PtrToStringUni(pString);
                        historyItem.MessageText = message;
                    }
                }

                historyItem.Contact = contact;
                historyItem.DateTime = new DateTime(1970, 1, 1)
                    .AddSeconds(eventInfo.timestamp);

                return historyItem;
            }
        }
예제 #2
0
 /// <summary>
 /// Compares this history item with other.
 /// </summary>
 /// <param name="other">
 /// History item to be compared to
 /// </param>
 /// <returns>
 /// true if objects are equal.
 /// </returns>
 public bool Equals(HistoryItem other)
 {
     if (ReferenceEquals(null, other)) return false;
     if (ReferenceEquals(this, other)) return true;
     return Equals(other.Contact, Contact) &&
            Equals(other.Type, Type) &&
            Equals(other.MessageText, MessageText) &&
            other.DateTime.Equals(DateTime);
 }