Esempio n. 1
0
        public void sendContent(Alert alert, eEndDevices devices = eEndDevices.all,
                                ePriority priority = ePriority.def)
        {
            var alertID   = DBManager.alert.AddAlertProcedure(alert);
            var nowDate   = DateTime.Now;
            var SendIndex =
                $"{nowDate.Date.Year}{nowDate.Date.Month}{nowDate.Date.Day}{nowDate.TimeOfDay.Hours}{nowDate.TimeOfDay.Minutes}{nowDate.TimeOfDay.Seconds}{nowDate.TimeOfDay.Milliseconds}{alertID}{alert.CreaterID}";

            DBManager.alert.SetSendIndex(alertID, SendIndex, alert.CreaterID);

            var send = new ContentNode {
                ID        = SendIndex,
                AlertID   = alertID,
                Priority  = priority,
                Receivers = new BroadcastReceivers {
                    Distribution = eDistributionType.broadcast,
                    Device       = devices
                }
            };

            if (priority != ePriority.def)
            {
                var index = contentQueue.FindIndex(el => el.Priority > send.Priority);
                contentQueue.Insert(index, send);
            }
            else
            {
                contentQueue.Add(send);
            }

            //СacheManager.PutAlert(alertID, alert);
        }
Esempio n. 2
0
        public void sendContent(Alert alert, IPAddress lower, IPAddress upper, eEndDevices devices = eEndDevices.all,
                                ePriority priority = ePriority.def)
        {
            var alertID   = DBManager.alert.AddAlertProcedure(alert);
            var nowDate   = DateTime.Now;
            var SendIndex =
                $"{nowDate.Date.Year}{nowDate.Date.Month}{nowDate.Date.Day}{nowDate.TimeOfDay.Hours}{nowDate.TimeOfDay.Minutes}{nowDate.TimeOfDay.Seconds}{nowDate.TimeOfDay.Milliseconds}{alertID}{alert.CreaterID}";

            DBManager.alert.SetSendIndex(alertID, SendIndex, alert.CreaterID);

            var send = new ContentNode {
                ID        = SendIndex,
                AlertID   = alertID,
                Priority  = priority,
                Receivers = new IPRangeReceivers {
                    Distribution = eDistributionType.ip_range,
                    Device       = devices,
                    Range        = new IPAddressRange(lower, upper)
                }
            };

            //DBManager.alert.DispatchAlertUser(SendIndex, Users);

            if (priority != ePriority.def)
            {
                var index = contentQueue.FindIndex(el => el.Priority > send.Priority);
                contentQueue.Insert(index, send);
            }
            else
            {
                contentQueue.Add(send);
            }

            // СacheManager.PutAlert(alertID, alert);
        }
Esempio n. 3
0
        //Если повторение старого, то надо сделать поиск ИДа алерта
        public void sendContent(Alert alert, List <int> Users, List <int> Groups, eEndDevices devices = eEndDevices.all,
                                ePriority priority = ePriority.def)
        {
            var alertID   = DBManager.alert.AddAlertProcedure(alert);
            var nowDate   = DateTime.Now;
            var SendIndex =
                $"{nowDate.Date.Year}{nowDate.Date.Month}{nowDate.Date.Day}{nowDate.TimeOfDay.Hours}{nowDate.TimeOfDay.Minutes}{nowDate.TimeOfDay.Seconds}{nowDate.TimeOfDay.Milliseconds}{alertID}{alert.CreaterID}";

            DBManager.alert.SetSendIndex(alertID, SendIndex, alert.CreaterID); /// добавть Sender_id

            var send = new ContentNode {
                ID        = SendIndex,
                AlertID   = alertID,
                Priority  = priority,
                Receivers = new NormalReceivers {
                    Distribution = eDistributionType.normal,
                    Device       = devices,
                    GroupList    = Groups,
                    UserList     = Users
                }
            };

            DBManager.alert.DispatchAlertUser(SendIndex, Users);
            //DBManager.alert.DispatchAlertUser(SendIndex, Groups);

            if (priority != ePriority.def)
            {
                var index = contentQueue.FindIndex(el => el.Priority > send.Priority);
                contentQueue.Insert(index, send);
            }
            else
            {
                contentQueue.Add(send);
            }

            TMP = alert;
            shipment();
            //СacheManager.PutAlert(alertID, alert);
        }
 /// <summary>
 /// Gets the (dotless, lower-cased) file extension either from the filename or the mime type, depending on the said priority.
 /// </summary>
 /// <param name="fileName"></param>
 /// <param name="mimeType"></param>
 /// <param name="priority"></param>
 /// <returns></returns>
 public string GetExtension(string fileName, string mimeType, ePriority priority)
 {
     return((priority == ePriority.FromFileName)
         ? (GetExtensionFromFileName(fileName) ?? GetExtensionFromMimeType(mimeType))
         : (GetExtensionFromMimeType(mimeType) ?? GetExtensionFromFileName(fileName)));
 }
