Инкапсулирует информацию о внутреннем протоколе janus://, производит разбор и форматирование во внешний и во внутренний формат.
Example #1
0
        private void IdBoxTextChanged(object sender, EventArgs e)
        {
            var isValid = true;

            try
            {
                var input = _idBox.Text;

                if (!string.IsNullOrEmpty(input))
                {
                    var janusProtocolInfo = JanusProtocolInfo.Parse(input);
                    if (null != janusProtocolInfo && janusProtocolInfo.IsId)
                    {
                        MessageId = janusProtocolInfo.Id;
                    }
                    else
                    {
                        MessageId = int.Parse(input);
                    }
                }
                else
                {
                    isValid = false;
                }
            }
            catch
            {
                isValid = false;
            }

            _labelMessageIdIsText.Text = string.Format(SR.EnterTopicMessageIdForm.MessageIdIsTextFormat, MessageId);

            _labelMessageIdIsText.Visible = isValid;
            _okButton.Enabled             = isValid;
        }
Example #2
0
        /// <summary>
        /// Хвост для ссылок (линк на внешний ресурс) на сообщения и информации
        /// о пользователе. Для остальных случаев возвращает пустую строку.
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="linkType">Тип ссылки.</param>
        /// <param name="info">Информация о протоколе.</param>
        /// <returns>Хвост для ссылок.</returns>
        private static string GetPostfixImagePath(
            IServiceProvider provider,
            LinkType linkType,
            JanusProtocolInfo info)
        {
            if (info != null)
            {
                if (linkType == LinkType.Local)
                {
                    return(GetMsgInDbLinkPostfix(provider, info.Id));
                }

                if (linkType == LinkType.Absent)
                {
                    return(GetMsgAbsentLinkLoadPostfix(provider, info.Id));
                }

                if (info.ResourceType == JanusProtocolResourceType.UserInfo)
                {
                    return(GetUserLinkPostfix(provider, info.Id));
                }
            }

            return(string.Empty);
        }
Example #3
0
        protected override string GetImagePrefix()
        {
            //return JanusProtocolInfo.FormatURI(JanusProtocolResourceType.Image,
            //	@"ForumImages" + JanusProtocolInfo.ProtocolSeparatorChar);

            return(JanusProtocolInfo.FormatURI(JanusProtocolResourceType.Formatter, String.Empty));
        }
Example #4
0
        /// <summary>
        /// Пытается ивлечь информацию о протоколе из внешнего адреса,
        /// который представим в Rsdn@Home - "message" и "user-info".
        /// Функция возвращает <c>true</c> - если адрес распознан.
        /// </summary>
        /// <param name="url">Внешний адрес.</param>
        /// <param name="protocolInfo">В случае удачи - информация о протоколе,
        /// иначе - <c>null</c>.</param>
        /// <returns><c>true</c> - если адрес распознан.</returns>
        private static bool TryExternalUrlParse(string url, out JanusProtocolInfo protocolInfo)
        {
            #region Сообщение

            var match = _msgUrlDetectorRx.Match(url);

            if (!match.Success)
            {
                match = _msgUrlDetector2Rx.Match(url);
            }

            if (match.Success)
            {
                return(Make(JanusProtocolResourceType.Message,
                            match.Groups["mid"].Value, url, out protocolInfo));
            }

            #endregion

            #region ФАКУ

            match = _infoUrlDetectorRx.Match(url);

            if (!match.Success)
            {
                match = _infoUrlDetectorRx2.Match(url);
            }

            if (match.Success)
            {
                return(Make(JanusProtocolResourceType.Faq,
                            match.Groups["name"].Value.Replace('/', '.'),
                            url, out protocolInfo));
            }

            #endregion

            #region Профиль пользователя

            match = _profileDetectorRx.Match(url);

            if (!match.Success)
            {
                match = _profileDetector2Rx.Match(url);
            }

            if (match.Success)
            {
                return(Make(JanusProtocolResourceType.UserInfo,
                            match.Groups["uid"].Value, url, out protocolInfo));
            }

            #endregion

            // ничего не найдено
            protocolInfo = null;
            return(false);
        }
        private int?GetActiveMessageId()
        {
            var info = JanusProtocolInfo.Parse(_browserFormService.Url);

            return(info != null &&
                   info.ResourceType == JanusProtocolResourceType.Message &&
                   info.IsId
                           ? (int?)info.Id : null);
        }
