| 258 | */ |
| 259 | |
| 260 | cupsd_subscription_t * /* O - New subscription object */ |
| 261 | cupsdAddSubscription( |
| 262 | unsigned mask, /* I - Event mask */ |
| 263 | cupsd_printer_t *dest, /* I - Printer, if any */ |
| 264 | cupsd_job_t *job, /* I - Job, if any */ |
| 265 | const char *uri, /* I - notify-recipient-uri, if any */ |
| 266 | int sub_id) /* I - notify-subscription-id or 0 */ |
| 267 | { |
| 268 | cupsd_subscription_t *temp; /* New subscription object */ |
| 269 | |
| 270 | |
| 271 | cupsdLogMessage(CUPSD_LOG_DEBUG, |
| 272 | "cupsdAddSubscription(mask=%x, dest=%p(%s), job=%p(%d), " |
| 273 | "uri=\"%s\")", |
| 274 | mask, (void *)dest, dest ? dest->name : "", (void *)job, job ? job->id : 0, |
| 275 | uri ? uri : "(null)"); |
| 276 | |
| 277 | _cupsRWLockWrite(&SubscriptionsLock); |
| 278 | |
| 279 | if (!Subscriptions) |
| 280 | Subscriptions = cupsArrayNew((cups_array_func_t)cupsd_compare_subscriptions, |
| 281 | NULL); |
| 282 | |
| 283 | if (!Subscriptions) |
| 284 | { |
| 285 | cupsdLogMessage(CUPSD_LOG_CRIT, |
| 286 | "Unable to allocate memory for subscriptions - %s", |
| 287 | strerror(errno)); |
| 288 | _cupsRWUnlock(&SubscriptionsLock); |
| 289 | return (NULL); |
| 290 | } |
| 291 | |
| 292 | /* |
| 293 | * Limit the number of subscriptions... |
| 294 | */ |
| 295 | |
| 296 | if (MaxSubscriptions > 0 && cupsArrayCount(Subscriptions) >= MaxSubscriptions) |
| 297 | { |
| 298 | cupsdLogMessage(CUPSD_LOG_DEBUG, |
| 299 | "cupsdAddSubscription: Reached MaxSubscriptions %d " |
| 300 | "(count=%d)", MaxSubscriptions, |
| 301 | cupsArrayCount(Subscriptions)); |
| 302 | _cupsRWUnlock(&SubscriptionsLock); |
| 303 | return (NULL); |
| 304 | } |
| 305 | |
| 306 | if (MaxSubscriptionsPerJob > 0 && job) |
| 307 | { |
| 308 | int count; /* Number of job subscriptions */ |
| 309 | |
| 310 | for (temp = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), |
| 311 | count = 0; |
| 312 | temp; |
| 313 | temp = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) |
| 314 | if (temp->job == job) |
| 315 | count ++; |
| 316 | |
| 317 | if (count >= MaxSubscriptionsPerJob) |
no test coverage detected