1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2 */
3
4 #include "lib.h"
5 #include "str.h"
6 #include "strfuncs.h"
7 #include "istream.h"
8
9 #include "sieve-common.h"
10 #include "sieve-error.h"
11 #include "sieve-dump.h"
12 #include "sieve-binary.h"
13
14 #include "sieve-data-storage.h"
15
16 /*
17 * Script data implementation
18 */
19
sieve_data_script_alloc(void)20 static struct sieve_data_script *sieve_data_script_alloc(void)
21 {
22 struct sieve_data_script *dscript;
23 pool_t pool;
24
25 pool = pool_alloconly_create("sieve_data_script", 1024);
26 dscript = p_new(pool, struct sieve_data_script, 1);
27 dscript->script = sieve_data_script;
28 dscript->script.pool = pool;
29
30 return dscript;
31 }
32
sieve_data_script_create_from_input(struct sieve_instance * svinst,const char * name,struct istream * input)33 struct sieve_script *sieve_data_script_create_from_input
34 (struct sieve_instance *svinst, const char *name, struct istream *input)
35 {
36 struct sieve_storage *storage;
37 struct sieve_data_script *dscript = NULL;
38
39 storage = sieve_storage_alloc(svinst, NULL, &sieve_data_storage,
40 "", 0, FALSE);
41
42 dscript = sieve_data_script_alloc();
43 sieve_script_init(&dscript->script,
44 storage, &sieve_data_script, "data:", name);
45
46 dscript->data = input;
47 i_stream_ref(dscript->data);
48
49 sieve_storage_unref(&storage);
50
51 dscript->script.open = TRUE;
52
53 return &dscript->script;
54 }
55
sieve_data_script_destroy(struct sieve_script * script)56 static void sieve_data_script_destroy(struct sieve_script *script)
57 {
58 struct sieve_data_script *dscript =
59 (struct sieve_data_script *)script;
60
61 i_stream_unref(&dscript->data);
62 }
63
sieve_data_script_get_stream(struct sieve_script * script,struct istream ** stream_r,enum sieve_error * error_r)64 static int sieve_data_script_get_stream
65 (struct sieve_script *script, struct istream **stream_r,
66 enum sieve_error *error_r)
67 {
68 struct sieve_data_script *dscript =
69 (struct sieve_data_script *)script;
70
71 i_stream_ref(dscript->data);
72 i_stream_seek(dscript->data, 0);
73
74 *stream_r = dscript->data;
75 *error_r = SIEVE_ERROR_NONE;
76 return 0;
77 }
78
sieve_data_script_equals(const struct sieve_script * script ATTR_UNUSED,const struct sieve_script * other ATTR_UNUSED)79 static bool sieve_data_script_equals
80 (const struct sieve_script *script ATTR_UNUSED,
81 const struct sieve_script *other ATTR_UNUSED)
82 {
83 return ( script == other );
84 }
85
86 const struct sieve_script sieve_data_script = {
87 .driver_name = SIEVE_DATA_STORAGE_DRIVER_NAME,
88 .v = {
89 .destroy = sieve_data_script_destroy,
90
91 .get_stream = sieve_data_script_get_stream,
92
93 .equals = sieve_data_script_equals
94 }
95 };
96