Пример #1
0
void CNetwork::UpdateQunContacts(HWND hwndDlg, unsigned int qunid) {
	if (Qun* qun=m_qunList.getQun(qunid)) {
		std::list<FriendItem> list=qun->getMembers();
		HANDLE hContact=FindContact(qunid);
		unsigned int creator=READC_D2("Creator");
		DBVARIANT dbv;
		TCHAR* pszNick;
		TCHAR szTemp[MAX_PATH];
		char szID[16];
		HWND hControl=GetDlgItem(hwndDlg,IDC_QUNINFO_MEMBERLIST);

		SendMessage(hControl,LB_RESETCONTENT,(WPARAM)NULL,(LPARAM)NULL);

		for (std::list<FriendItem>::iterator iter=list.begin(); iter!=list.end(); ++iter) {

			ultoa(iter->getQQ(),szID,10);
			if (READC_S2(szID,&dbv)) {
				// Nick not found
				swprintf(szTemp,L" [%s] %u",iter->isOnline()?TranslateT("Online"):TranslateT("Offline"),iter->getQQ());
			} else {
				// Nick found
				pszNick=mir_a2u_cp(dbv.pszVal,936);
				swprintf(szTemp,L" [%s] %s(%u)",iter->isOnline()?TranslateT("Online"):TranslateT("Offline"),pszNick,iter->getQQ());
				mir_free(pszNick);
				DBFreeVariant(&dbv);
			}

			if (creator==iter->getQQ())
				*szTemp=_T('*');
			else if (qun->isAdmin(iter->getQQ()))
				*szTemp=_T('+');

			SendMessage(hControl,LB_ADDSTRING,(WPARAM)NULL,(LPARAM)szTemp);
		}
	}
}
Пример #2
0
void PasteIt(MCONTACT hContact, int mode)
{
	PasteToWeb* pasteToWeb = pasteToWebs[Options::instance->defWeb];
	if(mode == FROM_CLIPBOARD)
	{
		pasteToWeb->FromClipboard();
	}
	else if(mode == FROM_FILE)
	{
		std::wstring file = GetFile();
		if(file.length() > 0)
		{
			pasteToWeb->FromFile(file);
		}
		else return;
	}
	else return;

	if(pasteToWeb->szFileLink[0] == 0 && pasteToWeb->error != NULL)
	{
		MessageBox(NULL, pasteToWeb->error, TranslateT("Error"), MB_OK | MB_ICONERROR);
	}
	else if(hContact != NULL && pasteToWeb->szFileLink[0] != 0)
	{
		char *szProto = GetContactProto(hContact);
		if (szProto && (INT_PTR)szProto != CALLSERVICE_NOTFOUND)
		{
			BOOL isChat = db_get_b(hContact, szProto, "ChatRoom", 0); 
			if(Options::instance->autoSend)
			{
				if(!isChat)
				{
					DBEVENTINFO dbei = {0};
					dbei.cbSize = sizeof(dbei);
					dbei.eventType = EVENTTYPE_MESSAGE;
					dbei.flags = DBEF_SENT;
					dbei.szModule = szProto;
					dbei.timestamp = (DWORD)time(NULL);
					dbei.cbBlob = (DWORD)strlen(pasteToWeb->szFileLink) + 1;
					dbei.pBlob = (PBYTE)pasteToWeb->szFileLink;
					db_event_add(hContact, &dbei);
					CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)pasteToWeb->szFileLink);
				}
				else
				{
					// PSS_MESSAGE is not compatible with chat rooms
					// there are no simple method to send text to all users
					// in chat room. 
					// Next step is to get all protocol sessions and find
					// one with correct hContact 
					GC_INFO gci = {0};    
					GCDEST  gcd = { szProto, NULL, GC_EVENT_SENDMESSAGE };
					GCEVENT gce = { sizeof(gce), &gcd };
					int cnt = (int)CallService(MS_GC_GETSESSIONCOUNT, 0, (LPARAM)szProto);  
					for (int i = 0; i < cnt ; i++ ) 
					{
						gci.iItem = i;
						gci.pszModule = szProto;
						gci.Flags = GCF_BYINDEX | GCF_HCONTACT | GCF_ID;
						CallService(MS_GC_GETINFO, 0, (LPARAM)&gci);
						if (gci.hContact == hContact) 
						{
							// In this place session was finded, gci.pszID contains
							// session ID, but it is in unicode or ascii format,
							// depends on protocol wersion
							gcd.ptszID = gci.pszID;
							gce.bIsMe = TRUE;             
							gce.dwFlags = GCEF_ADDTOLOG;  
							gce.ptszText = mir_a2u_cp(pasteToWeb->szFileLink, CP_ACP);             
							gce.time = time(NULL);                                            
							CallService(MS_GC_EVENT, 0, (LPARAM)(GCEVENT *) &gce); 
							mir_free((void*)gce.ptszText);                       
							break;  
						}
					}
				}
				
				// Send message to focus window
				CallServiceSync(MS_MSG_SENDMESSAGE, hContact, 0);
			}
			else
			{
				if(isChat)
				{
					// MS_MSG_SENDMESSAGE in incompatible with chat rooms,
					// because it sends text to IDC_MESSAGE window,
					// but in chat rooms is only IDC_CHAT_MESSAGE window.
					// contactWindows map contains all opened hContact
					// with assaigned to them chat windows. 
					// This map is prepared in ME_MSG_WINDOWEVENT event. 
					std::map<MCONTACT, HWND>::iterator it = contactWindows->find(hContact);
					if(it != contactWindows->end())
					{
						// it->second is imput window, so now I can send to them 
						// new text. Afterr all is sended MS_MSG_SENDMESSAGE 
						// to focus window.
						SendMessage(it->second, EM_SETSEL, -1, SendMessage(it->second, WM_GETTEXTLENGTH, 0, 0));
						SendMessageA(it->second, EM_REPLACESEL, FALSE, (LPARAM)pasteToWeb->szFileLink);
						CallServiceSync(MS_MSG_SENDMESSAGE, hContact, NULL);
					}
					else
					{
						// If window do not exist, maybe it is not chat
						CallServiceSync(MS_MSG_SENDMESSAGE, hContact, (LPARAM)pasteToWeb->szFileLink);
					}
				}
				else
				{
					CallServiceSync(MS_MSG_SENDMESSAGE, hContact, (LPARAM)pasteToWeb->szFileLink);
				}
			}
		}
	}
}
Пример #3
0
wchar_t* mir_a2u( const char* src )
{
	return mir_a2u_cp( src, LangPackGetDefaultCodePage());
}
Пример #4
0
static int CompareStatusMsg(STATUSMSGINFO *smi, DBCONTACTWRITESETTING *cws_new, char *szSetting)
{
	DBVARIANT dbv_old;
	int ret = -1;

	switch (cws_new->value.type) {
	case DBVT_ASCIIZ:
		smi->newstatusmsg = (CheckStr(cws_new->value.pszVal, 0, 1) ? nullptr : mir_a2u_cp(cws_new->value.pszVal, CP_ACP));
		break;
	case DBVT_UTF8:
		smi->newstatusmsg = (CheckStr(cws_new->value.pszVal, 0, 1) ? nullptr : mir_a2u_cp(cws_new->value.pszVal, CP_UTF8));
		break;
	case DBVT_WCHAR:
		smi->newstatusmsg = (CheckStrW(cws_new->value.pwszVal, 0, 1) ? nullptr : mir_wstrdup(cws_new->value.pwszVal));
		break;
	case DBVT_DELETED:
	default:
		smi->newstatusmsg = nullptr;
		break;
	}

	if (!db_get_s(smi->hContact, "UserOnline", szSetting, &dbv_old, 0)) {
		switch (dbv_old.type) {
		case DBVT_ASCIIZ:
			smi->oldstatusmsg = (CheckStr(dbv_old.pszVal, 0, 1) ? nullptr : mir_a2u_cp(dbv_old.pszVal, CP_ACP));
			break;
		case DBVT_UTF8:
			smi->oldstatusmsg = (CheckStr(dbv_old.pszVal, 0, 1) ? nullptr : mir_a2u_cp(dbv_old.pszVal, CP_UTF8));
			break;
		case DBVT_WCHAR:
			smi->oldstatusmsg = (CheckStrW(dbv_old.pwszVal, 0, 1) ? nullptr : mir_wstrdup(dbv_old.pwszVal));
			break;
		default:
			smi->oldstatusmsg = nullptr;
			break;
		}

		if (cws_new->value.type == DBVT_DELETED) {
			if (dbv_old.type == DBVT_WCHAR)
				ret = CheckStrW(dbv_old.pwszVal, COMPARE_DEL, COMPARE_SAME);
			else if (dbv_old.type == DBVT_UTF8 || dbv_old.type == DBVT_ASCIIZ)
				ret = CheckStr(dbv_old.pszVal, COMPARE_DEL, COMPARE_SAME);
			else
				ret = COMPARE_DEL;
		}
		else if (dbv_old.type != cws_new->value.type)
			ret = (mir_wstrcmp(smi->newstatusmsg, smi->oldstatusmsg) ? CheckStrW(smi->newstatusmsg, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME);

		else if (dbv_old.type == DBVT_ASCIIZ)
			ret = (mir_strcmp(cws_new->value.pszVal, dbv_old.pszVal) ? CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME);

		else if (dbv_old.type == DBVT_UTF8)
			ret = (mir_strcmp(cws_new->value.pszVal, dbv_old.pszVal) ? CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME);

		else if (dbv_old.type == DBVT_WCHAR)
			ret = (mir_wstrcmp(cws_new->value.pwszVal, dbv_old.pwszVal) ? CheckStrW(cws_new->value.pwszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME);

		db_free(&dbv_old);
	}
	else {
		if (cws_new->value.type == DBVT_DELETED)
			ret = COMPARE_SAME;
		else if (cws_new->value.type == DBVT_WCHAR)
			ret = CheckStrW(cws_new->value.pwszVal, COMPARE_DIFF, COMPARE_SAME);
		else if (cws_new->value.type == DBVT_UTF8 || cws_new->value.type == DBVT_ASCIIZ)
			ret = CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_SAME);
		else
			ret = COMPARE_DIFF;

		smi->oldstatusmsg = nullptr;
	}

	return ret;
}
Пример #5
0
static BOOL CALLBACK QunDetailsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg)
	{

	case WM_INITDIALOG:
		{
			TranslateDialogDefault(hwndDlg);
			SetWindowLong(hwndDlg,GWL_USERDATA,lParam);

			return TRUE;
		}

	case WM_TIMER:
		if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) {
			LPSTR m_szModuleName=ldt->network->m_szModuleName;
			HANDLE hContact=ldt->hContact;
			unsigned int qunid=READC_D2(UNIQUEIDSETTING);
			/*
			ldt->network->UpdateQunContacts(hwndDlg,qunid);
			*/
			KillTimer(hwndDlg,1);
			ldt->network->append(new QunGetOnlineMemberPacket(qunid));
		}
		return TRUE;

	case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->idFrom) {
			case 0:
				switch (((LPNMHDR)lParam)->code) {
					case PSN_INFOCHANGED:
						if (LocalDetails_t* ldt=networkmap[(HANDLE)((LPPSHNOTIFY)lParam)->lParam]) {
							LPTSTR pszTemp;
							LPSTR m_szModuleName=ldt->network->m_szModuleName;
							char szTemp[MAX_PATH];
							TCHAR wszTemp[MAX_PATH];
							HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
							HANDLE hContact2=hContact;
							DBVARIANT dbv;
							unsigned int nTemp;

							unsigned int qunid=0;

							qunid=READC_D2(UNIQUEIDSETTING);

							nTemp=READC_D2("Creator");
							ultoa(nTemp,szTemp,10);

							if (!READC_S2(szTemp,&dbv)) {
								// Qun creator info available
								pszTemp=mir_a2u_cp(dbv.pszVal,936);
								swprintf(wszTemp,L"%s (%u)", pszTemp, nTemp);
								mir_free(pszTemp);
								DBFreeVariant(&dbv);
							} else
								_ultow(nTemp,wszTemp,10);

							SetDlgItemText(hwndDlg,IDC_QUNINFO_CREATOR,wszTemp);

							_ultow(READC_D2("ExternalID"),wszTemp,10);
							SetDlgItemText(hwndDlg,IDC_QUNINFO_QID,wszTemp);

							if (!READC_TS2("Nick",&dbv)) {
								// Qun name available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_NAME,wcschr(dbv.ptszVal,L')')+2);
								DBFreeVariant(&dbv);
							}

							if (!DBGetContactSettingTString(hContact,"CList","StatusMsg",&dbv)) {
								// Notice available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_NOTICE,dbv.ptszVal);
								DBFreeVariant(&dbv);
							}

							if (!READC_TS2("Description",&dbv)) {
								// Description available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_DESC,dbv.ptszVal);
								DBFreeVariant(&dbv);
							}

							switch (READC_B2("GetInfoOnline")) {
								case 1: // Just retrieved info, send member online update call
									PostMessage(hwndDlg,WM_TIMER,1,0);
									{
										unsigned int myqq=ldt->network->GetMyQQ();
										Qun* qun=ldt->network->m_qunList.getQun(READC_D2(UNIQUEIDSETTING));
										if (qun==NULL || !(qun->isAdmin(myqq)||qun->getDetails().getCreator()==myqq)) {
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),FALSE);
										} else
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),TRUE);

										if (qun->getDetails().getCreator()==myqq) {
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_SETADMIN),TRUE);
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_UNSETADMIN),TRUE);
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_TRANSFER),TRUE);
										}
									}
									break;
								case 2: // Retrieved online info
									ldt->network->UpdateQunContacts(hwndDlg,qunid);
									WRITEC_B("GetInfoOnline",0);
									ldt->timer=SetTimer(hwndDlg,1,60000,NULL);
									break;
							}
						}
					break;
				}
				break;
		}
		break;

	case WM_DESTROY:
		if (LocalDetails_t* ldt=networkmap[hwndDlg]) {
			if (ldt->timer) KillTimer(hwndDlg,1);
			delete ldt;
			networkmap.erase(hwndDlg);
		}
		break;
	case WM_COMMAND:
		{
			if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) {
				char szTemp[MAX_PATH]={0};
				if (SendDlgItemMessageA(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETTEXT,SendDlgItemMessage(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETCURSEL,0,0),(LPARAM)&szTemp)!=LB_ERR && *szTemp!=0) {
					LPSTR pszChk=strrchr(szTemp,'(');

					unsigned int qqid=strtoul(strrchr(szTemp,pszChk?'(':' ')+1,NULL,10);
					LPSTR m_szModuleName=ldt->network->m_szModuleName;
					HANDLE hContact=ldt->hContact;
					unsigned int qunid=READC_D2(UNIQUEIDSETTING);

					switch (LOWORD(wParam)) {
						case IDC_QUNINFO_ADDTOME:
							{
								if (HANDLE hContact=ldt->network->FindContact(qqid)) {
									MessageBox(hwndDlg,TranslateT("The member is already in your contact list."),NULL,MB_ICONERROR);
								} else {
									ldt->network->AddContactWithSend(qqid);
								}
							}
							break;
						case IDC_QUNINFO_DELMEMBER:
							{
								TCHAR szMsg[MAX_PATH];
								_stprintf(szMsg,TranslateT("Are you sure you want to kick user %u out of this Qun %d?"),qqid,READC_D2("ExternalID"));
								if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) {
									std::list<unsigned int> list;
									QunModifyMemberPacket *out=new QunModifyMemberPacket(READC_D2(UNIQUEIDSETTING),false);
									list.insert(list.end(),qqid);
									out->setMembers(list);
									ldt->network->append(out);
								}
							}
							break;
						case IDC_QUNINFO_SETADMIN:
						case IDC_QUNINFO_UNSETADMIN:
							{
								QunAdminOpPacket* out=new QunAdminOpPacket(qunid,qqid,LOWORD(wParam)==IDC_QUNINFO_SETADMIN);
								ldt->network->append(out);
							}
							break;
						case IDC_QUNINFO_TRANSFER:
							{
								TCHAR szMsg[MAX_PATH];
								_stprintf(szMsg,TranslateT("Are you sure you want to transfer Qun %u to user %u?"),READC_D2("ExternalID"),qqid);
								if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) {
									std::list<unsigned int> list;
									QunTransferPacket *out=new QunTransferPacket(qunid,qqid);
									ldt->network->append(out);
								}
							}
							break;
					}
				}
			}
		}
		break;
