123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using SuperSocket.SocketBase.Protocol;
- namespace SuperWebSocket.SubProtocol
- {
- /// <summary>
- /// Json SubCommand base
- /// </summary>
- /// <typeparam name="TWebSocketSession">The type of the web socket session.</typeparam>
- /// <typeparam name="TJsonCommandInfo">The type of the json command info.</typeparam>
- public abstract class JsonSubCommandBase<TWebSocketSession, TJsonCommandInfo> : SubCommandBase<TWebSocketSession>
- where TWebSocketSession : WebSocketSession<TWebSocketSession>, new()
- {
- private const string m_QueryTemplateA = "{0}-{1} {2}";
- private const string m_QueryTemplateB = "{0} {1}";
- private bool m_IsSimpleType = false;
- private Type m_CommandInfoType;
- /// <summary>
- /// Initializes a new instance of the <see cref="JsonSubCommandBase<TWebSocketSession, TJsonCommandInfo>"/> class.
- /// </summary>
- public JsonSubCommandBase()
- {
- m_CommandInfoType = typeof(TJsonCommandInfo);
- if (m_CommandInfoType.IsSimpleType())
- m_IsSimpleType = true;
- }
- /// <summary>
- /// Executes the command.
- /// </summary>
- /// <param name="session">The session.</param>
- /// <param name="requestInfo">The request info.</param>
- public override void ExecuteCommand(TWebSocketSession session, SubRequestInfo requestInfo)
- {
- if (string.IsNullOrEmpty(requestInfo.Body))
- {
- ExecuteJsonCommand(session, default(TJsonCommandInfo));
- return;
- }
- TJsonCommandInfo jsonCommandInfo;
- LocalDataStoreSlot tokenSlot = null;
- if (!string.IsNullOrEmpty(requestInfo.Token))
- tokenSlot = session.SetCurrentToken(requestInfo.Token);
- try
- {
- if (!m_IsSimpleType)
- jsonCommandInfo = (TJsonCommandInfo)session.AppServer.JsonDeserialize(requestInfo.Body, m_CommandInfoType);
- else
- jsonCommandInfo = (TJsonCommandInfo)Convert.ChangeType(requestInfo.Body, m_CommandInfoType);
- ExecuteJsonCommand(session, jsonCommandInfo);
- }
- finally
- {
- if (tokenSlot != null)
- Thread.SetData(tokenSlot, null);
- }
- }
- /// <summary>
- /// Executes the json command.
- /// </summary>
- /// <param name="session">The session.</param>
- /// <param name="commandInfo">The command info.</param>
- protected abstract void ExecuteJsonCommand(TWebSocketSession session, TJsonCommandInfo commandInfo);
- /// <summary>
- /// Gets the json message.
- /// </summary>
- /// <param name="session">The session.</param>
- /// <param name="name">The name.</param>
- /// <param name="token">The token.</param>
- /// <param name="content">The content.</param>
- /// <returns></returns>
- protected string GetJsonMessage(TWebSocketSession session, string name, string token, object content)
- {
- string strOutput;
- //Needn't serialize primitive type object
- if (content.GetType().IsSimpleType())
- strOutput = content.ToString();
- else
- strOutput = session.AppServer.JsonSerialize(content);
- if (string.IsNullOrEmpty(token))
- return string.Format(m_QueryTemplateB, name, strOutput);
- else
- return string.Format(m_QueryTemplateA, name, token, strOutput);
- }
- }
- }
|