Esempio n. 5
0
	private opCode ParseExpr(opCode Acc, ePriority priority)
	{
		opCode ValueLeft = null;
		opCode valueRight = null;
		do
		{
			switch (mTokenizer.type)
			{
				case eTokenType.operator_minus:
					// unary minus operator 
					mTokenizer.NextToken();
					ValueLeft = ParseExpr(null, ePriority.unaryminus);
					ValueLeft = new opCodeUnary(eTokenType.operator_minus, ValueLeft);
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.operator_plus:
					// unary minus operator 
					mTokenizer.NextToken();
					break;
				case eTokenType.operator_not:
					mTokenizer.NextToken();
					ValueLeft = ParseExpr(null, ePriority.not);
					ValueLeft = new opCodeUnary(eTokenType.operator_not, ValueLeft);
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_identifier:
					ParseIdentifier(ref ValueLeft);
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_true:
					ValueLeft = new opCodeImmediate(EvalType.Boolean, true);
					mTokenizer.NextToken();
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_false:
					ValueLeft = new opCodeImmediate(EvalType.Boolean, false);
					mTokenizer.NextToken();
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_string:
					ValueLeft = new opCodeImmediate(EvalType.String, mTokenizer.value.ToString());
					mTokenizer.NextToken();
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_number:
					try
					{
						ValueLeft = new opCodeImmediate(EvalType.Number, double.Parse(mTokenizer.value.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture));
					}
					catch (Exception)
					{
						mTokenizer.RaiseError(string.Format("Invalid number {0}", mTokenizer.value.ToString()));
					}

					mTokenizer.NextToken();
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.value_date:
					try
					{
						ValueLeft = new opCodeImmediate(EvalType.Date, mTokenizer.value.ToString());
					}
					catch (Exception)
					{
						mTokenizer.RaiseError(string.Format("Invalid date {0}, it should be #DD/MM/YYYY hh:mm:ss#", mTokenizer.value.ToString()));
					}

					mTokenizer.NextToken();
					break; // TODO: might not be correct. Was : Exit Do 
				case eTokenType.open_parenthesis:
					mTokenizer.NextToken();
					ValueLeft = ParseExpr(null, ePriority.none);
					if (mTokenizer.type == eTokenType.close_parenthesis)
					{
						// good we eat the end parenthesis and continue ... 
						mTokenizer.NextToken();
						break; // TODO: might not be correct. Was : Exit Do 
					}
					else
					{
						mTokenizer.RaiseUnexpectedToken("End parenthesis not found");
					}

					break;
				case eTokenType.operator_if:
					// first check functions 
					List<object> parameters = new List<object>();
					// parameters... 
					mTokenizer.NextToken();

					bool brackets = false;
					parameters = ParseParameters(ref brackets);
					break; // TODO: might not be correct. Was : Exit Do 
				default:
					break; // TODO: might not be correct. Was : Exit Do 
			}
		}
		while (true);

		if (ValueLeft == null)
		{
			mTokenizer.RaiseUnexpectedToken("No Expression found");
		}
		ParseDot(ref ValueLeft);
		do
		{
			eTokenType tt;
			tt = mTokenizer.type;
			switch (tt)
			{
				case eTokenType.end_of_formula:
					// end of line 
					return ValueLeft;
				case eTokenType.value_number:
					mTokenizer.RaiseUnexpectedToken("Unexpected number without previous opterator");
					break;
				case eTokenType.operator_plus:
					if (priority < ePriority.plusminus)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.plusminus);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_minus:
					if (priority < ePriority.plusminus)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.plusminus);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_concat:
					if (priority < ePriority.concat)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.concat);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_mul:
				case eTokenType.operator_div:
					if (priority < ePriority.muldiv)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.muldiv);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_percent:
					if (priority < ePriority.percent)
					{
						mTokenizer.NextToken();
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, Acc);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_or:
					if (priority < ePriority.or)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.or);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_and:
					if (priority < ePriority.and)
					{
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.and);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				case eTokenType.operator_ne:
				case eTokenType.operator_gt:
				case eTokenType.operator_ge:
				case eTokenType.operator_eq:
				case eTokenType.operator_le:
				case eTokenType.operator_lt:
					if (priority < ePriority.equality)
					{
						tt = mTokenizer.type;
						mTokenizer.NextToken();
						valueRight = ParseExpr(ValueLeft, ePriority.equality);
						ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
					}
					else
					{
						break; // TODO: might not be correct. Was : Exit Do 
					}

					break;
				default:

					break; // TODO: might not be correct. Was : Exit Do 

					break;
			}
		}
		while (true);

		return ValueLeft;
	}
        public static void InitLogger()
        {
            LoggingConfiguration config = LogManager.Configuration ?? new LoggingConfiguration();

            try
            {
                FileInfo logFile = new FileInfo(Config.GetFile(Config.Dir.Log, LogFileName));
                if (logFile.Exists)
                {
                    if (File.Exists(Config.GetFile(Config.Dir.Log, OldLogFileName)))
                    {
                        File.Delete(Config.GetFile(Config.Dir.Log, OldLogFileName));
                    }

                    logFile.CopyTo(Config.GetFile(Config.Dir.Log, OldLogFileName));
                    logFile.Delete();
                }
            }
            catch (Exception) { }

            FileTarget fileTarget = new FileTarget();

            fileTarget.FileName = Config.GetFile(Config.Dir.Log, LogFileName);
            fileTarget.Encoding = "utf-8";
            fileTarget.Layout   = "${date:format=dd-MMM-yyyy HH\\:mm\\:ss} " +
                                  "${level:fixedLength=true:padding=5} " +
                                  "[${logger:fixedLength=true:padding=20:shortName=true}]: ${message} " +
                                  "${exception:format=tostring}";

            config.AddTarget("myvideo-importer", fileTarget);

            // Get current Log Level from MediaPortal
            LogLevel logLevel       = LogLevel.Debug;
            string   threadPriority = "Normal";
            int      intLogLevel    = 3;

            using (MediaPortal.Profile.Settings xmlreader = new MediaPortal.Profile.MPSettings())
            {
                threadPriority = xmlreader.GetValueAsString("general", "ThreadPriority", threadPriority);
                intLogLevel    = xmlreader.GetValueAsInt("general", "loglevel", intLogLevel);
            }

            switch (intLogLevel)
            {
            case 0:
                logLevel = LogLevel.Error;
                break;

            case 1:
                logLevel = LogLevel.Warn;
                break;

            case 2:
                logLevel = LogLevel.Info;
                break;

            default:
                logLevel = LogLevel.Debug;
                break;
            }
      #if DEBUG
            logLevel = LogLevel.Debug;
      #endif

            Priority = string.IsNullOrEmpty(threadPriority) || !threadPriority.Equals("Normal", StringComparison.CurrentCulture) ?
                       (string.IsNullOrEmpty(threadPriority) || !threadPriority.Equals("BelowNormal", StringComparison.CurrentCulture) ?
                        ePriority.BelowNormal :
                        ePriority.Lowest) :
                       ePriority.Lowest;

            LoggingRule rule = new LoggingRule("MyVideoImporter.*", logLevel, fileTarget);
            config.LoggingRules.Add(rule);

            LogManager.Configuration = config;
        }
