Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.mainResponder.discuss.addMessage
on addMessage (subject, member, inResponseTo, body, flNeuterMacros=true, flNeuterTags=true, postTime=clock.now (), adrroot=nil, flcallback=true, groupname="", flEmptyBodyOk=false, adrdata=nil, flEmptySubjectOk=false) { <<Changes <<5/26/03; 6:30:19 PM by JES <<New optional parameter, flEmptySubjectOk. Defaults to false, preserving current behavior. <<4/8/03; 2:45:24 PM by JES <<New optional parameter, adrdata. adrdata is the address of a table. If non-nil, then all sub-elements of the table at adrdata are copied into the msgtable. Use this parameter if your application needs to store additional information in the message. <<mainResponder.discuss.postMessage uses this parameter to add the IP address of the client POST-ing a new message. <<5/30/01; 11:17:16 JES <<If the subject is empty, put the body of the message in the page table, so the WYSIWYG editor has a chance to give the user another shot at creating the message. <<8/19/99; 3:30:57 PM by DW <<New optional param, flEmptyBodyOk, defaults false. <<If true, body can be the empty string. <<It was ridiculous to make an XML-RPC call supply a body, when the user hasn't edited the copy yet. <<7/16/99; 11:36:10 GMT by AR <<Closed a security hole: The subject is now run thru mainResponder.neuterText. <<5/26/99; 01:54:34 GMT by AR <<Added new optional parameter, groupname. If it's the empty string (the default), we assume config.mainResponder.globals.defaultMembershipGroup. <<2/11/99; 11:37:21 AM by DW <<if html.getPageTableAddress doesn't work, we create our own table <<any callback should only depend on pta^.adrNewMsg being set <<new optional parameter, adrroot, if nil, we should find the discussion root ourselves, otherwise the caller supplied it <<new optional parameter, flcallback, if true we call the callbacks, otherwise not <<4/10/00; 2:48:59 PM by JES <<changed string constants to lookups in the localization table with mainResponder.getString bundle { //clean up subject and messagetext subject = string.trimWhitespace (subject); if subject == "" { if not flEmptySubjectOk { local (errorText = mainResponder.getString ("discuss.cantAddMsgSubjEmpty")); try { //put the message body in the page table so Manila can handle the error gracefully pta = html.getPageTableAddress (); pta^.errorText = errorText; pta^.messageBody = body}; scriptError (errorText)}}; subject = mainResponder.neuterText (subject, flNeuterMacros, flNeuterTags); //AR 6/16/1999 body = string.trimWhitespace (body); if not flEmptyBodyOk { //8/19/99; 3:31:57 PM by DW if body == "" { scriptError (mainResponder.getString ("discuss.cantAddMsgBodyEmpty"))}}; body = mainResponder.neuterText (body, flNeuterMacros, flNeuterTags)}; bundle { //wipe out the member's message cache if groupname == "" { groupname = config.mainresponder.globals.defaultMembershipGroup}; local (adrmembers = mainresponder.members.getMembershipTable (groupname)); local (adrmember = @adrmembers^.users.[member]); try {delete (@adrmember^.messageListCache)}}; if adrroot == nil { //2/11/99; 11:41:51 AM by DW adrroot = mainresponder.discuss.openroot ()}; local (adrprefs = @adrroot^.prefs); local (adrmsgs = @adrroot^.messages); local (adrcal = @adrroot^.calendar); local (msgnum = adrprefs^.nextMsgNum++); local (msgtable); bundle { //copy info into msgtable new (tabletype, @msgtable); msgtable.body = body; msgtable.ctReads = 0; msgtable.inResponseTo = inResponseTo; msgtable.member = member; msgtable.msgnum = msgnum; msgtable.postTime = postTime; msgtable.lastUpdate = postTime; msgtable.responses = {}; msgtable.subject = subject}; local (name = string.padwithzeros (msgnum, 7)); local (adrnewmsg = @adrmsgs^.[name]); adrnewmsg^ = msgtable; if adrdata != nil { //JES 4/8/03: copy the data table's contents into the message table if defined (adrdata^) { if typeOf (adrdata^) == tableType { local (adritem); for adritem in adrdata { table.assign (@adrnewmsg^.[nameOf (adritem^)], adritem^)}}}}; if inResponseTo > 0 { //add this message to the parent's response list local (adrresponses = @adrmsgs^.[string.padwithzeros (inResponseTo, 7)].responses); local (listelement = {msgnum}); if defined (adrresponses^) { adrresponses^ = adrresponses^ + listelement} else { adrresponses^ = listelement}}; bundle { //cross-index in the calendar local (adrday = mainResponder.calendar.getDayAddress (adrcal, postTime)); adrday^.[name] = subject}; if flcallback { //2/11/99; 11:37:15 AM by DW local (pta = html.getPageTableAddress ()); pta^.adrNewMsg = adrNewMsg; mainResponder.callbackLoop (@config.mainresponder.callbacks.addMessage, pta)}; mainResponder.discuss.archiveMessage (adrnewmsg); //8/13/99; 10:02:37 PM by DW filemenu.saveMyRoot (adrroot); return (msgnum)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.