/// <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>
        /// 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>
        /// 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;
        }