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); }
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(); }
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]); }
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; }
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; }
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; }
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; }
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; }
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(); }
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); } }