-í ,„æ>csWdkTdklZdklZdklZdkZdk Z dfd„ƒYZ dS((s*(s threadutil(sInstanceLimitedThread(sUIBaseNs BaseFoldercsUtZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zdd„Zd „Z dd!„Z!d"„Z"d#„Z#d$„Z$e%d%„Z&RS(&Ncstƒ|_dS(N(sLocksselfsuidlock(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys__init__scs |iSdS(s Returns nameN(sselfsname(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetnamescsdSdS(s~Returns true if this folder suggests using threads for actions; false otherwise. Probably only IMAP will return true.iN((sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssuggeststhreads!scsdS(sŠFor threading folders, waits until there is a resource available before firing off a thread. For all others, returns immediately.N((sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys waitforthread&scs t‚dS(sXFor threading folders, returns the instancelimitname for InstanceLimitedThreads.N(sNotImplementedException(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetcopyinstancelimit+scsdSdS(sÖShould be true for any backend that actually saves message bodies. (Almost all of them). False for the LocalStatus backend. Saves us from having to slurp up messages just for localstatus purposes.iN((sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysstoresmessages0scs |iSdS(N(sselfsname(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetvisiblename6scs |iSdS(s9Returns the repository object that this folder is within.N(sselfs repository(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys getrepository9scs |iSdS(s=Returns the root of the folder, in a folder-specific fashion.N(sselfsroot(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetroot=scs |iSdS(s+Returns the separator for this folder type.N(sselfssep(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetsepAscs=|iƒo"|iƒ|iƒ|iƒSn |iƒSdS(N(sselfsgetrootsgetsepsgetname(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys getfullnameEs "csY|iƒ}|i|iiƒdƒ}tidd|ƒ}tidd|ƒ}|SdS(Ns.s/\.$s/dots^\.$sdot(sselfsgetnames foldernamesreplaces repositorysgetsepsressub(sselfs foldername((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetfolderbasenameKs  cs?|iƒtjo|iƒ|iƒjSn|iƒdSdS(Ni(sselfsgetsaveduidvaliditysNonesgetuidvalidityssaveuidvalidity(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysisuidvalidityokRs cs&tii|iiƒ|iƒƒSdS(N(sosspathsjoinsselfs repositorys getuiddirsgetfolderbasename(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys_getuidfilenameYscs‡t|dƒo |iSn|iƒ}tii|ƒ o t|_n5t |dƒ}t |i ƒi ƒƒ|_|iƒ|iSdS(Ns_base_saved_uidvaliditysrt(shasattrsselfs_base_saved_uidvaliditys_getuidfilenames uidfilenamesosspathsexistssNonesopensfileslongsreadlinesstripsclose(sselfsfiles uidfilename((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetsaveduidvalidity]s    cs‰|iƒ}|iƒ}|iiƒzOt|ddƒ}|i d|ƒ|i ƒt i |d|ƒ||_ Wd|iiƒXdS(Ns.tmpswts%d (sselfsgetuidvaliditysnewvals_getuidfilenames uidfilenamesuidlocksacquiresopensfileswritesclosesossrenames_base_saved_uidvaliditysrelease(sselfsnewvalsfiles uidfilename((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssaveuidvalidityis     cs t‚dS(N(sNotImplementedException(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetuidvalidityvscs t‚dS(s»Reads the message list from disk or network and stores it in memory for later use. This list will not be re-read from disk or memory unless this function is called again.N(sNotImplementedException(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyscachemessagelistyscs t‚dS(seGets the current message list. You must call cachemessagelist() before calling this function!N(sNotImplementedException(sself((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetmessagelistscs t‚dS(s-Returns the content of the specified message.N(sNotImplementedException(sselfsuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys getmessage„scs t‚dS(sÀWrites a new message, with the specified uid. If the uid is < 0, the backend should assign a new uid and return it. If the backend cannot assign a new uid, it returns the uid passed in WITHOUT saving the message. If the backend CAN assign a new uid, but cannot find out what this UID is (as is the case with many IMAP servers), it returns 0 but DOES save the message. IMAP backend should be the only one that can assign a new uid. If the uid is > 0, the backend should set the uid to this, if it can. If it cannot set the uid to that, it will save it anyway. It will return the uid assigned in any case. N(sNotImplementedException(sselfsuidscontentsflags((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys savemessageˆscs t‚dS(s,Returns the flags for the specified message.N(sNotImplementedException(sselfsuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysgetmessageflags›scs t‚dS(s4Sets the specified message's flags to the given set.N(sNotImplementedException(sselfsuidsflags((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssavemessageflagsŸscs]|i|ƒ}x-|D]%}||j o|i|ƒnqW|iƒ|i||ƒdS(s{Adds the specified flags to the message's flag set. If a given flag is already present, it will not be duplicated.N( sselfsgetmessageflagssuidsnewflagssflagssflagsappendssortssavemessageflags(sselfsuidsflagssflagsnewflags((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysaddmessageflags£s cs%x|D]}|i||ƒqWdS(N(suidlistsuidsselfsaddmessageflagssflags(sselfsuidlistsflagssuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysaddmessagesflags­scs\|i|ƒ}x,|D]$}||jo|i|ƒnqW|iƒ|i||ƒdS(sˆRemoves each flag given from the message's flag set. If a given flag is already removed, no action will be taken for that flag.N( sselfsgetmessageflagssuidsnewflagssflagssflagsremovessortssavemessageflags(sselfsuidsflagssflagsnewflags((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysdeletemessageflags±s  cs%x|D]}|i||ƒqWdS(N(suidlistsuidsselfsdeletemessageflagssflags(sselfsuidlistsflagssuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysdeletemessagesflags»scs t‚dS(N(sNotImplementedException(sselfsuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys deletemessage¿scs"x|D]}|i|ƒqWdS(N(suidlistsuidsselfs deletemessage(sselfsuidlistsuid((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pysdeletemessagesÂsic s;|otiƒi|iƒƒntiƒi|||ƒt } t }|i |ƒ} |i|ƒ}x;|D]3} | i|| |ƒ}|djo | } PnqnW| t jo…|omxfgi}|D]!} | | jo|| ƒnqÊ~D],}|i|| |ƒ|i|| |ƒqòWn|i|ƒndS(Ni(sregistersUIBases getglobaluisregisterthreadsselfsgetaccountnamescopyingmessagesuidsapplytosNones successobjects successuids getmessagesmessagesgetmessageflagssflagss tryappends savemessagesappends_[1]sxs appendservers deletemessage( sselfsuidsdestsapplytosregisters appendservers successuids_[1]sflagss successobjects tryappendsxsmessage((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssyncmessagesto_neguid_msgÆs.   "ÿc s4gi}|iƒiƒD]!}|djo||ƒnq~}g}t}|tjo|d}nx§|D]Ÿ}|o |i ƒol|i ƒt |iƒd|idd|iƒd|||fƒ}|idƒ|iƒ|i|ƒn|i|||ddƒqrWx|D]}|iƒqWdS( sBPass 1 of folder synchronization. Look for messages in self with a negative uid. These are messages in Maildirs that were not added by us. Try to add them to the dests, and once that succeeds, get the UID, add it to the others for real, add it to local for real, and delete the fake one.istargetsnamesNew msg sync from %ssargsisregisterN(sappends_[1]sselfsgetmessagelistskeyssuidsuidliststhreadssNones usethreadsapplytossuggeststhreadss waitforthreadsInstanceLimitedThreadsgetcopyinstancelimitssyncmessagesto_neguid_msgsgetvisiblenamesdeststhreads setDaemonsstartsjoin( sselfsdestsapplytos usethreadsuidsthreadsuidlists_[1]sthreads((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssyncmessagesto_neguidãs.$      csò|otiƒi|iƒƒntiƒi|||ƒd}x/|D]'}|i ƒo|i |ƒ}PnqJW|i |ƒ}xg|D]_}|i|||ƒ}|djo ||jo*|i|||ƒ|i|ƒ|}nq‹WdS(Nsi(sregistersUIBases getglobaluisregisterthreadsselfsgetaccountnamescopyingmessagesuidsapplytosmessagesobjectsstoresmessagess getmessagesgetmessageflagssflagss savemessagesnewuids deletemessage(sselfsuidsapplytosregistersnewuidsflagssmessagesobject((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pys copymessagetos"   c sg}xØ|iƒiƒD]Ä}|djoqn||iƒj o–|iƒoo|iƒt|i ƒd|i dd||i ƒfd||fƒ}|idƒ|iƒ|i|ƒn|i ||ddƒnqWx|D]}|iƒqèWdS( s€Pass 2 of folder synchronization. Look for messages present in self but not in dest. If any, add them to dest.istargetsnamesCopy message %d from %ssargsisregisterN(sthreadssselfsgetmessagelistskeyssuidsdestssuggeststhreadss waitforthreadsInstanceLimitedThreadsgetcopyinstancelimits copymessagetosgetvisiblenamesapplytosthreads setDaemonsstartsappendsjoin(sselfsdestsapplytosthreadssuidsthread((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssyncmessagesto_copys(       cs¥g}xS|iƒiƒD]?}|djoqn||iƒj o|i|ƒnqWt|ƒo8ti ƒi ||ƒx|D]}|i |ƒq†WndS(syPass 3 of folder synchronization. Look for message present in dest but not in self. If any, delete them.iN(s deletelistsdestsgetmessagelistskeyssuidsselfsappendslensUIBases getglobaluisdeletingmessagessapplytosobjectsdeletemessages(sselfsdestsapplytosuidsobjects deletelist((s?/usr/pkg/lib/python2p2/site-packages/offlineimap/folder/Base.pyssyncmessagesto_delete7s  csøh} h}x8|iƒiƒD]$}|djoqn|i|ƒ} |i|ƒ}gi }| D]!} | |jo|| ƒnqe~} x;| D]3}|| j og| |