xref: /haiku/src/kits/app/Notification.cpp (revision 1416521f1099252bb740e1e3d8991c716501e4da)
1de9dcd41SStephan Aßmus /*
2de9dcd41SStephan Aßmus  * Copyright 2010, Haiku, Inc. All Rights Reserved.
3de9dcd41SStephan Aßmus  * Distributed under the terms of the MIT License.
4de9dcd41SStephan Aßmus  *
5de9dcd41SStephan Aßmus  * Authors:
6de9dcd41SStephan Aßmus  *		Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
7279ca67dSAdrien Destugues  *		Stephan Aßmus, superstippi@gmx.de
8de9dcd41SStephan Aßmus  */
9de9dcd41SStephan Aßmus 
10f33637d9SStephan Aßmus 
11f33637d9SStephan Aßmus #include <Notification.h>
12f33637d9SStephan Aßmus 
13f33637d9SStephan Aßmus #include <new>
14f33637d9SStephan Aßmus 
15de9dcd41SStephan Aßmus #include <stdlib.h>
16de9dcd41SStephan Aßmus #include <string.h>
17de9dcd41SStephan Aßmus 
18279ca67dSAdrien Destugues #include <notification/Notifications.h>
19279ca67dSAdrien Destugues 
20de9dcd41SStephan Aßmus #include <Bitmap.h>
21de9dcd41SStephan Aßmus #include <Message.h>
22*1416521fSAdrien Destugues #include <NodeInfo.h>
23*1416521fSAdrien Destugues #include <Roster.h>
24de9dcd41SStephan Aßmus 
25de9dcd41SStephan Aßmus 
26de9dcd41SStephan Aßmus BNotification::BNotification(notification_type type)
27de9dcd41SStephan Aßmus 	:
28279ca67dSAdrien Destugues 	BArchivable(),
29279ca67dSAdrien Destugues 	fInitStatus(B_OK),
30de9dcd41SStephan Aßmus 	fType(type),
31279ca67dSAdrien Destugues 	fProgress(0.f),
32de9dcd41SStephan Aßmus 	fFile(NULL),
33de9dcd41SStephan Aßmus 	fBitmap(NULL)
34de9dcd41SStephan Aßmus {
35*1416521fSAdrien Destugues 	int32 iconSize = B_LARGE_ICON;
36*1416521fSAdrien Destugues 	fBitmap = new BBitmap(BRect(0, 0, iconSize - 1, iconSize - 1), 0, B_RGBA32);
37*1416521fSAdrien Destugues 	if (fBitmap) {
38*1416521fSAdrien Destugues 		team_info teamInfo;
39*1416521fSAdrien Destugues 		get_team_info(B_CURRENT_TEAM, &teamInfo);
40*1416521fSAdrien Destugues 		app_info appInfo;
41*1416521fSAdrien Destugues 		be_roster->GetRunningAppInfo(teamInfo.team, &appInfo);
42*1416521fSAdrien Destugues 		if (BNodeInfo::GetTrackerIcon(&appInfo.ref, fBitmap,
43*1416521fSAdrien Destugues 			icon_size(iconSize)) != B_OK) {
44*1416521fSAdrien Destugues 			delete fBitmap;
45*1416521fSAdrien Destugues 			fBitmap = NULL;
46*1416521fSAdrien Destugues 		}
47*1416521fSAdrien Destugues 	}
48de9dcd41SStephan Aßmus }
49de9dcd41SStephan Aßmus 
507c3d316bSAdrien Destugues 
51279ca67dSAdrien Destugues BNotification::BNotification(BMessage* archive)
52279ca67dSAdrien Destugues 	:
53279ca67dSAdrien Destugues 	BArchivable(archive),
54279ca67dSAdrien Destugues 	fInitStatus(B_OK),
55279ca67dSAdrien Destugues 	fProgress(0.0f),
56279ca67dSAdrien Destugues 	fFile(NULL),
57279ca67dSAdrien Destugues 	fBitmap(NULL)
58279ca67dSAdrien Destugues {
59279ca67dSAdrien Destugues 	int32 type;
60279ca67dSAdrien Destugues 	if (archive->FindInt32("_type", &type) == B_OK)
61279ca67dSAdrien Destugues 		fType = (notification_type)type;
62279ca67dSAdrien Destugues 	else
63279ca67dSAdrien Destugues 		fInitStatus = B_ERROR;
64279ca67dSAdrien Destugues 
65279ca67dSAdrien Destugues 	BString group;
66279ca67dSAdrien Destugues 	if (archive->FindString("_group", &group) == B_OK)
67279ca67dSAdrien Destugues 		SetGroup(group);
68279ca67dSAdrien Destugues 
69279ca67dSAdrien Destugues 	BString title;
70279ca67dSAdrien Destugues 	if (archive->FindString("_title", &title) == B_OK)
71279ca67dSAdrien Destugues 		SetTitle(title);
72279ca67dSAdrien Destugues 
73279ca67dSAdrien Destugues 	BString content;
74279ca67dSAdrien Destugues 	if (archive->FindString("_content", &content) == B_OK)
75279ca67dSAdrien Destugues 		SetContent(content);
76279ca67dSAdrien Destugues 
77279ca67dSAdrien Destugues 	BString messageID;
78279ca67dSAdrien Destugues 	if (archive->FindString("_messageID", &messageID) == B_OK)
79279ca67dSAdrien Destugues 		SetMessageID(messageID);
80279ca67dSAdrien Destugues 
81279ca67dSAdrien Destugues 	float progress;
82279ca67dSAdrien Destugues 	if (type == B_PROGRESS_NOTIFICATION
83279ca67dSAdrien Destugues 		&& archive->FindFloat("_progress", &progress) == B_OK)
84279ca67dSAdrien Destugues 		SetProgress(progress);
85279ca67dSAdrien Destugues 
86279ca67dSAdrien Destugues 	BString onClickApp;
87279ca67dSAdrien Destugues 	if (archive->FindString("_onClickApp", &onClickApp) == B_OK)
88279ca67dSAdrien Destugues 		SetOnClickApp(onClickApp);
89279ca67dSAdrien Destugues 
90279ca67dSAdrien Destugues 	entry_ref onClickFile;
91279ca67dSAdrien Destugues 	if (archive->FindRef("_onClickFile", &onClickFile) == B_OK)
92279ca67dSAdrien Destugues 		SetOnClickFile(&onClickFile);
93279ca67dSAdrien Destugues 
9433570266SRyan Leavengood 	entry_ref onClickRef;
9533570266SRyan Leavengood 	int32 index = 0;
9633570266SRyan Leavengood 	while (archive->FindRef("_onClickRef", index++, &onClickRef) == B_OK)
9733570266SRyan Leavengood 		AddOnClickRef(&onClickRef);
9833570266SRyan Leavengood 
9933570266SRyan Leavengood 	BString onClickArgv;
10033570266SRyan Leavengood 	index = 0;
10133570266SRyan Leavengood 	while (archive->FindString("_onClickArgv", index++, &onClickArgv) == B_OK)
10233570266SRyan Leavengood 		AddOnClickArg(onClickArgv);
10333570266SRyan Leavengood 
104279ca67dSAdrien Destugues 	status_t ret = B_OK;
105279ca67dSAdrien Destugues 	BMessage icon;
106279ca67dSAdrien Destugues 	if ((ret = archive->FindMessage("_icon", &icon)) == B_OK) {
107279ca67dSAdrien Destugues 		BBitmap bitmap(&icon);
108279ca67dSAdrien Destugues 		ret = bitmap.InitCheck();
109279ca67dSAdrien Destugues 		if (ret == B_OK)
110279ca67dSAdrien Destugues 			ret = SetIcon(&bitmap);
111279ca67dSAdrien Destugues 	}
112279ca67dSAdrien Destugues }
113279ca67dSAdrien Destugues 
114de9dcd41SStephan Aßmus 
115de9dcd41SStephan Aßmus BNotification::~BNotification()
116de9dcd41SStephan Aßmus {
117f33637d9SStephan Aßmus 	delete fFile;
118f33637d9SStephan Aßmus 	delete fBitmap;
119de9dcd41SStephan Aßmus 
120f33637d9SStephan Aßmus 	for (int32 i = fRefs.CountItems() - 1; i >= 0; i--)
121f33637d9SStephan Aßmus 		delete (entry_ref*)fRefs.ItemAtFast(i);
122f33637d9SStephan Aßmus 
123f33637d9SStephan Aßmus 	for (int32 i = fArgv.CountItems() - 1; i >= 0; i--)
124f33637d9SStephan Aßmus 		free(fArgv.ItemAtFast(i));
125de9dcd41SStephan Aßmus }
126de9dcd41SStephan Aßmus 
127de9dcd41SStephan Aßmus 
128279ca67dSAdrien Destugues /*! \brief Returns initialization status.
129279ca67dSAdrien Destugues  */
130279ca67dSAdrien Destugues status_t
131279ca67dSAdrien Destugues BNotification::InitCheck() const
132279ca67dSAdrien Destugues {
133279ca67dSAdrien Destugues 	return fInitStatus;
134279ca67dSAdrien Destugues }
135279ca67dSAdrien Destugues 
136279ca67dSAdrien Destugues 
137279ca67dSAdrien Destugues /*! \brief Returns a new BNotification object from @archive.
138279ca67dSAdrien Destugues 
139279ca67dSAdrien Destugues 	Returns a new BNotification object, allocated by new and created
140279ca67dSAdrien Destugues 	with the version of the constructor that takes BMessage archive.
141279ca67dSAdrien Destugues 	However, if the message doesn't contain an archived data for a
142279ca67dSAdrien Destugues 	BNotification object, this method returns NULL.
143279ca67dSAdrien Destugues 
144279ca67dSAdrien Destugues 	\return BNotification object from @archive or NULL if it doesn't
145279ca67dSAdrien Destugues 			contain a valid BNotification object.
146279ca67dSAdrien Destugues */
147279ca67dSAdrien Destugues BArchivable*
148279ca67dSAdrien Destugues BNotification::Instantiate(BMessage* archive)
149279ca67dSAdrien Destugues {
150279ca67dSAdrien Destugues 	if (validate_instantiation(archive, "BNotification"))
151279ca67dSAdrien Destugues 		return new(std::nothrow) BNotification(archive);
152279ca67dSAdrien Destugues 
153279ca67dSAdrien Destugues 	return NULL;
154279ca67dSAdrien Destugues }
155279ca67dSAdrien Destugues 
156279ca67dSAdrien Destugues 
157279ca67dSAdrien Destugues /*! \brief Archives the BNotification in the BMessages @archive.
158279ca67dSAdrien Destugues 
159279ca67dSAdrien Destugues 	\sa BArchivable::Archive(), Instantiate() static function.
160279ca67dSAdrien Destugues 	\return
161279ca67dSAdrien Destugues 	- \c B_OK: Everything went fine.
162279ca67dSAdrien Destugues 	- \c Other errors: Archiving has failed.
163279ca67dSAdrien Destugues */
164279ca67dSAdrien Destugues status_t
165279ca67dSAdrien Destugues BNotification::Archive(BMessage* archive, bool deep) const
166279ca67dSAdrien Destugues {
167279ca67dSAdrien Destugues 	status_t status = BArchivable::Archive(archive, deep);
168279ca67dSAdrien Destugues 
169279ca67dSAdrien Destugues 	if (status == B_OK)
170279ca67dSAdrien Destugues 		status = archive->AddInt32("_type", (int32)fType);
171279ca67dSAdrien Destugues 
172279ca67dSAdrien Destugues 	if (status == B_OK && Group() != NULL)
173279ca67dSAdrien Destugues 		status = archive->AddString("_group", Group());
174279ca67dSAdrien Destugues 
175279ca67dSAdrien Destugues 	if (status == B_OK && Title() != NULL)
176279ca67dSAdrien Destugues 		status = archive->AddString("_title", Title());
177279ca67dSAdrien Destugues 
178279ca67dSAdrien Destugues 	if (status == B_OK && Content() != NULL)
179279ca67dSAdrien Destugues 		status = archive->AddString("_content", Content());
180279ca67dSAdrien Destugues 
181279ca67dSAdrien Destugues 	if (status == B_OK && MessageID() != NULL)
182279ca67dSAdrien Destugues 		status = archive->AddString("_messageID", MessageID());
183279ca67dSAdrien Destugues 
184279ca67dSAdrien Destugues 	if (status == B_OK && Type() == B_PROGRESS_NOTIFICATION)
185279ca67dSAdrien Destugues 		status = archive->AddFloat("_progress", Progress());
186279ca67dSAdrien Destugues 
187279ca67dSAdrien Destugues 	if (status == B_OK && OnClickApp() != NULL)
188279ca67dSAdrien Destugues 		status = archive->AddString("_onClickApp", OnClickApp());
189279ca67dSAdrien Destugues 
190279ca67dSAdrien Destugues 	if (status == B_OK && OnClickFile() != NULL)
191279ca67dSAdrien Destugues 		status = archive->AddRef("_onClickFile", OnClickFile());
192279ca67dSAdrien Destugues 
193279ca67dSAdrien Destugues 	if (status == B_OK) {
194279ca67dSAdrien Destugues 		for (int32 i = 0; i < CountOnClickRefs(); i++) {
195279ca67dSAdrien Destugues 			status = archive->AddRef("_onClickRef", OnClickRefAt(i));
196279ca67dSAdrien Destugues 			if (status != B_OK)
197279ca67dSAdrien Destugues 				break;
198279ca67dSAdrien Destugues 		}
199279ca67dSAdrien Destugues 	}
200279ca67dSAdrien Destugues 
201279ca67dSAdrien Destugues 	if (status == B_OK) {
202279ca67dSAdrien Destugues 		for (int32 i = 0; i < CountOnClickArgs(); i++) {
203279ca67dSAdrien Destugues 			status = archive->AddString("_onClickArgv", OnClickArgAt(i));
204279ca67dSAdrien Destugues 			if (status != B_OK)
205279ca67dSAdrien Destugues 				break;
206279ca67dSAdrien Destugues 		}
207279ca67dSAdrien Destugues 	}
208279ca67dSAdrien Destugues 
209279ca67dSAdrien Destugues 	if (status == B_OK) {
210279ca67dSAdrien Destugues 		const BBitmap* icon = Icon();
211279ca67dSAdrien Destugues 		if (icon != NULL) {
212279ca67dSAdrien Destugues 			BMessage iconArchive;
213279ca67dSAdrien Destugues 			status = icon->Archive(&iconArchive);
214279ca67dSAdrien Destugues 			if (status == B_OK)
215279ca67dSAdrien Destugues 				archive->AddMessage("_icon", &iconArchive);
216279ca67dSAdrien Destugues 		}
217279ca67dSAdrien Destugues 	}
218279ca67dSAdrien Destugues 
219279ca67dSAdrien Destugues 	return status;
220279ca67dSAdrien Destugues }
221279ca67dSAdrien Destugues 
222279ca67dSAdrien Destugues 
223279ca67dSAdrien Destugues /*! \brief Notification's type.
224279ca67dSAdrien Destugues 
225279ca67dSAdrien Destugues 	\return A value of the notification_type enum that represents
226279ca67dSAdrien Destugues 			notification type.
227279ca67dSAdrien Destugues */
228de9dcd41SStephan Aßmus notification_type
229de9dcd41SStephan Aßmus BNotification::Type() const
230de9dcd41SStephan Aßmus {
231de9dcd41SStephan Aßmus 	return fType;
232de9dcd41SStephan Aßmus }
233de9dcd41SStephan Aßmus 
234de9dcd41SStephan Aßmus 
235279ca67dSAdrien Destugues /*! \brief Returns notification's group.
236279ca67dSAdrien Destugues 
237279ca67dSAdrien Destugues 	\return Notification's group.
238279ca67dSAdrien Destugues */
239de9dcd41SStephan Aßmus const char*
240279ca67dSAdrien Destugues BNotification::Group() const
241de9dcd41SStephan Aßmus {
242279ca67dSAdrien Destugues 	if (fGroup == "")
243279ca67dSAdrien Destugues 		return NULL;
244279ca67dSAdrien Destugues 	return fGroup;
245de9dcd41SStephan Aßmus }
246de9dcd41SStephan Aßmus 
247de9dcd41SStephan Aßmus 
248279ca67dSAdrien Destugues /*! \brief Sets notification's group.
249279ca67dSAdrien Destugues 
250279ca67dSAdrien Destugues 	Notifications can be grouped together setting the same group.
251279ca67dSAdrien Destugues */
252de9dcd41SStephan Aßmus void
253279ca67dSAdrien Destugues BNotification::SetGroup(const BString& group)
254de9dcd41SStephan Aßmus {
255279ca67dSAdrien Destugues 	fGroup = group;
256de9dcd41SStephan Aßmus }
257de9dcd41SStephan Aßmus 
258de9dcd41SStephan Aßmus 
259279ca67dSAdrien Destugues /*! \brief Returns notification's title.
260279ca67dSAdrien Destugues 
261279ca67dSAdrien Destugues 	\return Notification's title.
262279ca67dSAdrien Destugues */
263de9dcd41SStephan Aßmus const char*
264de9dcd41SStephan Aßmus BNotification::Title() const
265de9dcd41SStephan Aßmus {
266279ca67dSAdrien Destugues 	if (fTitle == "")
267279ca67dSAdrien Destugues 		return NULL;
268de9dcd41SStephan Aßmus 	return fTitle;
269de9dcd41SStephan Aßmus }
270de9dcd41SStephan Aßmus 
271de9dcd41SStephan Aßmus 
272279ca67dSAdrien Destugues /*! \brief Set notification's title.
273279ca67dSAdrien Destugues */
274de9dcd41SStephan Aßmus void
275908967a1SStephan Aßmus BNotification::SetTitle(const BString& title)
276de9dcd41SStephan Aßmus {
277f33637d9SStephan Aßmus 	fTitle = title;
278de9dcd41SStephan Aßmus }
279de9dcd41SStephan Aßmus 
280de9dcd41SStephan Aßmus 
281279ca67dSAdrien Destugues /*! \brief Returns notification's message.
282279ca67dSAdrien Destugues 
283279ca67dSAdrien Destugues 	\return Notification's message.
284279ca67dSAdrien Destugues */
285de9dcd41SStephan Aßmus const char*
286de9dcd41SStephan Aßmus BNotification::Content() const
287de9dcd41SStephan Aßmus {
288279ca67dSAdrien Destugues 	if (fContent == "")
289279ca67dSAdrien Destugues 		return NULL;
290de9dcd41SStephan Aßmus 	return fContent;
291de9dcd41SStephan Aßmus }
292de9dcd41SStephan Aßmus 
293de9dcd41SStephan Aßmus 
294279ca67dSAdrien Destugues /*! \brief Sets notification's message.
295279ca67dSAdrien Destugues */
296de9dcd41SStephan Aßmus void
297908967a1SStephan Aßmus BNotification::SetContent(const BString& content)
298de9dcd41SStephan Aßmus {
299f33637d9SStephan Aßmus 	fContent = content;
300de9dcd41SStephan Aßmus }
301de9dcd41SStephan Aßmus 
302de9dcd41SStephan Aßmus 
303279ca67dSAdrien Destugues /*! \brief Returns notification's message identifier.
304279ca67dSAdrien Destugues 
305279ca67dSAdrien Destugues 	\return Notification's message identifier.
306279ca67dSAdrien Destugues */
307de9dcd41SStephan Aßmus const char*
308de9dcd41SStephan Aßmus BNotification::MessageID() const
309de9dcd41SStephan Aßmus {
310279ca67dSAdrien Destugues 	if (fID == "")
311279ca67dSAdrien Destugues 		return NULL;
312de9dcd41SStephan Aßmus 	return fID;
313de9dcd41SStephan Aßmus }
314de9dcd41SStephan Aßmus 
315de9dcd41SStephan Aßmus 
316279ca67dSAdrien Destugues /*! \brief Sets notification's message identifier.
317279ca67dSAdrien Destugues */
318de9dcd41SStephan Aßmus void
319908967a1SStephan Aßmus BNotification::SetMessageID(const BString& id)
320de9dcd41SStephan Aßmus {
321f33637d9SStephan Aßmus 	fID = id;
322de9dcd41SStephan Aßmus }
323de9dcd41SStephan Aßmus 
324de9dcd41SStephan Aßmus 
325279ca67dSAdrien Destugues /*! \brief Returns progress information.
326279ca67dSAdrien Destugues 
327279ca67dSAdrien Destugues 	If notification's type is \c B_PROGRESS_NOTIFICATION, returns a value
328279ca67dSAdrien Destugues 	between 0.0 and 1.0 that represent progress percentage.
329279ca67dSAdrien Destugues 
330279ca67dSAdrien Destugues 	If notification's type is not \c B_PROGRESS_NOTIFICATION, returns -1.
331279ca67dSAdrien Destugues 
332279ca67dSAdrien Destugues 	\return Percentage if notification's type is B_PROGRESS_NOTIFICATION
333279ca67dSAdrien Destugues 			or otherwise -1.
334279ca67dSAdrien Destugues */
335de9dcd41SStephan Aßmus float
336de9dcd41SStephan Aßmus BNotification::Progress() const
337de9dcd41SStephan Aßmus {
338279ca67dSAdrien Destugues 	if (fType != B_PROGRESS_NOTIFICATION)
339279ca67dSAdrien Destugues 		return -1;
340de9dcd41SStephan Aßmus 	return fProgress;
341de9dcd41SStephan Aßmus }
342de9dcd41SStephan Aßmus 
343de9dcd41SStephan Aßmus 
344279ca67dSAdrien Destugues /*! \brief Sets progress information.
345279ca67dSAdrien Destugues 
346279ca67dSAdrien Destugues 	Sets progress percentage, this information will be used only
347279ca67dSAdrien Destugues 	if notification's type is \c B_PROGRESS_NOTIFICATION.
348279ca67dSAdrien Destugues 
349279ca67dSAdrien Destugues 	The value of @progress must be between 0.0 and 1.0.
350279ca67dSAdrien Destugues */
351de9dcd41SStephan Aßmus void
352de9dcd41SStephan Aßmus BNotification::SetProgress(float progress)
353de9dcd41SStephan Aßmus {
354279ca67dSAdrien Destugues 	if (progress < 0)
355279ca67dSAdrien Destugues 		fProgress = 0;
356279ca67dSAdrien Destugues 	else if (progress > 1)
357279ca67dSAdrien Destugues 		fProgress = 1;
358279ca67dSAdrien Destugues 	else
359de9dcd41SStephan Aßmus 		fProgress = progress;
360de9dcd41SStephan Aßmus }
361de9dcd41SStephan Aßmus 
362de9dcd41SStephan Aßmus 
363de9dcd41SStephan Aßmus const char*
364de9dcd41SStephan Aßmus BNotification::OnClickApp() const
365de9dcd41SStephan Aßmus {
366279ca67dSAdrien Destugues 	if (fApp == "")
367279ca67dSAdrien Destugues 		return NULL;
368de9dcd41SStephan Aßmus 	return fApp;
369de9dcd41SStephan Aßmus }
370de9dcd41SStephan Aßmus 
371de9dcd41SStephan Aßmus 
372de9dcd41SStephan Aßmus void
373908967a1SStephan Aßmus BNotification::SetOnClickApp(const BString& app)
374de9dcd41SStephan Aßmus {
375f33637d9SStephan Aßmus 	fApp = app;
376de9dcd41SStephan Aßmus }
377de9dcd41SStephan Aßmus 
378de9dcd41SStephan Aßmus 
379f33637d9SStephan Aßmus const entry_ref*
380de9dcd41SStephan Aßmus BNotification::OnClickFile() const
381de9dcd41SStephan Aßmus {
382de9dcd41SStephan Aßmus 	return fFile;
383de9dcd41SStephan Aßmus }
384de9dcd41SStephan Aßmus 
385de9dcd41SStephan Aßmus 
386f33637d9SStephan Aßmus status_t
387de9dcd41SStephan Aßmus BNotification::SetOnClickFile(const entry_ref* file)
388de9dcd41SStephan Aßmus {
389f33637d9SStephan Aßmus 	delete fFile;
390f33637d9SStephan Aßmus 
391f33637d9SStephan Aßmus 	if (file != NULL) {
392f33637d9SStephan Aßmus 		fFile = new(std::nothrow) entry_ref(*file);
393f33637d9SStephan Aßmus 		if (fFile == NULL)
394f33637d9SStephan Aßmus 			return B_NO_MEMORY;
395f33637d9SStephan Aßmus 	} else
396f33637d9SStephan Aßmus 		fFile = NULL;
397f33637d9SStephan Aßmus 
398f33637d9SStephan Aßmus 	return B_OK;
399de9dcd41SStephan Aßmus }
400de9dcd41SStephan Aßmus 
401de9dcd41SStephan Aßmus 
402f33637d9SStephan Aßmus status_t
403de9dcd41SStephan Aßmus BNotification::AddOnClickRef(const entry_ref* ref)
404de9dcd41SStephan Aßmus {
405f33637d9SStephan Aßmus 	if (ref == NULL)
406f33637d9SStephan Aßmus 		return B_BAD_VALUE;
407f33637d9SStephan Aßmus 
408908967a1SStephan Aßmus 	entry_ref* clonedRef = new(std::nothrow) entry_ref(*ref);
409908967a1SStephan Aßmus 	if (clonedRef == NULL || !fRefs.AddItem(clonedRef))
410908967a1SStephan Aßmus 		return B_NO_MEMORY;
411908967a1SStephan Aßmus 
412908967a1SStephan Aßmus 	return B_OK;
413de9dcd41SStephan Aßmus }
414de9dcd41SStephan Aßmus 
415de9dcd41SStephan Aßmus 
416f33637d9SStephan Aßmus int32
417f33637d9SStephan Aßmus BNotification::CountOnClickRefs() const
418de9dcd41SStephan Aßmus {
419f33637d9SStephan Aßmus 	return fRefs.CountItems();
420de9dcd41SStephan Aßmus }
421de9dcd41SStephan Aßmus 
422de9dcd41SStephan Aßmus 
423f33637d9SStephan Aßmus const entry_ref*
424f33637d9SStephan Aßmus BNotification::OnClickRefAt(int32 index) const
425f33637d9SStephan Aßmus {
426f33637d9SStephan Aßmus 	return (entry_ref*)fArgv.ItemAt(index);
427f33637d9SStephan Aßmus }
428f33637d9SStephan Aßmus 
429f33637d9SStephan Aßmus 
430f33637d9SStephan Aßmus status_t
431908967a1SStephan Aßmus BNotification::AddOnClickArg(const BString& arg)
432f33637d9SStephan Aßmus {
433908967a1SStephan Aßmus 	char* clonedArg = strdup(arg.String());
434f33637d9SStephan Aßmus 	if (clonedArg == NULL || !fArgv.AddItem(clonedArg))
435f33637d9SStephan Aßmus 		return B_NO_MEMORY;
436f33637d9SStephan Aßmus 
437f33637d9SStephan Aßmus 	return B_OK;
438de9dcd41SStephan Aßmus }
439de9dcd41SStephan Aßmus 
440de9dcd41SStephan Aßmus 
441f33637d9SStephan Aßmus int32
442f33637d9SStephan Aßmus BNotification::CountOnClickArgs() const
443f33637d9SStephan Aßmus {
444f33637d9SStephan Aßmus 	return fArgv.CountItems();
445f33637d9SStephan Aßmus }
446f33637d9SStephan Aßmus 
447f33637d9SStephan Aßmus 
448f33637d9SStephan Aßmus const char*
449f33637d9SStephan Aßmus BNotification::OnClickArgAt(int32 index) const
450f33637d9SStephan Aßmus {
451f33637d9SStephan Aßmus 	return (char*)fArgv.ItemAt(index);
452f33637d9SStephan Aßmus }
453f33637d9SStephan Aßmus 
454f33637d9SStephan Aßmus 
455279ca67dSAdrien Destugues /*! \brief Notification's icon.
456279ca67dSAdrien Destugues 
457279ca67dSAdrien Destugues 	\return Notification's icon.
458279ca67dSAdrien Destugues */
459f33637d9SStephan Aßmus const BBitmap*
460de9dcd41SStephan Aßmus BNotification::Icon() const
461de9dcd41SStephan Aßmus {
462de9dcd41SStephan Aßmus 	return fBitmap;
463de9dcd41SStephan Aßmus }
464de9dcd41SStephan Aßmus 
465de9dcd41SStephan Aßmus 
466279ca67dSAdrien Destugues /*! \brief Sets notification's icon.
467279ca67dSAdrien Destugues 
468279ca67dSAdrien Destugues 	Sets notification's icon.
46958844015SJessica Hamilton 	This method does not assume ownership of @icon.
470279ca67dSAdrien Destugues 
471279ca67dSAdrien Destugues 	\param icon Icon
472279ca67dSAdrien Destugues 	\return
473279ca67dSAdrien Destugues 	- \c B_OK: Everything went fine.
474279ca67dSAdrien Destugues 	- \c B_NO_MEMORY: Allocation of @icon copy has failed.
475279ca67dSAdrien Destugues 	- \c Other errors: Creation of @icon copy failed for some reason.
476279ca67dSAdrien Destugues */
477f33637d9SStephan Aßmus status_t
478f33637d9SStephan Aßmus BNotification::SetIcon(const BBitmap* icon)
479de9dcd41SStephan Aßmus {
480f33637d9SStephan Aßmus 	delete fBitmap;
481f33637d9SStephan Aßmus 
482f33637d9SStephan Aßmus 	if (icon != NULL) {
483f33637d9SStephan Aßmus 		fBitmap = new(std::nothrow) BBitmap(icon);
484f33637d9SStephan Aßmus 		if (fBitmap == NULL)
485f33637d9SStephan Aßmus 			return B_NO_MEMORY;
486f33637d9SStephan Aßmus 		return fBitmap->InitCheck();
487f33637d9SStephan Aßmus 	}
488f33637d9SStephan Aßmus 
489f33637d9SStephan Aßmus 	fBitmap = NULL;
490f33637d9SStephan Aßmus 	return B_OK;
491de9dcd41SStephan Aßmus }
492279ca67dSAdrien Destugues 
493279ca67dSAdrien Destugues 
494279ca67dSAdrien Destugues /*! \brief Sends a notification to the notification_server.
495279ca67dSAdrien Destugues 
496279ca67dSAdrien Destugues 	The notification is delivered asynchronously to the notification_server,
497279ca67dSAdrien Destugues 	which will display it according to its settings and filters.
498279ca67dSAdrien Destugues 
499279ca67dSAdrien Destugues 	\param timeout Microseconds after the message fades out.
500279ca67dSAdrien Destugues 	\return
501279ca67dSAdrien Destugues 	- \c B_OK: Everything went fine.
502279ca67dSAdrien Destugues 	- \c B_BAD_PORT_ID: A connection to notification_server could not be
503279ca67dSAdrien Destugues 	  established or the server is not up and running anymore.
504279ca67dSAdrien Destugues 	- \c Other errors: Building the message from the notification failed.
505279ca67dSAdrien Destugues */
506279ca67dSAdrien Destugues status_t
507279ca67dSAdrien Destugues BNotification::Send(bigtime_t timeout)
508279ca67dSAdrien Destugues {
509279ca67dSAdrien Destugues 	BMessage msg(kNotificationMessage);
510279ca67dSAdrien Destugues 
511279ca67dSAdrien Destugues 	// Archive notification
512279ca67dSAdrien Destugues 	status_t ret = Archive(&msg);
513279ca67dSAdrien Destugues 
514279ca67dSAdrien Destugues 	// Custom time out
515279ca67dSAdrien Destugues 	if (ret == B_OK && timeout > 0)
516279ca67dSAdrien Destugues 		ret = msg.AddInt64("timeout", timeout);
517279ca67dSAdrien Destugues 
518279ca67dSAdrien Destugues 	// Send message
519279ca67dSAdrien Destugues 	if (ret == B_OK) {
520279ca67dSAdrien Destugues 		BMessenger server(kNotificationServerSignature);
521279ca67dSAdrien Destugues 		ret = server.SendMessage(&msg);
522279ca67dSAdrien Destugues 	}
523279ca67dSAdrien Destugues 
524279ca67dSAdrien Destugues 	return ret;
525279ca67dSAdrien Destugues }
526