MsgMgr.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #pragma once
  20. typedef UINT MSGID;
  21. class CMsgMgr
  22. {
  23. public:
  24. CMsgMgr(void);
  25. virtual ~CMsgMgr(void);
  26. ///这个类型中的数据定义了消息性质的各位意义
  27. /*
  28. 消息性质的位格式(UINT)
  29. 0  ... 0 0 0 0 0 0 0 0
  30.            4 3 2 1 timeout
  31.     1: TIMELESS  一个没有生命期的消息,如果该位为0,则其后4位指定了消息的生存时间,分别表示0-15秒
  32. 2: FORCESHOW 需要强制用户了解的消息,一条消息的flags被更新为FORCESHOW后,在下一次dispatchmessage时就会被重置为0
  33. 3: WAIT  表示是一个等待过程中返回的消息
  34. */
  35. enum MESSAGETYPE
  36.   TIMELESS  = 0x10,
  37.   FORCESHOW = 0x20,
  38.   WAIT = 0x40,
  39.   FORCEHIDE = 0x80,
  40.   NOUPDATE = 0xFFFFFFFF
  41. };
  42. enum MESSAGELEVEL
  43. {
  44.    MSGLV_TRIVAL,
  45.    MSGLV_NOTIFY,
  46.    MSGLV_WARNING,
  47.    MSGLV_FATAL
  48. };
  49. protected:
  50. typedef struct _MSGDATA
  51. {
  52. UINT MsgFlags;
  53. CString strMsg;
  54. BOOL b_visited; //消息是否已经被getmessage所取出过?
  55. DWORD m_updated_tickcount; //消息上次被updated的时间(tickcount)
  56. MESSAGELEVEL m_msgLevel; //msg的等级,将一条高等级的消息更新成一条低等级的消息的行为将不会成功
  57. } MSGDATA;
  58. public:
  59. MSGID CreateMsgID(UINT MsgFlags = 0);
  60. void DeleteMsgID(MSGID MsgID);
  61. UINT GetMsgNum();
  62. void GetMsgIDArray(MSGID *pMsgIDArray);
  63. void UpdateMessage(MSGID MsgID, const CString &strNewMsg, UINT msgFlags = NOUPDATE, MESSAGELEVEL msglv = MSGLV_NOTIFY);
  64. void ClearMessage(MSGID MsgID);
  65. ///
  66. /*
  67. 从消息ID获得消息字串。通过传入合适的flags来限制获得消息
  68. Return
  69. 如果根据getflags的限制能成功获取消息,返回TRUE,并修改strMsg为消息字串,否则返回FALSE。此时strMsg未定义
  70. Remark
  71. 默认情况下,该函数修改对应的MSGDATA对象:将MSGTYPE的FORCESHOW去掉,并将b_visited置为TRUE。这保证了一条消息被多次
  72. 取出时,FORCESHOW(导致汽泡提示弹出)的情况最多只有一次
  73. */
  74. enum GETMESSAGEFLAGS
  75. {
  76. GMF_NOPP = 0,
  77. GMF_NOOLDMSG = 0x1, //不获取旧的(已经被访问过的)消息
  78. GMF_NOVISITEDFLAG = 0x100, //不对MSGDATA的b_visited进行标记
  79. GMF_NOCLEANFORCEFLAG = 0x200 //不对MSGDATA的FORCESHOW或者FORCEHIDE属性进行清除动作
  80. };
  81. BOOL  DispatchMessage(const MSGID MsgID, CString& strMsg, 
  82. const UINT getflags = GMF_NOPP, UINT* p_bMsgFlags = NULL);
  83. ///
  84. /*
  85. 这一函数相当于调用GetMessageEx并使用GMF_NOVISITEDFLAG和GMF_NOCLEANFORCESHOW标志
  86. */
  87. const CString PeerMessage(MSGID MsgID);
  88. protected:
  89. BOOL IsMsgExpired(MSGDATA& msg);
  90. typedef std::map<MSGID, MSGDATA> MsgMap;
  91. MsgMap m_MsgMap;
  92. CCritSec m_CritSec;
  93. UINT m_uMsgCounter;
  94. };