Mailing list archives: November 2004

Site index · List index
Message listThread · Author · Date
detail.makeLabel(parcel, _(u'link'), borderTop=2), + detail.makeSpacer(parcel, width=8), + detail.makeEditor(parcel, 'link', + viewAttribute=u'link', + border=RectType(0,2,2,2), + readOnly=True), + ], + ).install(parcel), </span><span class="cx"> </span><span class="rem">- # Author area - pair("AuthorArea", viewAttribute=u"author", position=0.19, - childrenBlocks = [ - label("AuthorLabel", title=u"author"), - field("AuthorAttribute", title=u"author"), - ] - ), </span><span class="add">+ # Date area + detail.makeArea(parcel, "DateArea", + position=0.4, + childrenBlocks = [ + detail.makeLabel(parcel, _(u"date"), borderTop=2), + detail.makeSpacer(parcel, width=8), + detail.makeEditor(parcel, 'date', + viewAttribute=u'date', + border=RectType(0,2,2,2), + readOnly=True, + stretchFactor=0.0, + size=SizeType(90, -1)), + ], + ).install(parcel), </span><span class="cx"> </span><span class="rem">- # Date area - pair("DateArea", viewAttribute=u"date", position=0.4, - childrenBlocks = [ - label("DateLabel", title=u"date"), - DateDetail.update(parcel, "DateAttribute", - title=u"date", - characterStyle=blocks.LabelStyle, - stretchFactor=0.0, - textAlignmentEnum="Left", - ), - ], - ), </span><span class="add">+ detail.makeSpacer(parcel, height=7, position=0.8999).install(parcel), + + FeedItemDetail.update(parcel, "ItemBodyArea", + position=0.9, + blockName="articletext", + size=SizeType(100,50), + minimumSize=SizeType(100,50), + ), + ] </span><span class="cx"> </span><span class="rem">- # Category - pair("CategoryArea", viewAttribute=u"category", - position=0.2, - childrenBlocks = [ - label("CategoryLabel", title=u"category"), - field("CategoryAttribute", - title=u"category", stretchFactor=1.0 - ), - ] - ), - ], </span><span class="add">+ + # The DetailTrunkSubtree ties the blocks to our FeedItem's Kind. + detail.DetailTrunkSubtree.update(parcel, "ChannelSubtree", + + # This ensures that this detail view gets attached to feed items + key = feeds.FeedItem.getKind(parcel.itsView), + rootBlocks = feedItemRootBlocks, </span><span class="cx"> ) </pre> <p /> </span><span class="rem">-Each <code>rootBlocks</code> attribute refers to a widget or fragment of user interface which will be displayed in the Detail View. Chandler will ensure that these user interface fragments will display and edit the correct data in a consistent way. </span><span class="add">+The <code>rootBlocks</code> attribute of the <code>DetailTrunkSubtree</code> refers to a widget or fragment of user interface which will be displayed in the Detail View. Chandler will ensure that these user interface fragments will display and edit the correct data in a consistent way. For the details on the feedItemRootBLocks, you'll need to look at the <a href="http://chandler.osafoundation.org/docs/0.6/feeds-tutorial.html">feeds tutorial</a>. You cand find a list of all the available blocks <a href="cpia-blocks.html">here</a>. </span><span class="cx"> <p /> <h2><a name="Loading_the_Items_into_Chandler"> </a><a name="Loading_the_Items_into_Chandler_"> </a> Loading the Items into Chandler: Parcels </h2> <p /> </span><span class="lines">@@ -484,20 +369,20 @@ </span><span class="cx"> <p /> <strong>Behind the scenes:</strong> The Python code for Kinds and Items is merely a bootstrapping mechanism to get data loaded into the Repository. The Repository is the primary data store that Chandler uses to keep all user data, schemas, and more. If data that is declared in your Parcel is changed within the Repository, those changes will <em>not</em> be serialized back the Python code in your Parcel.. <p /> </span><span class="rem">-<h2><a name="Where_Chandler_is_today"> </a> Where Chandler is today </h2> </span><span class="add">+<h2><a name="Where_Chandler_is_today"> </a> Where we've been</h2> </span><span class="cx"> <p /> In this paper, you have seen how to: <p /> <ul> </span><span class="rem">-<li> Define new data types </span><span class="add">+<li> Define new data types by declaring kinds </span><span class="cx"> </li> </span><span class="rem">-<li> Populate the repository with new data </span><span class="add">+<li> Populate the repository with new data using the <code>update</code> method </span><span class="cx"> </li> <li> Display that data in the Sidebar, Summary View, and Detail View </li> </ul> <p /> </span><span class="rem">-The next step is to spend some time developing your own data types and application behavior. The steps described here will get you some basic functionality out of your data but Chandler's true potential comes to light when you begin to explore some of its more advanced capabilities. When Items have been properly defined, many of these capabilities "just work" for your new Kind. </span><span class="add">+The next step is to spend some time developing your own data types and application behavior. The steps described here will get you some basic functionality out of your data but Chandler's true potential comes to light when you begin to explore some of its more advanced capabilities. When Items have been properly defined, many of these capabilities "just work" for your new Kind. Two examples of these capabilities are Sharing and Stamping. </span><span class="cx"> <p /> <h3><a name="Sharing"> </a> Sharing </h3> <p /> </span><span class="lines">@@ -513,7 +398,7 @@ </span><span class="cx"> <img src="http://wiki.osafoundation.org/pub/Documentation/BuildingChandlerParcels/mac_calendar_vertical.png" alt="mac_calendar_vertical.png" width="1024" height=&quot retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Sun, 26 Jan, 03:19
ssword=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Sun, 01 Sep, 04:58
ssword=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Sun, 01 Sep, 04:58
m.@osafoundation.org> cert, reconnectMethod) - -def displayIgnoreSSLErrorDialog(cert, err, reconnectMethod): - """ - Displays the invalid cert dialog. - """ - from osaf.framework.certstore import ssl - wxApplication = Globals.wxApplication - if wxApplication is not None: # test framework has no wxApplication - wxApplication.CallItemMethodAsync("MainView", 'callAnyCallable', - ssl.askIgnoreSSLError, False, cert, - err, reconnectMethod) - </span><span class="cx"> def NotifyUIAsync(message, logger=None, cl='setStatusMessage', *args, **keys): if logger is not None: logger(message) </span></pre></div> <a id="trunkchandlerparcelsosafsharingWebDAVpy"></a> <div class="modfile"><h4>Modified: trunk/chandler/parcels/osaf/sharing/WebDAV.py (15401 => 15402)</h4> <pre class="diff"> <span class="info">--- trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:38:04 UTC (rev 15401) +++ trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:49:08 UTC (rev 15402) </span><span class="lines">@@ -29,25 +29,22 @@ </span><span class="cx"> import zanshin.util import zanshin.http </span><span class="rem">-import wx </span><span class="cx"> import M2Crypto import chandlerdb import twisted.internet.error as error from twisted.internet import reactor </span><span class="rem">-import application.Globals as Globals </span><span class="cx"> import application.Utility as Utility from osaf.framework.certstore import ssl </span><span class="add">+from osaf.activity import ActivityAborted </span><span class="cx"> from osaf import messages import threading import logging import urllib from i18n import ChandlerMessageFactory as _ </span><span class="rem">-from osaf.mail.utils import displayIgnoreSSLErrorDialog, \ - displaySSLCertDialog, \ - callMethodInUIThread </span><span class="add">+from osaf.mail.utils import callMethodInUIThread +from osaf.framework.twisted import waitForDeferred </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerServerHandle(zanshin.webdav.ServerHandle): def __init__(self, host=None, port=None, username=None, password=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Mon, 03 May, 09:42
m.@osafoundation.org> cert, reconnectMethod) - -def displayIgnoreSSLErrorDialog(cert, err, reconnectMethod): - """ - Displays the invalid cert dialog. - """ - from osaf.framework.certstore import ssl - wxApplication = Globals.wxApplication - if wxApplication is not None: # test framework has no wxApplication - wxApplication.CallItemMethodAsync("MainView", 'callAnyCallable', - ssl.askIgnoreSSLError, False, cert, - err, reconnectMethod) - </span><span class="cx"> def NotifyUIAsync(message, logger=None, cl='setStatusMessage', *args, **keys): if logger is not None: logger(message) </span></pre></div> <a id="trunkchandlerparcelsosafsharingWebDAVpy"></a> <div class="modfile"><h4>Modified: trunk/chandler/parcels/osaf/sharing/WebDAV.py (15401 => 15402)</h4> <pre class="diff"> <span class="info">--- trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:38:04 UTC (rev 15401) +++ trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:49:08 UTC (rev 15402) </span><span class="lines">@@ -29,25 +29,22 @@ </span><span class="cx"> import zanshin.util import zanshin.http </span><span class="rem">-import wx </span><span class="cx"> import M2Crypto import chandlerdb import twisted.internet.error as error from twisted.internet import reactor </span><span class="rem">-import application.Globals as Globals </span><span class="cx"> import application.Utility as Utility from osaf.framework.certstore import ssl </span><span class="add">+from osaf.activity import ActivityAborted </span><span class="cx"> from osaf import messages import threading import logging import urllib from i18n import ChandlerMessageFactory as _ </span><span class="rem">-from osaf.mail.utils import displayIgnoreSSLErrorDialog, \ - displaySSLCertDialog, \ - callMethodInUIThread </span><span class="add">+from osaf.mail.utils import callMethodInUIThread +from osaf.framework.twisted import waitForDeferred </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerServerHandle(zanshin.webdav.ServerHandle): def __init__(self, host=None, port=None, username=None, password=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Mon, 03 May, 09:42
m.@osafoundation.org> cert, reconnectMethod) - -def displayIgnoreSSLErrorDialog(cert, err, reconnectMethod): - """ - Displays the invalid cert dialog. - """ - from osaf.framework.certstore import ssl - wxApplication = Globals.wxApplication - if wxApplication is not None: # test framework has no wxApplication - wxApplication.CallItemMethodAsync("MainView", 'callAnyCallable', - ssl.askIgnoreSSLError, False, cert, - err, reconnectMethod) - </span><span class="cx"> def NotifyUIAsync(message, logger=None, cl='setStatusMessage', *args, **keys): if logger is not None: logger(message) </span></pre></div> <a id="trunkchandlerparcelsosafsharingWebDAVpy"></a> <div class="modfile"><h4>Modified: trunk/chandler/parcels/osaf/sharing/WebDAV.py (15401 => 15402)</h4> <pre class="diff"> <span class="info">--- trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:38:04 UTC (rev 15401) +++ trunk/chandler/parcels/osaf/sharing/WebDAV.py 2007-10-05 21:49:08 UTC (rev 15402) </span><span class="lines">@@ -29,25 +29,22 @@ </span><span class="cx"> import zanshin.util import zanshin.http </span><span class="rem">-import wx </span><span class="cx"> import M2Crypto import chandlerdb import twisted.internet.error as error from twisted.internet import reactor </span><span class="rem">-import application.Globals as Globals </span><span class="cx"> import application.Utility as Utility from osaf.framework.certstore import ssl </span><span class="add">+from osaf.activity import ActivityAborted </span><span class="cx"> from osaf import messages import threading import logging import urllib from i18n import ChandlerMessageFactory as _ </span><span class="rem">-from osaf.mail.utils import displayIgnoreSSLErrorDialog, \ - displaySSLCertDialog, \ - callMethodInUIThread </span><span class="add">+from osaf.mail.utils import callMethodInUIThread +from osaf.framework.twisted import waitForDeferred </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerServerHandle(zanshin.webdav.ServerHandle): def __init__(self, host=None, port=None, username=None, password=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Mon, 03 May, 09:42
nen t reactor </span><span class="rem">-import application.Globals as Globals </span><span class="cx"> import application.Utility as Utility from osaf.framework.certstore import ssl </span><span class="add">+from osaf.activity import ActivityAborted </span><span class="cx"> from osaf import messages import threading import logging import urllib from i18n import ChandlerMessageFactory as _ </span><span class="rem">-from osaf.mail.utils import displayIgnoreSSLErrorDialog, \ - displaySSLCertDialog, \ - callMethodInUIThread </span><span class="add">+from osaf.mail.utils import callMethodInUIThread +from osaf.framework.twisted import waitForDeferred </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerServerHandle(zanshin.webdav.ServerHandle): def __init__(self, host=None, port=None, username=None, password=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Wed, 11 Jan, 14:11
od reactor </span><span class="rem">-import application.Globals as Globals </span><span class="cx"> import application.Utility as Utility from osaf.framework.certstore import ssl </span><span class="add">+from osaf.activity import ActivityAborted </span><span class="cx"> from osaf import messages import threading import logging import urllib from i18n import ChandlerMessageFactory as _ </span><span class="rem">-from osaf.mail.utils import displayIgnoreSSLErrorDialog, \ - displaySSLCertDialog, \ - callMethodInUIThread </span><span class="add">+from osaf.mail.utils import callMethodInUIThread +from osaf.framework.twisted import waitForDeferred </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerServerHandle(zanshin.webdav.ServerHandle): def __init__(self, host=None, port=None, username=None, password=None, useSSL=False, repositoryView=None): </span><span class="lines">@@ -83,52 +80,46 @@ </span><span class="cx"> try: return zanshin.util.blockUntil(callable, *args, **keywds) except Utility.CertificateVerificationError, err: </span><span class="add">+ self._reconnect = False + </span><span class="cx"> assert err.args[1] == 'certificate verify failed' # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Sat, 17 Aug, 17:33
sky # Reason why verification failed is stored in err.args[0], see # codes at http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) </span><span class="add">+ retry = lambda: True </span><span class="cx"> if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- handler = lambda: ssl.askTrustServerCertificate( - wx.GetApp().UIRepositoryView, </span><span class="add">+ d = ssl.askTrustServerCertificate( </span><span class="cx"> err.untrustedCertificates[0], retry) else: </span><span class="rem">- handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ d = ssl.askIgnoreSSLError( </span><span class="cx"> err.untrustedCertificates[0], err.args[0], retry) </span><span class="rem">- - self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.SSL.Checker.WrongHost, err: </span><span class="rem">- retry = (lambda: setattr(self, '_retry', True)) - - handler = lambda: ssl.askIgnoreSSLError( </span><span class="add">+ self._reconnect = False + + retry = lambda: True + + d = ssl.askIgnoreSSLError( </span><span class="cx"> err.pem, messages.SSL_HOST_MISMATCH % {'expectedHost': err.expectedHost, 'actualHost': err.actualHost}, retry) </span><span class="rem">- self._handleSSLError(handler, err, callable, *args, **keywds) - </span><span class="add">+ + if not waitForDeferred(d): + raise ActivityAborted(_(u"Cancelled by user")) + </span><span class="cx"> except M2Crypto.BIO.BIOError, err: # Translate the mysterious M2Crypto.BIO.BIOError raise error.SSLError(err) </span><span class="rem">- - def _handleSSLError(self, handler, err, callable, *args, **keywds): - self._reconnect = False - - if Globals.wxApplication is not None: # test framework has no wxApplication - handler() - - if hasattr(self, '_retry'): - del self._retry - else: - raise err </span><span class="cx"> </span><span class="rem">- </span><span class="cx"> class ChandlerHTTPClientFactory(zanshin.http.HTTPClientFactory): logLevel = logging.WARNING # Set to logging.INFO (on this class, or specific instances) </span><span class="lines">@@ -312,11 +303,13 @@ </span><span class="cx"> # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) if err.args[0] in ssl.unknown_issuer: </span><span class="rem">- displaySSLCertDialog(err.untrustedCertificates[0], self.reconnect) </span><span class="add">+ d = ssl.askTrustServerCertificate(err.untrustedCertificates[0], self.reconnect) </span><span class="cx"> else: </span><span class="rem">- displayIgnoreSSLErrorDialog(err.untrustedCertificates[0], - err.args[0], self.reconnect) </span><span class="add">+ d = ssl.askIgnoreSSLError(err.untrustedCertificates[0], + err.args[0], self.reconnect) </span><span class="cx"> </span><span class="add">+ waitForDeferred(d) + </span><span class="cx"> return result except Exception, e: # There is a bug in the M2Crypto code which needs </span><span class="lines">@@ -331,11 +324,12 @@ </span><span class="cx"> # the progress dialog will also kill the SSL error dialog. # Weird, huh? Welcome to the world of wx... callMethodInUIThread(self.callback, result) </span><span class="rem">- ssl.askIgnoreSSLError( err.pem, - messages.SSL_HOST_MISMATCH % \ - {'expectedHost': err.expectedHost, - 'actualHost': err.actualHost}, Sun, 11 Apr, 13:06
ulture Communication Technologie <a href="">tutorial</a> on the workings of the Feeds parcel that will explain more of the details of writing a parcel. </span><span class="add">+There is a more detailed <a href="http://chandler.osafoundation.org/docs/0.6/feeds-tutorial.html">tutorial</a> on the workings of the Feeds parcel that will fill in the details of writing a parcel. </span><span class="cx"> <p /> You can visit the Chandler home page for ideas on how to <a href="http://chandler.osafounation.org/getinvolved.php">get involved</a> with the Chandler project. <p /> </span> </pre> </div> </div> </body> </html> Sun, 26 Dec, 04:47
Message listThread · Author · Date
Box list
Jan 200827
Dec 2007224
Nov 2007217
Oct 2007105
Sep 200793
Aug 200727
Jul 2007105
Jun 2007108
May 2007292
Apr 2007276
Mar 2007275
Feb 2007303
Jan 2007183
Dec 2006232
Nov 2006183
Oct 200697
Sep 2006163
Aug 2006162
Jul 2006265
Jun 2006136
May 2006105
Apr 2006208
Mar 2006229
Feb 2006230
Jan 2006260
Dec 2005128
Nov 2005246
Oct 2005123
Sep 200572
Aug 200524
Jul 200517
Jun 20054
May 200520
Apr 20059
Mar 200519
Feb 200514
Jan 200548
Dec 200448
Nov 200410
Oct 20043
Aug 200411
Jul 20045
Jun 200412
May 20041
Apr 200421
Mar 200419
Feb 20047
Jan 200463
Dec 200344
Nov 200335
Oct 200343
Sep 200338
Aug 200354
Jul 200314
Jun 200360
May 2003125
Apr 2003117
Mar 2003166
Feb 2003220
Jan 2003408
Dec 2002297
Nov 2002728
Oct 2002479