updated to snarl v42
This commit is contained in:
parent
5a6886ddd7
commit
48fbb4f5b6
|
@ -76,6 +76,7 @@ uint FreedesktopNotification_Frontend::Notify(const QString &app_name, uint repl
|
|||
const QStringList &actions, const QVariantMap &hints, int timeout)
|
||||
{
|
||||
qDebug()<<app_name<<summary<<body<<app_icon;
|
||||
qDebug()<<"Hints:"<<hints;
|
||||
QString icon;
|
||||
|
||||
if(hints.contains("image_data")){
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,280 +1,371 @@
|
|||
#ifndef SNARL_INTERFACE_V41
|
||||
#define SNARL_INTERFACE_V41
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#define MINGW_HAS_SECURE_API
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#include <cstdio>
|
||||
|
||||
#ifndef SMTO_NOTIMEOUTIFNOTHUNG
|
||||
#define SMTO_NOTIMEOUTIFNOTHUNG 8
|
||||
#endif
|
||||
|
||||
|
||||
namespace Snarl {
|
||||
namespace V41 {
|
||||
|
||||
static const LPCTSTR SnarlWindowClass = _T("w>Snarl");
|
||||
static const LPCTSTR SnarlWindowTitle = _T("Snarl");
|
||||
|
||||
static const LPCTSTR SnarlGlobalMsg = _T("SnarlGlobalEvent");
|
||||
static const LPCTSTR SnarlAppMsg = _T("SnarlAppMessage");
|
||||
|
||||
static const int SnarlPacketDataSize = 4096;
|
||||
|
||||
// Enums put in own namespace, because ANSI C++ doesn't decorate enums with tagname :(
|
||||
namespace SnarlEnums {
|
||||
|
||||
/// <summary>
|
||||
/// Global event identifiers.
|
||||
/// Identifiers marked with a '*' are sent by Snarl in two ways:
|
||||
/// 1. As a broadcast message (uMsg = 'SNARL_GLOBAL_MSG')
|
||||
/// 2. To the window registered in snRegisterConfig() or snRegisterConfig2()
|
||||
/// (uMsg = reply message specified at the time of registering)
|
||||
/// In both cases these values appear in wParam.
|
||||
///
|
||||
/// Identifiers not marked are not broadcast; they are simply sent to the application's registered window.
|
||||
/// </summary>
|
||||
enum GlobalEvent
|
||||
{
|
||||
SnarlLaunched = 1, // Snarl has just started running*
|
||||
SnarlQuit = 2, // Snarl is about to stop running*
|
||||
SnarlAskAppletVer = 3, // (R1.5) Reserved for future use
|
||||
SnarlShowAppUi = 4 // (R1.6) Application should show its UI
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Message event identifiers.
|
||||
/// These are sent by Snarl to the window specified in RegisterApp() when the
|
||||
/// Snarl Notification raised times out or the user clicks on it.
|
||||
/// </summary>
|
||||
enum MessageEvent
|
||||
{
|
||||
NotificationClicked = 32, // Notification was right-clicked by user
|
||||
NotificationCancelled = 32, // Added in V37 (R1.6) -- same value, just improved the meaning of it
|
||||
NotificationTimedOut = 33, //
|
||||
NotificationAck = 34, // Notification was left-clicked by user
|
||||
NotificationMenu = 35, // Menu item selected (V39)
|
||||
NotificationMiddleButton = 36, // Notification middle-clicked by user (V39)
|
||||
NotificationClosed = 37 // User clicked the close gadget (V39)
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Error values returned by calls to GetLastError().
|
||||
/// </summary>
|
||||
enum SnarlStatus
|
||||
{
|
||||
Success = 0,
|
||||
|
||||
ErrorFailed = 101, // miscellaneous failure
|
||||
ErrorUnknownCommand, // specified command not recognised
|
||||
ErrorTimedOut, // Snarl took too long to respond
|
||||
|
||||
ErrorArgMissing = 109, // required argument missing
|
||||
ErrorSystem, // internal system error
|
||||
|
||||
ErrorNotRunning = 201, // Snarl handling window not found
|
||||
ErrorNotRegistered, //
|
||||
ErrorAlreadyRegistered, // not used yet; RegisterApp() returns existing token
|
||||
ErrorClassAlreadyExists, // not used yet; AddClass() returns existing token
|
||||
ErrorClassBlocked,
|
||||
ErrorClassNotFound,
|
||||
ErrorNotificationNotFound
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Application flags - features this app supports.
|
||||
/// </summary>
|
||||
enum AppFlags
|
||||
{
|
||||
AppDefault = 0,
|
||||
AppHasPrefs = 1,
|
||||
AppHasAbout = 2,
|
||||
AppIsWindowless = 0x8000
|
||||
};
|
||||
|
||||
enum SnarlCommand
|
||||
{
|
||||
RegisterApp = 1,
|
||||
UnregisterApp,
|
||||
UpdateApp,
|
||||
SetCallback,
|
||||
AddClass,
|
||||
RemoveClass,
|
||||
Notify,
|
||||
UpdateNotification,
|
||||
HideNotification,
|
||||
IsNotificationVisible,
|
||||
LastError // deprecated but retained for backwards compatability
|
||||
};
|
||||
}
|
||||
|
||||
struct SnarlMessage
|
||||
{
|
||||
SnarlEnums::SnarlCommand Command;
|
||||
LONG32 Token;
|
||||
BYTE PacketData[SnarlPacketDataSize];
|
||||
};
|
||||
|
||||
static const DWORD WM_SNARLTEST = WM_USER + 237;
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
/// SnarlInterface class definition
|
||||
// ------------------------------------------------------------------------
|
||||
class SnarlInterface {
|
||||
public:
|
||||
SnarlInterface();
|
||||
~SnarlInterface();
|
||||
|
||||
LPTSTR AllocateString(size_t n) { return new TCHAR[n]; }
|
||||
void FreeString(LPTSTR str) { delete [] str; str = NULL; }
|
||||
void FreeString(LPCTSTR str) { delete [] str; }
|
||||
|
||||
/// <summary>Register application with Snarl.</summary>
|
||||
/// <returns>The application token or 0 on failure.</returns>
|
||||
/// <remarks>The application token is saved in SnarlInterface member variable, so just use return value to check for error.</remarks>
|
||||
LONG32 RegisterApp(LPCSTR signature, LPCSTR title, LPCSTR icon, HWND hWndReply = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppDefault);
|
||||
LONG32 RegisterApp(LPCWSTR signature, LPCWSTR title, LPCWSTR icon, HWND hWndReply = NULL, LONG32 msgReply = 0, SnarlEnums::AppFlags flags = SnarlEnums::AppDefault);
|
||||
|
||||
/// <summary>Unregister application with Snarl when application is closing.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 UnregisterApp();
|
||||
|
||||
/// <summary>Update information provided when calling RegisterApp.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 UpdateApp(LPCSTR title = NULL, LPCSTR icon = NULL);
|
||||
LONG32 UpdateApp(LPCWSTR title = NULL, LPCWSTR icon = NULL);
|
||||
|
||||
/// <summary>Add a notification class to Snarl.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 AddClass(LPCSTR className, LPCSTR description, bool enabled = true);
|
||||
LONG32 AddClass(LPCWSTR className, LPCWSTR description, bool enabled = true);
|
||||
|
||||
/// <summary>Remove a notification class added with AddClass().</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 RemoveClass(LPCSTR className, bool forgetSettings = false);
|
||||
LONG32 RemoveClass(LPCWSTR className, bool forgetSettings = false);
|
||||
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 RemoveAllClasses(bool forgetSettings = false);
|
||||
|
||||
/// <summary>Show a Snarl notification.</summary>
|
||||
/// <returns>Returns the notification token or 0 on failure.</returns>
|
||||
/// <remarks>You can use <see cref="GetLastMsgToken()" /> to get the last token.</remarks>
|
||||
LONG32 EZNotify(LPCSTR className, LPCSTR title, LPCSTR text, LONG32 timeout = -1, LPCSTR icon = NULL, LONG32 priority = 0, LPCSTR acknowledge = NULL, LPCSTR value = NULL);
|
||||
LONG32 EZNotify(LPCWSTR className, LPCWSTR title, LPCWSTR text, LONG32 timeout = -1, LPCWSTR icon = NULL, LONG32 priority = 0, LPCWSTR acknowledge = NULL, LPCWSTR value = NULL);
|
||||
|
||||
/// <summary>
|
||||
/// Show a Snarl notification.
|
||||
/// This function requires that you write your own packet data.
|
||||
/// </summary>
|
||||
/// <returns>Returns the notification token or 0 on failure.</returns>
|
||||
/// <remarks>You can use <see cref="GetLastMsgToken()" /> to get the last token.</remarks>
|
||||
LONG32 Notify(LPCSTR className, LPCSTR packetData);
|
||||
LONG32 Notify(LPCWSTR className, LPCWSTR packetData);
|
||||
|
||||
/// <summary>Update the text or other parameters of a visible Snarl notification.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 EZUpdate(LONG32 msgToken, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR icon = NULL);
|
||||
LONG32 EZUpdate(LONG32 msgToken, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR icon = NULL);
|
||||
|
||||
/// <summary>
|
||||
/// Update the text or other parameters of a visible Snarl notification.
|
||||
/// This function requires that you write your own packet data.
|
||||
/// </summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 Update(LONG32 msgToken, LPCSTR packetData);
|
||||
LONG32 Update(LONG32 msgToken, LPCWSTR packetData);
|
||||
|
||||
/// <summary>Hide a Snarl notification.</summary>
|
||||
/// <returns>0 on failure.</returns>
|
||||
LONG32 Hide(LONG32 msgToken);
|
||||
|
||||
/// <summary>Test if a Snarl notification is visible.</summary>
|
||||
/// <returns>Returns -1 if message is visible. 0 if not visible or if an error occured.</returns>
|
||||
LONG32 IsVisible(LONG32 msgToken);
|
||||
|
||||
/// <summary>Get the last error from Snarl. Call after other functions return 0 to know why it failed.</summary>
|
||||
/// <returns>Returns one of the SnarlEnums::SnarlStatus values.</returns>
|
||||
SnarlEnums::SnarlStatus GetLastError();
|
||||
|
||||
/// <summary>Get Snarl version, if it is running.</summary>
|
||||
/// <returns>Returns a number indicating Snarl version.</returns>
|
||||
LONG32 GetVersion();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where Snarl is installed.
|
||||
/// ** Remember to call <see cref="FreeString(LPCTSTR)" /> on the returned string !!!
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where Snarl is installed.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
LPCTSTR GetAppPath();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where the default Snarl icons are located.
|
||||
/// <para>** Remember to call <see cref="FreeString(LPCTSTR)" /> on the returned string !!!</para>
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where the default Snarl icons are located.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
LPCTSTR GetIconsPath();
|
||||
|
||||
/// <summary>GetLastMsgToken() returns token of the last message sent to Snarl.</summary>
|
||||
/// <returns>Returns message token of last message.</returns>
|
||||
/// <remarks>This function is not in the official API!</remarks>
|
||||
LONG32 GetLastMsgToken() const;
|
||||
|
||||
/// <summary>Check whether Snarl is running</summary>
|
||||
/// <returns>Returns true if Snarl system was found running.</returns>
|
||||
static BOOL IsSnarlRunning();
|
||||
|
||||
/// <summary>
|
||||
/// Returns the value of Snarl's global registered message.
|
||||
/// Notes:
|
||||
/// Snarl registers SNARL_GLOBAL_MSG during startup which it then uses to communicate
|
||||
/// with all running applications through a Windows broadcast message. This function can
|
||||
/// only fail if for some reason the Windows RegisterWindowMessage() function fails
|
||||
/// - given this, this function *cannnot* be used to test for the presence of Snarl.
|
||||
/// </summary>
|
||||
/// <returns>A 16-bit value (translated to 32-bit) which is the registered Windows message for Snarl.</returns>
|
||||
static UINT Broadcast();
|
||||
|
||||
/// <summary>Returns the global Snarl Application message (V39)</summary>
|
||||
/// <returns>Returns Snarl application registered message.</returns>
|
||||
static UINT AppMsg();
|
||||
|
||||
/// <summary>Returns a handle to the Snarl Dispatcher window (V37)</summary>
|
||||
/// <returns>Returns handle to Snarl Dispatcher window, or zero if it's not found.</returns>
|
||||
/// <remarks>This is now the preferred way to test if Snarl is actually running.</remarks>
|
||||
static HWND GetSnarlWindow();
|
||||
|
||||
private:
|
||||
/// <summary>Send message to Snarl.</summary>
|
||||
/// <returns>Return zero on failure.</returns>
|
||||
LONG32 Send(SnarlMessage msg);
|
||||
|
||||
/// <summary>Convert a unicode string to UTF8</summary>
|
||||
/// <returns>Returns pointer to the new string - Remember to delete [] returned string !</returns>
|
||||
/// <remarks>Remember to delete [] returned string !!!</remarks>
|
||||
LPSTR WideToUTF8(LPCWSTR szWideStr);
|
||||
|
||||
/// <summary>Pack data into the PackedData member field.</summary>
|
||||
/// <param name="data">Should always be a pointer to the PackedData field</param>
|
||||
/// <param name="format">The format string. Can be NULL or "" to just zero PackedData!</param>
|
||||
/// <param name="...">Variable number of objects to convert</param>
|
||||
void PackData(BYTE* data, LPCSTR format, ...);
|
||||
|
||||
LONG32 appToken;
|
||||
LONG32 lastMsgToken;
|
||||
SnarlEnums::SnarlStatus localError;
|
||||
|
||||
}; // class
|
||||
|
||||
} // namespace V41
|
||||
} // namespace Snarl
|
||||
|
||||
#endif // SNARL_INTERFACE_V41
|
||||
#ifndef SNARL_INTERFACE_V42_H
|
||||
#define SNARL_INTERFACE_V42_H
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#define MINGW_HAS_SECURE_API
|
||||
#endif
|
||||
|
||||
#include <tchar.h>
|
||||
#include <windows.h>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
#ifndef SMTO_NOTIMEOUTIFNOTHUNG
|
||||
#define SMTO_NOTIMEOUTIFNOTHUNG 8
|
||||
#endif
|
||||
|
||||
|
||||
namespace Snarl {
|
||||
namespace V42 {
|
||||
|
||||
static const LPCTSTR SnarlWindowClass = _T("w>Snarl");
|
||||
static const LPCTSTR SnarlWindowTitle = _T("Snarl");
|
||||
|
||||
static const LPCTSTR SnarlGlobalMsg = _T("SnarlGlobalEvent");
|
||||
static const LPCTSTR SnarlAppMsg = _T("SnarlAppMessage");
|
||||
|
||||
static const DWORD WM_SNARLTEST = WM_USER + 237;
|
||||
|
||||
// Enums put in own namespace, because ANSI C++ doesn't decorate enums with tagname :(
|
||||
namespace SnarlEnums {
|
||||
|
||||
/// <summary>
|
||||
/// Global event identifiers.
|
||||
/// Identifiers marked with a '*' are sent by Snarl in two ways:
|
||||
/// 1. As a broadcast message (uMsg = 'SNARL_GLOBAL_MSG')
|
||||
/// 2. To the window registered in snRegisterConfig() or snRegisterConfig2()
|
||||
/// (uMsg = reply message specified at the time of registering)
|
||||
/// In both cases these values appear in wParam.
|
||||
///
|
||||
/// Identifiers not marked are not broadcast; they are simply sent to the application's registered window.
|
||||
/// </summary>
|
||||
enum GlobalEvent
|
||||
{
|
||||
SnarlLaunched = 1, // Snarl has just started running*
|
||||
SnarlQuit = 2, // Snarl is about to stop running*
|
||||
SnarlStopped = 3, // sent when stopped by user
|
||||
SnarlStarted = 4, // sent when started by user
|
||||
|
||||
// R2.4 Beta3
|
||||
SnarlUserAway, // away mode was enabled
|
||||
SnarlUserBack, // away mode was disabled
|
||||
};
|
||||
|
||||
enum SnarlStatus
|
||||
{
|
||||
Success = 0,
|
||||
|
||||
// Win32 callbacks (renamed under V42)
|
||||
CallbackRightClick = 32, // Deprecated as of V42, ex. SNARL_NOTIFICATION_CLICKED/SNARL_NOTIFICATION_CANCELLED
|
||||
CallbackTimedOut,
|
||||
CallbackInvoked, // left clicked and no default callback assigned
|
||||
CallbackMenuSelected, // HIWORD(wParam) contains 1-based menu item index
|
||||
CallbackMiddleClick, // Deprecated as of V42
|
||||
CallbackClosed,
|
||||
|
||||
|
||||
// critical errors
|
||||
ErrorFailed = 101, // miscellaneous failure
|
||||
ErrorUnknownCommand, // specified command not recognised
|
||||
ErrorTimedOut, // Snarl took too long to respond
|
||||
//104 gen critical #4
|
||||
//105 gen critical #5
|
||||
ErrorBadSocket = 106, // invalid socket (or some other socket-related error)
|
||||
ErrorBadPacket = 107, // badly formed request
|
||||
//108 net critical #3
|
||||
ErrorArgMissing = 109, // required argument missing
|
||||
ErrorSystem, // internal system error
|
||||
//120 libsnarl critical block
|
||||
ErrorAccessDenied = 121, // libsnarl only
|
||||
|
||||
// warnings
|
||||
ErrorNotRunning = 201, // Snarl handling window not found
|
||||
ErrorNotRegistered,
|
||||
ErrorAlreadyRegistered, // not used yet; sn41RegisterApp() returns existing token
|
||||
ErrorClassAlreadyExists, // not used yet
|
||||
ErrorClassBlocked,
|
||||
ErrorClassNotFound,
|
||||
ErrorNotificationNotFound,
|
||||
ErrorFlooding, // notification generated by same class within quantum
|
||||
ErrorDoNotDisturb, // DnD mode is in effect was not logged as missed
|
||||
ErrorCouldNotDisplay, // not enough space on-screen to display notification
|
||||
ErrorAuthFailure, // password mismatch
|
||||
|
||||
// informational
|
||||
WasMerged = 251, // notification was merged, returned token is the one we merged with
|
||||
|
||||
// callbacks
|
||||
NotifyGone = 301, // reserved for future use
|
||||
|
||||
// The following are currently specific to SNP 2.0 and are effectively the
|
||||
// Win32 SNARL_CALLBACK_nnn constants with 270 added to them
|
||||
|
||||
// SNARL_NOTIFY_CLICK = 302 // indicates notification was right-clicked (deprecated as of V42)
|
||||
NotifyExpired = 303,
|
||||
NotifyInvoked = 304, // note this was "ACK" in a previous life
|
||||
NotifyMenu, // indicates an item was selected from user-defined menu (deprecated as of V42)
|
||||
// SNARL_NOTIFY_EX_CLICK // user clicked the middle mouse button (deprecated as of V42)
|
||||
// SNARL_NOTIFY_CLOSED // user clicked the notification's close gadget
|
||||
|
||||
// the following is generic to SNP and the Win32 API
|
||||
NotifyAction = 308, // user picked an action from the list, the data value will indicate which one
|
||||
|
||||
|
||||
// C++ interface custom errors- not part of official API!
|
||||
ErrorCppInterface = 1001
|
||||
};
|
||||
|
||||
} // namespace SnarlEnums
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
/// SnarlParameterList class definition - Helper class, not meant for broad use
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template<class T>
|
||||
class SnarlParameterList
|
||||
{
|
||||
public:
|
||||
typedef std::pair<std::basic_string<T>, std::basic_string<T> > PairType;
|
||||
|
||||
SnarlParameterList()
|
||||
{
|
||||
}
|
||||
|
||||
explicit SnarlParameterList(int initialCapacity)
|
||||
{
|
||||
list.reserve(initialCapacity);
|
||||
}
|
||||
|
||||
void Add(const T* _key, const T* _value)
|
||||
{
|
||||
if (_value != NULL)
|
||||
list.push_back(PairType(std::basic_string<T>(_key), std::basic_string<T>(_value))); //
|
||||
}
|
||||
|
||||
void Add(const T* _key, LONG32 _value)
|
||||
{
|
||||
std::basic_stringstream<T> valStr;
|
||||
valStr << _value;
|
||||
list.push_back(PairType(std::basic_string<T>(_key), valStr.str()));
|
||||
}
|
||||
|
||||
void Add(const T* _key, void* _value)
|
||||
{
|
||||
if (_value != NULL)
|
||||
{
|
||||
std::basic_stringstream<T> valStr;
|
||||
valStr << (INT_PTR)_value; // Uckly hack, to get stringstream to print void* as decimal not hex
|
||||
|
||||
list.push_back(PairType(std::basic_string<T>(_key), valStr.str()));
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<PairType>& GetList() const
|
||||
{
|
||||
return list;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<PairType> list;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// SnarlInterface class definition
|
||||
// ----------------------------------------------------------------------------------------
|
||||
class SnarlInterface
|
||||
{
|
||||
public:
|
||||
/// <summary>Requests strings known by Snarl</summary>
|
||||
class Requests
|
||||
{
|
||||
public:
|
||||
static LPCSTR AddActionA() { return "addaction"; }
|
||||
static LPCWSTR AddActionW() { return L"addaction"; }
|
||||
static LPCSTR AddClassA() { return "addclass"; }
|
||||
static LPCWSTR AddClassW() { return L"addclass"; }
|
||||
static LPCSTR ClearActionsA() { return "clearactions"; }
|
||||
static LPCWSTR ClearActionsW() { return L"clearactions"; }
|
||||
static LPCSTR ClearClassesA() { return "clearclasses"; }
|
||||
static LPCWSTR ClearClassesW() { return L"clearclasses"; }
|
||||
static LPCSTR HelloA() { return "hello"; }
|
||||
static LPCWSTR HelloW() { return L"hello"; }
|
||||
static LPCSTR HideA() { return "hide"; }
|
||||
static LPCWSTR HideW() { return L"hide"; }
|
||||
static LPCSTR IsVisibleA() { return "isvisible"; }
|
||||
static LPCWSTR IsVisibleW() { return L"isvisible"; }
|
||||
static LPCSTR NotifyA() { return "notify"; }
|
||||
static LPCWSTR NotifyW() { return L"notify"; }
|
||||
static LPCSTR RegisterA() { return "reg"; } // register
|
||||
static LPCWSTR RegisterW() { return L"reg"; }
|
||||
static LPCSTR RemoveClassA() { return "remclass"; }
|
||||
static LPCWSTR RemoveClassW() { return L"remclass"; }
|
||||
static LPCSTR UnregisterA() { return "unregister"; }
|
||||
static LPCWSTR UnregisterW() { return L"unregister"; }
|
||||
static LPCSTR UpdateAppA() { return "updateapp"; }
|
||||
static LPCWSTR UpdateAppW() { return L"updateapp"; }
|
||||
static LPCSTR UpdateA() { return "update"; }
|
||||
static LPCWSTR UpdateW() { return L"update"; }
|
||||
static LPCSTR VersionA() { return "version"; }
|
||||
static LPCWSTR VersionW() { return L"version"; }
|
||||
};
|
||||
|
||||
SnarlInterface();
|
||||
virtual ~SnarlInterface();
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
// Static functions
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
// Use FreeString, when SnarlInterface returns a null terminated string pointer
|
||||
static LPTSTR AllocateString(size_t n) { return new TCHAR[n]; }
|
||||
static void FreeString(LPSTR str) { delete [] str; str = NULL; }
|
||||
static void FreeString(LPCSTR str) { delete [] str; }
|
||||
static void FreeString(LPWSTR str) { delete [] str; str = NULL; }
|
||||
static void FreeString(LPCWSTR str) { delete [] str; }
|
||||
|
||||
/// <summary>Send message to Snarl.</summary>
|
||||
/// <param name='request'>The request string. If using unicode version, the string will be UTF8 encoded before sending.</param>
|
||||
/// <param name='replyTimeout'>Time to wait before timeout - Default = 1000</param>
|
||||
/// <returns>
|
||||
/// Return zero or positive on Success.
|
||||
/// Negative on failure. (Get error code by abs(return_value))
|
||||
/// <see>http://sourceforge.net/apps/mediawiki/snarlwin/index.php?title=Windows_API#Return_Value</see>
|
||||
/// </returns>
|
||||
static LONG32 DoRequest(LPCSTR request, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, UINT replyTimeout = 1000);
|
||||
|
||||
/// <summary>Escapes a string, so it can be passed to Snarl.</summary>
|
||||
/// <remarks>
|
||||
/// Should only be used, if you are using DoRequest() and not the helper functions.
|
||||
/// Remember to Escape each key/value pair individually.
|
||||
/// </remarks>
|
||||
static std::basic_string<char>& Escape(std::basic_string<char>& str);
|
||||
static std::basic_string<wchar_t>& Escape(std::basic_string<wchar_t>& str);
|
||||
|
||||
/// <summary>Returns the global Snarl Application message (V39)</summary>
|
||||
/// <returns>Returns Snarl application registered message.</returns>
|
||||
static UINT AppMsg();
|
||||
|
||||
/// <summary>
|
||||
/// Returns the value of Snarl's global registered message.
|
||||
/// Notes:
|
||||
/// Snarl registers SNARL_GLOBAL_MSG during startup which it then uses to communicate
|
||||
/// with all running applications through a Windows broadcast message. This function can
|
||||
/// only fail if for some reason the Windows RegisterWindowMessage() function fails
|
||||
/// - given this, this function *cannnot* be used to test for the presence of Snarl.
|
||||
/// </summary>
|
||||
/// <returns>A 16-bit value (translated to 32-bit) which is the registered Windows message for Snarl.</returns>
|
||||
static UINT Broadcast();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where Snarl is installed.
|
||||
/// ** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where Snarl is installed.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetAppPath();
|
||||
|
||||
/// <summary>
|
||||
/// Get the path to where the default Snarl icons are located.
|
||||
/// <para>** Remember to call <see cref="FreeString(LPSTR)" /> on the returned string !!!</para>
|
||||
/// </summary>
|
||||
/// <returns>Returns the path to where the default Snarl icons are located.</returns>
|
||||
/// <remarks>This is a V39 API method.</remarks>
|
||||
static LPCTSTR GetIconsPath();
|
||||
|
||||
/// <summary>Returns a handle to the Snarl Dispatcher window (V37)</summary>
|
||||
/// <returns>Returns handle to Snarl Dispatcher window, or zero if it's not found.</returns>
|
||||
/// <remarks>This is now the preferred way to test if Snarl is actually running.</remarks>
|
||||
static HWND GetSnarlWindow();
|
||||
|
||||
/// <summary>Get Snarl version, if it is running.</summary>
|
||||
/// <returns>Returns a number indicating Snarl version.</returns>
|
||||
static LONG32 GetVersion();
|
||||
|
||||
/// <summary>Check whether Snarl is running</summary>
|
||||
/// <returns>Returns true if Snarl system was found running.</returns>
|
||||
static BOOL IsSnarlRunning();
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
/// <summary>Adds an action to an existing (on-screen or in the missed list) notification.</summary>
|
||||
LONG32 AddAction(LONG32 msgToken, LPCSTR label, LPCSTR cmd);
|
||||
LONG32 AddAction(LONG32 msgToken, LPCWSTR label, LPCWSTR cmd);
|
||||
|
||||
/// <summary>Add a notification class to Snarl.</summary>
|
||||
LONG32 AddClass(LPCSTR classId, LPCSTR name, LPCSTR title = NULL, LPCSTR text = NULL, LPCSTR icon = NULL, LPCSTR sound = NULL, LONG32 duration = NULL, LPCSTR callback = NULL, bool enabled = true);
|
||||
LONG32 AddClass(LPCWSTR classId, LPCWSTR name, LPCWSTR title = NULL, LPCWSTR text = NULL, LPCWSTR icon = NULL, LPCWSTR sound = NULL, LONG32 duration = -1, LPCWSTR callback = NULL, bool enabled = true);
|
||||
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearActions(LONG32 msgToken);
|
||||
|
||||
/// <summary>Remove all notification classes in one call.</summary>
|
||||
LONG32 ClearClasses();
|
||||
|
||||
/// <summary>GetLastMsgToken() returns token of the last message sent to Snarl.</summary>
|
||||
/// <returns>Returns message token of last message.</returns>
|
||||
/// <remarks>This function is not in the official API!</remarks>
|
||||
LONG32 GetLastMsgToken() const;
|
||||
|
||||
/// <summary>Hide a Snarl notification.</summary>
|
||||
LONG32 Hide(LONG32 msgToken);
|
||||
|
||||
/// <summary>Test if a Snarl notification is visible.</summary>
|
||||
LONG32 IsVisible(LONG32 msgToken);
|
||||
|
||||
/// <summary>Show a Snarl notification.</summary>
|
||||
/// <returns>Returns the notification token or negative on failure.</returns>
|
||||
/// <remarks>You can use <see cref="GetLastMsgToken()" /> to get the last token.</remarks>
|
||||
LONG32 Notify(LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, LONG32 priority = -2, LPCSTR ack = NULL, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Notify(LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, LONG32 priority = -2, LPCWSTR ack = NULL, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
|
||||
/// <summary>Register application with Snarl.</summary>
|
||||
/// <returns>The application token or negative on failure.</returns>
|
||||
/// <remarks>The application token is saved in SnarlInterface member variable, so just use return value to check for error.</remarks>
|
||||
LONG32 Register(LPCSTR signature, LPCSTR title, LPCSTR icon = NULL, LPCSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0);
|
||||
LONG32 Register(LPCWSTR signature, LPCWSTR title, LPCWSTR icon = NULL, LPCWSTR password = NULL, HWND hWndReplyTo = NULL, LONG32 msgReply = 0);
|
||||
|
||||
/// <summary>Remove a notification class added with AddClass().</summary>
|
||||
LONG32 RemoveClass(LPCSTR classId);
|
||||
LONG32 RemoveClass(LPCWSTR classId);
|
||||
|
||||
/// <summary>Update the text or other parameters of a visible Snarl notification.</summary>
|
||||
LONG32 Update(LONG32 msgToken, LPCSTR classId = NULL, LPCSTR title = NULL, LPCSTR text = NULL, LONG32 timeout = -1, LPCSTR iconPath = NULL, LPCSTR iconBase64 = NULL, LONG32 priority = -2, LPCSTR ack = NULL, LPCSTR callback = NULL, LPCSTR value = NULL);
|
||||
LONG32 Update(LONG32 msgToken, LPCWSTR classId = NULL, LPCWSTR title = NULL, LPCWSTR text = NULL, LONG32 timeout = -1, LPCWSTR iconPath = NULL, LPCWSTR iconBase64 = NULL, LONG32 priority = -2, LPCWSTR ack = NULL, LPCWSTR callback = NULL, LPCWSTR value = NULL);
|
||||
|
||||
/// <summary>Unregister application with Snarl when application is closing.</summary>
|
||||
LONG32 Unregister(LPCSTR signature);
|
||||
LONG32 Unregister(LPCWSTR signature);
|
||||
|
||||
/// <summary>Update information provided when calling RegisterApp.</summary>
|
||||
/*LONG32 UpdateApp(LPCSTR title = NULL, LPCSTR icon = NULL);
|
||||
LONG32 UpdateApp(LPCWSTR title = NULL, LPCWSTR icon = NULL);*/
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/// <summary>Convert a unicode string to UTF8</summary>
|
||||
/// <returns>Returns pointer to the new string - Remember to delete [] returned string !</returns>
|
||||
/// <remarks>Remember to call FreeString on returned string !!!</remarks>
|
||||
static LPSTR WideToUTF8(LPCWSTR szWideStr);
|
||||
|
||||
static LONG32 DoRequest(LPCSTR request, SnarlParameterList<char>& spl, UINT replyTimeout = 1000);
|
||||
static LONG32 DoRequest(LPCWSTR request, SnarlParameterList<wchar_t>& spl, UINT replyTimeout = 1000);
|
||||
|
||||
void SetPassword(LPCSTR password);
|
||||
void SetPassword(LPCWSTR password);
|
||||
void ClearPassword();
|
||||
|
||||
LONG32 appToken;
|
||||
LONG32 lastMsgToken;
|
||||
LPSTR szPasswordA;
|
||||
LPWSTR szPasswordW;
|
||||
}; // class SnarlInterface
|
||||
|
||||
} // namespace V42
|
||||
} // namespace Snarl
|
||||
|
||||
#endif // SNARL_INTERFACE_V42_H
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#define SNORENOTIFIER_MESSAGE_ID WM_USER + 238
|
||||
|
||||
using namespace Snarl::V41;
|
||||
using namespace Snarl::V42;
|
||||
|
||||
Q_EXPORT_PLUGIN2(snarl_backend,Snarl_Backend);
|
||||
|
||||
|
@ -65,10 +65,10 @@ void Snarl_Backend::registerApplication(Application *application){
|
|||
_applications.insert(application->name(),snarlInterface);
|
||||
}
|
||||
qDebug()<<"Register with Snarl"<<application->name()<<application->icon();
|
||||
snarlInterface->RegisterApp(application->name().toUtf8().constData(),
|
||||
snarlInterface->Register(application->name().toUtf8().constData(),
|
||||
application->name().toUtf8().constData(),
|
||||
application->icon().toUtf8().constData(),
|
||||
winIDWidget->winId(),SNORENOTIFIER_MESSAGE_ID);
|
||||
0,winIDWidget->winId(),SNORENOTIFIER_MESSAGE_ID);
|
||||
|
||||
foreach(Alert *alert,application->alerts()){
|
||||
snarlInterface->AddClass(application->name().toUtf8().constData(),
|
||||
|
@ -80,7 +80,7 @@ void Snarl_Backend::unregisterApplication(Application *application){
|
|||
SnarlInterface *snarlInterface = _applications.take(application->name());
|
||||
if(snarlInterface == NULL)
|
||||
return;
|
||||
snarlInterface->UnregisterApp();
|
||||
snarlInterface->Unregister(application->name().toUtf8().constData());
|
||||
delete snarlInterface;
|
||||
}
|
||||
|
||||
|
@ -92,15 +92,17 @@ int Snarl_Backend::notify(QSharedPointer<Notification>notification){
|
|||
|
||||
int id = notification->id();
|
||||
if(notification->id()==0){
|
||||
id = snarlInterface->EZNotify(notification->alert().toUtf8().constData(),
|
||||
id = snarlInterface->Notify(notification->alert().toUtf8().constData(),
|
||||
Notification::toPlainText(notification->title()).toUtf8().constData(),
|
||||
Notification::toPlainText(notification->text()).toUtf8().constData(),
|
||||
notification->timeout(),
|
||||
notification->icon().toUtf8().constData());
|
||||
//add ack stuff
|
||||
activeNotifications->insert(id,notification);
|
||||
}else{
|
||||
//update message
|
||||
snarlInterface->EZUpdate(notification->id(),
|
||||
snarlInterface->Update(notification->id(),
|
||||
notification->alert().toUtf8().constData(),
|
||||
Notification::toPlainText(notification->title()).toUtf8().constData(),
|
||||
Notification::toPlainText(notification->text()).toUtf8().constData(),
|
||||
notification->timeout(),
|
||||
|
@ -139,19 +141,19 @@ bool SnarlWidget::winEvent(MSG * msg, long * result){
|
|||
QSharedPointer<Notification> notification = _snarl->activeNotifications->value(notificationID);
|
||||
qDebug()<<"recived a Snarl callback id:"<<notificationID<<"action:"<<action;
|
||||
switch(action){
|
||||
case SnarlEnums::NotificationAck:
|
||||
case SnarlEnums::NotifyInvoked:
|
||||
notification->setActionInvoked(Notification::ACTION_1);
|
||||
break;
|
||||
case SnarlEnums::NotificationClicked:
|
||||
notification->setActionInvoked(Notification::ACTION_2);
|
||||
break;
|
||||
case SnarlEnums::NotificationMiddleButton:
|
||||
notification->setActionInvoked(Notification::ACTION_3);
|
||||
break;
|
||||
case SnarlEnums::NotificationClosed:
|
||||
//case SnarlEnums::NotificationClicked:
|
||||
// notification->setActionInvoked(Notification::ACTION_2);
|
||||
// break;
|
||||
//case SnarlEnums::NotificationMiddleButton:
|
||||
// notification->setActionInvoked(Notification::ACTION_3);
|
||||
// break;
|
||||
case SnarlEnums::CallbackClosed:
|
||||
notification->setActionInvoked(Notification::CLOSED);
|
||||
break;
|
||||
case SnarlEnums::NotificationTimedOut:
|
||||
case SnarlEnums::CallbackTimedOut:
|
||||
notification->setActionInvoked(Notification::TIMED_OUT);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -36,8 +36,8 @@ public:
|
|||
private:
|
||||
SnarlWidget* winIDWidget;
|
||||
|
||||
QHash<QString,Snarl::V41::SnarlInterface*> _applications;
|
||||
Snarl::V41::SnarlInterface* _defautSnarlinetrface;
|
||||
QHash<QString,Snarl::V42::SnarlInterface*> _applications;
|
||||
Snarl::V42::SnarlInterface* _defautSnarlinetrface;
|
||||
|
||||
public slots:
|
||||
void registerApplication(Application *application);
|
||||
|
|
Loading…
Reference in New Issue