Example #6
0
 private static bool Make(
     JanusProtocolResourceType resourceType,
     string parameters,
     string url,
     out JanusProtocolInfo protocolInfo)
 {
     protocolInfo = new JanusProtocolInfo(resourceType, parameters, url);
     return(true);
 }
        public static string GetUserProfileUrl(int userId)
        {
            return(JanusProtocolInfo.FormatExternalURI(
                       JanusProtocolResourceType.UserInfo, userId.ToString()));

            //return String.Format("{0}/Users/Profile.aspx?uid={1}",
            //	SiteUrlHelper.RsdnServerUrl,
            //	userID);
        }
Example #8
0
        public string GetImageUri(string name, StyleImageType imageType)
        {
            var si = GetStyleImage(name, imageType);

            return
                (si == null
                                        ? null
                                        : JanusProtocolInfo.FormatURI(JanusProtocolResourceType.Image,
                                                                      si.GetUri(Thread.CurrentThread.CurrentUICulture)
                                                                      .Replace(
                                                                          Path.DirectorySeparatorChar,
                                                                          JanusProtocolInfo.ProtocolSeparatorChar)));
        }
Example #9
0
 private void FormatterEventHandler(object sender, JanusProtocolEventArgs e)
 {
     using (var resr = Formatter.ResourceProvider.ReadResource(e.Parameters))
     {
         if (resr.Binary)
         {
             e.Response = new Resource(resr.GetContentType(), (byte[])resr.Read());
         }
         else
         {
             var prx = JanusProtocolInfo.FormatURI(JanusProtocolResourceType.Formatter, String.Empty);
             var src = ((String)resr.Read()).Replace("%URL%", prx);
             e.Response = new Resource(resr.GetContentType(), src);
         }
     }
 }
Example #10
0
        private static bool TryJanusUrlParse(string url,
                                             out JanusProtocolInfo protocolInfo)
        {
            var match = _resourceInfoRegex.Match(url);

            if (match.Success)
            {
                var resource   = match.Groups["resource"].Value.ToLower();
                var parameters = match.Groups["parameters"].Value;

                JanusProtocolResourceType resourceType;
                if (_resourceTypes.TryGetValue(resource, out resourceType))
                {
                    return(Make(resourceType, parameters, url, out protocolInfo));
                }
            }

            protocolInfo = null;
            return(false);
        }
Example #11
0
        internal EnterTopicMessageIdForm()
        {
            InitializeComponent();

            // Попытаться извлечь дефолтный номер сообщения из буфера обмена.
            var dto = Clipboard.GetDataObject();

            if (dto != null)
            {
                if (dto.GetDataPresent(DataFormats.Text))
                {
                    var data = (string)dto.GetData(DataFormats.Text);
                    var info = JanusProtocolInfo.Parse(data);
                    if (info != null && info.ResourceType == JanusProtocolResourceType.Message && info.IsId)
                    {
                        _idBox.Text = data;
                    }
                }
            }
        }
Example #12
0
        private string ProcessUrlInternal(string url, string text)
        {
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }

            var info = JanusProtocolInfo.Parse(url);

            string   title;
            string   imageUrl;
            LinkType linkType;

            if (info != null && info.ResourceType == JanusProtocolResourceType.Faq)
            {
                return(ProcessRsdnLinkInternal(_provider, info.Parameters, text));
            }

            url = RefineUrl(info, out imageUrl, out title, out linkType) ?? url;

            if (linkType == LinkType.External)
            {
                imageUrl = RefineImageForWellKnownUrls(_provider, url) ?? imageUrl;
            }

            const string format =
                "<a class='m' href='{0}{1}' title='{5}'><img border='0' align='absbottom' src='{3}' style='margin-bottom:1px;margin-right: 2px;'></a>" +
                "<a class='m' href='{0}{1}' title='{5}'>{2}</a>{4}";

            return(string.Format(format,
                                 ParseUrl(url).Groups["scheme"].Success ? "" : "http://",
                                 url.EncodeAgainstXSS(),
                                 text,
                                 imageUrl,
                                 GetPostfixImagePath(_provider, linkType, info),
                                 string.IsNullOrEmpty(title) ? url : title));
        }
        private void MessageBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
        {
            if (!_blockExternalNavigation)
            {
                var protocolInfo = JanusProtocolInfo.Parse(e.Url.ToString());
                var linkType     = protocolInfo == null ? LinkType.External : protocolInfo.LinkType;
                var obManager    = _serviceManager.GetRequiredService <IOutboxManager>();
                var manager      = ApplicationManager.Instance;

                switch (linkType)
                {
                case LinkType.Local:
                    Debug.Assert(protocolInfo != null);
                    if (protocolInfo.ResourceType == JanusProtocolResourceType.Message)
                    {
                        manager.ForumNavigator.SelectMessage(protocolInfo.Id);
                    }
                    else
                    {
                        manager.ForumNavigator.SelectMessage(protocolInfo.Parameters);
                    }
                    break;

                case LinkType.Absent:
                    Debug.Assert(protocolInfo != null);
                    obManager.AddTopicForDownloadWithConfirm(protocolInfo.Id);
                    e.Cancel = true;
                    break;

                case LinkType.External:
                    _serviceManager.OpenUrlInBrowser(e.Url.OriginalString);
                    e.Cancel = true;
                    break;
                }
            }
            _blockExternalNavigation = false;
        }
