/// <summary> /// Sends the conversation data to GDS using COM Interop /// </summary> /// <param name="messageData">MSNMessageData struct containing the IM message data</param> private void SendMessageData(MSNMessageData messageData) { try { GoogleDesktopClass gdsClass = new GoogleDesktopClass(); // create the event object gdsEventDisp = gdsClass.CreateEvent(kComponentGuid, "Google.Desktop.IM"); IGoogleDesktopEvent gdsEvent = (IGoogleDesktopEvent)gdsEventDisp; // add IM event properties // "message_time" property gdsEvent.AddProperty("message_time", messageData.date.ToUniversalTime().ToOADate()); // "format" property gdsEvent.AddProperty("format", "text/html"); // "content" property gdsEvent.AddProperty("content", messageData.fromFriendlyName + ": " + messageData.message); // "user_name" property gdsEvent.AddProperty("user_name", userName); // "buddy_name" property gdsEvent.AddProperty("buddy_name", buddyName); // "conversation_id" property gdsEvent.AddProperty("conversation_id", messageData.sessionId); // "title" property - use the buddy name gdsEvent.AddProperty("title", buddyName); // send the event real-time gdsEvent.Send(0x01); } catch (COMException e) { // protect some valid error results UInt32 error = (UInt32)e.ErrorCode; if (error != 0x80040005 && // E_COMPONENT_DISABLED error != 0x80040008 && // E_EVENT_TOO_LARGE error != 0x80040009 // E_SERVICE_NOT_RUNNING ) { SimpleMessageBox("COM Exception", e.ToString(), false); } } }
/// <summary> /// Parses an IM log file and sends the information to GDS /// </summary> /// <param name="logFile">The IM conversations log file</param> /// <param name="lastIndexed">messages older than this will not be sent to GDS</param> private void ParseAndSendMessages(string logFile, DateTime lastIndexed) { XmlDocument doc = new XmlDocument(); doc.Load(logFile); XmlNodeReader reader = new XmlNodeReader(doc); // reset user and buddy name userName = null; buddyName = null; // Moves the reader to the root element. reader.MoveToContent(); // move to the first message reader.Read(); while (reader.LocalName == "Message") { // check the date of the message - if older skip reader.MoveToAttribute("DateTime"); DateTime messageDateTime = DateTime.Parse(reader.Value); reader.MoveToElement(); // if older than the last indexing time, skip the message if (messageDateTime.CompareTo(lastIndexed) <= 0) { reader.Skip(); continue; } // get message data MSNMessageData messageData = ParseMessageData(reader.ReadOuterXml()); // send this message to GDS for indexing SendMessageData(messageData); } }
/// <summary> /// Captures MSN conversations /// </summary> /// <param name="xmlMessage">xml string containing an IM message data</param> /// <returns>an MSNMessageData struct containing the parsed data</returns> private MSNMessageData ParseMessageData(string xmlMessage) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlMessage); XmlNodeReader reader = new XmlNodeReader(doc); MSNMessageData messageData = new MSNMessageData(); // Moves the reader to the root element. reader.MoveToContent(); // get the date reader.MoveToAttribute("DateTime"); messageData.date = DateTime.Parse(reader.Value); // get the session id reader.MoveToAttribute("SessionID"); messageData.sessionId = Convert.ToInt32(reader.Value); // get the rest of the attributes while (reader.Read()) { // advance to the inner node we're interested in if (reader.NodeType == XmlNodeType.Element) { string parentNodeName = reader.LocalName; reader.Read(); switch (parentNodeName) { case "From": // get the from user reader.MoveToAttribute("FriendlyName"); messageData.fromFriendlyName = reader.Value; break; case "To": // get the to user reader.MoveToAttribute("FriendlyName"); messageData.toFriendlyName = reader.Value; break; // get the actual IM message case "Text": messageData.message = reader.Value; break; default: break; } } } // set user and buddy names if not already set if (userName == null) { userName = messageData.fromFriendlyName; } if (buddyName == null) { buddyName = messageData.toFriendlyName; } return(messageData); }
/// <summary> /// Captures MSN conversations /// </summary> /// <param name="xmlMessage">xml string containing an IM message data</param> /// <returns>an MSNMessageData struct containing the parsed data</returns> private MSNMessageData ParseMessageData(string xmlMessage) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlMessage); XmlNodeReader reader = new XmlNodeReader(doc); MSNMessageData messageData = new MSNMessageData(); // Moves the reader to the root element. reader.MoveToContent(); // get the date reader.MoveToAttribute("DateTime"); messageData.date = DateTime.Parse(reader.Value); // get the session id reader.MoveToAttribute("SessionID"); messageData.sessionId = Convert.ToInt32(reader.Value); // get the rest of the attributes while (reader.Read()) { // advance to the inner node we're interested in if (reader.NodeType == XmlNodeType.Element) { string parentNodeName = reader.LocalName; reader.Read(); switch(parentNodeName) { case "From": // get the from user reader.MoveToAttribute("FriendlyName"); messageData.fromFriendlyName = reader.Value; break; case "To": // get the to user reader.MoveToAttribute("FriendlyName"); messageData.toFriendlyName = reader.Value; break; // get the actual IM message case "Text": messageData.message = reader.Value; break; default: break; } } } // set user and buddy names if not already set if (userName == null) userName = messageData.fromFriendlyName; if (buddyName == null) buddyName = messageData.toFriendlyName; return messageData; }