summaryrefslogtreecommitdiffstats
path: root/libmail/imaplisthandler.H
blob: a71da9a4dbf995d1774f04fa8e0b6f50a7c15e2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
** Copyright 2002-2004, Double Precision Inc.
**
** See COPYING for distribution information.
*/
#ifndef libmail_imaplisthandler_H
#define libmail_imaplisthandler_H

#include "libmail_config.h"
#include "imaphandler.H"
#include "imapfolders.H"
#include "imapparsefmt.H"

#include <vector>

///////////////////////////////////////////////////////////////////////////
//
// A list command.

LIBMAIL_START

class imapListHandler : public imapCommandHandler {

	mail::callback::folderList &callback1;
	mail::callback &callback2;
	std::string hier;

	bool oneFolderOnly;
	bool fallbackOneFolderOnly;

	// True if this LIST command is invoked to determine the folder
	// hierarchy separator.  Otherwise, the LIST command is invoked
	// to obtain a list of subfolders.

	std::vector <imapFolder> folders;

public:
	imapListHandler(mail::callback::folderList &myCallback,
			      mail::callback &myCallback2,
			      std::string myHier, bool oneFolderOnlyArg);
	~imapListHandler();
	const char *getName();
	void timedOut(const char *errmsg);

	void installed(imap &imapAccount);
private:

	bool untaggedMessage(imap &imapAccount, std::string name);
	bool taggedMessage(imap &imapAccount, std::string name, std::string message,
			   bool okfail, std::string errmsg);
};


// Untagged LIST parser

class imapLIST : public imapHandlerStructured {

	std::vector <imapFolder> &folderList;
	size_t pfixLength;
	bool oneNameOnly;

	void (imapLIST::*next_func)(imap &, Token);

	bool hasChildren, hasNoChildren, marked, unmarked, noSelect;
	std::string hiersep;

protected:
	imapparsefmt xattributes;
public:
	imapLIST(std::vector<imapFolder> &mylist, size_t pfixLengthArg,
		       bool oneNameOnlyArg=false);
	~imapLIST();

	void installed(imap &imapAccount);

private:
	const char *getName();
	void timedOut(const char *errmsg);

	void process(imap &imapAccount, Token t);

	void start_attribute_list(imap &imapAccount, Token t);
	void get_attribute(imap &imapAccount, Token t);
	void get_hiersep(imap &imapAccount, Token t);
	void get_name(imap &imapAccount, Token t);
	void get_xattr_start(imap &imapAccount, Token t);
	void get_xattr_do(imap &imapAccount, Token t);

	virtual void processExtendedAttributes(imapFolder &);
};

LIBMAIL_END

#endif