Example #14
0
        /// <summary>
        /// Распределяет запросы протокола по обработчикам.
        /// </summary>
        /// <param name="uri">Путь запроса.</param>
        /// <returns>Результат обработки запроса.</returns>
        public Resource DispatchRequest(string uri)
        {
            try
            {
                var info = JanusProtocolInfo.Parse(uri);

                var resource = info != null ? info.ResourceName : uri;

                if (!_handlers.ContainsKey(resource))
                {
                    throw new ArgumentException(string.Format(SR.ResourceNotFound, resource));
                }

                System.Diagnostics.Debug.Assert(info != null);

                var jpea = new JanusProtocolEventArgs(info.Parameters);
                _handlers[resource](this, jpea);
                return(jpea.Response);
            }
            catch (Exception e)
            {
                return(new Resource(_mimeTypeHtml, HtmlPageBuilder.GetExceptionMessage(uri, e)));
            }
        }
Example #15
0
        private static bool TryJanusUrlParse(string url,
            out JanusProtocolInfo protocolInfo)
        {
            var match = _resourceInfoRegex.Match(url);
            if (match.Success)
            {
                var resource = match.Groups["resource"].Value.ToLower();
                var parameters = match.Groups["parameters"].Value;

                JanusProtocolResourceType resourceType;
                if (_resourceTypes.TryGetValue(resource, out resourceType))
                    return Make(resourceType, parameters, url, out protocolInfo);
            }

            protocolInfo = null;
            return false;
        }
Example #16
0
        /// <summary>
        /// Пытается ивлечь информацию о протоколе из внешнего адреса, 
        /// который представим в Rsdn@Home - "message" и "user-info".
        /// Функция возвращает <c>true</c> - если адрес распознан.
        /// </summary>
        /// <param name="url">Внешний адрес.</param>
        /// <param name="protocolInfo">В случае удачи - информация о протоколе,
        /// иначе - <c>null</c>.</param>
        /// <returns><c>true</c> - если адрес распознан.</returns>
        private static bool TryExternalUrlParse(string url, out JanusProtocolInfo protocolInfo)
        {
            #region Сообщение

            var match = _msgUrlDetectorRx.Match(url);

            if (!match.Success)
                match = _msgUrlDetector2Rx.Match(url);

            if (match.Success)
                return Make(JanusProtocolResourceType.Message,
                            match.Groups["mid"].Value, url, out protocolInfo);

            #endregion

            #region ФАКУ

            match = _infoUrlDetectorRx.Match(url);

            if (!match.Success)
                match = _infoUrlDetectorRx2.Match(url);

            if (match.Success)
                return Make(JanusProtocolResourceType.Faq,
                            match.Groups["name"].Value.Replace('/', '.'),
                            url, out protocolInfo);

            #endregion

            #region Профиль пользователя

            match = _profileDetectorRx.Match(url);

            if (!match.Success)
                match = _profileDetector2Rx.Match(url);

            if (match.Success)
                return Make(JanusProtocolResourceType.UserInfo,
                            match.Groups["uid"].Value, url, out protocolInfo);

            #endregion

            // ничего не найдено
            protocolInfo = null;
            return false;
        }
Example #17
0
 private static bool Make(
     JanusProtocolResourceType resourceType,
     string parameters,
     string url,
     out JanusProtocolInfo protocolInfo)
 {
     protocolInfo = new JanusProtocolInfo(resourceType, parameters, url);
     return true;
 }
