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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/*
* $Id: bldaddr.h 769 2007-10-24 00:15:40Z hubert@u.washington.edu $
*
* ========================================================================
* Copyright 2006-2007 University of Washington
* Copyright 2013-2020 Eduardo Chappa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* ========================================================================
*/
#ifndef PITH_BLDADDR_INCLUDED
#define PITH_BLDADDR_INCLUDED
#include "../pith/adrbklib.h"
#include "../pith/state.h"
#include "../pith/ldap.h"
#include "../pith/pattern.h"
#include "../pith/remtype.h"
/*
* This is the structure that the builders impose on the private data
* that is pointed to by the bldr_private pointer in each header entry.
*
* The bldr_private pointer points to a PrivateTop which consists of two
* parts, whose purposes are independent:
* ******* This part no longer exists ******
* encoded -- This is used to preserve the charset information for
* addresses in this entry. For example, if the user types
* in a nickname which has a charset in it, the encoded
* version containing the charset information is saved here
* along with a checksum of the text that created it (the
* line containing the nickname).
* etext -- Pointer to the encoded text.
* chksumlen -- Length of string that produced the etext.
* chksumval -- Checksum of that string.
* The string that produced the etext is just the displayed
* value of the entry, not the nickname before it was expanded.
* That's so we can check on the next builder call to see if it
* was changed or not. Appending or prepending more addresses to
* what's there will work, the etext from the old contents will
* be combined with the etext from the appended stuff. (The check
* is for appending or prepending so appending AND prepending all
* at once won't work, charset will be lost.) If the middle of the
* text is edited the charset is lost. If text is removed, the
* charset is lost.
*
* affector -- This is for entries which affect the contents of other
* fields. For example, the Lcc field affects what goes in
* the To and Fcc fields, and the To field affects what goes
* in the Fcc field.
* who -- Who caused this field to be set last.
* chksumlen -- Length of string in the "who" field that caused the effect.
* chksumval -- Checksum of that string.
* The string that is being checksummed is the one that is displayed
* in the field doing the affecting. So, for the affector in the
* Fcc headerentry, the who might point to either To or Lcc and
* then the checksummed string would be either the To or Lcc displayed
* string. The purpose of the affector is to remember that the
* affected field was set from an address book entry that is no
* longer identifiable once it is expanded. For example, if a list
* is entered into the Lcc field, then the To field gets the list
* fullname and the fcc field gets the fcc entry for the list. If
* we move out of the Lcc field and back in and call the builder
* again, the list has been expanded and we can't tell (except for
* the affector) that the same list is what caused the results.
* Same for the To field. A nickname entered there will cause the
* fcc of that nickname to go in the Fcc field and the affector
* will cause it to stick as long as the To field is only appended to.
*
* It may seem a little strange that the PrivateAffector doesn't have a text
* field. The reason is that the text is actually displayed in that field
* and so is contained in the entry itself, unlike the PrivateEncoded
* which has etext which is not displayed and is only used when we go to
* send the mail.
*/
typedef enum {BP_Unset, BP_To, BP_Lcc} WhoSetUs;
typedef struct private_affector {
WhoSetUs who;
int cksumlen;
unsigned long cksumval;
} PrivateAffector;
/*
* This used to have more than one member. We could get rid
* of this structure now if we wanted to, and just have the
* PrivateAffector at the top-level, but it's easier alone.
* Who knows, we may have a need for something else to be added
* to the structure in the future.
*/
typedef struct private_top {
PrivateAffector *affector;
} PrivateTop;
/* save_and_restore flags */
#define SAR_SAVE 1
#define SAR_RESTORE 2
/* exported prototypes */
int our_build_address(BuildTo, char **, char **, char **, void (*)(int, SAVE_STATE_S *));
int build_address_internal(BuildTo, char **, char **, char **, int *, char **,
void (*)(int, SAVE_STATE_S *), int, int *);
ADDRESS *expand_address(BuildTo, char *, char *, int *, char **, \
int *, char **, char **, int, int, int *);
ADDRESS *massage_phrase_addr(char *, char *, char *);
char *get_fcc(char *);
void set_last_fcc(char *);
char *get_fcc_based_on_to(ADDRESS *);
void free_privatetop(PrivateTop **);
void strip_personal_quotes(ADDRESS *);
void free_bldaddr_module_globals(void);
#endif /* PITH_BLDADDR_INCLUDED */
|