示例#1
0
void RegConfig::BookmarkInsertInt(int nPos, RegPath* pKey, BOOL abSaveImmediate /*= TRUE*/)
{
	if (szBookmarksValueName[0] == 0 || !pszBookmarks)
	{
		_ASSERTE(szBookmarksValueName[0] && pszBookmarks);
		return;
	}

	// Сформировать полный путь с "HKEY_xxx"
	wchar_t* pszNewKey = NULL;
	int nKeyLen = pKey->mpsz_Key ? lstrlenW(pKey->mpsz_Key) : 0;
	pszNewKey = (wchar_t*)calloc(nKeyLen+40,2);
	if (pKey->mh_Root) {
		if (!pKey->IsKeyPredefined(pKey->mh_Root)) {
			pszNewKey[0] = 0;
		} else if (!HKeyToStringKey(pKey->mh_Root, pszNewKey , 40)) {
			// Неизвестный ключ!
			InvalidOp();
			SafeFree(pszNewKey);
			return;
		}
		MCHKHEAP;
	}
	if (*pKey->mpsz_Key) {
		lstrcatW(pszNewKey, L"\\");
		lstrcpynW(pszNewKey+lstrlenW(pszNewKey), pKey->mpsz_Key, nKeyLen+1);
	}
	BookmarkInsertInt(nPos, pszNewKey, abSaveImmediate);
	SafeFree(pszNewKey);
}
示例#2
0
void RegConfig::BookmarkDeleteInt(int nPos)
{
	if (szBookmarksValueName[0] == 0 || !pszBookmarks || nPos < 0)
	{
		_ASSERTE(szBookmarksValueName[0] && pszBookmarks && nPos >= 0);
		return;
	}
	
	// удаление пункта nPos
	wchar_t* psz = pszBookmarks;
	wchar_t* pszEnd = pszBookmarks + cchBookmarksLen - 1;
	while (psz < pszEnd && nPos > 0)
	{
		nPos--; psz += lstrlenW(psz)+1;
	}
	if (nPos == 0 && psz < pszEnd)
	{
		// Сдвинуть все остальное (ПОСЛЕ ТЕКУЩЕГО) вперед
		wchar_t* pszNext = psz + lstrlenW(psz) + 1;
		if (pszNext < pszEnd)
		{
			size_t nDelLen = pszNext - psz;
			if (nDelLen > cchBookmarksLen)
			{
				InvalidOp();
			}
			else
			{
				memmove(psz, pszNext, (cchBookmarksLen - (pszNext - pszBookmarks))*2);
				cchBookmarksLen -= (DWORD)nDelLen;
				_ASSERTE(cchBookmarksLen >= 2);
				_ASSERTE(cchBookmarksLen < 1 || pszBookmarks[cchBookmarksLen-1] == 0);
				_ASSERTE(cchBookmarksLen < 2 || pszBookmarks[cchBookmarksLen-2] == 0);
			}
		}
		else
		{
			// Удален послдений элемент. просто уменьшить длину
			cchBookmarksLen = (DWORD)(psz - pszBookmarks + 1);
			_ASSERTE(cchBookmarksLen >= 1);
			if (cchBookmarksLen > 0) pszBookmarks[cchBookmarksLen-1] = 0;
			if (cchBookmarksLen > 1) pszBookmarks[cchBookmarksLen-2] = 0;
			while (cchBookmarksLen >= 3
				&& pszBookmarks[cchBookmarksLen-1] == 0
				&& pszBookmarks[cchBookmarksLen-2] == 0
				&& pszBookmarks[cchBookmarksLen-3] == 0)
			{
				cchBookmarksLen--;
			}
		}
		_ASSERTE(cchBookmarksLen < 1 || pszBookmarks[cchBookmarksLen-1] == 0);
		_ASSERTE(cchBookmarksLen < 2 || pszBookmarks[cchBookmarksLen-2] == 0);
	}

	BookmarksSaveInt();
}
示例#3
0
RegFolder* RegFolderCache::GetFolder(RegPath* apKey, u64 OpMode)
{
	if (apKey->eType == RE_UNDEFINED)
	{
		_ASSERTE(apKey->eType != RE_UNDEFINED);
		InvalidOp();
		return NULL;
	}

	int nFreeIdx = -1;
	// Может он уже есть?
	if (mp_Cache) {
 		for (int i = 0; i < mn_ItemCount; i++) {
 			if (mp_Cache[i]->key.eType == RE_UNDEFINED)
 			{
 				if (nFreeIdx == -1)
 					nFreeIdx = i;
 				continue;
			}
 			if (mp_Cache[i]->key.IsEqual(apKey))
 			{
				mp_Cache[i]->AddRef();
 				return (mp_Cache[i]);
 			}
 		}
	}
	
	// Нужно создать!
	
	if (!mp_Cache || (nFreeIdx == -1 && mn_ItemCount >= mn_MaxItemCount)) {
		// Выделить доп. память под структуры
		_ASSERTE(mn_ItemCount <= mn_MaxItemCount);
		mn_MaxItemCount += 256;
		RegFolder **pNew = (RegFolder**)calloc(mn_MaxItemCount,sizeof(RegFolder*));
		if (mn_ItemCount > 0)
			memmove(pNew, mp_Cache, mn_ItemCount*sizeof(RegFolder*));
		SafeFree(mp_Cache);
		mp_Cache = pNew;
	}
	
	int nIdx = 0;
	if (nFreeIdx != -1)
		nIdx = nFreeIdx;
	else
		nIdx = mn_ItemCount++;
	// На всякий случай - обнуляем
	if (mp_Cache[nIdx] == NULL)
		mp_Cache[nIdx] = new RegFolder;
	else
		mp_Cache[nIdx]->AddRef();
	mp_Cache[nIdx]->Init(apKey);
	mp_Cache[nIdx]->bForceRelease = (OpMode & OPM_FIND) == OPM_FIND; // Реально освободить при запросе из Фар
	return (mp_Cache[nIdx]);
}
示例#4
0
void * __cdecl operator new[] (size_t _Size)
{
	void * p = xf_malloc(
		_Size
		#ifdef TRACK_MEMORY_ALLOCATIONS
		,__FILE__,__LINE__
		#endif
		);
	#ifdef MVALIDATE_POINTERS
		_ASSERTE(p != NULL);
		if (p == NULL) InvalidOp();
	#endif
	return p;
}
示例#5
0
int REPluginList::Register(REPlugin* pPlugin)
{
	mn_PlugCount++;
	for (UINT i = 0; i < countof(Plugins); i++)
	{
		if (Plugins[i] == NULL)
		{
			Plugins[i] = pPlugin;
			return mn_PlugCount;
		}
	}
	InvalidOp();
	return mn_PlugCount;
}
示例#6
0
int REPluginList::Unregister(REPlugin* pPlugin)
{
	if (mn_PlugCount > 0)
		mn_PlugCount--;
	for (UINT i = 0; i < countof(Plugins); i++)
	{
		if (Plugins[i] == pPlugin)
		{
			Plugins[i] = NULL;
			return mn_PlugCount;
		}
	}
	InvalidOp();
	return mn_PlugCount;
}
示例#7
0
BOOL MRegistryBase::ConnectRemote(LPCWSTR asServer, LPCWSTR asLogin /*= NULL*/, LPCWSTR asPassword /*= NULL*/, LPCWSTR asResource /*= NULL*/)
{
	if (!asServer || !*asServer)
	{
		InvalidOp();
		return FALSE;
	}
	
	// Сначала отключиться, если было другое подключение
	ConnectLocal();

	while (*asServer == L'\\' || *asServer == '/') asServer++;
	// The name of the remote computer. The string has the following form: \\computername
	if (asServer[0])
	{
		sRemoteServer[0] = sRemoteServer[1] = L'\\';
		lstrcpynW(sRemoteServer+2, asServer, countof(sRemoteServer)-2);

		if (asLogin && *asLogin && asPassword)
		{
			NETRESOURCEW res = {0};
			
			_ASSERTE(countof(sRemoteResource) > countof(sRemoteServer));
			if (asResource && asResource[0] == L'\\' && asResource[1] == L'\\')
			{
				lstrcpynW(sRemoteResource, asResource, countof(sRemoteResource));
			}
			else
			{
				lstrcpynW(sRemoteResource, sRemoteServer, countof(sRemoteResource));
				if (asResource && asResource[0] == L'\\')
				{
					lstrcatW(sRemoteResource, asResource);
				}
				else
				{
					lstrcatW(sRemoteResource, L"\\");
					if (asResource && *asResource)
						lstrcatW(sRemoteResource, asResource);
					else
						lstrcatW(sRemoteResource, L"IPC$");
				}
			}
			
			res.dwType = RESOURCETYPE_ANY;
			res.lpRemoteName = sRemoteResource;
			
			// Подключаемся
			CScreenRestore pop(GetMsg(REM_RemoteConnecting), GetMsg(REPluginName));
			DWORD dwErr = WNetAddConnection2W(&res, asPassword, asLogin, CONNECT_TEMPORARY);
			pop.Restore();
			if (dwErr != 0)
			{
				REPlugin::MessageFmt(REM_LogonFailed, asLogin, dwErr, _T("RemoteConnect"));
				return FALSE;
			}
		} else {
			sRemoteResource[0] = 0;
		}
	}
	bRemote = true;
	return TRUE;
}
示例#8
0
BOOL RegConfig::Configure()
{
	//TODO: Открыть диалог с настройками
	mb_SettingsChanged = FALSE;
	RegConfigDlg Config(psi, REConfigTitle, _T("Configuration"), &guid_Configuration);
	
	FarDialogItem *p1, *p2;
	
	Config.StartColumns();
	Config.AddCheckbox(REAddToPluginsMenu, &bAddToPluginsMenu);
	Config.ColumnBreak();
	Config.AddCheckbox(REAddToDisksMenu, &bAddToDisksMenu);
	Config.EndColumns();
	bool lbNeedDiskNumbers = true;
#ifdef _UNICODE
	#if FAR_UNICODE>=1906
		lbNeedDiskNumbers = false;
	#else
		lbNeedDiskNumbers = (gFarVersion.Build < 1692);
	#endif
#endif
	if (lbNeedDiskNumbers)
	{
		p1 = Config.AddText(REDisksMenuHotkey);
		p2 = Config.AddEditField(cDiskMenuHotkey, 2, 1); p2->X2 = p2->X1; p2->Type = DI_FIXEDIT;
		Config.MoveItemAfter(p1,p2);
	}
	
	Config.AddSeparator(REPrefixSeparator);
	Config.StartColumns();
	p1 = Config.AddText(REPrefixLabel); p2 = Config.AddEditField(sCommandPrefix, 9, 10);
	Config.MoveItemAfter(p1,p2);
	Config.ColumnBreak();
	p1 = Config.AddText(REPanelPrefixLabel); p2 = Config.AddEditField(sRegTitlePrefix, 9, 10);
	Config.MoveItemAfter(p1,p2);
	Config.EndColumns();

	Config.AddSeparator(REWow6432);
	Config.StartColumns();
	Config.AddCheckbox(REWow64on32, &bWow64on32_)->Flags |= DIF_3STATE;
	Config.ColumnBreak();
	Config.AddCheckbox(REWow64process, &is64bitOs)->Flags |= DIF_DISABLE;
	Config.EndColumns();

	Config.AddSeparator();

	Config.AddCheckbox(RESkipAccessDeniedMessage, &bSkipAccessDeniedMessage);
	Config.StartColumns();
	Config.AddCheckbox(REUseBackupRestore, &bUseBackupRestore);
	Config.ColumnBreak();
	Config.AddCheckbox(RESkipPrivilegesDeniedMessage, &bSkipPrivilegesDeniedMessage);
	Config.EndColumns();
	
	Config.StartColumns();
	BOOL lbBrowseRegFiles = (bBrowseRegFiles == 1) ? 2 : (bBrowseRegFiles == 2) ? 1 : 0;
	Config.AddCheckbox(REBrowseRegFiles, &lbBrowseRegFiles)->Flags |= DIF_3STATE;
	Config.AddCheckbox(REShowKeysAsDirs, &bShowKeysAsDirs);
	Config.ColumnBreak();
	Config.AddCheckbox(REBrowseHives, &bBrowseRegHives)->Flags |= DIF_3STATE;
	Config.AddCheckbox(REExportDefaultValueFirst, &bExportDefaultValueFirst);
	Config.EndColumns();
	Config.StartColumns();
	Config.AddCheckbox(RECreateUnicodeFiles, &bCreateUnicodeFiles);
	Config.ColumnBreak();
	p1 = Config.AddText(REAnsiCpLabel); p2 = Config.AddIntEditField((int*)&nAnsiCodePage, 6);
	Config.MoveItemAfter(p1,p2);
	Config.EndColumns();
	Config.StartColumns();
	Config.AddCheckbox(REEscapeRNonExporting, &bEscapeRNonExporting);
	Config.ColumnBreak();
	Config.AddCheckbox(REEditBinaryAsText, &bEditBinaryAsText);
	Config.EndColumns();
	Config.StartColumns();
	Config.AddCheckbox(RECheckMacroSeq, &bCheckMacroSequences);
	Config.ColumnBreak();
	Config.AddCheckbox(RECheckMacroVar, &bCheckMacrosInVars);
	Config.EndColumns();

	//// Speed up browsing of large keys (HKCR\\CLSID, and so on)
	//Config.AddSeparator(RESpeedUpLargeKeysSeparator);
	//Config.AddCheckbox(REUnsortLargeKeys, &bUnsortLargeKeys);
	//Config.SlideItemUp(Config.AddIntEditField((int*)&nLargeKeyCount, 7));
	//Config.AddCheckbox(RELoadDescriptions, &bLoadDescriptions);
	//Config.SlideItemUp(Config.AddIntEditField((int*)&nLargeKeyTimeout, 7));
	//
	//// 
	//Config.AddSeparator(REAutoRefreshSeparator);
	//Config.AddCheckbox(REAutoRefreshChanges, &bRefreshChanges);
	//Config.StartColumns();
	//p1 = Config.AddText(RERefreshKeyTimeoutLabel); p2 = Config.AddIntEditField((int*)&nRefreshKeyTimeout, 6);
	//Config.MoveItemAfter(p1,p2);
	//Config.ColumnBreak();
	//p1 = Config.AddText(RERefreshSubkeyTimeoutLabel); p2 = Config.AddIntEditField((int*)&nRefreshSubkeyTimeout, 6);
	//Config.MoveItemAfter(p1,p2);
	//Config.EndColumns();


	int nOkBtn = Config.AddFooterButtons(REBtnOK, REBtnVisual, REBtnCancel, 0);
	Config.nBtnVisualID = nOkBtn+1;
	Config.GetItemByIndex(Config.nBtnVisualID)->Flags |= DIF_BTNNOCLOSE;

	if (Config.ShowDialog())
	{
		mb_SettingsChanged = TRUE;
		if (nAnsiCodePage == CP_UTF8 || nAnsiCodePage == CP_UTF7)
		{
			InvalidOp(); nAnsiCodePage = 1251;
		}
		bBrowseRegFiles = (lbBrowseRegFiles == 1) ? 2 : (lbBrowseRegFiles == 2) ? 1 : 0;
		// сохраним в реестр
		SaveConfiguration();
		// Обновить Wow64on32 и заголовки
		gpPluginList->OnSettingsChanged(bWow64on32_);
	}
	
	// Вернуть TRUE, если фар нужно передернуть
	return mb_SettingsChanged;
}
示例#9
0
void RegConfig::BookmarksEdit()
{
	if (!bUseInternalBookmarks)
		return;

	if (szBookmarksValueName[0] == 0)
	{
		_ASSERTE(szBookmarksValueName[0]);
		return;
	}
	
	MFileTxtReg file(bWow64on32_);
	BOOL lbFarUnicode =
	#ifdef _UNICODE
		TRUE
	#else
		FALSE
	#endif
		;
	if (!file.FileCreateTemp(szBookmarksValueName, L".txt", lbFarUnicode))
	{
		InvalidOp();
		return;
	}
	if (pszBookmarks)
	{
		if (!file.FileWriteMSZ(pszBookmarks, BookmarksLen(NULL)))
		{
			InvalidOp();
			file.FileDelete();
			return;
		}
	}
	file.FileClose();
	
	
	TCHAR sTitle[64]; lstrcpy_t(sTitle, countof(sTitle), szBookmarksValueName);
	int nEdtRc = psi.Editor(file.GetShowFilePathName(), sTitle, 0,0,-1,-1,
		EF_DISABLEHISTORY/*EF_NONMODAL|EF_IMMEDIATERETURN|EF_DELETEONCLOSE|EF_ENABLE_F6*/,
		#ifdef _UNICODE
		1, 1, 1200
		#else
		0, 1
		#endif
	);
	if (nEdtRc == EEC_MODIFIED)
	{
		wchar_t* pszNew = NULL; DWORD cbNewSize = 0;
		if (MFileTxt::LoadTextMSZ(file.GetFilePathName(), lbFarUnicode, &pszNew, &cbNewSize) == 0)
		{
			BookmarkParse(pszNew, cbNewSize/2);
			SafeFree(pszNew);
			//if (cchBookmarksMaxCount*2 < cbNewSize)
			//{
			//	SafeFree(pszBookmarks);
			//	cchBookmarksMaxCount = (cbNewSize >> 1) + 512;
			//	pszBookmarks = (wchar_t*)calloc(cchBookmarksMaxCount,2);
			//}
			//if (pszBookmarks)
			//	memmove(pszBookmarks, pszNew, cbNewSize);
			//SafeFree(pszNew);
			//cchBookmarksLen = (cbNewSize >> 1);
			//if (cchBookmarksLen == 0)
			//{
			//	_ASSERTE(cchBookmarksLen > 0);
			//	cchBookmarksLen = 1;
			//	pszBookmarks[0] = pszBookmarks[1] = 0;
			//}
			//else
			//{
			//	if (cchBookmarksLen<1 || pszBookmarks[cchBookmarksLen-1] != 0)
			//		pszBookmarks[cchBookmarksLen++] = 0;
			//	if (cchBookmarksLen<2 || pszBookmarks[cchBookmarksLen-2] != 0)
			//		pszBookmarks[cchBookmarksLen++] = 0;
			//}
		}
		_ASSERTE(bUseInternalBookmarks);
		BookmarksSaveInt();
	}

	// ВРЕМЕННЫЙ файл больше не нужен!
	file.FileDelete();
}
示例#10
0
void RegConfig::BookmarksLoadInt(RegPath* pKey, BOOL bRemote)
{
	LONG nRegRc = -1;
	BOOL bNoBookmarks = FALSE;
	
	SafeFree(pszBookmarks);
	
	switch (pKey->eType)
	{
		case RE_WINAPI:
			lstrcpyW(szBookmarksValueName, bRemote ? L"RegBookmarksRemote" : L"RegBookmarksLocal"); break;
		case RE_REGFILE:
			lstrcpyW(szBookmarksValueName, L"RegBookmarksFile"); break;
		case RE_HIVE:
			lstrcpyW(szBookmarksValueName, L"RegBookmarksHive"); break;
		default:
			InvalidOp();
			return;
	}

	cchBookmarksLen = 0;

	BOOL lbKeyOpened = FALSE;

	#if FAR_UNICODE>=1900
	FarSettingsCreate sc = {sizeof(FarSettingsCreate), guid_PluginGuid, INVALID_HANDLE_VALUE};
	FarSettingsItem fsi = {0};
	lbKeyOpened = psi.SettingsControl(INVALID_HANDLE_VALUE, SCTL_CREATE, 0, &sc) != 0;
	#else
	HANDLE hk = NULL;
	lbKeyOpened = (0 == RegOpenKeyEx(HKEY_CURRENT_USER, pszPluginKey, 0, KEY_READ, (HKEY*)&hk));
	#endif
	
	if (!lbKeyOpened)
	{
		// Если ключа не было - сразу создать в реестре значения по умолчанию!
		bNoBookmarks = TRUE;
		
	}
	else
	{
		DWORD nSize = 0;
		wchar_t* pszNew = NULL;

		nRegRc = -1;
		#if FAR_UNICODE>=1900
			FarSettingsItem fsi = {0};
			fsi.Name = szBookmarksValueName;
			fsi.Type = FST_DATA; // Именно DATA, ибо попадаются \0
			if (psi.SettingsControl(sc.Handle, SCTL_GET, 0, &fsi))
			{
				nSize = (DWORD)fsi.Data.Size;
				pszNew = (wchar_t*)calloc(nSize+4,1);
				memmove(pszNew, fsi.Data.Data, nSize);
				MCHKHEAP;
				nRegRc = 0;
			}
		#else
			nRegRc = RegQueryValueExW((HKEY)hk, szBookmarksValueName, NULL, NULL, NULL, &nSize);
			if (nRegRc == 0)
			{
				_ASSERTE(pszBookmarks == NULL);
				pszNew = (wchar_t*)calloc(nSize+4,1);
				nRegRc = RegQueryValueExW((HKEY)hk, szBookmarksValueName, NULL, NULL, (LPBYTE)pszNew, &nSize);
			}
		#endif
		
		if (nRegRc == 0)
		{
			BookmarkParse(pszNew, nSize/2);
			SafeFree(pszNew);
		}
		else
		{
			bNoBookmarks = TRUE;
		}
		
		_ASSERTE(cchBookmarksLen < 1 || pszBookmarks[cchBookmarksLen-1] == 0);
		_ASSERTE(cchBookmarksLen < 2 || pszBookmarks[cchBookmarksLen-2] == 0);

		#if FAR_UNICODE>=1900
		psi.SettingsControl(sc.Handle, SCTL_FREE, 0, 0);
		#else
		RegCloseKey((HKEY)hk);
		#endif
	}
	
	// Если закладок в реестре еще не было - создать умолчания и сохранить
	if (bNoBookmarks)
	{
		BookmarksReset(pKey, bRemote);
	}
}