diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/gntp-20141024.1950/gntp.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/gntp-20141024.1950/gntp.el | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/gntp-20141024.1950/gntp.el b/configs/shared/emacs/.emacs.d/elpa/gntp-20141024.1950/gntp.el new file mode 100644 index 000000000000..c7af09ffb58f --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/gntp-20141024.1950/gntp.el @@ -0,0 +1,243 @@ +;;; gntp.el --- Growl Notification Protocol for Emacs -*- lexical-binding: t -*- + +;; Author: Engelke Eschner <tekai@gmx.li> +;; Version: 0.1 +;; Package-Version: 20141024.1950 +;; Created: 2013-03-21 + +;; LICENSE +;; Copyright (c) 2013 Engelke Eschner +;; All rights reserved. + +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions +;; are met: +;; * Redistributions of source code must retain the above copyright +;; notice, this list of conditions and the following disclaimer. +;; * Redistributions in binary form must reproduce the above +;; copyright notice, this list of conditions and the following +;; disclaimer in the documentation and/or other materials provided +;; with the distribution. +;; * Neither the name of the gntp.el nor the names of its +;; contributors may be used to endorse or promote products derived +;; from this software without specific prior written permission. + +;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT +;; HOLDER> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +;; OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +;;; Commentary: +;; This package implements the Growl Notification Protocol GNTP +;; described at http://www.growlforwindows.com/gfw/help/gntp.aspx +;; It is incomplete as it only lets you send but not receive +;; notifications. + +;;; Code: + +(defgroup gntp nil + "GNTP, send/register growl notifications via GNTP from within emacs." + :group 'external) + +(defcustom gntp-application-name "Emacs/gntp.el" + "Name of the application gntp registers itself." + :type '(string)) + +(defcustom gntp-application-icon nil + "Icon to display as the application icon. +Either a URL or a path to a file." + :type '(string)) + +(defcustom gntp-server "localhost" + "Default port of the server. +Standard says can't be changed, but port-forwarding etc." + :type '(string)) + +(defcustom gntp-server-port 23053 + "Default port of the server. +Standard says can't be changed, but port-forwarding etc." + :type '(integer)) + +(defcustom gntp-register-alist nil + "Registration item list." + :type '(choice string (const nil))) + +(defun gntp-register (&optional notifications server port) + (interactive) + "Register NOTIFICATIONS at SERVER:PORT. +PORT defaults to `gntp-server-port'." + (let ((message (gntp-build-message-register (if notifications notifications gntp-register-alist)))) + (gntp-send message (if server server gntp-server) port))) + +;;;###autoload +(defun gntp-notify (name title text server &optional port priority icon) + "Send notification NAME with TITLE, TEXT, PRIORITY and ICON to SERVER:PORT. +PORT defaults to `gntp-server-port'" + (let ((message (gntp-build-message-notify name title text priority icon))) + (gntp-send message server port))) + +(defun gntp-build-message-register (notifications) + "Build the message to register NOTIFICATIONS types." + (let ((lines (list "GNTP/1.0 REGISTER NONE" + (format "Application-Name: %s" + gntp-application-name) + (format "Notifications-Count: %d" + (length notifications)))) + (icon-uri (gntp-app-icon-uri)) + (icon-data (gntp-app-icon-data)) + (icons (list))) + + ;; append icon uri + (when icon-uri + (nconc lines (list (format "Application-Icon: %s" icon-uri))) + ;; and data when it exists + (when icon-data + (setq icons (cons icon-data icons)))) + + (dolist (notice notifications) + ;; "For each notification being registered: + ;; Each notification being registered should be seperated by a + ;; blank line, including the first notification + (nconc lines (cons "" (gntp-notification-lines notice))) + ;; c + (let ((icon (gntp-notice-icon-data notice))) + (when icon + (nconc icons (list "" icon))))) + + ;; icon data must come last + (when icons + (nconc lines (cons "" icons))) + + (mapconcat 'identity (remove nil lines) "\r\n"))) + +(defun gntp-notification-lines (notice) + "Transform NOTICE into a list of strings." + (let ((display-name (gntp-notice-get notice :display)) + (enabled (gntp-notice-get notice :enabled)) + (icon-uri (gntp-notice-icon-uri notice))) + (list + ;; Required - The name (type) of the notification being registered + (concat "Notification-Name: " (gntp-notice-name notice)) + ;; Optional - The name of the notification that is displayed to + ;; the user (defaults to the same value as Notification-Name) + (when display-name + (concat "Notification-Display-Name: " display-name)) + ;; Optional - Indicates if the notification should be enabled by + ;; default (defaults to False) + (when enabled + "Notification-Enabled: True") + ;; Optional - The default icon to use for notifications of this type + (when icon-uri + (concat "Notification-Icon: " icon-uri))))) + +(defun gntp-build-message-notify (name title text &optional priority icon) + "Build a message of type NAME with TITLE and TEXT." + + (format + "GNTP/1.0 NOTIFY NONE\r\n\ +Application-Name: %s\r\n\ +Notification-Name: %s\r\n\ +Notification-Title: %s\r\n\ +Notification-Text: %s\r\n\ +Notification-Priority: %s\r\n\ +Notification-Icon: %s\r\n\ +\r\n" + gntp-application-name + (if (symbolp name) (symbol-name name) name) + title + ;; no CRLF in the text to avoid accidentel msg end + (replace-regexp-in-string "\r\n" "\n" text) + (if priority priority "0") + (if icon (gntp-icon-uri icon) ""))) + +;; notice +;;(list name ; everthing else is optional +;; :display "name to display" +;; :enabled nil +;; :icon "url or file") + + +(defun gntp-notice-icon-uri (notice) + "Get the icon URI from NOTICE." + (gntp-icon-uri (gntp-notice-get notice :icon))) + +(defun gntp-notice-icon-data (notice) + "Get icon data from NOTICE." + (gntp-icon-data (gntp-notice-get notice :icon))) + +(defun gntp-app-icon-uri () + "Return the value to be used in the Application-Icon header." + (gntp-icon-uri gntp-application-icon)) + +(defun gntp-app-icon-data () + "Return the value to be used in the Application-Icon header." + (gntp-icon-data gntp-application-icon)) + +(defun gntp-icon-uri (icon) + "Get the URI of ICON." + (when icon + (cond ((string-equal (substring icon 0 7) "http://") icon) + ((and (file-exists-p icon) (file-readable-p icon)) + (concat "x-growl-resource://" (md5 icon)))))) + +(defun gntp-icon-data (icon) + "Get the URI of ICON." + (when (and icon (not (string-equal (substring icon 0 7) "http://")) + (file-exists-p icon) (file-readable-p icon)) + (let ((id (md5 icon)) + (data (gntp-file-string icon))) + (format "Identifier: %s\r\nLength: %d\r\n\r\n%s" + id (length data) data)))) + +(defun gntp-notice-name (notice) + "Get the name of NOTICE. The name must be either a symbol or string." + (let ((name (car notice))) + (if (symbolp name) + (symbol-name name) + name))) + +(defun gntp-notice-get (notice property) + "Get PROPERTY from NOTICE." + (plist-get (cdr notice) property)) + +(defun gntp-send (message server &optional port) + "Send MESSAGE to SERVER:PORT. PORT defaults to `gntp-server-port'." + (let ((proc (make-network-process + :name "gntp" + :host server + :server nil + :service (if port port gntp-server-port) + ;;:sentinel 'gntp-sentinel + :filter 'gntp-filter))) + ;; hmm one CRLF too much? + (process-send-string proc (concat message "\r\n\r\n\r\n")))) + +(defun gntp-filter (proc string) + "Filter for PROC started by `gntp-send'. +Argument STRING reply from the server." + (when (string-equal "GNTP/1.0 -ERROR" (substring string 0 15)) + (error "GNTP: Something went wrong take a look at the reply:\n %s" + string))) + +;; (defun gntp-sentinel (proc msg) +;; (when (string= msg "connection broken by remote peer\n") +;; (message (format "client %s has quit" proc)))) + + +(defun gntp-file-string (file) + "Read the contents of a FILE and return as a string." + (with-temp-buffer + (insert-file-contents-literally file) + (buffer-string))) + +(provide 'gntp) + +;;; gntp.el ends here |