- Timestamp:
- 2015-02-20T22:50:54Z (9 years ago)
- Branches:
- master
- Children:
- 0b9daac, 3d45471, 7733b8c
- Parents:
- af359b4
- git-author:
- Indent <please@…> (19-02-15 05:47:20)
- git-committer:
- dequis <dx@…> (20-02-15 22:50:54)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
query.c
raf359b4 r5ebff60 1 1 /********************************************************************\ 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * … … 27 27 #include "bitlbee.h" 28 28 29 static void query_display( irc_t *irc, query_t *q);30 static query_t *query_default( irc_t *irc);29 static void query_display(irc_t *irc, query_t *q); 30 static query_t *query_default(irc_t *irc); 31 31 32 query_t *query_add( 33 34 void *data)32 query_t *query_add(irc_t *irc, struct im_connection *ic, char *question, 33 query_callback yes, query_callback no, query_callback free, 34 void *data) 35 35 { 36 query_t *q = g_new0( query_t, 1);37 36 query_t *q = g_new0(query_t, 1); 37 38 38 q->ic = ic; 39 q->question = g_strdup( question);39 q->question = g_strdup(question); 40 40 q->yes = yes; 41 41 q->no = no; 42 42 q->free = free; 43 43 q->data = data; 44 45 if( strchr( irc->umode, 'b' ) != NULL ) 46 { 44 45 if (strchr(irc->umode, 'b') != NULL) { 47 46 char *s; 48 47 49 48 /* At least for the machine-parseable version, get rid of 50 49 newlines to make "parsing" easier. */ 51 for ( s = q->question; *s; s ++ )52 if ( *s == '\r' || *s == '\n' )50 for (s = q->question; *s; s++) { 51 if (*s == '\r' || *s == '\n') { 53 52 *s = ' '; 53 } 54 } 54 55 } 55 56 if( irc->queries ) 57 { 56 57 if (irc->queries) { 58 58 query_t *l = irc->queries; 59 60 while( l->next ) l = l->next; 59 60 while (l->next) { 61 l = l->next; 62 } 61 63 l->next = q; 62 } 63 else 64 { 64 } else { 65 65 irc->queries = q; 66 66 } 67 68 if( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "lifo" ) == 0 || irc->queries == q ) 69 query_display( irc, q ); 70 71 return( q ); 67 68 if (g_strcasecmp(set_getstr(&irc->b->set, "query_order"), "lifo") == 0 || irc->queries == q) { 69 query_display(irc, q); 70 } 71 72 return(q); 72 73 } 73 74 74 void query_del( irc_t *irc, query_t *q)75 void query_del(irc_t *irc, query_t *q) 75 76 { 76 77 query_t *l; 77 78 if( irc->queries == q ) 79 { 78 79 if (irc->queries == q) { 80 80 irc->queries = q->next; 81 } 82 else 83 { 84 for( l = irc->queries; l; l = l->next ) 85 { 86 if( l->next == q ) 87 { 81 } else { 82 for (l = irc->queries; l; l = l->next) { 83 if (l->next == q) { 88 84 l->next = q->next; 89 85 break; 90 86 } 91 87 } 92 93 if ( !l )88 89 if (!l) { 94 90 return; /* Hrmmm... */ 91 } 95 92 } 96 97 g_free( q->question ); 98 if( q->free && q->data ) 99 q->free( q->data ); 100 g_free( q ); 93 94 g_free(q->question); 95 if (q->free && q->data) { 96 q->free(q->data); 97 } 98 g_free(q); 101 99 } 102 100 103 void query_del_by_conn( irc_t *irc, struct im_connection *ic)101 void query_del_by_conn(irc_t *irc, struct im_connection *ic) 104 102 { 105 103 query_t *q, *n, *def; 106 104 int count = 0; 107 108 if ( !ic )105 106 if (!ic) { 109 107 return; 110 108 } 109 111 110 q = irc->queries; 112 def = query_default( irc ); 113 114 while( q ) 115 { 116 if( q->ic == ic ) 117 { 111 def = query_default(irc); 112 113 while (q) { 114 if (q->ic == ic) { 118 115 n = q->next; 119 query_del( irc, q);116 query_del(irc, q); 120 117 q = n; 121 122 count ++; 123 } 124 else 125 { 118 119 count++; 120 } else { 126 121 q = q->next; 127 122 } 128 123 } 129 130 if( count > 0 )131 imcb_log( ic, "Flushed %d unanswered question(s) for this connection.", count );132 133 q = query_default( irc );134 if( q && q != def )135 query_display( irc, q );136 }137 124 138 void query_answer( irc_t *irc, query_t *q, int ans ) 139 { 140 int disp = 0; 141 142 if( !q ) 143 { 144 q = query_default( irc ); 145 disp = 1; 125 if (count > 0) { 126 imcb_log(ic, "Flushed %d unanswered question(s) for this connection.", count); 146 127 } 147 if( ans )148 {149 if( q->ic )150 imcb_log( q->ic, "Accepted: %s", q->question );151 else152 irc_rootmsg( irc, "Accepted: %s", q->question );153 if( q->yes )154 q->yes( q->data );155 }156 else157 {158 if( q->ic )159 imcb_log( q->ic, "Rejected: %s", q->question );160 else161 irc_rootmsg( irc, "Rejected: %s", q->question );162 if( q->no )163 q->no( q->data );164 }165 q->data = NULL;166 167 query_del( irc, q );168 169 if( disp && ( q = query_default( irc ) ) )170 query_display( irc, q );171 }172 128 173 static void query_display( irc_t *irc, query_t *q ) 174 { 175 if( q->ic ) 176 { 177 imcb_log( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question ); 178 } 179 else 180 { 181 irc_rootmsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question ); 129 q = query_default(irc); 130 if (q && q != def) { 131 query_display(irc, q); 182 132 } 183 133 } 184 134 185 static query_t *query_default( irc_t *irc ) 135 void query_answer(irc_t *irc, query_t *q, int ans) 136 { 137 int disp = 0; 138 139 if (!q) { 140 q = query_default(irc); 141 disp = 1; 142 } 143 if (ans) { 144 if (q->ic) { 145 imcb_log(q->ic, "Accepted: %s", q->question); 146 } else { 147 irc_rootmsg(irc, "Accepted: %s", q->question); 148 } 149 if (q->yes) { 150 q->yes(q->data); 151 } 152 } else { 153 if (q->ic) { 154 imcb_log(q->ic, "Rejected: %s", q->question); 155 } else { 156 irc_rootmsg(irc, "Rejected: %s", q->question); 157 } 158 if (q->no) { 159 q->no(q->data); 160 } 161 } 162 q->data = NULL; 163 164 query_del(irc, q); 165 166 if (disp && (q = query_default(irc))) { 167 query_display(irc, q); 168 } 169 } 170 171 static void query_display(irc_t *irc, query_t *q) 172 { 173 if (q->ic) { 174 imcb_log(q->ic, 175 "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", 176 q->question); 177 } else { 178 irc_rootmsg(irc, 179 "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", 180 q->question); 181 } 182 } 183 184 static query_t *query_default(irc_t *irc) 186 185 { 187 186 query_t *q; 188 189 if ( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "fifo" ) == 0 )187 188 if (g_strcasecmp(set_getstr(&irc->b->set, "query_order"), "fifo") == 0) { 190 189 q = irc->queries; 191 else 192 for( q = irc->queries; q && q->next; q = q->next ); 193 194 return( q ); 190 } else { 191 for (q = irc->queries; q && q->next; q = q->next) { 192 ; 193 } 194 } 195 196 return(q); 195 197 }
Note: See TracChangeset
for help on using the changeset viewer.