Пример #1
0
        private void Monitor(object state)
        {
            lock (monitorMutex)
            {
                if (!isRunning)
                {
                    return;
                }

                if (neverConnect)
                {
                    return;
                }

                if (!IsConnected)
                {
                    if (curFileName != null)
                    {
                        curFileName = null;
                        monitorLogEvents.Clear();
                    }
                    return;
                }

                if (curFileName != null)
                {
                    if (monitorLogEvents.Count == 0)
                    {
                        try
                        {
                            if (File.Exists(curFileName))
                            {
                                File.Delete(curFileName);
                            }
                            curFileName = null;
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        return;
                    }
                }

                DirectoryInfo di    = new DirectoryInfo("./" + CMSConstants.LOG_DIR);
                FileInfo[]    files = di.GetFiles();
                if (files == null || files.Length == 0)
                {
                    return;
                }

                FileInfo oldestFile      = null;
                long     fileSmallestNum = Int64.MaxValue;

                foreach (FileInfo fi in files)
                {
                    string name = fi.Name;
                    if (!name.StartsWith("x"))
                    {
                        continue;
                    }
                    bool deleteable  = name.StartsWith("x");
                    int  periodIndex = name.IndexOf('.');
                    long serialNum   = Int64.Parse(name.Substring(1, periodIndex - 1));
                    if (serialNum < fileSmallestNum)
                    {
                        fileSmallestNum = serialNum;
                        oldestFile      = fi;
                    }
                }


                if (oldestFile == null)
                {
                    return;
                }

                try
                {
                    curFileName = oldestFile.FullName;
                    using (FileStream fileStream = new FileStream(curFileName, FileMode.Open))
                    {
                        using (GZipStream gStream = new GZipStream(fileStream, CompressionMode.Decompress))
                        {
                            /*
                             * const int size = 4096;
                             * byte[] bytes = new byte[4096];
                             * int numBytes;
                             * while ((numBytes = gStream.Read(bytes, 0, size)) > 0)
                             * {
                             *  int prevIndex = 0;
                             *  for (int i = 0; i < numBytes; i++)
                             *  {
                             *      byte b = bytes[i];
                             *
                             *      //if(b < 32 && b != 9 && b != 10 && b != 13)
                             *      if (b == 31)
                             *      {
                             *          if (prevIndex < i)
                             *              ms.Write(bytes, prevIndex, i - prevIndex);
                             *          prevIndex = i + 1;
                             *      }
                             *  }
                             *  if (prevIndex < numBytes)
                             *  {
                             *      ms.Write(bytes, prevIndex, numBytes - prevIndex);
                             *  }
                             * }
                             */

                            //ms.WriteTo(new FileStream("C:/temp/out.xml", FileMode.Create));

                            //ms.Position = 0;
                            XmlSerializer xmSer      = new XmlSerializer(typeof(CMSLogMessage));
                            CMSLogMessage logMessage = xmSer.Deserialize(gStream) as CMSLogMessage;
                            if (logMessage == null)
                            {
                                curFileName = null;
                            }
                            foreach (XmlElement logXml in logMessage.Messages)
                            {
                                monitorLogEvents.AddLast(logXml);
                            }
                        }
                    }
                }
                catch
                {
                }
            }
        }
        /*
         * private Queue<CMSLogEvent> logEvents = new Queue<CMSLogEvent>();
         *
         * public void AddLogEvent(CMSLogEvent logEvent)
         * {
         *  lock (mutex)
         *  {
         *      if (logEvents.Count >= maxNumLogEvents)
         *          logEvents.Dequeue();
         *      logEvents.Enqueue(logEvent);
         *  }
         * }
         */

        public bool SendLogEvents(LinkedList <object> logEvents)
        {
            if (!isConnected)
            {
                return(false);
            }

            if (uid == 0)
            {
                return(true);
            }

            CMSLogMessage message = new CMSLogMessage();

            message.Uid = uid;


            object [] les = null;
            lock (mutex)
            {
                les = logEvents.ToArray();
                logEvents.Clear();
            }
            message.Messages = new System.Xml.XmlElement[les.Length];
            for (int i = 0; i < les.Length; i++)
            {
                if (les[i] is CMSLogEvent)
                {
                    CMSLogEvent curLogEvent = les[i] as CMSLogEvent;
                    if (curLogEvent.Uid == 0)
                    {
                        curLogEvent.Uid = uid;
                    }
                    message.Messages[i] = curLogEvent.ToXml();
                }
                else if (les[i] is XmlElement)
                {
                    message.Messages[i] = (XmlElement)les[i];
                }
            }

            try
            {
                CMSAckMessage ackMessage = restClient.SendRequest(endPoint, message, typeof(CMSAckMessage), proxyServer) as CMSAckMessage;
                if (ackMessage == null)
                {
                    exception   = new Exception("No Response from server");
                    isConnected = false;
                    return(false);
                }
                if (ackMessage.Uid != uid)
                {
                    exception   = new Exception("Server responded with different user id");
                    isConnected = false;
                    return(false);
                }
                return(true);
            }
            catch (Exception e)
            {
                exception   = e;
                isConnected = false;
                return(false);
            }
        }