public void SetMessageData(MessageData data) { TextBox recipient = (TextBox)this.FindControl("recipient"); TextBox sender = (TextBox)this.FindControl("sender"); TextBox subject = (TextBox)this.FindControl("subject"); TextBox content = (TextBox)this.FindControl("content"); LiteralControl html_content = (LiteralControl)this.FindControl("html_content"); PlaceHolder html_content_container = (PlaceHolder)this.FindControl("html_content_container"); TextBox date = (TextBox)this.FindControl("date"); recipient.Text = data.strRecipient; sender.Text = data.strSender; subject.Text = data.strSubject; if (data.strMime == "html") { html_content_container.Visible = true; content.Visible = false; html_content.Text = data.strBody; } else { html_content_container.Visible = false; content.Visible = true; content.Text = data.strBody; } date.Text = DateTimeUtil.LocalTime(data.strCreateTime); this.RecordID = data.strRecordID; this.TimeStamp = data.TimeStamp; this.BoxName = data.strBoxType; return; }
// 回复 // 实际上是刷新窗口内容到适合回复的状态 void replybutton_Click(object senderparam, EventArgs e) { TextBox recipient = (TextBox)this.FindControl("recipient"); TextBox sender = (TextBox)this.FindControl("sender"); TextBox subject = (TextBox)this.FindControl("subject"); TextBox content = (TextBox)this.FindControl("content"); TextBox date = (TextBox)this.FindControl("date"); string strRecipient = sender.Text; string strSender = recipient.Text; string strSubject = "回复: " + subject.Text; string strContent = sender.Text + ":\r\n你好!" + "\r\n\r\n\r\n\r\n> === 以下引用 " + sender.Text + " 于 " + date.Text + " 发送给 " + recipient.Text + " 的内容 ===\r\n" + MakeQuoteContent(content.Text) + "\r\n> ======"; recipient.Text = strRecipient; sender.Text = strSender; subject.Text = strSubject; content.Text = strContent; date.Text = ""; content.ReadOnly = false; // 让修改 this.MessageData = null; this.RecordID = null; this.TimeStamp = null; this.BoxName = null; }
// 检索获得消息, 或者从结果集中获得消息 // parameters: // strStyle search / untouched / touched // 有search表示进行检索和获取,没有search就表示不检索而获取先前检索的结果集。 // untoched和touched应当和search联用。否则只能获取先前的结果数 public int GetMessage( RmsChannelCollection Channels, string strResultsetName, string strStyle, string strUserID, string strBoxType, MessageLevel messagelevel, int nStart, int nCount, out int nTotalCount, out List <MessageData> messages, out string strError) { nTotalCount = 0; messages = new List <MessageData>(); strError = ""; if (String.IsNullOrEmpty(this.MessageDbName) == true) { strError = "消息库尚未定义"; return(-1); } int nRet = 0; long lRet = 0; if (String.IsNullOrEmpty(strBoxType) == true) { strBoxType = MessageCenter.INBOX; } RmsChannel channel = Channels.GetChannel(this.ServerUrl); if (channel == null) { strError = "get channel error"; return(-1); } if (String.IsNullOrEmpty(strResultsetName) == true) { strResultsetName = "messages_of_" + strBoxType; } bool bSearch = true; if (StringUtil.IsInList("search", strStyle) == true) { bSearch = true; } else { bSearch = false; } string strQueryStyle = ""; if (StringUtil.IsInList("touched", strStyle) == true) { strQueryStyle = "touched"; } else if (StringUtil.IsInList("untouched", strStyle) == true) { strQueryStyle = "untouched"; } // 检索 if (bSearch == true) { string strQueryXml = ""; // 构造检索式 nRet = MakeSearchQuery( strUserID, strBoxType, strQueryStyle, out strQueryXml, out strError); if (nRet == -1) { // text-level: 内部错误 strError = "构造检索式出错: " + strError; return(-1); } lRet = channel.DoSearch(strQueryXml, strResultsetName, "", // strOuputStyle out strError); if (lRet == -1) { // text-level: 内部错误 strError = "检索失败: " + strError; return(-1); } // not found if (lRet == 0) { // text-level: 用户提示 strError = this.GetString("没有任何消息"); // "没有任何消息" return(0); } nTotalCount = (int)lRet; } if (nCount == 0) { return(nTotalCount); // 如果不需要获得结果集 } Debug.Assert(nStart >= 0, ""); // 获得结果集中指定范围的记录路径 ArrayList aLine = null; lRet = channel.DoGetSearchFullResult( strResultsetName, nStart, nCount, "zh", null, out aLine, out strError); if (lRet == -1) { // 虽然返回-1,但是aLine中仍然有内容了 if (aLine == null) { // text-level: 内部错误 strError = "获取浏览格式失败: " + strError; return(-1); } } // 返回数据 for (int i = 0; i < aLine.Count; i++) { string[] cols = null; cols = (string[])aLine[i]; string strPath = cols[0]; MessageData data = null; // TODO: level == none 只返回路径 nRet = GetMessageByPath( channel, strPath, messagelevel, out data, out strError); if (nRet == -1) { return(-1); } messages.Add(data); } return(aLine.Count); }
// 从 MSMQ 队列获得若干消息 // parameters: public List<MessageData> GetMessage(int nMaxCount, TimeSpan timeout) { List<MessageData> results = new List<MessageData>(); if (nMaxCount == 0) return results; try { MessageEnumerator iterator = _queue.GetMessageEnumerator2(); int i = 0; while (iterator.MoveNext(timeout)) { System.Messaging.Message message = iterator.Current; MessageData record = new MessageData(); record.strBody = (string)message.Body; record.strMime = "xml"; results.Add(record); // iterator.RemoveCurrent(); i++; if (i >= nMaxCount) break; } return results; } catch (MessageQueueException ex) { this.App.WriteErrorLog("GetMessage() 出现异常: " + ExceptionUtil.GetDebugText(ex)); } catch (Exception ex) { this.App.WriteErrorLog("GetMessage() 出现异常: " + ExceptionUtil.GetDebugText(ex)); } return results; }
// 根据消息记录路径获得消息 // 不检查消息是否属于特定用户 int GetMessageByPath( RmsChannel channel, string strPath, MessageLevel messagelevel, out MessageData data, out string strError) { data = new MessageData(); string strMetaData = ""; byte[] timestamp = null; string strXml = ""; string strOutputPath = ""; long lRet = channel.GetRes(strPath, out strXml, out strMetaData, out timestamp, out strOutputPath, out strError); if (lRet == -1) { // text-level: 内部错误 strError = "获得消息记录 '" + strPath + "' 时出错: " + strError; return(-1); } XmlDocument dom = new XmlDocument(); try { dom.LoadXml(strXml); } catch (Exception ex) { // text-level: 内部错误 strError = "装载XML记录进入DOM时出错: " + ex.Message; return(-1); } data.strSender = DomUtil.GetElementText(dom.DocumentElement, "sender"); data.strRecipient = DomUtil.GetElementText(dom.DocumentElement, "recipient"); data.strSubject = DomUtil.GetElementText(dom.DocumentElement, "subject"); data.strCreateTime = DomUtil.GetElementText(dom.DocumentElement, "date"); data.strMime = DomUtil.GetElementText(dom.DocumentElement, "mime"); data.strSize = DomUtil.GetElementText(dom.DocumentElement, "size"); string strTouched = DomUtil.GetElementText(dom.DocumentElement, "touched"); if (strTouched == "1") { data.Touched = true; } else { data.Touched = false; } data.strRecordID = ResPath.GetRecordId(strOutputPath); if (messagelevel == MessageLevel.Full) { data.strBody = DomUtil.GetElementText(dom.DocumentElement, "content"); } data.strUserName = DomUtil.GetElementText(dom.DocumentElement, "username"); // 恒定为中文名称 data.strBoxType = DomUtil.GetElementText(dom.DocumentElement, "box"); data.TimeStamp = timestamp; // 修改touched元素值 if (messagelevel == MessageLevel.Full && data.Touched == false) { DomUtil.SetElementText(dom.DocumentElement, "touched", "1"); byte[] output_timestamp = null; //string strOutputPath = ""; lRet = channel.DoSaveTextRes(strPath, dom.OuterXml, false, "content,ignorechecktimestamp", timestamp, out output_timestamp, out strOutputPath, out strError); if (lRet == -1) { // text-level: 内部错误 strError = "写回记录 '" + strPath + "' 时出错: " + strError; return(-1); } data.Touched = true; data.TimeStamp = output_timestamp; } return(1); }
// 删除一个box中的全部消息 public int DeleteMessage( RmsChannelCollection Channels, string strUserID, bool bMoveToRecycleBin, string strBoxType, out string strError) { strError = ""; int nStart = 0; int nCount = -1; int nTotalCount = 0; for (; ;) { List <MessageData> messages = null; int nRet = GetMessage( Channels, "message_deleteall", nStart == 0 ? "search" : "", strUserID, strBoxType, MessageLevel.ID, nStart, nCount, out nTotalCount, out messages, out strError); if (nRet == -1) { return(-1); } if (nCount == -1) { nCount = nTotalCount - nStart; } for (int j = 0; j < messages.Count; j++) { MessageData data = messages[j]; nRet = DeleteMessage( bMoveToRecycleBin, Channels, data.strRecordID, data.TimeStamp, out strError); if (nRet == -1) { return(-1); } } nStart += messages.Count; nCount -= messages.Count; if (nStart >= nTotalCount) { break; } if (nCount <= 0) { break; } } return(nTotalCount); }
// 根据消息记录路径获得消息 // 不检查消息是否属于特定用户 int GetMessageByPath( RmsChannel channel, string strPath, MessageLevel messagelevel, out MessageData data, out string strError) { data = new MessageData(); string strMetaData = ""; byte[] timestamp = null; string strXml = ""; string strOutputPath = ""; long lRet = channel.GetRes(strPath, out strXml, out strMetaData, out timestamp, out strOutputPath, out strError); if (lRet == -1) { // text-level: 内部错误 strError = "获得消息记录 '" + strPath + "' 时出错: " + strError; return -1; } XmlDocument dom = new XmlDocument(); try { dom.LoadXml(strXml); } catch (Exception ex) { // text-level: 内部错误 strError = "装载XML记录进入DOM时出错: " + ex.Message; return -1; } data.strSender = DomUtil.GetElementText(dom.DocumentElement, "sender"); data.strRecipient = DomUtil.GetElementText(dom.DocumentElement, "recipient"); data.strSubject = DomUtil.GetElementText(dom.DocumentElement, "subject"); data.strCreateTime = DomUtil.GetElementText(dom.DocumentElement, "date"); data.strMime = DomUtil.GetElementText(dom.DocumentElement, "mime"); data.strSize = DomUtil.GetElementText(dom.DocumentElement, "size"); string strTouched = DomUtil.GetElementText(dom.DocumentElement, "touched"); if (strTouched == "1") data.Touched = true; else data.Touched = false; data.strRecordID = ResPath.GetRecordId(strOutputPath); if (messagelevel == MessageLevel.Full) { data.strBody = DomUtil.GetElementText(dom.DocumentElement, "content"); } data.strUserName = DomUtil.GetElementText(dom.DocumentElement, "username"); // 恒定为中文名称 data.strBoxType = DomUtil.GetElementText(dom.DocumentElement, "box"); data.TimeStamp = timestamp; // 修改touched元素值 if (messagelevel == MessageLevel.Full && data.Touched == false) { DomUtil.SetElementText(dom.DocumentElement, "touched", "1"); byte[] output_timestamp = null; //string strOutputPath = ""; lRet = channel.DoSaveTextRes(strPath, dom.OuterXml, false, "content,ignorechecktimestamp", timestamp, out output_timestamp, out strOutputPath, out strError); if (lRet == -1) { // text-level: 内部错误 strError = "写回记录 '"+strPath+"' 时出错: " + strError; return -1; } data.Touched = true; data.TimeStamp = output_timestamp; } return 1; }
// 根据消息记录id获得消息详细内容 // 本函数还将检查消息是否属于strUserID指明的用户 // parameters: // strUserID 如果==null,表示不检查消息属于何用户 public int GetMessage( RmsChannelCollection Channels, string strUserID, string strMessageID, MessageLevel messagelevel, out MessageData message, out string strError) { strError = ""; message = null; int nRet = 0; RmsChannel channel = Channels.GetChannel(this.ServerUrl); if (channel == null) { strError = "get channel error"; return -1; } string strPath = this.MessageDbName + "/" + strMessageID; nRet = GetMessageByPath( channel, strPath, messagelevel, out message, out strError); if (nRet == -1) return -1; if (strUserID != null && message.strUserName != strUserID) { // text-level: 用户提示 strError = string.Format(this.GetString("此条消息不属于用户s, 不允许察看"), // "此条消息不属于用户 '{0}', 不允许察看。" strUserID); // "此条消息不属于用户 '" +strUserID+ "', 不允许察看。"; return -1; } return 1; }
public MessageData(MessageData origin) { this.strUserName = origin.strUserName; this.strBoxType = origin.strBoxType; this.strSender = origin.strSender; this.strRecipient = origin.strRecipient; this.strSubject = origin.strSubject; this.strMime = origin.strMime; this.strBody = origin.strBody; this.strCreateTime = origin.strCreateTime; this.strSize = origin.strSize; this.Touched = origin.Touched; this.strRecordID = origin.strRecordID; this.TimeStamp = origin.TimeStamp; }