#if 0
	case WM_COMMAND:
		/*switch(LOWORD(wParam))
		{

		case IDC_CHANGEDETAILS:
		{
		CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://www.icq.com/whitepages/user_details.php");
		}
		break;

		case IDCANCEL:
		SendMessage(GetParent(hwndDlg),msg,wParam,lParam);
		break;
		}*/
		break;
#endif
	}

	return FALSE;	
}
Пример #6
0
int CMraProto::MraDbSettingChanged(WPARAM hContact, LPARAM lParam)
{
	if (!m_bLoggedIn || !lParam || !hContact)
		return 0;

	DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam;

	// это наш контакт, он не временный (есть в списке на сервере) и его обновление разрешено
	if (IsContactMra(hContact) && !db_get_b(hContact, "CList", "NotOnList", 0) && getDword(hContact, "HooksLocked", FALSE) == FALSE) {
		if (!strcmp(cws->szModule, "CList")) {
			// MyHandle setting
			if (!strcmp(cws->szSetting, "MyHandle")) {
				// always store custom nick
				CMStringW wszNick;
				if (cws->value.type == DBVT_DELETED) {
					wszNick = GetContactNameW(hContact);
					db_set_ws(hContact, "CList", "MyHandle", wszNick);
				}
				else if (cws->value.pszVal) {
					switch (cws->value.type) {
					case DBVT_WCHAR:
						wszNick = cws->value.pwszVal;
						break;
					case DBVT_UTF8:
						wszNick = ptrW(mir_utf8decodeW(cws->value.pszVal));
						break;
					case DBVT_ASCIIZ:
						wszNick = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE));
						break;
					}
					if (wszNick.GetLength())
						MraModifyContact(hContact, 0, 0, 0, 0, &wszNick);
				}
			}
			// Group setting
			else if (!strcmp(cws->szSetting, "Group")) {
				CMStringW wszGroup;
				// manage group on server
				switch (cws->value.type) {
				case DBVT_WCHAR:
					wszGroup = cws->value.pwszVal;
					break;
				case DBVT_UTF8:
					wszGroup = ptrW(mir_utf8decodeW(cws->value.pszVal));
					break;
				case DBVT_ASCIIZ:
					wszGroup = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE));
					break;
				}
				if (wszGroup.GetLength()) {
					DWORD dwGroupID = getDword(hContact, "GroupID", -1);
					if (dwGroupID != -1)
						MraMoveContactToGroup(hContact, dwGroupID, wszGroup);
				}
			}
			// NotOnList setting. Has a temporary contact just been added permanently?
			else if (!strcmp(cws->szSetting, "NotOnList")) {
				if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) {
					CMStringW wszAuthMessage;
					if (!mraGetStringW(NULL, "AuthMessage", wszAuthMessage))
						wszAuthMessage = TranslateT(MRA_DEFAULT_AUTH_MESSAGE);

					db_unset(hContact, "CList", "Hidden");

					CMStringA szEmail, szPhones;
					CMStringW wszNick;
					DWORD dwGroupID, dwContactFlag;
					GetContactBasicInfoW(hContact, NULL, &dwGroupID, &dwContactFlag, NULL, NULL, &szEmail, &wszNick, &szPhones);
					MraAddContact(hContact, dwContactFlag, dwGroupID, szEmail, wszNick, &szPhones, &wszAuthMessage);
				}
			}
			// Hidden setting
			else if (!strcmp(cws->szSetting, "Hidden")) {
				DWORD dwContactFlag = GetContactFlags(hContact);
				if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0))
					dwContactFlag &= ~CONTACT_FLAG_SHADOW;
				else
					dwContactFlag |= CONTACT_FLAG_SHADOW;

				MraModifyContact(hContact, 0, &dwContactFlag);
			}
		}
		// Ignore section
		else if (!strcmp(cws->szModule, "Ignore")) {
			if (!strcmp(cws->szSetting, "Mask1")) {
				DWORD dwContactFlag = GetContactFlags(hContact);
				if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_DWORD && cws->value.dVal&IGNOREEVENT_MESSAGE) == 0)
					dwContactFlag &= ~CONTACT_FLAG_IGNORE;
				else
					dwContactFlag |= CONTACT_FLAG_IGNORE;

				MraModifyContact(hContact, 0, &dwContactFlag);
			}
		}
		// User info section
		else if (!strcmp(cws->szModule, "UserInfo")) {
			if (!strcmp(cws->szSetting, "MyPhone0") || !strcmp(cws->szSetting, "MyPhone1") || !strcmp(cws->szSetting, "MyPhone2"))
				MraModifyContact(hContact);
		}
	}
	return 0;
}