]> git.cworth.org Git - sup/blobdiff - lib/sup/message.rb
Merge branch 'enclosed-message-display-tweaks'
[sup] / lib / sup / message.rb
index 39862b9f643c2dd66aa0ebaf877a00a39a30559c..afa8f008f354d28802ca6f78062dd353032a11f3 100644 (file)
@@ -127,6 +127,31 @@ class Message
     @list_unsubscribe = header["list-unsubscribe"]
   end
 
+  ## Expected index entry format:
+  ## :message_id, :subject => String
+  ## :date => Time
+  ## :refs, :replytos => Array of String
+  ## :from => Person
+  ## :to, :cc, :bcc => Array of Person
+  def load_from_index! entry
+    @id = entry[:message_id]
+    @from = entry[:from]
+    @date = entry[:date]
+    @subj = entry[:subject]
+    @to = entry[:to]
+    @cc = entry[:cc]
+    @bcc = entry[:bcc]
+    @refs = (@refs + entry[:refs]).uniq
+    @replytos = entry[:replytos]
+
+    @replyto = nil
+    @list_address = nil
+    @recipient_email = nil
+    @source_marked_read = false
+    @list_subscribe = nil
+    @list_unsubscribe = nil
+  end
+
   def add_ref ref
     @refs << ref
     @dirty = true
@@ -166,11 +191,13 @@ class Message
 
   def has_label? t; @labels.member? t; end
   def add_label l
+    l = l.to_sym
     return if @labels.member? l
     @labels << l
     @dirty = true
   end
   def remove_label l
+    l = l.to_sym
     return unless @labels.member? l
     @labels.delete l
     @dirty = true
@@ -182,6 +209,7 @@ class Message
 
   def labels= l
     raise ArgumentError, "not a set" unless l.is_a?(Set)
+    raise ArgumentError, "not a set of labels" unless l.all? { |ll| ll.is_a?(Symbol) }
     return if @labels == l
     @labels = l
     @dirty = true
@@ -411,10 +439,19 @@ private
     elsif m.header.content_type == "message/rfc822"
       if m.body
         payload = RMail::Parser.read(m.body)
-        from = payload.header.from.first
-        from_person = from ? Person.from_address(from.format) : nil
-        [Chunk::EnclosedMessage.new(from_person, payload.to_s)] +
-          message_to_chunks(payload, encrypted)
+        from = payload.header.from.first ? payload.header.from.first.format : ""
+        to = payload.header.to.map { |p| p.format }.join(", ")
+        cc = payload.header.cc.map { |p| p.format }.join(", ")
+        subj = payload.header.subject
+        subj = subj ? Message.normalize_subj(payload.header.subject.gsub(/\s+/, " ").gsub(/\s+$/, "")) : subj
+        if Rfc2047.is_encoded? subj
+          subj = Rfc2047.decode_to $encoding, subj
+        end
+        msgdate = payload.header.date
+        from_person = from ? Person.from_address(from) : nil
+        to_people = to ? Person.from_address_list(to) : nil
+        cc_people = cc ? Person.from_address_list(cc) : nil
+        [Chunk::EnclosedMessage.new(from_person, to_people, cc_people, msgdate, subj)] + message_to_chunks(payload, encrypted)
       else
         [Chunk::EnclosedMessage.new(nil, "")]
       end