comparison src/address.c @ 389:bc9a7845b53a

Refactoring and code layouting.
author markus schnalke <meillo@marmaro.de>
date Sat, 18 Feb 2012 13:43:30 +0100
parents b27f66555ba8
children 9b93c0a3bd8c
comparison
equal deleted inserted replaced
388:aa40710f09fe 389:bc9a7845b53a
23 create_address(gchar *path, gboolean is_rfc821) 23 create_address(gchar *path, gboolean is_rfc821)
24 { 24 {
25 address *addr; 25 address *addr;
26 addr = _create_address(path, NULL, is_rfc821); 26 addr = _create_address(path, NULL, is_rfc821);
27 27
28 if (addr != NULL) { 28 if (addr) {
29 addr_unmark_delivered(addr); 29 addr_unmark_delivered(addr);
30 } 30 }
31 return addr; 31 return addr;
32 } 32 }
33 33
34 address* 34 address*
35 create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain) 35 create_address_qualified(gchar *path, gboolean is_rfc821, gchar *domain)
36 { 36 {
37 address *addr = create_address(path, is_rfc821); 37 address *addr = create_address(path, is_rfc821);
38 38
39 if (addr != NULL && addr->domain == NULL) { 39 if (addr && !addr->domain) {
40 addr->domain = g_strdup(domain); 40 addr->domain = g_strdup(domain);
41 } 41 }
42 return addr; 42 return addr;
43 } 43 }
44 44
45 /* nothing special about pipes here, but its only called for that purpose */ 45 /* nothing special about pipes here, but its only called for that purpose */
50 50
51 if (addr) { 51 if (addr) {
52 memset(addr, 0, sizeof(address)); 52 memset(addr, 0, sizeof(address));
53 addr->address = g_strchomp(g_strdup(path)); 53 addr->address = g_strchomp(g_strdup(path));
54 addr->local_part = g_strdup(addr->address); 54 addr->local_part = g_strdup(addr->address);
55
56 addr->domain = g_strdup("localhost"); /* quick hack */ 55 addr->domain = g_strdup("localhost"); /* quick hack */
57 } 56 }
58 return addr; 57 return addr;
59 } 58 }
60 59
61 void 60 void
62 destroy_address(address *addr) 61 destroy_address(address *addr)
63 { 62 {
64 DEBUG(6) debugf("destroy_address entered\n"); 63 DEBUG(6) debugf("destroy_address entered\n");
65
66 g_free(addr->address); 64 g_free(addr->address);
67 g_free(addr->local_part); 65 g_free(addr->local_part);
68 g_free(addr->domain); 66 g_free(addr->domain);
69
70 g_free(addr); 67 g_free(addr);
71 } 68 }
72 69
73 address* 70 address*
74 copy_modify_address(const address *orig, gchar *l_part, gchar *dom) 71 copy_modify_address(const address *orig, gchar *l_part, gchar *dom)
76 address *addr = NULL; 73 address *addr = NULL;
77 74
78 if (!orig) { 75 if (!orig) {
79 return NULL; 76 return NULL;
80 } 77 }
81 78 if (!(addr = g_malloc(sizeof(address)))) {
82 if ((addr = g_malloc(sizeof(address))) == NULL) {
83 return NULL; 79 return NULL;
84 } 80 }
85
86 addr->address = g_strdup(orig->address); 81 addr->address = g_strdup(orig->address);
87 82 addr->local_part = l_part ? g_strdup(l_part) :
88 if (l_part == NULL) 83 g_strdup(orig->local_part);
89 addr->local_part = g_strdup(orig->local_part); 84 addr->domain = dom ? g_strdup(dom) : g_strdup(orig->domain);
90 else
91 addr->local_part = g_strdup(l_part);
92
93 if (dom == NULL)
94 addr->domain = g_strdup(orig->domain);
95 else
96 addr->domain = g_strdup(dom);
97
98 addr->flags = 0; 85 addr->flags = 0;
99 addr->children = NULL; 86 addr->children = NULL;
100 addr->parent = NULL; 87 addr->parent = NULL;
101 return addr; 88 return addr;
102 } 89 }
103 90
104 gboolean 91 gboolean
105 addr_isequal(address *addr1, address *addr2, int (*cmpfunc) (const char*, const char*)) 92 addr_isequal(address *addr1, address *addr2,
93 int (*cmpfunc) (const char*, const char*))
106 { 94 {
107 return (cmpfunc(addr1->local_part, addr2->local_part) == 0) 95 return (cmpfunc(addr1->local_part, addr2->local_part)==0) &&
108 && (strcasecmp(addr1->domain, addr2->domain) == 0); 96 (strcasecmp(addr1->domain, addr2->domain)==0);
109 } 97 }
110 98
111 /* searches in ancestors of addr1 */ 99 /* searches in ancestors of addr1 */
112 gboolean 100 gboolean
113 addr_isequal_parent(address *addr1, address *addr2, int (*cmpfunc) (const char*, const char*)) 101 addr_isequal_parent(address *addr1, address *addr2,
102 int (*cmpfunc) (const char*, const char*))
114 { 103 {
115 address *addr; 104 address *addr;
116 105
117 for (addr = addr1; addr; addr = addr->parent) 106 for (addr = addr1; addr; addr = addr->parent) {
118 if (addr_isequal(addr, addr2, cmpfunc)) 107 if (addr_isequal(addr, addr2, cmpfunc)) {
119 return TRUE; 108 return TRUE;
120 109 }
110 }
121 return FALSE; 111 return FALSE;
122 } 112 }
123 113
124 /* careful, this is recursive */ 114 /* careful, this is recursive */
125 /* returns TRUE if ALL children have been delivered */ 115 /* returns TRUE if ALL children have been delivered */
126 gboolean 116 gboolean
127 addr_is_delivered_children(address *addr) 117 addr_is_delivered_children(address *addr)
128 { 118 {
129 GList *addr_node; 119 GList *addr_node;
130 120
131 if (addr->children == NULL) 121 if (!addr->children) {
132 return addr_is_delivered(addr); 122 return addr_is_delivered(addr);
133 123 }
134 foreach(addr->children, addr_node) { 124 foreach(addr->children, addr_node) {
135 address *addr = (address *) (addr_node->data); 125 address *addr = (address *) (addr_node->data);
136 if (!addr_is_delivered_children(addr)) 126 if (!addr_is_delivered_children(addr)) {
137 return FALSE; 127 return FALSE;
128 }
138 } 129 }
139 return TRUE; 130 return TRUE;
140 } 131 }
141 132
142 /* careful, this is recursive */ 133 /* careful, this is recursive */
144 gboolean 135 gboolean
145 addr_is_finished_children(address *addr) 136 addr_is_finished_children(address *addr)
146 { 137 {
147 GList *addr_node; 138 GList *addr_node;
148 139
149 if (addr->children == NULL) 140 if (!addr->children) {
150 return (addr_is_failed(addr) || addr_is_delivered(addr)); 141 return (addr_is_failed(addr) || addr_is_delivered(addr));
151 142 }
152 foreach(addr->children, addr_node) { 143 foreach(addr->children, addr_node) {
153 address *addr = (address *) (addr_node->data); 144 address *addr = (address *) (addr_node->data);
154 if (!addr_is_finished_children(addr)) 145 if (!addr_is_finished_children(addr)) {
155 return FALSE; 146 return FALSE;
147 }
156 } 148 }
157 return TRUE; 149 return TRUE;
158 } 150 }
159 151
160 /* find original address */ 152 /* find original address */
161 address* 153 address*
162 addr_find_ancestor(address *addr) 154 addr_find_ancestor(address *addr)
163 { 155 {
164 while (addr->parent) 156 while (addr->parent) {
165 addr = addr->parent; 157 addr = addr->parent;
158 }
166 return addr; 159 return addr;
167 } 160 }
168 161
169 gchar* 162 gchar*
170 addr_string(address *addr) 163 addr_string(address *addr)
171 { 164 {
172 static gchar *buffer = NULL; 165 static gchar *buffer = NULL;
173 166
174 if (addr == NULL) { 167 if (!addr) {
175 g_free(buffer); 168 g_free(buffer);
176 buffer = NULL; 169 buffer = NULL;
177 return NULL; 170 return NULL;
178 } 171 }
179 if (buffer) 172 if (buffer) {
180 g_free(buffer); 173 g_free(buffer);
181 174 }
182 if (addr->local_part[0] == '\0') { 175 if (!*addr->local_part) {
183 buffer = g_strdup("<>"); 176 buffer = g_strdup("<>");
184 } else { 177 } else {
185 buffer = g_strdup_printf("<%s@%s>", addr->local_part ? addr->local_part : "", addr->domain ? addr->domain : ""); 178 buffer = g_strdup_printf("<%s@%s>",
179 addr->local_part ? addr->local_part : "",
180 addr->domain ? addr->domain : "");
186 } 181 }
187 return buffer; 182 return buffer;
188 } 183 }