Example #18
0
        /// <summary>
        /// Возвращает в случае возможности линк на внутренний ресурс
        /// (message, user-info), иначе - оригинальный линк.
        /// Если <paramref name="protocolInfo"/>
        /// есть <c>null</c>, то функция возвращает <c>null</c>.
        /// </summary>
        /// <param name="protocolInfo">Информация о протоколе
        /// <see cref="Rsdn.Janus.JanusProtocolInfo"/>.</param>
        /// <param name="imageUrl">Ссылка на иконку адреса.</param>
        /// <param name="title">Всплывающая подсказка (тултип).</param>
        /// <param name="linkType">Тип ссылки <see cref="Rsdn.Janus.LinkType"/>.</param>
        /// <returns>
        /// В случае возможности линк на внутренний ресурс
        /// (message, user-info), иначе - оригинальный линк.
        /// Если <paramref name="protocolInfo"/>
        /// есть <c>null</c>, то результатом тоже будет <c>null</c>.
        /// </returns>
        private string RefineUrl(
            JanusProtocolInfo protocolInfo,
            out string imageUrl, out string title, out LinkType linkType)
        {
            title    = string.Empty;
            linkType = LinkType.External;
            imageUrl = GetImageUri(_provider, @"ForumImages\webref", StyleImageType.ConstSize);

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

            switch (protocolInfo.ResourceType)
            {
            case JanusProtocolResourceType.Message:
            case JanusProtocolResourceType.MessageAbsent:
                using (var db = _dbManager.CreateDBContext())
                {
                    if (!protocolInfo.IsId)
                    {
                        return(protocolInfo.OriginalUrl);
                    }

                    var msg =
                        db
                        .Message(
                            protocolInfo.Id,
                            m =>
                            new
                    {
                        m.IsRead,
                        m.IsMarked,
                        m.ArticleId,
                        m.Subject,
                        m.UserNick,
                        m.Date
                    });

                    // сообщение не найдено
                    if (msg == null)
                    {
                        title    = SR.MessageAbsent;
                        linkType = LinkType.Absent;
                        imageUrl = GetImageUri(_provider, "MsgNotInDb", StyleImageType.ConstSize);

                        return(protocolInfo.OriginalUrl);
                    }

                    // сообщение найдено
                    title = FormatMsgLinkTitle(msg.Subject, msg.Date, msg.UserNick);

                    linkType = LinkType.Local;
                    imageUrl = GetMessageImagePath(
                        _provider,
                        msg.IsRead,
                        msg.IsMarked,
                        msg.ArticleId > 0);
                }

                return(protocolInfo.Url);

            case JanusProtocolResourceType.UserInfo:
                using (var db = _dbManager.CreateDBContext())
                {
                    var user =
                        protocolInfo.IsId
                                                                ? db.User(
                            protocolInfo.Id,
                            u => new { u.UserClass, DisplayName = u.DisplayName() })
                                                                : null;

                    if (user == null)
                    {
                        title    = SR.UserInfoMissed;
                        imageUrl = GetImageUri(_provider, "UserNotInDb", StyleImageType.ConstSize);
                        return(protocolInfo.OriginalUrl);
                    }

                    imageUrl = GetUserImagePath(_provider, user.UserClass);
                    title    = user.DisplayName;
                }
                return(protocolInfo.Url);

            default:
                imageUrl = GetResourceImagePath(_provider, protocolInfo.ResourceType);
                break;
            }

            return(protocolInfo.OriginalUrl);
        }
