Пример #1
0
char *NickFromHContact(HANDLE hContact)
{
	static char nick[512] = "";

	if (hContact)
	{
		char szProto[256];
		int loaded = 0;

		if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto)))
			loaded = IsProtocolLoaded(szProto);

		if (!szProto[0] || !loaded)
		{
			char name[256];

			if (szProto[0])
			{
				if (GetValue(hContact,szProto,"Nick",name,SIZEOF(name)))
					mir_snprintf(nick, SIZEOF(nick),"%s (%s)", name, szProto);
				else
					mir_snprintf(nick, SIZEOF(nick),"(UNKNOWN) (%s)", szProto);
			}
			else
				mir_snprintf(nick, SIZEOF(nick),"(UNKNOWN)");
		}
		else
		{
			char *uid;
			char szUID[256];

			uid = (char*)CallProtoService(szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0);
			if ((int)uid!=CALLSERVICE_NOTFOUND && uid)
			{
				GetValue(hContact, szProto, uid, szUID, SIZEOF(szUID));
				mir_snprintf(nick, SIZEOF(nick), "%s *(%s)*<%s>*{%s}*", (char*)GetContactName(hContact,szProto,0), szProto, uid, szUID);
			}
			else
				mir_snprintf(nick, SIZEOF(nick), "%s (%s)", (char*)GetContactName(hContact,szProto,0), szProto);
		}
	}

	return nick;
}
Пример #2
0
static MCONTACT convertContact(MCONTACT hContact)
{
    // Check what protocol this contact belongs to
    char szProto[100];
    if (myGetS(hContact, "Protocol", "p", szProto))
        return INVALID_CONTACT_ID;

    // Protocol installed?
    if (!IsProtocolLoaded(szProto))
        return INVALID_CONTACT_ID;

    // Is contact in database?
    char* pszUniqueSetting = (char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);

    // Skip protocols with no unique id setting (some non IM protocols return NULL)
    MCONTACT hDst = INVALID_CONTACT_ID;
    if (pszUniqueSetting && (INT_PTR)pszUniqueSetting != CALLSERVICE_NOTFOUND) {
        DBVARIANT dbv;
        if (!myGet(hContact, szProto, pszUniqueSetting, &dbv)) {
            switch (dbv.type) {
            case DBVT_DWORD:
                hDst = HContactFromNumericID(szProto, pszUniqueSetting, dbv.dVal);
                break;

            case DBVT_ASCIIZ:
                hDst = HContactFromID(szProto, pszUniqueSetting, _A2T(dbv.pszVal));
                break;

            case DBVT_WCHAR:
                hDst = HContactFromID(szProto, pszUniqueSetting, dbv.ptszVal);
                break;
            }
            srcDb->FreeVariant(&dbv);
        }
    }
    return hDst;
}
Пример #3
0
INT_PTR CALLBACK copyModDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	ModuleAndContact *mac = (ModuleAndContact *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
	if (msg == WM_INITDIALOG)
	{
		int index, loaded;
		char szProto[256];
		for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) {
			if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto)))
				loaded = IsProtocolLoaded(szProto);
			else
				loaded = 0;

			// filter
			if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED))
				continue;

			// contacts name
			DBVARIANT dbv ={0};
			WCHAR nick[256];
			WCHAR protoW[256]; // unicode proto

			if (szProto[0])
				a2u(szProto, protoW, SIZEOF(protoW));
			else
				protoW[0] = 0;

			if (!szProto[0] || !loaded) {
				if (protoW) {
					if (Order)
						mir_snwprintf(nick, SIZEOF(nick), L"(%s) %s %s", protoW, GetContactName(hContact, szProto, 1), L"(UNLOADED)");
					else
						mir_snwprintf(nick, SIZEOF(nick), L"%s (%s) %s", GetContactName(hContact, szProto, 1), protoW, L"(UNLOADED)");
				}
				else wcscpy(nick, nick_unknownW);
			}
			else {
				if (Order)
					mir_snwprintf(nick, SIZEOF(nick), L"(%s) %s", protoW, GetContactName(hContact, szProto, 1));
				else
					mir_snwprintf(nick, SIZEOF(nick), L"%s (%s)", GetContactName(hContact, szProto, 1), protoW);
			}

			index = SendMessageW(GetDlgItem(hwnd, IDC_CONTACTS), CB_ADDSTRING, 0, (LPARAM)nick);
			SendMessageW(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETITEMDATA, index, hContact);
		}

		index = (int)SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_INSERTSTRING, 0, (LPARAM)(char*)Translate("Settings"));
		SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETITEMDATA, index, 0);
		SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETCURSEL, index, 0);

		SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam);
		TranslateDialogDefault(hwnd);
	}
	else if (msg == WM_COMMAND)
	{
		switch(LOWORD(wParam)) {
		case CHK_COPY2ALL:
			EnableWindow(GetDlgItem(hwnd, IDC_CONTACTS),!IsDlgButtonChecked(hwnd,CHK_COPY2ALL));
			break;

		case IDOK:
			if (!IsDlgButtonChecked(hwnd,CHK_COPY2ALL)) {
				MCONTACT hContact = (MCONTACT)SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETITEMDATA, SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETCURSEL, 0, 0), 0);
				copyModule(mac->module, mac->hContact, hContact);
			}
			else {
				SetCursor(LoadCursor(NULL,IDC_WAIT));
				for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact))
					copyModule(mac->module, mac->hContact, hContact);

				SetCursor(LoadCursor(NULL,IDC_ARROW));
			}
			mir_free(mac);
			refreshTree(1);
			DestroyWindow(hwnd);
			break;

		case IDCANCEL:
			mir_free(mac);
			DestroyWindow(hwnd);
			break;
		}
	}
	return 0;
}
Пример #4
0
void moduleListWM_NOTIFY(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)// hwnd here is to the main window, NOT the treview
{
	switch (((NMHDR *)lParam)->code) {
	case TVN_ITEMEXPANDINGA:
	case TVN_ITEMEXPANDINGW:
		if (populating && ((LPNMTREEVIEW)lParam)->action == TVE_EXPAND) {
			ModuleTreeInfoStruct *mtis = (ModuleTreeInfoStruct *)((LPNMTREEVIEW)lParam)->itemNew.lParam;
			if (mtis && (mtis->type == (CONTACT | EMPTY))) {
				TVINSERTSTRUCT tvi;
				HTREEITEM item = {0};
				ModuleTreeInfoStruct *_lParam;
				HWND hwnd2Tree = GetDlgItem(hwnd2mainWindow, IDC_MODULES);
				ModSetLinkLinkItem *module;
				ModuleSettingLL modlist;
				MCONTACT hContact = mtis->hContact;

				mtis->type = CONTACT;

				if (!EnumModules(&modlist)) {
					msg(Translate("Error loading module list"), modFullname);
					break;
				}

				module = modlist.first;
				while (module && hwnd2mainWindow) {
					if (module->name[0] && !IsModuleEmpty(hContact, module->name)) {
						tvi.hParent = ((LPNMTREEVIEW)lParam)->itemNew.hItem;
						tvi.hInsertAfter = TVI_SORT;
						tvi.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
						tvi.item.pszText = module->name;

						_lParam = (ModuleTreeInfoStruct *)mir_calloc(sizeof(ModuleTreeInfoStruct));
						_lParam->hContact = hContact;

						tvi.item.iImage = 5;
						tvi.item.iSelectedImage = 6;
						_lParam->type = KNOWN_MODULE;

						tvi.item.lParam = (LPARAM)_lParam;
						TreeView_InsertItem(hwnd2Tree, &tvi);
					}
					module = (ModSetLinkLinkItem *)module->next;
				}

				FreeModuleSettingLL(&modlist);
			}
		}
		break;

	case TVN_SELCHANGEDA:
	case TVN_SELCHANGEDW:
		{
			ModuleTreeInfoStruct *mtis;
			LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
			TVITEM tvi = {0};
			char text[264];
			MCONTACT hContact;
			HWND hwnd2Settings = GetDlgItem(hwnd, IDC_SETTINGS);
			tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT;
			tvi.hItem = pnmtv->itemNew.hItem;
			tvi.pszText = text;
			tvi.cchTextMax = 264;
			TreeView_GetItem(pnmtv->hdr.hwndFrom, &tvi);

			if (tvi.lParam) {
				mtis = (ModuleTreeInfoStruct *)tvi.lParam;
				hContact = mtis->hContact;

				if (mtis->type == STUB)
					break;

				if (populating)
					Select = 0;

				if (mtis->type == MODULE) {
					SettingListInfo *info = (SettingListInfo *)GetWindowLongPtr(hwnd2Settings, GWLP_USERDATA);
					BOOL refresh = 1;

					if (info) {
						if (info->hContact == hContact && !mir_strcmp(info->module, text))
							refresh = 0;
					}

					if (refresh)
						PopulateSettings(hwnd2Settings, hContact, text);
				}
				else if (((mtis->type & CONTACT) == CONTACT && hContact) || (mtis->type == CONTACT_ROOT_ITEM && !hContact)) {
					char data[32], szProto[256];
					int index, loaded, multi = 0;
					LVITEM lvi = {0};
					lvi.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
					lvi.iImage = 6;

					ClearListview(hwnd2Settings);
					SetWindowLongPtr(hwnd2Settings, GWLP_USERDATA, 0);
					if (himl2)
						ListView_SetImageList(hwnd2Settings, himl2, LVSIL_SMALL);

					if (mtis->type == CONTACT_ROOT_ITEM && !hContact) {
						multi = 1;
						hContact = db_find_first();
					}

					while (hContact && hwnd2mainWindow) {
						if (multi) {
							// filter
							if (GetValue(hContact, "Protocol", "p", szProto, SIZEOF(szProto)))
								loaded = IsProtocolLoaded(szProto);
							else
								loaded = 0;

							if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED)) {
								hContact = db_find_next(hContact);
								continue;
							}
						}

						lvi.iItem = 0;
						lvi.pszText = (char *)GetContactName(hContact, NULL, FALSE);

						index = ListView_InsertItem(hwnd2Settings, &lvi);

						mir_snprintf(data, SIZEOF(data), "0x%08X (%ld)", hContact, hContact);

						ListView_SetItemText(hwnd2Settings, index, 1, data);
						ListView_SetItemText(hwnd2Settings, index, 2, Translate("HANDLE"));
						ListView_SetItemText(hwnd2Settings, index, 3, "0x0004 (4)");

						if (!multi)
							break;

						hContact = db_find_next(hContact);
					}
				}
				else
					ClearListview(hwnd2Settings);
			}
			else // clear any settings that may be there...
				ClearListview(hwnd2Settings);
		}
		break; //TVN_SELCHANGED:

	case NM_RCLICK:
		if (((NMHDR *)lParam)->code == NM_RCLICK)
			moduleListRightClick(hwnd, wParam, lParam);
		break;

	case TVN_BEGINLABELEDITA: // subclass it..
	case TVN_BEGINLABELEDITW:
		{
			LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam;
			ModuleTreeInfoStruct *mtis = (ModuleTreeInfoStruct *)ptvdi->item.lParam;
			HWND hwnd2Edit = TreeView_GetEditControl(GetDlgItem(hwnd, IDC_MODULES));
			if (!mtis->type || (mtis->type == CONTACT)) {
				SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE);
				break;
			}
			mir_subclassWindow(hwnd2Edit, ModuleTreeLabelEditSubClassProc);
			SetWindowLongPtr(hwnd, DWLP_MSGRESULT, FALSE);
		}
		break;

	case TVN_ENDLABELEDITA:
	case TVN_ENDLABELEDITW:
		LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam;
		TVITEM tvi = {0};
		char text[264];
		char *newtext;
		ModuleTreeInfoStruct *mtis;
		tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM;
		tvi.hItem = ptvdi->item.hItem;
		tvi.pszText = text;
		tvi.cchTextMax = 264;
		TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &tvi);
		mtis = (ModuleTreeInfoStruct *)ptvdi->item.lParam;

		newtext = u2a((WCHAR *)ptvdi->item.pszText);

		if (!newtext // edit control failed
			|| !mtis->type // its a root item
			|| mtis->type == CONTACT // its a contact
			|| *newtext == 0)  // empty string
			SetWindowLongPtr(hwnd, DWLP_MSGRESULT, FALSE);
		else {
			if (mir_strcmp(tvi.pszText, newtext)) {
				renameModule(tvi.pszText, newtext, mtis->hContact);

				findAndRemoveDuplicates(((LPNMHDR)lParam)->hwndFrom, mtis->hContact, newtext);

				if (TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &tvi)) {
					tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
					tvi.iImage = 1;
					tvi.iSelectedImage = 2;
					TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom, &tvi);

					PopulateSettings(GetDlgItem(hwnd, IDC_SETTINGS), mtis->hContact, newtext);
				}
			}
			SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE);
		}

		mir_free(newtext);
		break;
	}
}
Пример #5
0
void exportDB(HANDLE hContact, char* module) // hContact == -1 export entire db. module == NULL export entire contact.
{                                            // hContact == -1, module == "" - all contacts
	FILE* file = NULL;
	char fileName[MAX_PATH];
	int nullcontactDone = 0;
	ModuleSettingLL modlist;
	struct ModSetLinkLinkItem *mod;

	// enum all the modules
	if (!EnumModules(&modlist)) { msg(Translate("Error Loading Module List"),modFullname); return;}

	if (Openfile(fileName, ((int)hContact==-1)?NULL:module))
	{
		if (!(file = fopen(fileName, "wt"))) { msg(Translate("Couldn't open file for writing"), modFullname); return; }

		SetCursor(LoadCursor(NULL,IDC_WAIT));

		// exporting entire db
		if (hContact == INVALID_HANDLE_VALUE)
		{
			hContact = NULL;

			if (module == NULL)
			{
				fprintf(file, "SETTINGS:\n");
				mod = modlist.first;
				while(mod)
				{
					if (IsModuleEmpty(hContact, mod->name))
					{
						mod = (struct ModSetLinkLinkItem *)mod->next;
						continue;
					}
					exportModule(hContact, mod->name, file);
					mod = (struct ModSetLinkLinkItem *)mod->next;
					if (mod)
						fprintf(file, "\n");
				}
			}
			else
			{
				if (module == "") module = NULL; // reset module for all contacts export
			}

			hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);

			while (hContact)
			{
				if (!hContact) continue;

				// filter
				if (Mode != MODE_ALL)
				{
					char szProto[256];
					int loaded = 0;

					if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto)))
						loaded = IsProtocolLoaded(szProto);

					if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED))
					{
						hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0);
						continue;
					}
				}

				fprintf(file, "CONTACT: %s\n", NickFromHContact(hContact));

				if (module == NULL) // export all modules
				{
					mod = modlist.first;
					while(mod)
					{
						if (IsModuleEmpty(hContact, mod->name))
						{
							mod = (struct ModSetLinkLinkItem *)mod->next;
							continue;
						}
						exportModule(hContact, mod->name, file);
						mod = (struct ModSetLinkLinkItem *)mod->next;
						if (mod)
							fprintf(file, "\n");
					}
				}
				else // export module
				{
					exportModule(hContact, module, file);
				}
				hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)(HANDLE)hContact, 0);
			}
		}
		// exporting a contact
		else
		{
			if (!module) // exporting every module
			{
				if (hContact)
					fprintf(file, "CONTACT: %s\n", NickFromHContact(hContact));
				else
					fprintf(file, "SETTINGS:\n");

				mod = modlist.first;
				while(mod)
				{
					if (IsModuleEmpty(hContact, mod->name))
					{
						mod = (struct ModSetLinkLinkItem *)mod->next;
						continue;
					}
					exportModule(hContact, mod->name, file);
					mod = (struct ModSetLinkLinkItem *)mod->next;
					if (mod)
						fprintf(file, "\n");
				}
			}
			else
			{
				if (hContact)
					fprintf(file, "FROM CONTACT: %s\n", NickFromHContact(hContact));
				else
					fprintf(file, "SETTINGS:\n");

				exportModule(hContact, module, file);
			}
		}
		fclose(file);

		SetCursor(LoadCursor(NULL,IDC_ARROW));
	}

	FreeModuleSettingLL(&modlist);
}
Пример #6
0
static MCONTACT ImportContact(MCONTACT hSrc)
{
    MCONTACT hDst;
    TCHAR id[ 40 ], *pszUniqueID;
    char  szProto[100];

    // Check what protocol this contact belongs to
    if (myGetS(hSrc, "Protocol", "p", szProto)) {
        AddMessage(LPGENT("Skipping contact with no protocol"));
        return NULL;
    }

    if (!IsProtocolLoaded(szProto)) {
        AddMessage(LPGENT("Skipping contact, %S not installed."), szProto);
        return NULL;
    }

    // Skip protocols with no unique id setting (some non IM protocols return NULL)
    char* pszUniqueSetting = (char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
    if (!pszUniqueSetting || (INT_PTR)pszUniqueSetting == CALLSERVICE_NOTFOUND) {
        AddMessage(LPGENT("Skipping non-IM contact (%S)"), szProto);
        return NULL;
    }

    DBVARIANT dbv;
    if (myGet(hSrc, szProto, pszUniqueSetting, &dbv)) {
        AddMessage(LPGENT("Skipping %S contact, ID not found"), szProto);
        return NULL;
    }

    // Does the contact already exist?
    switch (dbv.type) {
    case DBVT_DWORD:
        pszUniqueID = _ltot(dbv.dVal, id, 10);
        hDst = HContactFromNumericID(szProto, pszUniqueSetting, dbv.dVal);
        break;

    case DBVT_ASCIIZ:
        pszUniqueID = NEWTSTR_ALLOCA(_A2T(dbv.pszVal));
        hDst = HContactFromID(szProto, pszUniqueSetting, pszUniqueID);
        break;

    case DBVT_WCHAR:
        pszUniqueID = NEWTSTR_ALLOCA(dbv.ptszVal);
        hDst = HContactFromID(szProto, pszUniqueSetting, pszUniqueID);
        break;
    }

    if (hDst != INVALID_CONTACT_ID) {
        AddMessage(LPGENT("Skipping duplicate %S contact %s"), szProto, pszUniqueID);
        srcDb->FreeVariant(&dbv);
        return NULL;
    }

    TCHAR *tszGroup = myGetWs(hSrc, "CList", "Group"), *tszNick = myGetWs(hSrc, "CList", "MyHandle");
    if (tszNick == NULL)
        tszNick = myGetWs(hSrc, szProto, "Nick");

    hDst = AddContact(hdlgProgress, szProto, pszUniqueSetting, &dbv, pszUniqueID, tszNick, tszGroup);
    mir_free(tszGroup), mir_free(tszNick);

    if (hDst != INVALID_CONTACT_ID) {
        // Hidden?
        if (!myGet(hSrc, "CList", "Hidden", &dbv)) {
            mySet(hDst, "CList", "Hidden", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // Ignore settings
        if (!myGet(hSrc, "Ignore", "Mask1", &dbv)) {
            mySet(hDst, "Ignore", "Mask1", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // Apparent mode
        if (!myGet(hSrc, szProto, "ApparentMode", &dbv)) {
            mySet(hDst, szProto, "ApparentMode", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // Nick
        if (!myGet(hSrc, szProto, "Nick", &dbv)) {
            mySet(hDst, szProto, "Nick", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // Myhandle
        if (!myGet(hSrc, szProto, "MyHandle", &dbv)) {
            mySet(hDst, szProto, "MyHandle", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // First name
        if (!myGet(hSrc, szProto, "FirstName", &dbv)) {
            mySet(hDst, szProto, "FirstName", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // Last name
        if (!myGet(hSrc, szProto, "LastName", &dbv)) {
            mySet(hDst, szProto, "LastName", &dbv);
            srcDb->FreeVariant(&dbv);
        }

        // About
        if (!myGet(hSrc, szProto, "About", &dbv)) {
            mySet(hDst, szProto, "About", &dbv);
            srcDb->FreeVariant(&dbv);
        }
    }
    else AddMessage(LPGENT("Unknown error while adding %S contact %s"), szProto, pszUniqueID);

    return hDst;
}