1de9dcd41SStephan Aßmus /* 26aa05872SBrian Hill * Copyright 2010-2017, 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 86aa05872SBrian Hill * Brian Hill, supernova@tycho.email 9de9dcd41SStephan Aßmus */ 10de9dcd41SStephan Aßmus 11f33637d9SStephan Aßmus 12f33637d9SStephan Aßmus #include <Notification.h> 13f33637d9SStephan Aßmus 14f33637d9SStephan Aßmus #include <new> 15f33637d9SStephan Aßmus 16de9dcd41SStephan Aßmus #include <stdlib.h> 17de9dcd41SStephan Aßmus #include <string.h> 18de9dcd41SStephan Aßmus 19279ca67dSAdrien Destugues #include <notification/Notifications.h> 20279ca67dSAdrien Destugues 21de9dcd41SStephan Aßmus #include <Bitmap.h> 22de9dcd41SStephan Aßmus #include <Message.h> 231416521fSAdrien Destugues #include <NodeInfo.h> 246aa05872SBrian Hill #include <Path.h> 251416521fSAdrien Destugues #include <Roster.h> 26de9dcd41SStephan Aßmus 27de9dcd41SStephan Aßmus 28de9dcd41SStephan Aßmus BNotification::BNotification(notification_type type) 29de9dcd41SStephan Aßmus : 30279ca67dSAdrien Destugues BArchivable(), 31279ca67dSAdrien Destugues fInitStatus(B_OK), 32de9dcd41SStephan Aßmus fType(type), 33279ca67dSAdrien Destugues fProgress(0.f), 34de9dcd41SStephan Aßmus fFile(NULL), 35de9dcd41SStephan Aßmus fBitmap(NULL) 36de9dcd41SStephan Aßmus { 371416521fSAdrien Destugues team_info teamInfo; 381416521fSAdrien Destugues get_team_info(B_CURRENT_TEAM, &teamInfo); 391416521fSAdrien Destugues app_info appInfo; 401416521fSAdrien Destugues be_roster->GetRunningAppInfo(teamInfo.team, &appInfo); 416aa05872SBrian Hill 426aa05872SBrian Hill int32 iconSize = B_LARGE_ICON; 436aa05872SBrian Hill fBitmap = new BBitmap(BRect(0, 0, iconSize - 1, iconSize - 1), 0, B_RGBA32); 446aa05872SBrian Hill if (fBitmap) { 451416521fSAdrien Destugues if (BNodeInfo::GetTrackerIcon(&appInfo.ref, fBitmap, 461416521fSAdrien Destugues icon_size(iconSize)) != B_OK) { 471416521fSAdrien Destugues delete fBitmap; 481416521fSAdrien Destugues fBitmap = NULL; 491416521fSAdrien Destugues } 501416521fSAdrien Destugues } 516aa05872SBrian Hill fSourceSignature = appInfo.signature; 526aa05872SBrian Hill BPath path(&appInfo.ref); 536aa05872SBrian Hill if (path.InitCheck() == B_OK) 546aa05872SBrian Hill fSourceName = path.Leaf(); 55de9dcd41SStephan Aßmus } 56de9dcd41SStephan Aßmus 577c3d316bSAdrien Destugues 58279ca67dSAdrien Destugues BNotification::BNotification(BMessage* archive) 59279ca67dSAdrien Destugues : 60279ca67dSAdrien Destugues BArchivable(archive), 61279ca67dSAdrien Destugues fInitStatus(B_OK), 62279ca67dSAdrien Destugues fProgress(0.0f), 63279ca67dSAdrien Destugues fFile(NULL), 64279ca67dSAdrien Destugues fBitmap(NULL) 65279ca67dSAdrien Destugues { 666aa05872SBrian Hill BString appName; 676aa05872SBrian Hill if (archive->FindString("_appname", &appName) == B_OK) 686aa05872SBrian Hill fSourceName = appName; 696aa05872SBrian Hill 706aa05872SBrian Hill BString signature; 716aa05872SBrian Hill if (archive->FindString("_signature", &signature) == B_OK) 726aa05872SBrian Hill fSourceSignature = signature; 736aa05872SBrian Hill 74279ca67dSAdrien Destugues int32 type; 75279ca67dSAdrien Destugues if (archive->FindInt32("_type", &type) == B_OK) 76279ca67dSAdrien Destugues fType = (notification_type)type; 77279ca67dSAdrien Destugues else 78279ca67dSAdrien Destugues fInitStatus = B_ERROR; 79279ca67dSAdrien Destugues 80279ca67dSAdrien Destugues BString group; 81279ca67dSAdrien Destugues if (archive->FindString("_group", &group) == B_OK) 82279ca67dSAdrien Destugues SetGroup(group); 83279ca67dSAdrien Destugues 84279ca67dSAdrien Destugues BString title; 85279ca67dSAdrien Destugues if (archive->FindString("_title", &title) == B_OK) 86279ca67dSAdrien Destugues SetTitle(title); 87279ca67dSAdrien Destugues 88279ca67dSAdrien Destugues BString content; 89279ca67dSAdrien Destugues if (archive->FindString("_content", &content) == B_OK) 90279ca67dSAdrien Destugues SetContent(content); 91279ca67dSAdrien Destugues 92279ca67dSAdrien Destugues BString messageID; 93279ca67dSAdrien Destugues if (archive->FindString("_messageID", &messageID) == B_OK) 94279ca67dSAdrien Destugues SetMessageID(messageID); 95279ca67dSAdrien Destugues 96279ca67dSAdrien Destugues float progress; 97279ca67dSAdrien Destugues if (type == B_PROGRESS_NOTIFICATION 98279ca67dSAdrien Destugues && archive->FindFloat("_progress", &progress) == B_OK) 99279ca67dSAdrien Destugues SetProgress(progress); 100279ca67dSAdrien Destugues 101279ca67dSAdrien Destugues BString onClickApp; 102279ca67dSAdrien Destugues if (archive->FindString("_onClickApp", &onClickApp) == B_OK) 103279ca67dSAdrien Destugues SetOnClickApp(onClickApp); 104279ca67dSAdrien Destugues 105279ca67dSAdrien Destugues entry_ref onClickFile; 106279ca67dSAdrien Destugues if (archive->FindRef("_onClickFile", &onClickFile) == B_OK) 107279ca67dSAdrien Destugues SetOnClickFile(&onClickFile); 108279ca67dSAdrien Destugues 10933570266SRyan Leavengood entry_ref onClickRef; 11033570266SRyan Leavengood int32 index = 0; 11133570266SRyan Leavengood while (archive->FindRef("_onClickRef", index++, &onClickRef) == B_OK) 11233570266SRyan Leavengood AddOnClickRef(&onClickRef); 11333570266SRyan Leavengood 11433570266SRyan Leavengood BString onClickArgv; 11533570266SRyan Leavengood index = 0; 11633570266SRyan Leavengood while (archive->FindString("_onClickArgv", index++, &onClickArgv) == B_OK) 11733570266SRyan Leavengood AddOnClickArg(onClickArgv); 11833570266SRyan Leavengood 119279ca67dSAdrien Destugues status_t ret = B_OK; 120279ca67dSAdrien Destugues BMessage icon; 121279ca67dSAdrien Destugues if ((ret = archive->FindMessage("_icon", &icon)) == B_OK) { 122279ca67dSAdrien Destugues BBitmap bitmap(&icon); 123279ca67dSAdrien Destugues ret = bitmap.InitCheck(); 124279ca67dSAdrien Destugues if (ret == B_OK) 125279ca67dSAdrien Destugues ret = SetIcon(&bitmap); 126279ca67dSAdrien Destugues } 127279ca67dSAdrien Destugues } 128279ca67dSAdrien Destugues 129de9dcd41SStephan Aßmus 130de9dcd41SStephan Aßmus BNotification::~BNotification() 131de9dcd41SStephan Aßmus { 132f33637d9SStephan Aßmus delete fFile; 133f33637d9SStephan Aßmus delete fBitmap; 134de9dcd41SStephan Aßmus 135f33637d9SStephan Aßmus for (int32 i = fRefs.CountItems() - 1; i >= 0; i--) 136f33637d9SStephan Aßmus delete (entry_ref*)fRefs.ItemAtFast(i); 137f33637d9SStephan Aßmus 138f33637d9SStephan Aßmus for (int32 i = fArgv.CountItems() - 1; i >= 0; i--) 139f33637d9SStephan Aßmus free(fArgv.ItemAtFast(i)); 140de9dcd41SStephan Aßmus } 141de9dcd41SStephan Aßmus 142de9dcd41SStephan Aßmus 143279ca67dSAdrien Destugues /*! \brief Returns initialization status. 144279ca67dSAdrien Destugues */ 145279ca67dSAdrien Destugues status_t 146279ca67dSAdrien Destugues BNotification::InitCheck() const 147279ca67dSAdrien Destugues { 148279ca67dSAdrien Destugues return fInitStatus; 149279ca67dSAdrien Destugues } 150279ca67dSAdrien Destugues 151279ca67dSAdrien Destugues 152279ca67dSAdrien Destugues /*! \brief Returns a new BNotification object from @archive. 153279ca67dSAdrien Destugues 154279ca67dSAdrien Destugues Returns a new BNotification object, allocated by new and created 155279ca67dSAdrien Destugues with the version of the constructor that takes BMessage archive. 156279ca67dSAdrien Destugues However, if the message doesn't contain an archived data for a 157279ca67dSAdrien Destugues BNotification object, this method returns NULL. 158279ca67dSAdrien Destugues 159279ca67dSAdrien Destugues \return BNotification object from @archive or NULL if it doesn't 160279ca67dSAdrien Destugues contain a valid BNotification object. 161279ca67dSAdrien Destugues */ 162279ca67dSAdrien Destugues BArchivable* 163279ca67dSAdrien Destugues BNotification::Instantiate(BMessage* archive) 164279ca67dSAdrien Destugues { 165279ca67dSAdrien Destugues if (validate_instantiation(archive, "BNotification")) 166279ca67dSAdrien Destugues return new(std::nothrow) BNotification(archive); 167279ca67dSAdrien Destugues 168279ca67dSAdrien Destugues return NULL; 169279ca67dSAdrien Destugues } 170279ca67dSAdrien Destugues 171279ca67dSAdrien Destugues 172279ca67dSAdrien Destugues /*! \brief Archives the BNotification in the BMessages @archive. 173279ca67dSAdrien Destugues 174279ca67dSAdrien Destugues \sa BArchivable::Archive(), Instantiate() static function. 175279ca67dSAdrien Destugues \return 176279ca67dSAdrien Destugues - \c B_OK: Everything went fine. 177279ca67dSAdrien Destugues - \c Other errors: Archiving has failed. 178279ca67dSAdrien Destugues */ 179279ca67dSAdrien Destugues status_t 180279ca67dSAdrien Destugues BNotification::Archive(BMessage* archive, bool deep) const 181279ca67dSAdrien Destugues { 182279ca67dSAdrien Destugues status_t status = BArchivable::Archive(archive, deep); 183279ca67dSAdrien Destugues 184279ca67dSAdrien Destugues if (status == B_OK) 1856aa05872SBrian Hill status = archive->AddString("_appname", fSourceName); 1866aa05872SBrian Hill 1876aa05872SBrian Hill if (status == B_OK) 1886aa05872SBrian Hill status = archive->AddString("_signature", fSourceSignature); 1896aa05872SBrian Hill 1906aa05872SBrian Hill if (status == B_OK) 191279ca67dSAdrien Destugues status = archive->AddInt32("_type", (int32)fType); 192279ca67dSAdrien Destugues 193279ca67dSAdrien Destugues if (status == B_OK && Group() != NULL) 194279ca67dSAdrien Destugues status = archive->AddString("_group", Group()); 195279ca67dSAdrien Destugues 196279ca67dSAdrien Destugues if (status == B_OK && Title() != NULL) 197279ca67dSAdrien Destugues status = archive->AddString("_title", Title()); 198279ca67dSAdrien Destugues 199279ca67dSAdrien Destugues if (status == B_OK && Content() != NULL) 200279ca67dSAdrien Destugues status = archive->AddString("_content", Content()); 201279ca67dSAdrien Destugues 202279ca67dSAdrien Destugues if (status == B_OK && MessageID() != NULL) 203279ca67dSAdrien Destugues status = archive->AddString("_messageID", MessageID()); 204279ca67dSAdrien Destugues 205279ca67dSAdrien Destugues if (status == B_OK && Type() == B_PROGRESS_NOTIFICATION) 206279ca67dSAdrien Destugues status = archive->AddFloat("_progress", Progress()); 207279ca67dSAdrien Destugues 208279ca67dSAdrien Destugues if (status == B_OK && OnClickApp() != NULL) 209279ca67dSAdrien Destugues status = archive->AddString("_onClickApp", OnClickApp()); 210279ca67dSAdrien Destugues 211279ca67dSAdrien Destugues if (status == B_OK && OnClickFile() != NULL) 212279ca67dSAdrien Destugues status = archive->AddRef("_onClickFile", OnClickFile()); 213279ca67dSAdrien Destugues 214279ca67dSAdrien Destugues if (status == B_OK) { 215279ca67dSAdrien Destugues for (int32 i = 0; i < CountOnClickRefs(); i++) { 216279ca67dSAdrien Destugues status = archive->AddRef("_onClickRef", OnClickRefAt(i)); 217279ca67dSAdrien Destugues if (status != B_OK) 218279ca67dSAdrien Destugues break; 219279ca67dSAdrien Destugues } 220279ca67dSAdrien Destugues } 221279ca67dSAdrien Destugues 222279ca67dSAdrien Destugues if (status == B_OK) { 223279ca67dSAdrien Destugues for (int32 i = 0; i < CountOnClickArgs(); i++) { 224279ca67dSAdrien Destugues status = archive->AddString("_onClickArgv", OnClickArgAt(i)); 225279ca67dSAdrien Destugues if (status != B_OK) 226279ca67dSAdrien Destugues break; 227279ca67dSAdrien Destugues } 228279ca67dSAdrien Destugues } 229279ca67dSAdrien Destugues 230279ca67dSAdrien Destugues if (status == B_OK) { 231279ca67dSAdrien Destugues const BBitmap* icon = Icon(); 232279ca67dSAdrien Destugues if (icon != NULL) { 233279ca67dSAdrien Destugues BMessage iconArchive; 234279ca67dSAdrien Destugues status = icon->Archive(&iconArchive); 235279ca67dSAdrien Destugues if (status == B_OK) 236279ca67dSAdrien Destugues archive->AddMessage("_icon", &iconArchive); 237279ca67dSAdrien Destugues } 238279ca67dSAdrien Destugues } 239279ca67dSAdrien Destugues 240279ca67dSAdrien Destugues return status; 241279ca67dSAdrien Destugues } 242279ca67dSAdrien Destugues 243279ca67dSAdrien Destugues 2446aa05872SBrian Hill /*! \brief Returns source application signature. 2456aa05872SBrian Hill 2466aa05872SBrian Hill \return Source application signature. 2476aa05872SBrian Hill */ 2486aa05872SBrian Hill const char* 2496aa05872SBrian Hill BNotification::SourceSignature() const 2506aa05872SBrian Hill { 2516aa05872SBrian Hill return fSourceSignature; 2526aa05872SBrian Hill } 2536aa05872SBrian Hill 2546aa05872SBrian Hill 2556aa05872SBrian Hill /*! \brief Returns source application name. 2566aa05872SBrian Hill 2576aa05872SBrian Hill \return Source application name. 2586aa05872SBrian Hill */ 2596aa05872SBrian Hill const char* 2606aa05872SBrian Hill BNotification::SourceName() const 2616aa05872SBrian Hill { 2626aa05872SBrian Hill return fSourceName; 2636aa05872SBrian Hill } 2646aa05872SBrian Hill 2656aa05872SBrian Hill 266279ca67dSAdrien Destugues /*! \brief Notification's type. 267279ca67dSAdrien Destugues 268279ca67dSAdrien Destugues \return A value of the notification_type enum that represents 269279ca67dSAdrien Destugues notification type. 270279ca67dSAdrien Destugues */ 271de9dcd41SStephan Aßmus notification_type 272de9dcd41SStephan Aßmus BNotification::Type() const 273de9dcd41SStephan Aßmus { 274de9dcd41SStephan Aßmus return fType; 275de9dcd41SStephan Aßmus } 276de9dcd41SStephan Aßmus 277de9dcd41SStephan Aßmus 278279ca67dSAdrien Destugues /*! \brief Returns notification's group. 279279ca67dSAdrien Destugues 280279ca67dSAdrien Destugues \return Notification's group. 281279ca67dSAdrien Destugues */ 282de9dcd41SStephan Aßmus const char* 283279ca67dSAdrien Destugues BNotification::Group() const 284de9dcd41SStephan Aßmus { 285279ca67dSAdrien Destugues if (fGroup == "") 286279ca67dSAdrien Destugues return NULL; 287279ca67dSAdrien Destugues return fGroup; 288de9dcd41SStephan Aßmus } 289de9dcd41SStephan Aßmus 290de9dcd41SStephan Aßmus 291279ca67dSAdrien Destugues /*! \brief Sets notification's group. 292279ca67dSAdrien Destugues 293279ca67dSAdrien Destugues Notifications can be grouped together setting the same group. 294279ca67dSAdrien Destugues */ 295de9dcd41SStephan Aßmus void 296279ca67dSAdrien Destugues BNotification::SetGroup(const BString& group) 297de9dcd41SStephan Aßmus { 298279ca67dSAdrien Destugues fGroup = group; 299de9dcd41SStephan Aßmus } 300de9dcd41SStephan Aßmus 301de9dcd41SStephan Aßmus 302279ca67dSAdrien Destugues /*! \brief Returns notification's title. 303279ca67dSAdrien Destugues 304279ca67dSAdrien Destugues \return Notification's title. 305279ca67dSAdrien Destugues */ 306de9dcd41SStephan Aßmus const char* 307de9dcd41SStephan Aßmus BNotification::Title() const 308de9dcd41SStephan Aßmus { 309279ca67dSAdrien Destugues if (fTitle == "") 310279ca67dSAdrien Destugues return NULL; 311de9dcd41SStephan Aßmus return fTitle; 312de9dcd41SStephan Aßmus } 313de9dcd41SStephan Aßmus 314de9dcd41SStephan Aßmus 315279ca67dSAdrien Destugues /*! \brief Set notification's title. 316279ca67dSAdrien Destugues */ 317de9dcd41SStephan Aßmus void 318908967a1SStephan Aßmus BNotification::SetTitle(const BString& title) 319de9dcd41SStephan Aßmus { 320f33637d9SStephan Aßmus fTitle = title; 321de9dcd41SStephan Aßmus } 322de9dcd41SStephan Aßmus 323de9dcd41SStephan Aßmus 324279ca67dSAdrien Destugues /*! \brief Returns notification's message. 325279ca67dSAdrien Destugues 326279ca67dSAdrien Destugues \return Notification's message. 327279ca67dSAdrien Destugues */ 328de9dcd41SStephan Aßmus const char* 329de9dcd41SStephan Aßmus BNotification::Content() const 330de9dcd41SStephan Aßmus { 331279ca67dSAdrien Destugues if (fContent == "") 332279ca67dSAdrien Destugues return NULL; 333de9dcd41SStephan Aßmus return fContent; 334de9dcd41SStephan Aßmus } 335de9dcd41SStephan Aßmus 336de9dcd41SStephan Aßmus 337279ca67dSAdrien Destugues /*! \brief Sets notification's message. 338279ca67dSAdrien Destugues */ 339de9dcd41SStephan Aßmus void 340908967a1SStephan Aßmus BNotification::SetContent(const BString& content) 341de9dcd41SStephan Aßmus { 342f33637d9SStephan Aßmus fContent = content; 343de9dcd41SStephan Aßmus } 344de9dcd41SStephan Aßmus 345de9dcd41SStephan Aßmus 346279ca67dSAdrien Destugues /*! \brief Returns notification's message identifier. 347279ca67dSAdrien Destugues 348279ca67dSAdrien Destugues \return Notification's message identifier. 349279ca67dSAdrien Destugues */ 350de9dcd41SStephan Aßmus const char* 351de9dcd41SStephan Aßmus BNotification::MessageID() const 352de9dcd41SStephan Aßmus { 353279ca67dSAdrien Destugues if (fID == "") 354279ca67dSAdrien Destugues return NULL; 355de9dcd41SStephan Aßmus return fID; 356de9dcd41SStephan Aßmus } 357de9dcd41SStephan Aßmus 358de9dcd41SStephan Aßmus 359279ca67dSAdrien Destugues /*! \brief Sets notification's message identifier. 360279ca67dSAdrien Destugues */ 361de9dcd41SStephan Aßmus void 362908967a1SStephan Aßmus BNotification::SetMessageID(const BString& id) 363de9dcd41SStephan Aßmus { 364f33637d9SStephan Aßmus fID = id; 365de9dcd41SStephan Aßmus } 366de9dcd41SStephan Aßmus 367de9dcd41SStephan Aßmus 368279ca67dSAdrien Destugues /*! \brief Returns progress information. 369279ca67dSAdrien Destugues 370279ca67dSAdrien Destugues If notification's type is \c B_PROGRESS_NOTIFICATION, returns a value 371279ca67dSAdrien Destugues between 0.0 and 1.0 that represent progress percentage. 372279ca67dSAdrien Destugues 373279ca67dSAdrien Destugues If notification's type is not \c B_PROGRESS_NOTIFICATION, returns -1. 374279ca67dSAdrien Destugues 375279ca67dSAdrien Destugues \return Percentage if notification's type is B_PROGRESS_NOTIFICATION 376279ca67dSAdrien Destugues or otherwise -1. 377279ca67dSAdrien Destugues */ 378de9dcd41SStephan Aßmus float 379de9dcd41SStephan Aßmus BNotification::Progress() const 380de9dcd41SStephan Aßmus { 381279ca67dSAdrien Destugues if (fType != B_PROGRESS_NOTIFICATION) 382279ca67dSAdrien Destugues return -1; 383de9dcd41SStephan Aßmus return fProgress; 384de9dcd41SStephan Aßmus } 385de9dcd41SStephan Aßmus 386de9dcd41SStephan Aßmus 387279ca67dSAdrien Destugues /*! \brief Sets progress information. 388279ca67dSAdrien Destugues 389279ca67dSAdrien Destugues Sets progress percentage, this information will be used only 390279ca67dSAdrien Destugues if notification's type is \c B_PROGRESS_NOTIFICATION. 391279ca67dSAdrien Destugues 392279ca67dSAdrien Destugues The value of @progress must be between 0.0 and 1.0. 393279ca67dSAdrien Destugues */ 394de9dcd41SStephan Aßmus void 395de9dcd41SStephan Aßmus BNotification::SetProgress(float progress) 396de9dcd41SStephan Aßmus { 397279ca67dSAdrien Destugues if (progress < 0) 398279ca67dSAdrien Destugues fProgress = 0; 399279ca67dSAdrien Destugues else if (progress > 1) 400279ca67dSAdrien Destugues fProgress = 1; 401279ca67dSAdrien Destugues else 402de9dcd41SStephan Aßmus fProgress = progress; 403de9dcd41SStephan Aßmus } 404de9dcd41SStephan Aßmus 405de9dcd41SStephan Aßmus 406de9dcd41SStephan Aßmus const char* 407de9dcd41SStephan Aßmus BNotification::OnClickApp() const 408de9dcd41SStephan Aßmus { 409279ca67dSAdrien Destugues if (fApp == "") 410279ca67dSAdrien Destugues return NULL; 411de9dcd41SStephan Aßmus return fApp; 412de9dcd41SStephan Aßmus } 413de9dcd41SStephan Aßmus 414de9dcd41SStephan Aßmus 415de9dcd41SStephan Aßmus void 416908967a1SStephan Aßmus BNotification::SetOnClickApp(const BString& app) 417de9dcd41SStephan Aßmus { 418f33637d9SStephan Aßmus fApp = app; 419de9dcd41SStephan Aßmus } 420de9dcd41SStephan Aßmus 421de9dcd41SStephan Aßmus 422f33637d9SStephan Aßmus const entry_ref* 423de9dcd41SStephan Aßmus BNotification::OnClickFile() const 424de9dcd41SStephan Aßmus { 425de9dcd41SStephan Aßmus return fFile; 426de9dcd41SStephan Aßmus } 427de9dcd41SStephan Aßmus 428de9dcd41SStephan Aßmus 429f33637d9SStephan Aßmus status_t 430de9dcd41SStephan Aßmus BNotification::SetOnClickFile(const entry_ref* file) 431de9dcd41SStephan Aßmus { 432f33637d9SStephan Aßmus delete fFile; 433f33637d9SStephan Aßmus 434f33637d9SStephan Aßmus if (file != NULL) { 435f33637d9SStephan Aßmus fFile = new(std::nothrow) entry_ref(*file); 436f33637d9SStephan Aßmus if (fFile == NULL) 437f33637d9SStephan Aßmus return B_NO_MEMORY; 438f33637d9SStephan Aßmus } else 439f33637d9SStephan Aßmus fFile = NULL; 440f33637d9SStephan Aßmus 441f33637d9SStephan Aßmus return B_OK; 442de9dcd41SStephan Aßmus } 443de9dcd41SStephan Aßmus 444de9dcd41SStephan Aßmus 445f33637d9SStephan Aßmus status_t 446de9dcd41SStephan Aßmus BNotification::AddOnClickRef(const entry_ref* ref) 447de9dcd41SStephan Aßmus { 448f33637d9SStephan Aßmus if (ref == NULL) 449f33637d9SStephan Aßmus return B_BAD_VALUE; 450f33637d9SStephan Aßmus 451908967a1SStephan Aßmus entry_ref* clonedRef = new(std::nothrow) entry_ref(*ref); 452908967a1SStephan Aßmus if (clonedRef == NULL || !fRefs.AddItem(clonedRef)) 453908967a1SStephan Aßmus return B_NO_MEMORY; 454908967a1SStephan Aßmus 455908967a1SStephan Aßmus return B_OK; 456de9dcd41SStephan Aßmus } 457de9dcd41SStephan Aßmus 458de9dcd41SStephan Aßmus 459f33637d9SStephan Aßmus int32 460f33637d9SStephan Aßmus BNotification::CountOnClickRefs() const 461de9dcd41SStephan Aßmus { 462f33637d9SStephan Aßmus return fRefs.CountItems(); 463de9dcd41SStephan Aßmus } 464de9dcd41SStephan Aßmus 465de9dcd41SStephan Aßmus 466f33637d9SStephan Aßmus const entry_ref* 467f33637d9SStephan Aßmus BNotification::OnClickRefAt(int32 index) const 468f33637d9SStephan Aßmus { 469f33637d9SStephan Aßmus return (entry_ref*)fArgv.ItemAt(index); 470f33637d9SStephan Aßmus } 471f33637d9SStephan Aßmus 472f33637d9SStephan Aßmus 473f33637d9SStephan Aßmus status_t 474908967a1SStephan Aßmus BNotification::AddOnClickArg(const BString& arg) 475f33637d9SStephan Aßmus { 476908967a1SStephan Aßmus char* clonedArg = strdup(arg.String()); 477f33637d9SStephan Aßmus if (clonedArg == NULL || !fArgv.AddItem(clonedArg)) 478f33637d9SStephan Aßmus return B_NO_MEMORY; 479f33637d9SStephan Aßmus 480f33637d9SStephan Aßmus return B_OK; 481de9dcd41SStephan Aßmus } 482de9dcd41SStephan Aßmus 483de9dcd41SStephan Aßmus 484f33637d9SStephan Aßmus int32 485f33637d9SStephan Aßmus BNotification::CountOnClickArgs() const 486f33637d9SStephan Aßmus { 487f33637d9SStephan Aßmus return fArgv.CountItems(); 488f33637d9SStephan Aßmus } 489f33637d9SStephan Aßmus 490f33637d9SStephan Aßmus 491f33637d9SStephan Aßmus const char* 492f33637d9SStephan Aßmus BNotification::OnClickArgAt(int32 index) const 493f33637d9SStephan Aßmus { 494f33637d9SStephan Aßmus return (char*)fArgv.ItemAt(index); 495f33637d9SStephan Aßmus } 496f33637d9SStephan Aßmus 497f33637d9SStephan Aßmus 498279ca67dSAdrien Destugues /*! \brief Notification's icon. 499279ca67dSAdrien Destugues 500279ca67dSAdrien Destugues \return Notification's icon. 501279ca67dSAdrien Destugues */ 502f33637d9SStephan Aßmus const BBitmap* 503de9dcd41SStephan Aßmus BNotification::Icon() const 504de9dcd41SStephan Aßmus { 505de9dcd41SStephan Aßmus return fBitmap; 506de9dcd41SStephan Aßmus } 507de9dcd41SStephan Aßmus 508de9dcd41SStephan Aßmus 509279ca67dSAdrien Destugues /*! \brief Sets notification's icon. 510279ca67dSAdrien Destugues 511279ca67dSAdrien Destugues Sets notification's icon. 51258844015SJessica Hamilton This method does not assume ownership of @icon. 513279ca67dSAdrien Destugues 514279ca67dSAdrien Destugues \param icon Icon 515279ca67dSAdrien Destugues \return 516279ca67dSAdrien Destugues - \c B_OK: Everything went fine. 517279ca67dSAdrien Destugues - \c B_NO_MEMORY: Allocation of @icon copy has failed. 518279ca67dSAdrien Destugues - \c Other errors: Creation of @icon copy failed for some reason. 519279ca67dSAdrien Destugues */ 520f33637d9SStephan Aßmus status_t 521f33637d9SStephan Aßmus BNotification::SetIcon(const BBitmap* icon) 522de9dcd41SStephan Aßmus { 523f33637d9SStephan Aßmus delete fBitmap; 524f33637d9SStephan Aßmus 525f33637d9SStephan Aßmus if (icon != NULL) { 526f33637d9SStephan Aßmus fBitmap = new(std::nothrow) BBitmap(icon); 527f33637d9SStephan Aßmus if (fBitmap == NULL) 528f33637d9SStephan Aßmus return B_NO_MEMORY; 529f33637d9SStephan Aßmus return fBitmap->InitCheck(); 530f33637d9SStephan Aßmus } 531f33637d9SStephan Aßmus 532f33637d9SStephan Aßmus fBitmap = NULL; 533f33637d9SStephan Aßmus return B_OK; 534de9dcd41SStephan Aßmus } 535279ca67dSAdrien Destugues 536279ca67dSAdrien Destugues 537279ca67dSAdrien Destugues /*! \brief Sends a notification to the notification_server. 538279ca67dSAdrien Destugues 539279ca67dSAdrien Destugues The notification is delivered asynchronously to the notification_server, 540279ca67dSAdrien Destugues which will display it according to its settings and filters. 541279ca67dSAdrien Destugues 542279ca67dSAdrien Destugues \param timeout Microseconds after the message fades out. 543279ca67dSAdrien Destugues \return 544279ca67dSAdrien Destugues - \c B_OK: Everything went fine. 545279ca67dSAdrien Destugues - \c B_BAD_PORT_ID: A connection to notification_server could not be 546279ca67dSAdrien Destugues established or the server is not up and running anymore. 547279ca67dSAdrien Destugues - \c Other errors: Building the message from the notification failed. 548279ca67dSAdrien Destugues */ 549279ca67dSAdrien Destugues status_t 550279ca67dSAdrien Destugues BNotification::Send(bigtime_t timeout) 551279ca67dSAdrien Destugues { 552279ca67dSAdrien Destugues BMessage msg(kNotificationMessage); 553279ca67dSAdrien Destugues 554279ca67dSAdrien Destugues // Archive notification 555279ca67dSAdrien Destugues status_t ret = Archive(&msg); 556279ca67dSAdrien Destugues 557279ca67dSAdrien Destugues // Custom time out 558279ca67dSAdrien Destugues if (ret == B_OK && timeout > 0) 559279ca67dSAdrien Destugues ret = msg.AddInt64("timeout", timeout); 560279ca67dSAdrien Destugues 561279ca67dSAdrien Destugues // Send message 562279ca67dSAdrien Destugues if (ret == B_OK) { 563279ca67dSAdrien Destugues BMessenger server(kNotificationServerSignature); 564279ca67dSAdrien Destugues ret = server.SendMessage(&msg); 565279ca67dSAdrien Destugues } 566279ca67dSAdrien Destugues 567279ca67dSAdrien Destugues return ret; 568279ca67dSAdrien Destugues } 569*8856b518SBrian Hill 570*8856b518SBrian Hill 571*8856b518SBrian Hill void BNotification::_ReservedNotification1() {} 572*8856b518SBrian Hill void BNotification::_ReservedNotification2() {} 573*8856b518SBrian Hill void BNotification::_ReservedNotification3() {} 574*8856b518SBrian Hill void BNotification::_ReservedNotification4() {} 575*8856b518SBrian Hill void BNotification::_ReservedNotification5() {} 576*8856b518SBrian Hill void BNotification::_ReservedNotification6() {} 577*8856b518SBrian Hill void BNotification::_ReservedNotification7() {} 578*8856b518SBrian Hill void BNotification::_ReservedNotification8() {} 579