Calendar Server ships with a complete ENS implementation. If you wish to customize it, you may use the ENS APIs to do so. The following four code samples, a simple publisher and subscriber pair, and a reliable publisher and subscriber pair, illustrate how to use the ENS API. The sample code is provided with the product in the following directory:
/opt/SUNWics5/cal/csapi/samples/ens
This sample code pair establishes a simple interactive asynchronous publisher and subscriber.
/* * Copyright 2000 by Sun Microsystems, Inc. * All rights reserved * * apub : simple interactive asynchronous publisher using * * Syntax: * apub host port */ #include <stdlib.h> #include <stdio.h> #include "pasdisp.h" #include "publisher.h" static pas_dispatcher_t *disp = NULL; static publisher_t *_publisher = NULL; static int _shutdown = 0; static void _read_stdin(); static void _exit_usage() { printf("\nUsage:\napub host port\n"); exit(5); } static void _exit_error(const char *msg) { printf("%s\n", msg); exit(1); } static void _call_shutdown() { _shutdown = 1; pas_shutdown(disp); } static void _open_ack(void *arg, int rc, void *enc) { _publisher = (publisher_t *)enc; (void *)arg; if (!_publisher) { printf("Failed to create publisher with status %d\n", rc); _call_shutdown(); return; } _read_stdin(); return; } static void _publish_ack(void *arg, int rc, void *ignored) { (void *)ignored; free(arg); if (rc != 0) { printf("Publish failed with status %d\n", rc); _call_shutdown(); return; } _read_stdin(); return; } static void _read_stdin() { static char input[1024]; printf("apub> "); fflush(stdout); while (!_shutdown) { if ( !fgets(input, sizeof(input), stdin) ) { continue; } else { char *message; unsigned int message_len; input[strlen(input) - 1] = 0; /* Strip off the \n */ if (*input == ’.’ && input[1] == 0) { publisher_delete(_publisher); _call_shutdown(); break; } message = strdup(input); message_len = strlen(message); publish(_publisher, "enp://siroe.com/xyz",message, message_len, _publish_ack, NULL, (void *)message, 0); return; } } return; } main(int argc, char **argv) { unsigned short port = 7997; char host[256]; if (argc < 2) _exit_usage(); if (*(argv[1]) == ’0’) { strcpy(host, "127.0.0.1"); } else { strcpy(host, argv[1]); } if (argc > 2) { port = (unsigned short)atoi(argv[2]); } disp = pas_dispatcher_new(NULL); if (disp == NULL) _exit_error("Can’t create publisher"); publisher_new_a(disp, NULL, host, port, _open_ack, disp); pas_dispatch(disp); _shutdown = 1; pas_dispatcher_delete(disp); exit(0); }
/* * Copyright 2000 by Sun Microsystems, Inc. * All rights reserved * * asub : example asynchronous subscriber * * Syntax: * asub host port */ #include <stdlib.h> #include <stdio.h> #include "pasdisp.h" #include "subscriber.h" static pas_dispatcher_t *disp = NULL; static subscriber_t *_subscriber = NULL; static subscription_t *_subscription = NULL; static renl_t *_renl = NULL; static void _exit_usage() { printf("\nUsage:\nasub host port\n"); exit(5); } static void _exit_error(const char *msg) { printf("%s\n", msg); exit(1); } static void _subscribe_ack(void *arg, int rc, void *subscription) { (void)arg; if (!rc) { _subscription = subscription; printf("Subscription successful\n"); } else { printf("Subscription failed - status %d\n", rc); pas_shutdown(disp); } } static void _unsubscribe_ack(void *arg, int rc, void *ignored) { (void *)ignored; (void *)arg; if (rc != 0) { printf("Unsubscribe failed - status %d\n", rc); } subscriber_delete(_subscriber); pas_shutdown(disp); } static int _handle_notify(void *arg, char *url, char *str, int len) { (void *)arg; printf("[%s] %.*s\n", url, len, (str) ? str : "(null)"); return 0; } static void _open_ack(void *arg, int rc, void *enc) { _subscriber = (subscriber_t *)enc; (void *)arg; if (rc) { printf("Failed to create subscriber with status %d\n", rc); pas_shutdown(disp); return; } subscribe(_subscriber, "enp://siroe.com/xyz", _handle_notify, NULL, _subscribe_ack, NULL); return; } static void _unsubscribe(int sig) { (int)sig; unsubscribe(_subscriber, _subscription, _unsubscribe_ack, NULL); } main(int argc, char **argv) { unsigned short port = 7997; char host[256]; if (argc < 2) _exit_usage(); if (*(argv[1]) == ’0’) { strcpy(host, "127.0.0.1"); } else { strcpy(host, argv[1]); } if (argc > 2) { port = (unsigned short)atoi(argv[2]); } disp = pas_dispatcher_new(NULL); if (disp == NULL) _exit_error("Can’t create publisher"); subscriber_new_a(disp, NULL, host, port, _open_ack, NULL); pas_dispatch(disp); pas_dispatcher_delete(disp); exit(0); }
This sample code pair establishes a reliable asynchronous publisher and subscriber.
/* * Copyright 2000 by Sun Microsystems, Inc. * All rights reserved * * rpub : simple *reliable* interactive asynchronous publisher. * It is designed to be used in combination with rsub, * the reliable subscriber. * * Syntax: * rpub host port */ #include <stdlib.h> #include <stdio.h> #include "pasdisp.h" #include "publisher.h" static pas_dispatcher_t *disp = NULL; static publisher_t *_publisher = NULL; static int _shutdown = 0; static renl_t *_renl; static void _read_stdin(); static void _exit_usage() { printf("\nUsage:\nrpub host port\n"); exit(5); } static void _exit_error(const char *msg) { printf("%s\n", msg); exit(1); } static void _call_shutdown() { _shutdown = 1; pas_shutdown(disp); } static void _renl_create_cb(void *arg, int rc, void *ignored) { (void *)arg; (void *)ignored; if (!_publisher) { printf("Failed to create RENL - status %d\n", rc); _call_shutdown(); return; } _read_stdin(); return; } static void _publisher_new_cb(void *arg, int rc, void *enc) { _publisher = (publisher_t *)enc; (void *)arg; if (!_publisher) { printf("Failed to create publisher - status %d\n", rc); _call_shutdown(); return; } renl_create_publisher(_publisher, "renl_id", NULL, _renl_create_cb,NULL); return; } static void _recv_ack(void *arg, int rc, void *ignored) { (void *)ignored; if (rc < 0) { printf("Acknowledgment Timeout\n"); } else if ( rc == 0) { printf("Acknowledgment Received\n"); } fflush (stdout); _read_stdin(); free(arg); return; } static void _read_stdin() { static char input[1024]; printf("rpub> "); fflush(stdout); while (!_shutdown) { if ( !fgets(input, sizeof(input), stdin) ) { continue; } else { char *message; unsigned int message_len; input[strlen(input) - 1] = 0; /* Strip off the \n */ if (*input == ’.’ && input[1] == 0) { publisher_delete(_publisher); _call_shutdown(); break; } message = strdup(input); message_len = strlen(message); /* five seconds timeout */ publish(_publisher, "enp://siroe.com/xyz", message, message_len, NULL, _recv_ack, message, 5000); return; } } return; } main(int argc, char **argv) { unsigned short port = 7997; char host[256]; if (argc < 2) _exit_usage(); if (*(argv[1]) == ’0’) { strcpy(host, "127.0.0.1"); } else { strcpy(host, argv[1]); } if (argc > 2) { port = (unsigned short)atoi(argv[2]); } disp = pas_dispatcher_new(NULL); if (disp == NULL) _exit_error("Can’t create publisher"); publisher_new_a(disp, NULL, host, port, _publisher_new_cb, NULL); pas_dispatch(disp); _shutdown = 1; pas_dispatcher_delete(disp); exit(0); }
/* * Copyright 2000 by Sun Microsystems, Inc. * All rights reserved * * asub : example asynchronous subscriber * * Syntax: * asub host port */ #include <stdlib.h> #include <stdio.h> #include "pasdisp.h" #include "subscriber.h" static pas_dispatcher_t *disp = NULL; static subscriber_t *_subscriber = NULL; static subscription_t *_subscription = NULL; static renl_t *_renl = NULL; static void _exit_usage() { printf("\nUsage:\nasub host port\n"); exit(5); } static void _exit_error(const char *msg) { printf("%s\n", msg); exit(1); } static void _subscribe_ack(void *arg, int rc, void *subscription) { (void)arg; if (!rc) { _subscription = subscription; printf("Subscription successful\n"); _renl = renl_create_subscriber(_subscription, "renl_id", NULL); } else { printf("Subscription failed - status %d\n", rc) pas_shutdown(disp); } } static void _unsubscribe_ack(void *arg, int rc, void *ignored) { (void *)ignored; (void *)arg; if (rc != 0) { printf("Unsubscribe failed - status %d\n", rc); } subscriber_delete(_subscriber); pas_shutdown(disp); } static int _handle_notify(void *arg, char *url, char *str, int len) { (void *)arg; printf("[%s] %.*s\n", url, len, (str) ? str : "(null)"); return 0; } static void _open_ack(void *arg, int rc, void *enc) { _subscriber = (subscriber_t *)enc; (void *)arg; if (rc) { printf("Failed to create subscriber with status %d\n", rc); pas_shutdown(disp); return; } subscribe(_subscriber, "enp://siroe.com/xyz",_handle_notify, NULL,_subscribe_ack, NULL); return; } static void _unsubscribe(int sig) { (int)sig; unsubscribe(_subscriber, _subscription, _unsubscribe_ack, NULL); } main(int argc, char **argv) { unsigned short port = 7997; char host[256]; if (argc < 2) _exit_usage(); if (*(argv[1]) == ’0’) { strcpy(host, "127.0.0.1"); } else { strcpy(host, argv[1]); } if (argc > 2) { port = (unsigned short)atoi(argv[2]); } disp = pas_dispatcher_new(NULL); if (disp == NULL) _exit_error("Can’t create publisher"); subscriber_new_a(disp, NULL, host, port, _open_ack, NULL); pas_dispatch(disp); pas_dispatcher_delete(disp); exit(0);
}