|
|
1.1 ! root 1: /* ! 2: * utils.c ! 3: * ! 4: * Purpose: ! 5: * generic utils ! 6: * ! 7: * Owner: ! 8: * MikeSart ! 9: */ ! 10: #define UNICODE 1 ! 11: ! 12: #include <windows.h> ! 13: #include <windowsx.h> ! 14: #include <lm.h> ! 15: #include "netwatch.h" ! 16: #include "rcids.h" ! 17: ! 18: void ! 19: RestoreWindowPosition(HWND hwnd) ! 20: { ! 21: WINDOWPLACEMENT wndpl; ! 22: HKEY hkey; ! 23: DWORD cb; ! 24: DWORD dwTopMost = 0; ! 25: DWORD fHideTitle; ! 26: ! 27: wndpl.showCmd = SW_SHOWNORMAL; ! 28: if(!RegOpenKeyEx(HKEY_CURRENT_USER, szFromIDS1(IDS_KEY), 0, KEY_READ, &hkey)) ! 29: { ! 30: cb = sizeof(fHideTitle); ! 31: if(!RegQueryValueEx(hkey, szFromIDS1(IDS_HIDETITLE), 0, 0, ! 32: (LPBYTE)&fHideTitle, &cb) && fHideTitle) ! 33: ShowTitle(hwnd, SW_HIDE); ! 34: ! 35: cb = sizeof(wndpl); ! 36: if(!RegQueryValueEx(hkey, szFromIDS1(IDS_PLACEMENT), 0, 0, ! 37: (LPBYTE)&wndpl, &cb)) ! 38: { ! 39: if(wndpl.length == sizeof(wndpl)) ! 40: SetWindowPlacement(hwnd, &wndpl); ! 41: else ! 42: wndpl.showCmd = SW_SHOWNORMAL; ! 43: } ! 44: ! 45: cb = COUNT_CHECKMENUS * sizeof(unMenuFlags[0]); ! 46: if(!RegQueryValueEx(hkey, szFromIDS1(IDS_MENUFLAGS), 0, 0, ! 47: (LPBYTE)unMenuFlags, &cb)) ! 48: for(cb = 0; cb < COUNT_CHECKMENUS; cb++) ! 49: { ! 50: CheckMenuItem(ghMenu, CHECKMENUSTART + cb, ! 51: MF_BYCOMMAND | unMenuFlags[cb]); ! 52: } ! 53: ! 54: cb = sizeof(dwTimerInterval); ! 55: RegQueryValueEx(hkey, szFromIDS1(IDS_TIMERINTERVAL), 0, 0, ! 56: (LPBYTE)&dwTimerInterval, &cb); ! 57: ! 58: if(!RegQueryValueEx(hkey, szFromIDS1(IDS_TOPMOST), 0, 0, ! 59: (LPBYTE)&dwTopMost, &cb) && cb && dwTopMost) ! 60: { ! 61: SetWindowPos(hwnd, HWND_TOPMOST, 0 ,0 ,0 ,0, ! 62: SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); ! 63: CheckMenuItem(ghMenu, IDM_TOPMOST, ! 64: MF_BYCOMMAND | MF_CHECKED); ! 65: } ! 66: } ! 67: ! 68: ShowWindow(hwnd, wndpl.showCmd); ! 69: ! 70: if(dwTimerInterval < 1000) ! 71: dwTimerInterval = 1000; ! 72: } ! 73: ! 74: void ! 75: SaveWindowPosition(HWND hwnd) ! 76: { ! 77: WINDOWPLACEMENT wndpl; ! 78: HKEY hkey; ! 79: DWORD dwTopMost = 0; ! 80: DWORD fHideTitle; ! 81: ! 82: wndpl.length = sizeof(wndpl); ! 83: GetWindowPlacement(hwnd, &wndpl); ! 84: // for some reason, GetWindowPlacement resets the length part?? ! 85: wndpl.length = sizeof(wndpl); ! 86: ! 87: if(!RegCreateKeyEx(HKEY_CURRENT_USER, szFromIDS1(IDS_KEY), 0, szFromIDS1(IDS_KEY), 0, ! 88: KEY_READ | KEY_WRITE, 0, &hkey, NULL)) ! 89: { ! 90: RegSetValueEx(hkey, szFromIDS1(IDS_PLACEMENT), 0, REG_BINARY, ! 91: (LPBYTE)&wndpl, sizeof(wndpl)); ! 92: ! 93: RegSetValueEx(hkey, szFromIDS1(IDS_MENUFLAGS), 0, REG_BINARY, ! 94: (LPBYTE)unMenuFlags, COUNT_CHECKMENUS * sizeof(unMenuFlags[0])); ! 95: ! 96: RegSetValueEx(hkey, szFromIDS1(IDS_TIMERINTERVAL), 0, REG_DWORD, ! 97: (LPBYTE)&dwTimerInterval, sizeof(dwTimerInterval)); ! 98: ! 99: fHideTitle = GetMenu(hwnd) ? 0 : 1; ! 100: RegSetValueEx(hkey, szFromIDS1(IDS_HIDETITLE), 0, REG_DWORD, ! 101: (LPBYTE)&fHideTitle, sizeof(fHideTitle)); ! 102: ! 103: if(GetMenuState(ghMenu, IDM_TOPMOST, MF_BYCOMMAND) & MF_CHECKED) ! 104: dwTopMost = 1; ! 105: RegSetValueEx(hkey, szFromIDS1(IDS_TOPMOST), 0, REG_DWORD, ! 106: (LPBYTE)&dwTopMost, sizeof(dwTopMost)); ! 107: } ! 108: } ! 109: ! 110: // gets the string and allocs a block with ! 111: // just enough room for it. ! 112: TCHAR * ! 113: AllocAndLoadString(UINT unID) ! 114: { ! 115: TCHAR *sz; ! 116: TCHAR *szT = szFromIDS1(unID); ! 117: ! 118: sz = GlobalAllocPtr(GHND, (lstrlen(szT) + 1) * sizeof(TCHAR)); ! 119: if(sz) ! 120: lstrcpy(sz, szT); ! 121: ! 122: return sz; ! 123: } ! 124: ! 125: TCHAR * ! 126: szFromIDS1(UINT unID) ! 127: { ! 128: static TCHAR szBuf1[MAX_STRINGTABLE_LEN + 1]; ! 129: ! 130: if(!LoadString(ghInst, unID, szBuf1, sizeof(szBuf1) / sizeof(TCHAR))) ! 131: szBuf1[0] = '\0'; ! 132: return szBuf1; ! 133: } ! 134: ! 135: TCHAR * ! 136: szFromIDS2(UINT unID) ! 137: { ! 138: static TCHAR szBuf2[MAX_STRINGTABLE_LEN + 1]; ! 139: ! 140: if(!LoadString(ghInst, unID, szBuf2, sizeof(szBuf2) / sizeof(TCHAR))) ! 141: szBuf2[0] = '\0'; ! 142: return szBuf2; ! 143: } ! 144: ! 145: TCHAR * ! 146: GetSystemErrMessage(DWORD dwError) ! 147: { ! 148: LPTSTR szErrMessage = NULL; ! 149: HMODULE hLibrary; ! 150: ! 151: if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, ! 152: NULL, dwError, 0/*LANG_USER_DEFAULT*/, (LPTSTR)&szErrMessage, 0, NULL)) ! 153: { ! 154: szErrMessage[lstrlen(szErrMessage) - 2] = '\0'; // remove /r/n ! 155: } ! 156: else if(hLibrary = LoadLibrary(MESSAGE_FILENAME)) ! 157: { ! 158: if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, ! 159: (LPVOID)hLibrary, dwError, 0, (LPTSTR)&szErrMessage, 0, NULL)) ! 160: { ! 161: szErrMessage[lstrlen(szErrMessage) - 2] = '\0'; // remove /r/n ! 162: } ! 163: FreeLibrary(hLibrary); ! 164: } ! 165: ! 166: return szErrMessage; ! 167: } ! 168: ! 169: // TRUE: turn on timer ! 170: // FALSE: turn it off ! 171: void ! 172: PunchTimer(BOOL fNewState) ! 173: { ! 174: static BOOL fCurrentState = FALSE; ! 175: ! 176: if(fCurrentState == fNewState) ! 177: return; ! 178: ! 179: if(fNewState) ! 180: SetTimer(hwndMain, TIMERID, dwTimerInterval, NULL); ! 181: else ! 182: KillTimer(hwndMain, TIMERID); ! 183: ! 184: fCurrentState = fNewState; ! 185: } ! 186: ! 187: void ! 188: UpdateWindowText(HWND hwnd, BOOL fForceUpdate) ! 189: { ! 190: static DWORD dwNumUsersCache; ! 191: ! 192: if(fForceUpdate || dwNumUsersCache != dwNumUsers) ! 193: { ! 194: if(!szServerName) ! 195: lstrcpy(szBuffer, szAppName); ! 196: else if(dwNumUsers == 1) ! 197: wsprintf(szBuffer, szFromIDS1(IDS_WINDOWTEXT1), ! 198: szAppName, dwNumUsers, szServerName); ! 199: else ! 200: wsprintf(szBuffer, szFromIDS1(IDS_WINDOWTEXT), ! 201: szAppName, dwNumUsers, szServerName); ! 202: ! 203: if(IsIconic(hwnd)) ! 204: InvalidateRect(hwnd, NULL, TRUE); ! 205: ! 206: SetWindowText(hwnd, szBuffer); ! 207: ! 208: dwNumUsersCache = dwNumUsers; ! 209: } ! 210: } ! 211: ! 212: void ! 213: ShowTitle(HWND hwnd, int nCmdShow) ! 214: { ! 215: static HMENU hMenu = NULL; ! 216: DWORD dwStyle; ! 217: ! 218: dwStyle = GetWindowLong(hwnd, GWL_STYLE); ! 219: if(hMenu) ! 220: { ! 221: dwStyle = WS_TILEDWINDOW | dwStyle; ! 222: SetMenu(hwnd, hMenu); ! 223: hMenu = NULL; ! 224: } ! 225: else ! 226: { ! 227: dwStyle &= ~(WS_DLGFRAME | WS_SYSMENU | ! 228: WS_MINIMIZEBOX | WS_MAXIMIZEBOX); ! 229: ! 230: hMenu = GetMenu(hwnd); ! 231: SetMenu(hwnd, NULL); ! 232: } ! 233: ! 234: SetWindowLong(hwnd, GWL_STYLE, dwStyle); ! 235: SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | ! 236: SWP_NOZORDER | SWP_FRAMECHANGED); ! 237: ! 238: ShowWindow(hwnd, nCmdShow); ! 239: } ! 240: ! 241: // takes whatever is in szServerName and puts it ! 242: // in the caption - returns nas if it can't find szNewServerName ! 243: // assumes szNewServerName has \\ in front of it ! 244: NET_API_STATUS ! 245: SetWindowTextAndServerName(HWND hwnd, LPTSTR szNewServerName) ! 246: { ! 247: SERVER_INFO_100 *si100 = NULL; ! 248: SHARE_INFO_2 *shi2 = NULL; ! 249: LPTSTR szT = NULL; ! 250: NET_API_STATUS nas; ! 251: DWORD dwDummy; ! 252: ! 253: SetCursor(LoadCursor(NULL, IDC_WAIT)); ! 254: ! 255: nas = NetServerGetInfo(szNewServerName, 100, (LPBYTE *)&si100); ! 256: if(nas || !si100 || !si100[0].sv100_name) ! 257: goto err; ! 258: ! 259: // make room for the \\ that NetServerGetInfo doesn't add ! 260: szT = GlobalAllocPtr(GHND, ! 261: (lstrlen(si100[0].sv100_name) + 3) * sizeof(TCHAR)); ! 262: if(!szT) ! 263: goto err; ! 264: ! 265: szT[0] = szT[1] = '\\'; ! 266: lstrcpy(&szT[2], si100[0].sv100_name); ! 267: ! 268: nas = NetShareEnum(szT, 2, (LPBYTE *)&shi2, ! 269: MAX_PREFERRED_LENGTH, &dwDummy, &dwDummy, NULL); ! 270: if(nas) ! 271: goto err; ! 272: ! 273: GlobalFreeNullPtr(szServerName); ! 274: szServerName = szT; ! 275: ! 276: UpdateWindowText(hwndMain, TRUE); ! 277: PostMessage(hwndMain, WM_TIMER, 0, 0L); ! 278: ! 279: err: ! 280: SetCursor(LoadCursor(NULL, IDC_ARROW)); ! 281: ! 282: if(nas) ! 283: { ! 284: TCHAR *szErrMessage; ! 285: ! 286: if(nas == ERROR_BAD_NETPATH) ! 287: { ! 288: wsprintf(szBuffer, szFromIDS1(IDS_COMPNOTFOUND), szNewServerName); ! 289: MessageBox(hwnd, szBuffer, szAppName, MB_ICONEXCLAMATION); ! 290: } ! 291: else if(szErrMessage = GetSystemErrMessage(nas)) ! 292: { ! 293: MessageBox(hwnd, szErrMessage, szAppName, MB_ICONEXCLAMATION); ! 294: LocalFree((HLOCAL)szErrMessage); ! 295: } ! 296: else ! 297: MessageBox(hwnd, szFromIDS1(IDS_ERRMEMORY), szAppName, MB_ICONEXCLAMATION); ! 298: } ! 299: ! 300: NetApiBufferFree(si100); ! 301: NetApiBufferFree(shi2); ! 302: return nas; ! 303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.