Example #19
0
		/// <summary>
		/// Возвращает в случае возможности линк на внутренний ресурс 
		/// (message, user-info), иначе - оригинальный линк. 
		/// Если <paramref name="protocolInfo"/>
		/// есть <c>null</c>, то функция возвращает <c>null</c>.
		/// </summary>
		/// <param name="protocolInfo">Информация о протоколе 
		/// <see cref="Rsdn.Janus.JanusProtocolInfo"/>.</param>
		/// <param name="imageUrl">Ссылка на иконку адреса.</param>
		/// <param name="title">Всплывающая подсказка (тултип).</param>
		/// <param name="linkType">Тип ссылки <see cref="Rsdn.Janus.LinkType"/>.</param>
		/// <returns>
		/// В случае возможности линк на внутренний ресурс
		/// (message, user-info), иначе - оригинальный линк. 
		/// Если <paramref name="protocolInfo"/>
		/// есть <c>null</c>, то результатом тоже будет <c>null</c>.
		/// </returns>
		private string RefineUrl(
			JanusProtocolInfo protocolInfo,
			out string imageUrl, out string title, out LinkType linkType)
		{
			title    = string.Empty;
			linkType = LinkType.External;
			imageUrl = GetImageUri(_provider, @"ForumImages\webref", StyleImageType.ConstSize);

			if (protocolInfo == null)
				return null;

			switch (protocolInfo.ResourceType)
			{
				case JanusProtocolResourceType.Message:
				case JanusProtocolResourceType.MessageAbsent:
					using (var db = _dbManager.CreateDBContext())
					{
						if (!protocolInfo.IsId)
							return protocolInfo.OriginalUrl;

						var msg =
							db
								.Message(
									protocolInfo.Id,
									m =>
										new
										{
											m.IsRead,
											m.IsMarked,
											m.ArticleId,
											m.Subject,
											m.UserNick,
											m.Date
										});

						// сообщение не найдено
						if (msg == null)
						{
							title = SR.MessageAbsent;
							linkType = LinkType.Absent;
							imageUrl = GetImageUri(_provider, "MsgNotInDb", StyleImageType.ConstSize);

							return protocolInfo.OriginalUrl;
						}

						// сообщение найдено
						title = FormatMsgLinkTitle(msg.Subject, msg.Date, msg.UserNick);

						linkType = LinkType.Local;
						imageUrl = GetMessageImagePath(
							_provider,
							msg.IsRead,
							msg.IsMarked,
							msg.ArticleId > 0);
					}

					return protocolInfo.Url;
				
				case JanusProtocolResourceType.UserInfo:
					using (var db = _dbManager.CreateDBContext())
					{
						var user =
							protocolInfo.IsId 
								? db.User(
									protocolInfo.Id,
									u => new {u.UserClass, DisplayName = u.DisplayName()})
								: null;

						if (user == null)
						{
							title    = SR.UserInfoMissed;
							imageUrl = GetImageUri(_provider, "UserNotInDb", StyleImageType.ConstSize);
							return protocolInfo.OriginalUrl;
						}

						imageUrl = GetUserImagePath(_provider, user.UserClass);
						title    = user.DisplayName;
					}
					return protocolInfo.Url;

				default:
					imageUrl = GetResourceImagePath(_provider, protocolInfo.ResourceType);
					break;
			}

			return protocolInfo.OriginalUrl;
		}
Example #20
0
		/// <summary>
		/// Хвост для ссылок (линк на внешний ресурс) на сообщения и информации 
		/// о пользователе. Для остальных случаев возвращает пустую строку.
		/// </summary>
		/// <param name="provider"></param>
		/// <param name="linkType">Тип ссылки.</param>
		/// <param name="info">Информация о протоколе.</param>
		/// <returns>Хвост для ссылок.</returns>
		private static string GetPostfixImagePath(
			IServiceProvider provider,
			LinkType linkType, 
			JanusProtocolInfo info)
		{
			if (info != null)
			{
				if (linkType == LinkType.Local)
					return GetMsgInDbLinkPostfix(provider, info.Id);

				if (linkType == LinkType.Absent)
					return GetMsgAbsentLinkLoadPostfix(provider, info.Id);

				if (info.ResourceType == JanusProtocolResourceType.UserInfo)
					return GetUserLinkPostfix(provider, info.Id);
			}

			return string.Empty;
		}
Example #21
0
 /// <summary>
 /// Получить внешний формат ссылки для соответствующего ресурса.
 /// <seealso cref="SiteUrlHelper"/>
 /// </summary>
 /// <param name="resourceType">Тип ресурса.</param>
 /// <param name="parameters">Параметр ссылки.</param>
 /// <returns>Внешний формат ссылки на ресурс.</returns>
 public static string FormatExternalURI(JanusProtocolResourceType resourceType, string parameters)
 {
     return(JanusProtocolInfo
            .FormatExternalURI(resourceType, parameters));
 }
 public string FormatUserInfoURI(string parameters)
 {
     return(JanusProtocolInfo.FormatURI(
                JanusProtocolResourceType.UserInfo, parameters));
 }
 public string FormatMessageRateURI(string parameters)
 {
     return(JanusProtocolInfo.FormatURI(
                JanusProtocolResourceType.MessageRate, parameters));
 }
 public static string GetInfoUrl(string name)
 {
     return(JanusProtocolInfo
            .FormatExternalURI(JanusProtocolResourceType.Faq, name));
 }
 public static string GetMessageUrl(int messageId)
 {
     return(JanusProtocolInfo.FormatExternalURI(
                JanusProtocolResourceType.Message, messageId.ToString()));
 }