Esempio n. 1
0
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);		
}
Esempio n. 2
0
/***********************************************************
 * 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);
	}
}