1 /*
2 ** Copyright 2003-2005, Double Precision Inc.
3 **
4 ** See COPYING for distribution information.
5 */
6 
7 #ifndef cursesattachmentdisplay_H
8 #define cursesattachmentdisplay_H
9 
10 #include "config.h"
11 #include "curses/mycurses.H"
12 #include "curses/cursescontainer.H"
13 #include "curses/cursesbutton.H"
14 #include "curses/curseskeyhandler.H"
15 #include "mymessage.H"
16 #include "libmail/objectmonitor.H"
17 
18 #include <list>
19 #include <string>
20 #include <vector>
21 
22 class CursesMessage;
23 
24 namespace mail {
25 	class mimestruct;
26 }
27 
28 ////////////////////////////////////////////////////////////////
29 //
30 // A list of message's attachments.  We take a mimestruct, and
31 // unwrap it.
32 
33 class CursesAttachmentDisplay : public CursesContainer,
34 				public CursesKeyHandler {
35 
36 	mail::ptr<CursesMessage> messageInfoPtr;
37 
38 	class Attachment;
39 
40 	std::list<Curses *> children; // Labels created in this container.
41 
42 	std::list<Attachment *> attachment_list;
43 
44 	// A non-multipart attachments.
45 
46 	class Attachment : public CursesButton {
47 
48 		CursesAttachmentDisplay *parent;
49 		std::string name;
50 	public:
51 
52 		mail::mimestruct *mime;
53 		mail::envelope *env;
54 		bool deleted;
55 
56 		Attachment(CursesAttachmentDisplay *parentArg,
57 			   mail::mimestruct *mimeArg,
58 			   mail::envelope *envArg,
59 			   std::string nameArg);
60 		~Attachment();
61 
62 		void clicked();
63 		bool processKeyInFocus(const Curses::Key &key);
64 
65 		void markDeleted(bool flag);
66 	};
67 
68 	class KeyImportHelper;
69 
70 public:
71 	CursesAttachmentDisplay(CursesContainer *parent,
72 			     CursesMessage *messageArg);
73 	~CursesAttachmentDisplay();
74 
75 private:
76 	void createAttList(mail::mimestruct *mimePtr, int &rowNum,
77 			   int nestingLevel);
78 
79 	void createMsgAtt(mail::mimestruct *mimePtr,
80 			  mail::envelope *env, int &rowNum, int nestingLevel);
81 
82 public:
83 	// Inherited from Curses
84 	int getWidth() const;
85 	int getHeight() const;
86 
87 	bool isFocusable();
88 	void requestFocus();
89 
90 	// Inherited from CursesKeyHandler
91 
92 	bool processKey(const Curses::Key &key);
93 	bool listKeys( std::vector< std::pair<std::string, std::string> > &list);
94 
95 	void open(mail::mimestruct *mimePtr);
96 	// Open a message/rfc822 attachment
97 
98 	void download(Attachment *a);
99 	// Download an attachment.
100 
101 	static void downloadTo(CursesMessage *, mail::mimestruct *,
102 			       std::string);
103 };
104 
105 #endif
106