Fix crash introduced in the last refactoring
[imap-fix-internaldate] / mailbox_state.py
1 '''
2 mailbox_state.py - The module contains the MailboxState class.
3
4 Copyright (c) 2012 Intra2net AG
5 Author: Plamen Dimitrov
6
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 '''
17
18 class MailboxState:
19     """This class is responsible for containing and updating a mailbox data."""
20
21     # class attributes
22     # string with quotation marks for the mailbox name
23     name = None
24     # string for the mailbox uidvalidity
25     uidvalidity = None
26     # string for user owning the mailbox
27     owner = None
28     # list of bytes for last cached mail uids
29     uids = None
30     # boolean flag for committing state changes
31     needs_save = None
32     # integer for found date conflicts
33     date_conflicts = None
34     # integer for found messages with missing received headers
35     no_received_field = None
36     # unique key for a mailbox
37     key = None
38
39     def __init__(self, name, uidvalidity, owner):
40         self.name = name
41         self.uidvalidity = uidvalidity
42         self.owner = owner
43
44         self.uids = []
45         self.needs_save = False
46
47         self.date_conflicts = 0
48         self.no_received_field = 0
49
50         #special key to ensure better mailbox uniqueness
51         self.key = self.name.strip('"') + self.uidvalidity
52
53         return
54
55     def __getstate__(self):
56         """Prepares the MailboxState instance for pickling."""
57         changed_dict = self.__dict__.copy()
58         # remove the following attributes for pickling
59         del changed_dict['needs_save']
60         del changed_dict['date_conflicts']
61         del changed_dict['no_received_field']
62         return changed_dict
63
64     def __setstate__(self, dict):
65         """Prepares the MailboxState instance for unpickling."""
66         self.name = dict["name"]
67         self.uidvalidity = dict["uidvalidity"]
68         self.owner = dict["owner"]
69
70         self.uids = dict["uids"]
71         self.needs_save = False
72
73         self.date_conflicts = 0
74         self.no_received_field = 0
75         
76         self.key = dict["key"]
77         
78         return    
79
80     def __str__(self):
81         """Makes the class printable."""
82         return self.key
83
84     def synchronize(self, list_ids):
85         """Adds new messages to the cache and returns a list of them.
86         Confirm the changes to a mailbox to finally save it."""
87         new_ids = []
88         if(len(self.uids)==0):
89             new_ids = list_ids
90         else:
91             for uid in list_ids:
92                 try:
93                     self.uids.index(uid)
94                 except ValueError:
95                     new_ids.append(uid)
96         # update this mailbox potential uids
97         self.uids = list_ids
98         return new_ids
99
100     def confirm_change(self):
101         """Confirm the chages to the cached mailbox."""
102         self.needs_save = True
103         return