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