<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MesQuilla &#187; Planet MozillaMessaging</title>
	<atom:link href="http://mesquilla.com/category/mozillamessaging/feed/" rel="self" type="application/rss+xml" />
	<link>http://mesquilla.com</link>
	<description>Messaging with Mozilla by rkent</description>
	<lastBuildDate>Wed, 03 Mar 2010 22:31:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mailnews Exchange Support: basic mail infrastructure</title>
		<link>http://mesquilla.com/2010/03/03/mailnews-exchange-support-basic-mail-infrastructure/</link>
		<comments>http://mesquilla.com/2010/03/03/mailnews-exchange-support-basic-mail-infrastructure/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 22:31:39 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Exchange Web Services (EWS)]]></category>
		<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=619</guid>
		<description><![CDATA[This post is intended mostly as a status update on my effort to add Microsoft Exchange Server support to the Mozilla mailnews products, including Thunderbird and SeaMonkey.
In my last report, I was testing and updating the old Mozilla SOAP framework for use in communicating with Exchange Web Services (EWS). Using the framework in a Thunderbird [...]]]></description>
			<content:encoded><![CDATA[<p>This post is intended mostly as a status update on my effort to add Microsoft Exchange Server support to the Mozilla mailnews products, including Thunderbird and SeaMonkey.</p>
<p>In my <a href="http://mesquilla.com/2010/02/01/toward-mailnews-exchange-web-services-support-soap-calls/">last report</a>, I was testing and updating the old Mozilla SOAP framework for use in communicating with Exchange Web Services (EWS). Using the framework in a Thunderbird 3.0 environment, I could talk to the BING search SOAP interface. It took a couple of more weeks to resolve issues associated with communicating with EWS. There were a number of features missing from the old Mozilla SOAP, most importantly:</p>
<ul>
<li>attributes in SOAP elements.</li>
<li>arrays of choices with unlimited number of elements. The property bag of the previous interface can&#8217;t handle multiple items with the same name, so I did my own &#8220;property list&#8221; replacement for it.</li>
<li>authenticated access to the SOAP service.</li>
</ul>
<p>I&#8217;ve successfully sent a &#8220;Get Folder&#8221; call to an Exchange Server. The code to define the specific Exchange call looks like this:</p>
<pre>let getFolder = new EwsGetFolder;
getFolder.invoke(responseListener);

function EwsGetFolder()
{
 // defaults
 this.FolderBaseShape = "Default";
 this.FolderIds = "inbox";
}

EwsGetFolder.prototype = new SoapBase(kMessages2007sp1Schema);

EwsGetFolder.prototype.invoke =
  function EwsGetFolder_invoke(aSOAPResponseListener)
{
 let FolderShapeList =
   objectPropertyList({BaseShape: this.FolderBaseShape});
 let FolderIdsList = objectPropertyList(
     {DistinguishedFolderId: objectPropertyList(
       {$attributes: objectPropertyList({Id: this.FolderIds}) })});
 let soapCall = Cc["@mozilla.org/xmlextras/soap/call;1"]
                  .createInstance(Ci.nsISOAPCall);
 let parameters = [];
 let FolderShapeType =
   this._schema.collection.getType(
     'FolderResponseShapeType',
     'http://schemas.microsoft.com/exchange/services/2006/types');
 let FolderIdsType =
   this._schema.collection.getType(
     'NonEmptyArrayOfBaseFolderIdsType',
     'http://schemas.microsoft.com/exchange/services/2006/types');
 parameters.push(
   new soapParameter(
     "FolderShape",
     FolderShapeList,
     FolderShapeType,
     "http://schemas.microsoft.com/exchange/services/2006/messages"));
 parameters.push(
   new soapParameter(
     'FolderIds',
     FolderIdsList,
     FolderIdsType,
     "http://schemas.microsoft.com/exchange/services/2006/messages"));
 soapCall.encode(
   Ci.nsISOAPMessage.VERSION_1_1,
   'GetFolder',
   this._schema.targetNamespace,
   0, null, // header blocks
   parameters.length, parameters);
 soapCall.transportURI = kAccount.url;
 soapCall.asyncInvoke(aSOAPResponseListener,
                      kAccount.user, kAccount.password);
}</pre>
<p>So I can now successfully do SOAP communication to an Exchange Server (2007 SP1), using the standard Exchange schemas to encode the messages. There is still much needed to clean this up, but I&#8217;ve got enough working for now.</p>
<p>So now I turn my attention to the setup of a new account type in Thunderbird. This is the same issue that<a href="http://quetzalcoatal.blogspot.com/2010/01/developing-new-account-types-part-0.html"> jcranmer is working on</a>, but he is specifically trying to do everything in javascript, while I am content (for now) to work partly in C++. So I have to build the darn thing.</p>
<p>Ah, the Mozilla build system. Gotta love it. You have to know the difference between :, ::, :=, =~, (), {}, in a zillion different languages (perl, python, autoconf, automake, bash, make at least). When it works, it works like magic. But sometimes you wave your magic wand, say your magic incantation, and nothing happens. That&#8217;s what makes it so hard. You spend hours seeing if you can get the spell to work, but sometimes you just have to give up and do it the old fashioned way, knowing that there is probably some trivial change you could have done to make the magic work. But I guess I have no right to complain. Everyone said to NOT do it this way, but did I listen? I&#8217;ve been in build hell for a week.</p>
<p>But it turned out to be just build purgatory! Now that I am out, what wonders heaven holds! I can use a real debugger on my code, and not Venkman and dump()! The vast majority of the existing mailnews code is in C++, so I can see what local folders, IMAP, and newsgroups do, and very easily adapt it to my needs. I can subclass the existing implementations!</p>
<p>So as of today, I have a series of subclassed C++ files that contain what will be the future EWS-based objects &#8211; though I have not attempted yet to glue them to EWS, just simulations. I have new C++ files for the folder, message service, incoming server, and summary database &#8211; along with some basic unit tests. (This is very similar to the approach that the RSS implementation takes).</p>
<p>So what can I do? I can just display an account, its subfolders, and a message header (all simulated not real). It looks like this:</p>
<p><a href="http://mesquilla.com/wp-content/uploads/2010/03/ews-message-600.jpg"><img class="alignnone size-full wp-image-623" title="Simulated Exchange Web Service message" src="http://mesquilla.com/wp-content/uploads/2010/03/ews-message-600.jpg" alt="" width="600" height="299" /></a></p>
<p>As you can see, I have not faced the issue yet of registering my protocols, so when I click on the message I get a complaint. I&#8217;ll be doing that next, along with trying to get the real information from EWS instead of this simulation.</p>
<p>OK, I know, you are not impressed &#8211; one simulated message, and that does not even work?  &#8220;Everything is hard to do in Thunderbird&#8221; is my defense, so cut me some slack, all right?</p>
<p>rkent</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2010/03/03/mailnews-exchange-support-basic-mail-infrastructure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Combining Thunderbird with SpamAssassin</title>
		<link>http://mesquilla.com/2010/02/12/combining-thunderbird-with-spamassassin/</link>
		<comments>http://mesquilla.com/2010/02/12/combining-thunderbird-with-spamassassin/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 01:22:53 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[JunQuilla]]></category>
		<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=607</guid>
		<description><![CDATA[For anyone who gets lots of spam mail, I typically recommend that their anti-spam management plan must consist of a multi-stage process. A common open source solution to that (and the one that I use personally) is a server-based SpamAssassin (SA) front end, followed by a client-based bayes filter, in this case the Thunderbird (TB) [...]]]></description>
			<content:encoded><![CDATA[<p>For anyone who gets lots of spam mail, I typically recommend that their anti-spam management plan must consist of a multi-stage process. A common open source solution to that (and the one that I use personally) is a server-based SpamAssassin (SA) front end, followed by a client-based bayes filter, in this case the Thunderbird (TB) default filter. Both filters are tuned to never give false positives, with Uncertain emails show in an Uncertain folder that I regularly watch.</p>
<p>In the Thunderbird 3.0 / SeaMonkey 2.0 series, I snuck in a little hidden preference to allow modifications to the way that the TB bayes filter does it tokenization. The main point of this was to allow better transfer of information between SA and TB. I&#8217;d like to describe here how to use that feature.</p>
<p>SA&#8217;s decision process involves two key steps. First, they evaluate the message with zillions of rules, and tag the message with each rule that the message hits. Second, they have a method of combining all of those tags into a final junk score for the message, which is used to decide whether to tag the overall message as spam.</p>
<p>SA&#8217;s rules include many tests that are not done by TB (score one point for SA). Yet when they take all of their rules and combine them together, in most cases they are using broad measures of goodness and spaminess that apply to some concept of a universal email. In contrast, TB&#8217;s bayes algorithm will precisely tune the junk analysis to the particular set of emails that a user gets. So if you are in the Viagra business, you can tune your local TB filter to accept those. (score one point for TB).</p>
<p>Wouldn&#8217;t it be great if you could combine together the superior rule set of SA, with the superior decision making customization of TB? That is the point of the hidden preference.</p>
<p>SA communicates its message tags to TB in the form of a custom header, X-SPAM-STATUS. A sample value of that from a spam message that I got is:</p>
<p id="line1">X-Spam-Status: No, score=4.9 required=5.0 tests=HTML_IMAGE_ONLY_16,<br />
HTML_IMAGE_RATIO_02,HTML_MESSAGE,HTML_SHORT_LINK_IMG_2,<br />
MIME_HTML_ONLY,	SPF_PASS shortcircuit=no autolearn=disabled version=3.2.5</p>
<p>This message was not marked as spam by SA, as it just barely missed the score=5.0 cutoff point, so arrives in TB as a suspicious but nevertheless good message. Yet there is lots of information about the tests that SA did in that header. TB should be able to take advantage of that information.</p>
<p>In the default TB configuration, the entire content of the X-Spam-Status header is treated as a single token. So TB will only respond to exact matches to that header. Yet those tests can appear in a variety of combinations, so that is not really taking advantage of the information effectively.</p>
<p>The answer provided in TB3 / SM2 is to provide a hidden preference that allows you to tell TB to break that particular header up into lots of separate tokens, and analyze each of those separately. That is documented in the code <a href="http://mxr.mozilla.org/comm-central/source/mailnews/extensions/bayesian-spam-filter/src/nsBayesianFilter.cpp#371">here</a>. In the preference, you specify a particular header, and give a list of delimiters for that tokenization. So to process the x-spam-status header as individual tokens including both space and comma as delimiters, you add the preference:</p>
<pre style="padding-left: 30px;">mailnews.bayesian_spam_filter.tokenizeheader.x-spam-status
</pre>
<p>and assign it the string value &#8221; ,\t\n\r\f&#8221;</p>
<p>(That can be hard to set with all of those special characters in it). That includes space, comma, tab, line feed, carriage return, and form feed as delimiters.</p>
<p>You really can&#8217;t do this to an existing training corpus without getting strange results. So you must reset the training data and retrain after you do that.</p>
<p>As a sample, the tokens used by TB to process an email with my example x-spam-status is:</p>
<p><a href="http://mesquilla.com/wp-content/uploads/2010/02/JunkAnalysisDetail1.jpg"><img class="alignnone size-full wp-image-612" title="Junk Analysis Detail" src="http://mesquilla.com/wp-content/uploads/2010/02/JunkAnalysisDetail1.jpg" alt="" width="513" height="534" /></a></p>
<p>This image uses the &#8220;Junk Analysis Detail&#8221; report from my <a href="http://mesquilla.com/extensions/junquilla/">JunQuilla extension</a>.</p>
<p>Things to notice:</p>
<ol>
<li>The tokens that TB is using to analyze this email are mostly these x-spam-status tokens, as this is a mostly-image spam message with little text for TB to analyze. So the use of the SA tokens greatly enhances the power of TB&#8217;s internal filter.</li>
<li>The final score for this, 84, ended up with the message marked as junk for me. I run a cutoff of 75, while the default cutoff is 90.</li>
<li>Many of the x-spam-status tokens are actually working against us here. For example, x-spam-status:required=5.0 has a score of 23, which moves the message toward the &#8220;good&#8221; status. Yet that token appears on every single email I receive, so should be neutral. What is going on here?
<p>This is the issue that I reported in a previous post &#8220;<a href="http://mesquilla.com/2009/12/02/bad-effects-on-junk-training-corpus-from-change/">bad effects on junk training corpus from change</a>&#8221; That is, recently I have been automatically training more messages as Good than Junk. &#8220;x-spam-status:required=5.0&#8243; must not exist in my older emails for some reason, so this bias is appearing because 1) the token changed at some point in time, and 2) there is a mismatch in the number of junk and good emails being trained recently. I really need to figure out a solution to this. What I will probably do is to add features to FiltaQuilla to allow me to precisely match the training of junk and good to remove this bias.</li>
</ol>
<p>I still need to do some tests of this to directly compare the performance of the spam filters with and without the tokenization to be sure this is really a good idea. That is quite tricky to do unfortunately.</p>
<p>In spite of these issues, I would recommend to new installations that you use this alternate tokenization when you are using a Spam Assassin front-end to Thunderbird or SeaMonkey.</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2010/02/12/combining-thunderbird-with-spamassassin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My uber-cautious checkin procedure</title>
		<link>http://mesquilla.com/2010/02/10/my-uber-cautious-checkin-procedure/</link>
		<comments>http://mesquilla.com/2010/02/10/my-uber-cautious-checkin-procedure/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 17:50:44 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=604</guid>
		<description><![CDATA[Since I see that checkin errors are fairly common, and a poorly controlled source of potential issues in Mozilla code, I developed my own written process that I follow whenever I do checkins. It&#8217;s probably over cautious, with a practice checkin locally before I do the real thing, but here it is in case anyone [...]]]></description>
			<content:encoded><![CDATA[<p>Since I see that checkin errors are fairly common, and a poorly controlled source of potential issues in Mozilla code, I developed my own written process that I follow whenever I do checkins. It&#8217;s probably over cautious, with a practice checkin locally before I do the real thing, but here it is in case anyone else is interested. This is my actual text, with little massaging for general audiences:</p>
<p>====<br />
Check tinderbox for current checkin status and burns</p>
<p>(cd pristine/src) [This is a directory containing a clone of comm-central from mozilla]<br />
hg pull &#8211;u</p>
<p>(cd mozpush/src) [This is a directory containing a clone of my local pristine repository]</p>
<p>hg pull &#8211;u</p>
<p>(If there are problems, create a new mozpush directory, and do<br />
hg clone /s/tb/pristine/src src)</p>
<p>hg import /f/tb/patch/name.patch<br />
(above starts notepad, give bug &amp; approvals and save)<br />
hg outgoing -p<br />
(check that the patch and comment are correct)<br />
hg push</p>
<p>(cd pristine/src)<br />
hg pull &#8211;rebase<br />
(if changes, you may need hg update, or hg rebase -s revision -d revision)<br />
hg outgoing -p</p>
<p>(if everything looks good)<br />
hg push</p>
<p>Go to http://hg.mozilla.org/comm-central/shortlog and get the diff link for the push, something like:</p>
<p>http://hg.mozilla.org/comm-central/rev/324e7b178ad7</p>
<p>(or http://hg.mozilla.org/releases/comm-1.9.1/shortlog )</p>
<p>Go to bug, comment on checked-in attachment with above link.</p>
<p>Mark resolved/fixed, and add the appropriate pristine/src Target Milestone.</p>
<p>(when you checkin to comm-1.9.1, please set the status-thunderbird3.0 field to &#8220;.1-fixed&#8221; (or whatever the appropriate dot release is)</p>
<p>Follow tinderboxes.</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2010/02/10/my-uber-cautious-checkin-procedure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Toward mailnews Exchange Web Services support: SOAP calls</title>
		<link>http://mesquilla.com/2010/02/01/toward-mailnews-exchange-web-services-support-soap-calls/</link>
		<comments>http://mesquilla.com/2010/02/01/toward-mailnews-exchange-web-services-support-soap-calls/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 22:28:51 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Exchange Web Services (EWS)]]></category>
		<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=593</guid>
		<description><![CDATA[I&#8217;ve embarked on an effort to investigate adding support for Exchange server to the mailnews code. Although Exchange in Windows has traditionally used port 135-based protocols, my understanding is that the future for them is SOAP-based Exchange Web Services (EWS). As a first step, I wanted to get a basic SOAP library working in current [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve embarked on an effort to investigate adding support for Exchange server to the mailnews code. Although Exchange in Windows has traditionally used port 135-based protocols, my understanding is that the future for them is SOAP-based Exchange Web Services (EWS). As a first step, I wanted to get a basic SOAP library working in current mailnews code.</p>
<p>I considered a variety of approaches to this. One extension &#8220;Asertiva Thunderbird Extension for Sugar&#8221; uses the IBM/Prototype js library for SOAP access. Others recommended that I consider one of the open source SOAP libraries, such as a python-based library, or Apache&#8217;s AXIS2 library. Or that I cooperate with the existing project to provide an open-source method of accessing Exchange server.</p>
<p>But I&#8217;m not sure of how &#8220;open source&#8221; I want all of this to be. From my perspective, &#8220;open source&#8221; as a charitable activity is not successful. We all need to eat, and so the revenue model needs to be clear if a project is going to be more than a phase of life I am going through at the moment. So I would rather keep my options open until I understand that better. Anyway, that&#8217;s a long discussion which is beyond the scope of the current posting, which is supposed to be a status update.</p>
<p>I am still in an education phase, trying to understand SOAP and the related protocols, and to figure out what exactly I gain from using any existing library versus doing things more directly from the raw XML. So as both a trial and education step (and against the recommendation of others I might add) I&#8217;ve tried to update the old Gecko webservices extension to work in current Gecko 1.9.2, and to work with some current Microsoft SOAP protocols.</p>
<p>Rather than start with EWS, I started with the simpler BING search calls. I used existing Microsoft demos in C#, and could capture the communications using Wireshark to see what I was supposed to be sending and receiving.</p>
<h3>Updating the abandoned webservices extension to Gecko 1.9.2</h3>
<p>After testing webservices some under an old Firefox 2 build, I upgraded portions of the code to work under a current comm-central trunk build, using Gecko 1.9.2. My requirements are somewhat simpler than the original extension:</p>
<ol>
<li> Most importantly, my target is chrome-based extensions rather than browser code, so a lot of the security issues that FF folks worried about were not important to me.</li>
<li>I had no interest also in allowing native JS creation of components, as I could rely on using .createInstance calls instead.</li>
<li>At least initially, I am not supporting the reading of wsdl files, nor the associated automatic creation of proxy calls and interfaces. Instead, I read in a schema file, and generate my own code for each method. My understanding is that Microsoft, in their EWS libraries, also does not actually automatically generate method calls from a WSDL-based proxy, but follows this same approach of starting with the schema files.</li>
</ol>
<p>That allowed me to avoid about half of the existing code, and focus on the /schema and /soap directories of the webservices extension.</p>
<p>Looking at my hg logs, it took one week of development time, and 17 patches to get to the point where I could write a unit test under Gecko 1.9.2, and confirm that I could create webservices components using a unit test. (I&#8217;m doing things in a test-driven development fashion, writing XPCSHELL unit tests to try out different features of webservices.)</p>
<h3>Learning and testing Gecko webservices</h3>
<p>Although there was a little old documentation around on Gecko webservices, ultimately I just needed to learn things the old fashioned way, reading the code and its interfaces and experimenting to see what worked. I took little baby steps, starting first with an <a href="http://www.w3.org/TR/xmlschema-0/">XML schema primer</a> and eventually working my way toward duplicating the functionality in some <a href="http://msdn.microsoft.com/en-us/library/dd251024.aspx">Microsoft Bing search demo C# code</a>. This phase, starting from the first demonstration of loading of SOAP components under Gecko 1.9.2 through testing of encoding and decoding of a Bing search message, took about 2 weeks of coding and 23 patches, with the creation of 22 unit tests in the process.</p>
<p>The main issue that I had to deal with in the existing SOAP code is that it did not support maxOccurs&gt;1 schema types, such as this one from the Bing schema:</p>
<pre>&lt;xsd:complexType name="ArrayOfNewsArticle"&gt;
  &lt;xsd:sequence&gt;
    &lt;xsd:element minOccurs="0" maxOccurs="unbounded"
                 name="NewsArticle" type="tns:NewsArticle" /&gt;
  &lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;</pre>
<p>I solved this by using an nsIArray to hold multiple values of the same element.</p>
<h3>Sample Code</h3>
<p>So now I can do a Bing search in an XPCSHELL test, and decode and test the results. I want to show some of the js that I use, to give some idea of the complexity (or lack thereof) of using this.</p>
<p>I create a class BingSearch, then encode some values to setup the search. A basic call for a search looks like this:</p>
<pre>function run_test()
{
 do_test_pending();
 getNews = new BingSearch();
 getNews.Query = "obama";
 getNews.Options = ["EnableHighlighting"];
 getNews.Sources = ["News"];
 getNews.News = {Offset: 0, SortBy: "Relevance", Count: 1};
 getNews.invoke(getNewsListener);
}
</pre>
<p>The &#8220;BingSearch&#8221; object is presumably what a sophisticated library would create automatically from the WSDL file. Instead, I create it by hand. Here&#8217;s my partial implementation, that does not support all of the allowed inputs to a Bing search, but works for my tests:</p>
<pre>function BingSearch()
{
 // defaults
 this.Version = "2.0";
 this.AppId = "&lt;you get this from Microsoft for your application&gt;";
 this.Market = "en-us";
}

BingSearch.prototype = new BingBase();

BingSearch.prototype.invoke = function BingSearch_invoke(aSOAPResponseListener)
{
 let parametersBag = objectPropertyBag({
   Version: this.Version,
   Market: this.Market,
   Query: this.Query,
   AppId: this.AppId,
   Options: arrayPropertyBag("SearchOption", this.Options),
   Sources: arrayPropertyBag("SourceType", this.Sources),
   News: objectPropertyBag(this.News)
 });

 // soap message component
 let soapCall = Cc["@mozilla.org/xmlextras/soap/call;1"]
                  .createInstance(Ci.nsISOAPCall);
 let parameters = [];
 parameters.push(new soapParameter("parameters",
                   parametersBag,
                   this._schema.getTypeByName('SearchRequest')));
 soapCall.encode(Ci.nsISOAPMessage.VERSION_1_2,
                 'SearchRequest',
                 this._schema.targetNamespace,
                 0, null, // header blocks
                 parameters.length, parameters);
 soapCall.transportURI = "http://api.bing.net:80/soap.asmx";
 soapCall.encoding = this._encoding;
 soapCall.asyncInvoke(aSOAPResponseListener);
}

const kSchema = {
 file: 'data/bing20.xsd',
 schemaNamespace: 'http://www.w3.org/2001/XMLSchema',
 targetNamespace: 'http://schemas.microsoft.com/LiveSearch/2008/03/Search'
 }

function BingBase()
{
 if (typeof this._schema == "undefined")
 {
   this._schema = getSchema(kSchema);
   // use the 2001 SOAP encoder
   this._encoding = Cc["@mozilla.org/xmlextras/soap/encoding;1"]
                      .createInstance(Ci.nsISOAPEncoding);
   this._encoding.getAssociatedEncoding("http://www.w3.org/2001/09/soap-encoding", true);
   this._encoding.schemaCollection = this._schema.collection;
 }
}
</pre>
<p>So far, the complexity of this does not seem unmanageable to me. I&#8217;ve only shown the endoding step. Decoding the response consists of a creating a call-specific translator similar to the &#8220;BingSearch.prototype.invoke&#8221; function above, which relies on the webservices soap library decode method. All of the other functions I&#8217;ve created (such as arrayPropertyBag) are not at all specific to the nature of the SOAP interface being used. I am not seeing the need to process the WSDL file automatically and generate proxy functions.</p>
<p>I&#8217;m not yet convinced that this resurrection of the old webservices library is the right approach, but I am not seeing any obstacles to using it either. I can generate and decode soap calls fairly efficiently, debug issues that arise, plus I have code that will integrate fairly easily with either javascript or C++ code in a Gecko chrome environment.</p>
<h3>Next steps</h3>
<p>I&#8217;m trying to decide on the next step toward moving this forward. I&#8217;m leaning toward attempting a specific EWS application, such as read-only access to an Exchange calendar as a Lightning extension. Another option might be to add some core mailnews hooks to allow me to create either message accounts or addressbooks using an extension &#8211; though I&#8217;m hoping jcranmer will <a href="http://quetzalcoatal.blogspot.com/2010/01/developing-new-account-types-part-0.html">beat me to it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2010/02/01/toward-mailnews-exchange-web-services-support-soap-calls/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>QA -&gt; Developers communication</title>
		<link>http://mesquilla.com/2010/01/22/qa-developers-communication/</link>
		<comments>http://mesquilla.com/2010/01/22/qa-developers-communication/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 18:44:06 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=588</guid>
		<description><![CDATA[A few weeks ago on IRC dmose and I discussed the general issue of how QA communicates priorities to developers. I&#8217;d like to hear some comments on that from others, and possibly participate in some sort of trial of improvements.
The issue here is that I see lots of good work going on by people who [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago on IRC dmose and I discussed the general issue of how QA communicates priorities to developers. I&#8217;d like to hear some comments on that from others, and possibly participate in some sort of trial of improvements.</p>
<p>The issue here is that I see lots of good work going on by people who are mostly involved in QA, such as wsmwk, WADA, and Ludo, but I as a developer don&#8217;t really know how to make the best use of that work.</p>
<p>I assume there is supposed to be a waterfall here, from (bug reporter)-&gt;(QA)-&gt;(developer)-&gt;(code reviewer)-&gt;(bug landing). I understand all of the steps of the process except this (QA)-&gt;(developer) handoff. I would be curious to hear from people involved in QA about what they view the main outcome of their work is supposed to be, as viewed by a developer.</p>
<p>Here&#8217;s what my understanding is of the current process. After bugs are submitted, QA has three main responsibilities: 1) get the bug in the correct component, 2) move the status to NEW or one of the inactive states (DUPE, INVALID, etc.) 3) clarify the bug information to get clear steps to reproduce.</p>
<p>Is this accurate?</p>
<p>Let&#8217;s look to see how that is working by looking at my recent work. In the last three months, I fixed eight bugs (that&#8217;s a little off my desired pace, but we were frozen a lot of that time). What brought those bugs to my attention?</p>
<p>(3) bugs I reported myself, either due to issues I observed or as a result of following support forums.</p>
<p>(3) bugs are fixes of crashes that wsmwk reported from crash stats</p>
<p>(2) bugs were filed earlier by others. If I recall correctly, both of those bugs were items that I noticed first in support forums, then located the bug in Bugzilla and fixed it.</p>
<p>In no cases did the standard QA waterfall process play a significant role in bringing a bug to my attention. And that concerns me, because I see some very competent and dedicated people working hard on QA, but I don&#8217;t seem to be making effective use of that work.</p>
<p>Am I somehow not following the process that I am supposed to be following, or is that process flawed? In theory I am probably in a better position than most people here, because I primarily track items that appear in the mailnews core/filters component.</p>
<p>I wish there was a clear way for the QA people to bring a limited number of bugs to my attention that are 1) important, 2) clearly defined and reproducible, and 3) likely to be fairly easy to fix.</p>
<p>The mailnews core/filters category currently has 326 NEW/ASSIGNED/REOPENED bugs in it. I could probably fix a few per month that were brought to my attention. A reasonable expectation might be that 10% of those are addressed in the next year. How are the QA folks supposed to influence the selection of which 32 bugs actually get my attention?</p>
<p>(posted to http://mesquilla.com and m.d.a.thunderbird, followup to m.d.a.thunderbird please.)</p>
<p>rkent</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2010/01/22/qa-developers-communication/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>TaQuilla 0.3.0 released</title>
		<link>http://mesquilla.com/2009/12/22/taquilla-0-3-0-released/</link>
		<comments>http://mesquilla.com/2009/12/22/taquilla-0-3-0-released/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 19:15:30 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>
		<category><![CDATA[TaQuilla]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=569</guid>
		<description><![CDATA[I&#8217;ve just uploaded a new version of TaQuilla to Mozilla&#8217;s add-on site. You can download it here. It is still listed as experimental status, so updates are not automatic. Details of the changes in this revision are available here, but briefly it mostly adds some user interface consolidations for consistency, plus support for Thunderbird 3.0 [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just uploaded a new version of <a href="http://mesquilla.com/extensions/taquilla/">TaQuilla</a> to Mozilla&#8217;s add-on site. You can download it <a href="https://addons.mozilla.org/en-US/thunderbird/addon/10905">here</a>. It is still listed as experimental status, so updates are not automatic. Details of the changes in this revision are available <a href="http://mesquilla.com/extensions/taquilla/taquilla-revisions/">here</a>, but briefly it mostly adds some user interface consolidations for consistency, plus support for Thunderbird 3.0 and SeaMonkey 2.0.</p>
<p>Frankly, I&#8217;ve struggled to find a good personal use of TaQuilla for use in my dogfooding. I&#8217;ve tried using it to <a href="http://mesquilla.com/2009/03/15/automatically-determining-interesting-rss-feed-posts/">categorize &#8220;interesting&#8221; posts</a>, but I can&#8217;t even agree myself from day-to-day what is &#8220;interesting&#8221;, and the soft tagging is even more indecisive. But I&#8217;ve finally hit on a good use for it in my workflow &#8211; rejecting of sports articles in newsfeeds!</p>
<p>I have an RSS feed that subscribes to local news for the &#8220;Seattle Times&#8221; newspaper, but I find a lot of the articles are sports related. Now I am a certified geek, and not really interested in those types of articles. So what I did is to create a tag &#8220;Sports&#8221;, then I setup TaQuilla soft tags for &#8220;Sports&#8221; on the RSS feed, create a virtual folder that filters out articles tagged with &#8220;Sports&#8221;, and voila I can read the newspaper feed without all of those annoying sports articles. It&#8217;s particularly useful since many of the same articles get updated multiple times, and the updates are very efficiently rejected with the bayes filter if I tag the original.</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2009/12/22/taquilla-0-3-0-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FiltaQuilla 1.0.0 released, adds custom search terms</title>
		<link>http://mesquilla.com/2009/12/02/filtaquilla-1-0-0-released-adds-custom-search-terms/</link>
		<comments>http://mesquilla.com/2009/12/02/filtaquilla-1-0-0-released-adds-custom-search-terms/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 06:37:35 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Extensions]]></category>
		<category><![CDATA[FiltaQuilla]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=512</guid>
		<description><![CDATA[Well I finally decided to quit adding new stuff, and just get a compatible FiltaQuilla out the door that works with Thunderbird 3.0 and SeaMonkey 2.0. You can get the new version from Mozilla&#8217;s download site here.
In addition to some new filter actions (print, add sender to address list, and save attachments to a folder) [...]]]></description>
			<content:encoded><![CDATA[<p>Well I finally decided to quit adding new stuff, and just get a compatible <a href="http://mesquilla.com/extensions/filtaquilla/">FiltaQuilla</a> out the door that works with Thunderbird 3.0 and SeaMonkey 2.0. You can get the new version from Mozilla&#8217;s download site <a href="https://addons.mozilla.org/en-US/thunderbird/addon/10052">here</a>.</p>
<p>In addition to some new filter actions (print, add sender to address list, and save attachments to a folder) this release introduces &#8220;custom search terms&#8221; for the first time. This is a new feature that has been added recently to the mailnews core code, and is part of the TB 3.0 and SM 2.0 releases.</p>
<p>The search I am talking about is the old-style Thunderbird search, not the newer global database (gloda) search that was added to Thunderbird. Gloda gets all of the press, but we&#8217;ve also taught the old style search a few tricks as well! These are particularly useful in saved searchs (also called virtual folders).</p>
<p>I think that the most interesting new capability is that you can define a search (and therefore a virtual folder) by adding a few lines of javascript code that does precisely what you want. Let me give a very simple example.</p>
<p>Let&#8217;s assume that you want a virtual  folder to contain all of the active items that you currently need to process involving projects. Incoming emails are marked with tags, either manually or by some sort of filter. You define new tags for each project, and each tag begins with &#8220;pro&#8221; and ends with some sort of project marker, say a number or word. You want to have your active folder contain messages that have a tag containing &#8220;pro&#8221;, but NOT include messages that are tagged &#8220;done&#8221;.</p>
<p>The standard mailnews tag search forces you to enter the tag name for each tag that you want. There is no way to search for tags by the characters in the tags. Plus, searching for several tags is an OR function, and saying to not include DONE messages is an AND function. But the standard mailnews search does not handle complex boolean searches.</p>
<p>The javascript custom search comes to the rescue! Go to the folder that contains the messages that you want, and select the Javascript search term:</p>
<p><img class="alignnone size-full wp-image-513" title="Search Javascript search term" src="http://mesquilla.com/wp-content/uploads/2009/12/SearchJavascript.jpg" alt="Search Javascript search term" width="577" height="194" /></p>
<p>Click on the script icon <img class="alignnone size-full wp-image-494" title="Script edit button" src="http://mesquilla.com/wp-content/uploads/2009/12/script_edit.png" alt="Script edit button" width="16" height="16" /> and you will get a small editor window, where you can enter a few lines of javascript. All that we need to do is grab the string that has the tags in it, and make sure it includes &#8220;pro&#8221; but does not include &#8220;done&#8221;. Our javacript is given a variable &#8220;message&#8221; which is the database header object that can be used to get message properties. We need to execute an expression as the last statement, whose value is either <strong>true</strong> if we want the message, or<strong> false </strong>if we do not. That&#8217;s just the following two lines of javascript:</p>
<pre style="padding-left: 30px;">let tags = message.getStringProperty('keywords');
(/pro/.test(tags) &amp;&amp; !(/done/.test(tags));</pre>
<p>So here&#8217;s what our javascript window and code looks like:</p>
<p><img class="alignnone size-full wp-image-514" title="Enter Javascript code" src="http://mesquilla.com/wp-content/uploads/2009/12/EnterJavascript.jpg" alt="Enter Javascript code" width="489" height="156" /></p>
<p>Now save this as a virtual folder, and you have the exact virtual folder that you want!</p>
<p>OK, this is just for geeks, but it is really powerful in letting you define folders that can precisely define the workflow that you want. There&#8217;s also a few other geek-friendly search terms, including the much-requested regular expression search by subject or other header. For details, see the updated <a href="http://mesquilla.com/extensions/filtaquilla/">FiltaQuilla page</a> on this site.</p>
<p>FiltaQuilla is still in experimental status, though I have now nominated it to be public. Still it may be a few weeks before it gets there. If you are an existing FiltaQuilla user, you will need to go to the <a href="https://addons.mozilla.org/en-US/thunderbird/addon/10052">download page</a> directly and download and install the new version.</p>
<p>Enjoy!</p>
<span class="sfforumlink"><a href="http://mesquilla.com/forum/filtaquilla/filtaquilla-1-0-0-released-adds-custom-search-terms/"><img src="http://mesquilla.com/wp-content/plugins/simple-forum/styles/icons/default/bloglink.png" alt="" /> Join the forum discussion on this post</a> - (1) Posts</span>]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2009/12/02/filtaquilla-1-0-0-released-adds-custom-search-terms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bad effects on junk training corpus from change</title>
		<link>http://mesquilla.com/2009/12/02/bad-effects-on-junk-training-corpus-from-change/</link>
		<comments>http://mesquilla.com/2009/12/02/bad-effects-on-junk-training-corpus-from-change/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 17:41:04 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=499</guid>
		<description><![CDATA[I&#8217;ve been tracking some difficulties in my junk analysis recently, which was caused when I enabled some experimental changes to tokenization. (I added full tokenization of the Received: and x-spam-status: headers). At the same time, I started some experiments where I am automatically training certain incoming emails as good.
What I am seeing is that the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been tracking some difficulties in my junk analysis recently, which was caused when I enabled some experimental changes to tokenization. (I added full tokenization of the Received: and x-spam-status: headers). At the same time, I started some experiments where I am automatically training certain incoming emails as good.</p>
<p>What I am seeing is that the common, unchanging words in the Received: header, like &#8220;received:from&#8221; and &#8220;received:(exim&#8221;, are persistently occurring with a moderate &#8220;good&#8221; score, such as 36, even after training junk messages with those headers. There are a lot of these little meaningless tokens per message though, and they are dragging down the junk score of junk messages into the Uncertain category.</p>
<p>I think what is happening is this, and it could be caused by any change in your common environment. I started adding new tokens such as &#8220;received:from&#8221;, without restarting training. Because I also started training temporarily many more good messages than junk, these new tokens are showing up disproportionately as good.</p>
<p>Suppose, for example, I start with 1000 good messages and 1000 junk messages in my corpus, then suddenly add a new token to all incoming emails. Then I train 100 good messages with that new token, and 10 junk messages. The spam corpus will claim that the new token appears in 10% of good emails, but only 1% of junk emails, so the presence of that token is a marker that the message is more likely to be good. Which is not true, since now ALL emails have that new token!</p>
<p>I suppose that one defense against this would be to make sure that the proportion of good and junk emails trained always stays about the same. That is not easy to do, however.</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2009/12/02/bad-effects-on-junk-training-corpus-from-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extension driven development</title>
		<link>http://mesquilla.com/2009/11/28/extension-driven-development/</link>
		<comments>http://mesquilla.com/2009/11/28/extension-driven-development/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 07:37:49 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Extensions]]></category>
		<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet Mozilla]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=479</guid>
		<description><![CDATA[What then do I mean by &#8220;extension driven development&#8221;? It is the concept of changing the way that Thunderbird is developed and distributed, with a bare minimum set of core code, and the main features presented as a set of extensions, shipped with the product,  that can be enabled or disabled by users.
I don&#8217;t have [...]]]></description>
			<content:encoded><![CDATA[<p>What then do I mean by &#8220;extension driven development&#8221;? It is the concept of changing the way that Thunderbird is developed and distributed, with a bare minimum set of core code, and the main features presented as a set of extensions, shipped with the product,  that can be enabled or disabled by users.</p>
<p>I don&#8217;t have any illusions that this has a significant chance of being implemented, and I&#8217;m not even sure it&#8217;s a good idea myself. But I ask you to suspend disbelief for a minute, and imagine a change to the development culture and process.</p>
<p>An email client is different from a web client in many ways, but one significant way is that there is no real need for a fat uniform core product that developers can target (such as web developers for FireFox). So we are free to allow wide changes in our product configuration that would not make sense for FireFox. There is really no fundamental need for Thunderbird to be presented as a single, fat, feature-laden client.</p>
<p>Instead, ship Thunderbird as a minimal base with a collection of extensions. The extensions could be in a variety of statuses. At one status extreme, &#8220;Core&#8221; extensions would be enabled by default, would be fully localized, and their updates would be shipped with updates to the core product, rather than through AMO. Many existing core features would be converted into &#8220;Core&#8221; extensions that could be disabled if desired (for example bayes junk processing, or gloda.) At the other extreme, &#8220;Pilot&#8221; extensions would be shipped with the core product in a disabled state, would be updated by AMO, and not fully localized. There would also be &#8220;Standard&#8221; extensions that are shipped with the product, not maintained through AMO, but would not be enabled by default. Lightning might be one example of this. FiltaQuilla or JunQuilla could easily get added to this category in the future, or popular extensions like ThunderBrowse.</p>
<p>So why would you do such a crazy thing? For several reasons.</p>
<p>First, you would have a path to add features to the program that is not as generally disruptive as has been, for example, gloda or the new message header. By not using a new extension, an existing user would not see changes to their workflow that they did not want or appreciate. Also, new features need not delay the release of new versions of Thunderbird, as &#8220;Pilot&#8221; status extensions could be updated through AMO.</p>
<p>Second, new complex features like gloda, even though they are developed by the core team (well mostly asuth) are in a state of rapid flux, and would really benefit from allowing updates more frequently than even the accelerated release process will allow.</p>
<p>Third, you provide a natural path for outside developers to add contribution to the product without having to completely submerge themselves in the Mozilla culture, or give up complete control of their creation.</p>
<p>Fourth, this really recognizes that the use of an email client is highly personal. Basic users could be presented a basic email client. Advanced users could easily add advanced features. (Existing AMO-based extensions are also good for this, but the quality is not uniform, and they frequently are not kept up to date. And the standard product is still very fat with lots of features that are unneeded by most users.)</p>
<p>Fifth, this would solve the serious issue with Thunderbird of how hard it is for the average user to install addons (because the most popular and important addons would be shipped with the product).</p>
<p>There&#8217;s another dimension to this, and that is the developer&#8217;s relationship with his or her extension. I know that I feel a responsibility for my extensions that is beyond the responsibility I feel for any core code. You can see that in the documentation that I provide, and my reliability in responding to issues. I think that many other extension developers are like that as well. I&#8217;m guessing that they would be delighted to see a higher level of promotion of their work, without the need to cede complete control that incorporation in core might involve.</p>
<p>I suppose I could write a book on what this might look like, but for now let me leave it here.</p>
<p>rkent</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2009/11/28/extension-driven-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Maybe I need a search extension &#8211; SearchaQuilla?</title>
		<link>http://mesquilla.com/2009/11/20/maybe-i-need-a-search-extension-searchaquilla/</link>
		<comments>http://mesquilla.com/2009/11/20/maybe-i-need-a-search-extension-searchaquilla/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 19:13:12 +0000</pubDate>
		<dc:creator>rkent</dc:creator>
				<category><![CDATA[Extensions]]></category>
		<category><![CDATA[FiltaQuilla]]></category>
		<category><![CDATA[Mailnews development]]></category>
		<category><![CDATA[Planet MozillaMessaging]]></category>

		<guid isPermaLink="false">http://mesquilla.com/?p=461</guid>
		<description><![CDATA[The last few weeks I&#8217;ve been adding custom search terms to my FiltaQuilla extension using the new nsIMsgSearchCustomTerm interface, which can then be used in searches, virtual folders, or filters. But I keep coming up with new things that I want to do. That delays my packaging of FiltaQuilla 1.0.0 for non-experimental release. Maybe I [...]]]></description>
			<content:encoded><![CDATA[<p>The last few weeks I&#8217;ve been adding custom search terms to my <a href="http://mesquilla.com/category/extensions/filtaquilla/"></a><a href="http://mesquilla.com/extensions/filtaquilla/">FiltaQuilla</a> extension using the new <a href="http://mxr.mozilla.org/comm-central/source/mailnews/base/search/public/nsIMsgSearchCustomTerm.idl">nsIMsgSearchCustomTerm</a> interface, which can then be used in searches, virtual folders, or filters. But I keep coming up with new things that I want to do. That delays my packaging of FiltaQuilla 1.0.0 for non-experimental release. Maybe I should quit adding this stuff to FiltaQuilla (which is already pretty large with all of its filter actions) and define a new search-oriented extension, called probably SearchaQuilla?</p>
<p>So far, I have added the following new search terms:</p>
<p><strong>BCC</strong> &#8211; locate items in the BCC field</p>
<p><strong>Subject Regex</strong> &#8211; search the subject using a javascript regular expression</p>
<p><strong>Header Regex</strong> &#8211; search any specific header using a javascript regular expression</p>
<p><strong>Javascript</strong> &#8211; load javascript in a text field, and program your own search given an nsIMsgDBHdr object</p>
<p><strong>Tag of Thread Head</strong> &#8211; match a tag in the head of a message&#8217;s thread</p>
<p><strong>Tag of Thread Messages</strong> &#8211; match a tag near the message in its thread (within +/- 10 messages by default)</p>
<p><strong>Address in Thread</strong> &#8211; match an address near the message in its thread (within +/- 10 messages by default)</p>
<p>This stuff can be useful outside of filters, in fact I am mostly using them personally to define virtual folders. So I&#8217;ll probably move them to a new extension, and try to get FiltaQuilla out the door finally.</p>
<p>rkent</p>
]]></content:encoded>
			<wfw:commentRss>http://mesquilla.com/2009/11/20/maybe-i-need-a-search-extension-searchaquilla/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
