int growl_udp_notify( const char *const server, const char *const appname, const char *const notify, const char *const title, const char *const message , const char *const password ) { int notify_header_length = 28 + strlen(appname)+strlen(notify)+strlen(message)+strlen(title); unsigned char *data = (unsigned char*)malloc(notify_header_length); int pointer = 0; int rc = 0; uint8_t GROWL_PROTOCOL_VERSION = 1; uint8_t GROWL_TYPE_NOTIFICATION = 1; uint16_t flags = ntohs(0); uint16_t appname_length = ntohs(strlen(appname)); uint16_t notify_length = ntohs(strlen(notify)); uint16_t title_length = ntohs(strlen(title)); uint16_t message_length = ntohs(strlen(message)); growl_init(); memset( data , 0 , notify_header_length ); pointer = 0; memcpy( data + pointer , &GROWL_PROTOCOL_VERSION , 1 ); pointer++; memcpy( data + pointer , &GROWL_TYPE_NOTIFICATION , 1 ); pointer++; memcpy( data + pointer , &flags , 2 ); pointer += 2; memcpy( data + pointer , ¬ify_length , 2 ); pointer += 2; memcpy( data + pointer , &title_length , 2 ); pointer += 2; memcpy( data + pointer , &message_length , 2 ); pointer += 2; memcpy( data + pointer , &appname_length , 2 ); pointer += 2; sprintf( (char*)data + pointer , notify ); pointer += strlen(notify); sprintf( (char*)data + pointer , title ); pointer += strlen(title); sprintf( (char*)data + pointer , message ); pointer += strlen(message); sprintf( (char*)data + pointer , appname ); pointer += strlen(appname); growl_append_md5( data , pointer , password ); pointer += 16; rc = growl_tcp_datagram( server , data , pointer ); free(data); return rc; }
int growl_udp_register( const char *const server , const char *const appname , const char **const notifications , const int notifications_count , const char *const password ) { int register_header_length = 22+(int)strlen(appname); unsigned char *data; int pointer = 0; int rc = 0; int i=0; uint8_t GROWL_PROTOCOL_VERSION = 1; uint8_t GROWL_TYPE_REGISTRATION = 0; uint16_t appname_length = ntohs((u_short)strlen(appname)); uint8_t _notifications_count = notifications_count; uint8_t default_notifications_count = notifications_count; uint8_t j; growl_init(); for(i=0;i<notifications_count;i++) { register_header_length += 3 + (int)strlen(notifications[i]); } data = (unsigned char*)PhAllocateSafe(register_header_length); if (!data) return -1; memset( data , 0 , register_header_length ); pointer = 0; memcpy( data + pointer , &GROWL_PROTOCOL_VERSION , 1 ); pointer++; memcpy( data + pointer , &GROWL_TYPE_REGISTRATION , 1 ); pointer++; memcpy( data + pointer , &appname_length , 2 ); pointer += 2; memcpy( data + pointer , &_notifications_count , 1 ); pointer++; memcpy( data + pointer, &default_notifications_count , 1 ); pointer++; sprintf( (char*)data + pointer , "%s" , appname ); pointer += (int)strlen(appname); for(i=0;i<notifications_count;i++) { uint16_t notify_length = ntohs((u_short)strlen(notifications[i])); memcpy( data + pointer, ¬ify_length , 2 ); pointer +=2; sprintf( (char*)data + pointer , "%s" , notifications[i] ); pointer += (int)strlen(notifications[i]); } for(j=0;j<notifications_count;j++) { memcpy( data + pointer , &j , 1 ); pointer++; } growl_append_md5( data , pointer , password ); pointer += 16; rc = growl_tcp_datagram( server , data , pointer ); PhFree(data); return rc; }