Esempio n. 7
0
        private object ParseExpr(ePriority ePriority)
        {
            object ValueLeft = null, ValueRight;

LeftParse:
            #region LeftParse
            switch (_Tokenizer.TokenType)
            {
            case eTokenType.operator_minus:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.UnaryMinus);

                if (ValueLeft.GetType() == typeof(decimal))
                {
                    ValueLeft = -(decimal)ValueLeft;
                }
                else
                {
                    throw new ApplicationException("Operator Unary Minus pada nilai non numerik");
                }
                break;

            case eTokenType.operator_plus:
                _Tokenizer.NextToken();
                goto LeftParse;

            case eTokenType.operator_not:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.Not);
                if (ValueLeft.GetType() == typeof(bool))
                {
                    ValueLeft = !(bool)ValueLeft;
                }
                else
                {
                    throw new ApplicationException("Operator NOT pada nilai non boolean");
                }
                break;

            case eTokenType.value_identifier:
                ValueLeft = ParseIdentifier();
                break;

            case eTokenType.value_true:
                ValueLeft = true;
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_false:
                ValueLeft = false;
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_string:
                ValueLeft = _Tokenizer.Value.ToString();
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_number:
                decimal TmpNum;
                if (!decimal.TryParse(_Tokenizer.Value.ToString(),
                                      NumberStyles.Number, BaseUtility.DefaultCultureInfo,
                                      out TmpNum))
                {
                    ValueLeft = decimal.Zero;
                }
                else
                {
                    ValueLeft = TmpNum;
                }
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_date:
                DateTime TmpDate;
                if (!DateTime.TryParse(_Tokenizer.Value.ToString(),
                                       BaseUtility.DefaultCultureInfo, DateTimeStyles.None,
                                       out TmpDate))
                {
                    ValueLeft = DateTime.Today;
                }
                else
                {
                    ValueLeft = TmpDate;
                }
                _Tokenizer.NextToken();
                break;

            case eTokenType.open_parenthesis:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.None);
                if (_Tokenizer.TokenType == eTokenType.close_parenthesis)
                {
                    _Tokenizer.NextToken();
                }
                else
                {
                    throw new ApplicationException("Kurung Tutup tidak ditemukan !");
                }
                break;
            }
            #endregion

            if (ValueLeft == null)
            {
                return(null);
            }

