From 8dcde3d515666ff7c4c4a260f2c2a2ff76634e14 Mon Sep 17 00:00:00 2001
From: Michael Stapelberg <michael@stapelberg.de>
Date: Wed, 30 Sep 2009 21:59:30 +0200
Subject: [PATCH] Implement saving all attachments to a folder (keybinding A)

---
 lib/sup/buffer.rb                 |    4 ++--
 lib/sup/modes/thread-view-mode.rb |   14 ++++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
index df5d23c..5830650 100644
--- a/lib/sup/buffer.rb
+++ b/lib/sup/buffer.rb
@@ -470,7 +470,7 @@ EOS
     end
   end
 
-  def ask_for_filename domain, question, default=nil
+  def ask_for_filename domain, question, default=nil, allow_directory=false
     answer = ask domain, question, default do |s|
       if s =~ /(~([^\s\/]*))/ # twiddle directory expansion
         full = $1
@@ -495,7 +495,7 @@ EOS
       answer =
         if answer.empty?
           spawn_modal "file browser", FileBrowserMode.new
-        elsif File.directory?(answer)
+        elsif File.directory?(answer) and !allow_directory
           spawn_modal "file browser", FileBrowserMode.new(answer)
         else
           File.expand_path answer
diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
index 9fa3455..ba9cf4a 100644
--- a/lib/sup/modes/thread-view-mode.rb
+++ b/lib/sup/modes/thread-view-mode.rb
@@ -59,6 +59,7 @@ EOS
     k.add :alias, "Edit alias/nickname for a person", 'i'
     k.add :edit_as_new, "Edit message as new", 'D'
     k.add :save_to_disk, "Save message/attachment to disk", 's'
+    k.add :save_all_to_disk, "Save all attachments to disk", 'A'
     k.add :search, "Search for messages from particular people", 'S'
     k.add :compose, "Compose message to person", 'm'
     k.add :subscribe_to_list, "Subscribe to/unsubscribe from mailing list", "("
@@ -340,6 +341,19 @@ EOS
     end
   end
 
+  def save_all_to_disk
+    m = @message_lines[curpos] or return
+    default_dir = ($config[:default_attachment_save_dir] || ".")
+    folder = BufferManager.ask_for_filename :filename, "Save all attachment to folder: ", default_dir, true
+    return unless folder
+
+    m.chunks.each do |chunk|
+      next unless chunk.is_a?(Chunk::Attachment)
+      fn = File.join(folder, chunk.filename)
+      save_to_file(fn) { |f| f.print chunk.raw_content }
+    end
+  end
+
   def edit_draft
     m = @message_lines[curpos] or return
     if m.is_draft?
-- 
1.6.3.1

