Monday, November 08, 2010 at 12:04 AM.


on addMessage (subject, member, inResponseTo, body, flNeuterMacros=true, flNeuterTags=true, (), adrroot=nil, flcallback=true, groupname="", flEmptyBodyOk=false, adrdata=nil, flEmptySubjectOk=false) {
		<<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.