RightParse:
            #region RightParse
            eTokenType tt = _Tokenizer.TokenType;
            switch (tt)
            {
            case eTokenType.end_of_expr:
                return(ValueLeft);

            case eTokenType.value_number:
                throw new ApplicationException("Bilangan diikuti Bilangan tanpa Operator");

            case eTokenType.operator_plus:
            case eTokenType.operator_minus:
                if (ePriority < ePriority.PlusMinus)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.PlusMinus);
                    Type tp = ValueLeft.GetType();
                    if (tp == typeof(decimal))
                    {
                        Type tp2 = ValueRight.GetType();
                        if (tp2 == typeof(decimal))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = (decimal)ValueLeft + (decimal)ValueRight;
                            }
                            else
                            {
                                ValueLeft = (decimal)ValueLeft - (decimal)ValueRight;
                            }
                            goto RightParse;
                        }
                        else if (tp2 == typeof(DateTime))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = ((DateTime)ValueRight).AddDays(
                                    Convert.ToDouble(ValueLeft));
                            }
                            goto RightParse;
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                        }
                    }
                    else if (tp == typeof(DateTime))
                    {
                        Type tp2 = ValueRight.GetType();
                        if (tp2 == typeof(decimal))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = ((DateTime)ValueLeft).AddDays(
                                    Convert.ToDouble(ValueRight));
                            }
                            else
                            {
                                ValueLeft = ((DateTime)ValueLeft).AddDays(
                                    -Convert.ToDouble(ValueRight));
                            }
                            goto RightParse;
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                        }
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = ValueLeft + ValueRight.ToString();
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException(
                                  "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                    }
                }
                break;

            case eTokenType.operator_mul:
            case eTokenType.operator_div:
                if (ePriority < ePriority.MulDiv)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.MulDiv);

                    if (ValueLeft.GetType() == typeof(decimal) &&
                        ValueRight.GetType() == typeof(decimal))
                    {
                        if (tt == eTokenType.operator_mul)
                        {
                            ValueLeft = (decimal)ValueLeft * (decimal)ValueRight;
                        }
                        else
                        {
                            ValueLeft = (decimal)ValueLeft / (decimal)ValueRight;
                        }
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator Kali/ Bagi pada Data bukan Bilangan");
                    }
                }
                break;

            case eTokenType.operator_or:
                if (ePriority < ePriority.Or)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Or);
                    if (ValueLeft.GetType() == typeof(bool) &&
                        ValueRight.GetType() == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft || (bool)ValueRight;
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator OR pada Data bukan Boolean");
                    }
                }
                break;

            case eTokenType.operator_and:
                if (ePriority < ePriority.And)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.And);
                    if (ValueLeft.GetType() == typeof(bool) &&
                        ValueRight.GetType() == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && (bool)ValueRight;
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator AND pada Data bukan Boolean");
                    }
                }
                break;

            case eTokenType.operator_eq:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft == (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = (string)ValueLeft == (string)ValueRight;
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft == (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_ne:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft != (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = (string)ValueLeft != (string)ValueRight;
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft != (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft != (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_lt:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft < (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft < (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = !(bool)ValueLeft && (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_le:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft <= (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft <= (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = !(bool)ValueLeft && (bool)ValueRight ||
                                    (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_gt:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft > (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft > (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && !(bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_ge:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft >= (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft >= (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && !(bool)ValueRight ||
                                    (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;
            }
            #endregion

            return(ValueLeft);
        }
Esempio n. 8
0
        private opCode ParseExpr(opCode Acc, ePriority priority)
        {
            opCode ValueLeft = null, valueRight = null;

            do
            {
                switch (mTokenizer.type)
                {
                case eTokenType.operator_minus:
                {
                    // unary minus operator
                    mTokenizer.NextToken();
                    ValueLeft = ParseExpr(null /* TODO Change to default(_) if this is not a reference type */, ePriority.unaryminus);
                    ValueLeft = new opCodeUnary(eTokenType.operator_minus, ValueLeft);
                    goto Foo;
                    break;
                }

                case eTokenType.operator_plus:
                {
                    // unary minus operator
                    mTokenizer.NextToken();
                    break;
                }

                case eTokenType.operator_not:
                {
                    mTokenizer.NextToken();
                    ValueLeft = ParseExpr(null /* TODO Change to default(_) if this is not a reference type */, ePriority.not);
                    ValueLeft = new opCodeUnary(eTokenType.operator_not, ValueLeft);
                    goto Foo;
                    break;
                }

                case eTokenType.value_identifier:
                {
                    ParseIdentifier(ref ValueLeft);
                    goto Foo;
                    break;
                }

                case eTokenType.value_true:
                {
                    ValueLeft = new opCodeImmediate(EvalType.Boolean, true);
                    mTokenizer.NextToken();
                    goto Foo;
                    break;
                }

                case eTokenType.value_false:
                {
                    ValueLeft = new opCodeImmediate(EvalType.Boolean, false);
                    mTokenizer.NextToken();
                    goto Foo;
                    break;
                }

                case eTokenType.value_string:
                {
                    ValueLeft = new opCodeImmediate(EvalType.String, mTokenizer.value.ToString());
                    mTokenizer.NextToken();
                    goto Foo;
                    break;
                }

                case eTokenType.value_number:
                {
                    try
                    {
                        ValueLeft = new opCodeImmediate(EvalType.Number, double.Parse(mTokenizer.value.ToString(), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture));
                    }
                    catch (Exception ex)
                    {
                        mTokenizer.RaiseError(string.Format("Invalid number {0}", mTokenizer.value.ToString()));
                    }

                    mTokenizer.NextToken();
                    goto Foo;
                    break;
                }

                case eTokenType.value_date:
                {
                    try
                    {
                        ValueLeft = new opCodeImmediate(EvalType.Date, mTokenizer.value.ToString());
                    }
                    catch (Exception ex)
                    {
                        mTokenizer.RaiseError(string.Format("Invalid date {0}, it should be #DD/MM/YYYY hh:mm:ss#", mTokenizer.value.ToString()));
                    }

                    mTokenizer.NextToken();
                    goto Foo;
                    break;
                }

                case eTokenType.open_parenthesis:
                {
                    mTokenizer.NextToken();
                    ValueLeft = ParseExpr(null /* TODO Change to default(_) if this is not a reference type */, ePriority.none);
                    if (mTokenizer.type == eTokenType.close_parenthesis)
                    {
                        // good we eat the end parenthesis and continue ...
                        mTokenizer.NextToken();
                        goto Foo;
                    }
                    else
                    {
                        mTokenizer.RaiseUnexpectedToken("End parenthesis not found");
                    }
                    break;
                }

                case eTokenType.operator_if:
                {
                    // first check functions
                    IList <iEvalTypedValue> parameters = new List <iEvalTypedValue>();
                    mTokenizer.NextToken();
                    bool p = false;
                    parameters = ParseParameters(ref p);
                    goto Foo;
                    break;
                }

                default:
                {
                    goto Foo;
                    break;
                }
                }
            }while (true)// parameters...
            ;
Foo:

            if (ValueLeft == null)
            {
                mTokenizer.RaiseUnexpectedToken("No Expression found");
            }
            ParseDot(ref ValueLeft);
            do
            {
                eTokenType tt;
                tt = mTokenizer.type;
                switch (tt)
                {
                case eTokenType.end_of_formula:
                {
                    // end of line
                    return(ValueLeft);
                }

                case eTokenType.value_number:
                {
                    mTokenizer.RaiseUnexpectedToken("Unexpected number without previous opterator");
                    break;
                }

                case eTokenType.operator_plus:
                {
                    if (priority < ePriority.plusminus)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.plusminus);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_minus:
                {
                    if (priority < ePriority.plusminus)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.plusminus);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_concat:
                {
                    if (priority < ePriority.concat)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.concat);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_mul:
                case eTokenType.operator_div:
                {
                    if (priority < ePriority.muldiv)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.muldiv);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_percent:
                {
                    if (priority < ePriority.percent)
                    {
                        mTokenizer.NextToken();
                        ValueLeft = new opCodeBinary(mTokenizer, ValueLeft, tt, Acc);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_or:
                {
                    if (priority < ePriority.or)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.or);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_and:
                {
                    if (priority < ePriority.and)
                    {
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.and);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                case eTokenType.operator_ne:
                case eTokenType.operator_gt:
                case eTokenType.operator_ge:
                case eTokenType.operator_eq:
                case eTokenType.operator_le:
                case eTokenType.operator_lt:
                {
                    if (priority < ePriority.equality)
                    {
                        tt = mTokenizer.type;
                        mTokenizer.NextToken();
                        valueRight = ParseExpr(ValueLeft, ePriority.equality);
                        ValueLeft  = new opCodeBinary(mTokenizer, ValueLeft, tt, valueRight);
                    }
                    else
                    {
                        goto Foo1;
                    }
                    break;
                }

                default:
                {
                    goto Foo1;
                    break;
                }
                }
            }while (true);
Foo1:
            return(ValueLeft);
        }