void CBuddyManager::NotifyBuddyIsOnline(BUDDY_INFO *pBI, SERVER_INFO *pServerInfo) { if(pBI==NULL) return; if(pServerInfo==NULL) return; vecBI::iterator it = FindBuddyInfoByID(pBI->dwID); if(it==BuddyList.end()) return; if(pServerInfo->szServerName!=NULL) strncpy_s(it->szServerName,sizeof(pBI->szServerName),pServerInfo->szServerName,_TRUNCATE); it->cGAMEINDEX = pServerInfo->cGAMEINDEX; it->sIndex = (int) pServerInfo->dwIndex; //have to change the Buddy index to a new var that can hold bigger numbers such as DWORD HWND hwndLV = g_hwndListBuddy; LV_FINDINFO lvfi; char szText[250]; memset(&lvfi,0,sizeof(LV_FINDINFO)); lvfi.flags = LVFI_PARAM; lvfi.lParam = (LPARAM)pBI->dwID; int index = ListView_FindItem(hwndLV , -1, &lvfi); if(index!=-1) { LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = index; memset(szText,0,sizeof(szText)); if(gm.GamesInfo[it->cGAMEINDEX].colorfilter!=NULL) { gm.GamesInfo[it->cGAMEINDEX].colorfilter(it->szServerName,szText,249); item.pszText = szText; item.cchTextMax = (int)strlen(szText); } else { item.pszText = it->szServerName; item.cchTextMax = (int)strlen(it->szServerName); } item.iSubItem = 1; item.iImage = gm.Get_GameIcon(it->cGAMEINDEX); ListView_SetItem(g_hwndListBuddy,&item); sprintf_s(szText,"%s:%d",pServerInfo->szIPaddress,pServerInfo->usPort); strcpy_s(it->szIPaddress,szText); ListView_SetItemText(g_hwndListBuddy,index ,2,szText); } if(gm.GamesInfo[it->cGAMEINDEX].colorfilter!=NULL) gm.GamesInfo[it->cGAMEINDEX].colorfilter(it->szServerName,szText,249); else strcpy_s(szText,it->szPlayerName); if(g_bRunningQueryServerList && g_bPlayedNotify==false) PlayNotifySound(0 ); if(AppCFG.bBuddyNotify) ShowBalloonTip("A buddy is online!",szText); }
/*********************************************************** * MessageReceived ***********************************************************/ void HDaemonApp::MessageReceived(BMessage *message) { switch(message->what) { case M_CHECK_NOW: case M_TIMER: CheckMails(); break; case M_RELOAD_SETTING: fPrefs->LoadPrefs(); if(fRunner) { int32 interval; fPrefs->GetData("check_minutes",&interval); PRINT(("NEW INTERVAL:%d\n",interval)); fRunner->SetInterval(interval); } break; case M_LAUNCH_SCOOBY: { be_roster->Launch("application/x-vnd.takamatsu-scooby"); break; } // Error case H_ERROR_MESSAGE: { PRINT(("POP ERROR\n")); BString err_str("POP3 ERROR"); err_str += "\n"; if(message->FindString("log")) err_str += message->FindString("log"); PRINT(("%s\n",err_str.String())); fPopClient->PostMessage(B_QUIT_REQUESTED); fPopClient = NULL; entry_ref ref; if(GetNextAccount(ref) == B_OK) // Connect next server CheckFromServer(ref); else{ if(fGotMails) PlayNotifySound(); fChecking = false; } break; } // conect success case H_CONNECT_MESSAGE: { BMessage msg(H_LOGIN_MESSAGE); msg.AddString("login",fLogin); msg.AddString("password",fPassword); msg.AddBool("apop",(fProtocolType == 0)?false:true); fPopClient->PostMessage(&msg); break; } // login success case H_LOGIN_MESSAGE: fPopClient->PostMessage(H_UIDL_MESSAGE); break; // list success case H_UIDL_MESSAGE: { BString list; BMessage msg(H_RETR_MESSAGE); if(message->FindString("list",&list) == B_OK) { int32 startpos = 1; if(fUidl.Length() > 1) { if(list.FindFirst(fUidl) != B_ERROR) startpos = atoi(fUidl.String())+1; else startpos = 1; } if(list.Length() == 0) { fPopClient->PostMessage(B_QUIT_REQUESTED); fPopClient = NULL; break; } // make list char *buf = const_cast<char*>(list.String()); char *p = strtok(buf,"\n"); int size,index,count = 0; char uidl[1024]; while(p) { if(strlen(p) <= 1) continue; if(fCanUseUIDL) ::sscanf(p,"%d%s",&index,uidl); else ::sscanf(p,"%d%d",&index,&size); if(index >= startpos) { msg.AddInt32("index",index); fUidl = ""; if(fCanUseUIDL) { fUidl << index; fUidl += " "; fUidl += uidl; }else{ fUidl << index; fUidl += " "; fUidl << size; fUidl += "\r\n"; } count++; } p = strtok('\0',"\n"); } if(count==0) { fPopClient->PostMessage(B_QUIT_REQUESTED); fPopClient = NULL; break; } fPopClient->PostMessage(&msg); }else{ // POP3 server is not support UIDL command fCanUseUIDL = false; PRINT(("UIDL not supported\n")); fPopClient->PostMessage(H_LIST_MESSAGE); } break; } // receive list case H_LIST_MESSAGE: { message->what = H_UIDL_MESSAGE; this->PostMessage(message); break; } // receive content case H_RETR_MESSAGE: { int32 index; const char* content; if(message->FindInt32("index",&index) == B_OK && message->FindString("content",&content) == B_OK) { entry_ref folder_ref,file_ref; bool is_delete; SaveMail(content,&folder_ref,&file_ref,&is_delete); if(is_delete) fDeleteMails.AddInt32("index",index); int32 count; type_code type; fDeleteMails.GetInfo("index",&type,&count); if(count == 0 && message->FindBool("end")) { SetNextRecvPos(fUidl.String()); fPopClient->PostMessage(B_QUIT_REQUESTED); fPopClient = NULL; break; }else if(count > 0 && message->FindBool("end")){ fPopClient->PostMessage(&fDeleteMails); break; } } break; } // delete success case H_DELETE_MESSAGE: { int32 index; if(message->FindInt32("index",&index) == B_OK) { if(message->FindBool("end")) { fPopClient->PostMessage(B_QUIT_REQUESTED); fPopClient = NULL; SetNextRecvPos(""); } } break; } // Session ended case M_QUIT_FINISHED: { entry_ref ref; status_t err = GetNextAccount(ref); if(err == B_OK) { // Connect next server CheckFromServer(ref); }else{ // Quit pop session if(fGotMails) PlayNotifySound(); fChecking = false; PRINT(("All check have been finished\n")); RefreshAllCaches(); EmptyNewMailList(); } break; } // Check whether new mails have received from Deskbar replicant case M_CHECK_SCOOBY_STATE: { int32 icon; if(message->FindInt32("icon",&icon) != B_OK) break; BMessage msg(M_CHECK_SCOOBY_STATE); msg.AddInt32("icon",(fHaveNewMails)?DESKBAR_NEW_ICON:DESKBAR_NORMAL_ICON); message->SendReply(&msg,(BHandler*)NULL,1000000); break; } // reset deskbar icon case M_RESET_ICON: { fHaveNewMails = false; break; } case M_NEW_MESSAGE: { entry_ref ref; if(be_roster->FindApp("text/x-email",&ref) != B_OK) return; int32 argc = 0; char *argv[3]; argv[argc] = new char[strlen("mailto:")+1]; ::strcpy(argv[argc++],"mailto:" ); argv[argc++] = NULL; be_roster->Launch(&ref,argc-1,argv); for(int32 k = 0;k < argc;k++) delete[] argv[k]; break; } default: BApplication::MessageReceived(message); } }