|
|
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:
1.1.1.2 ! root 151: if(dwError == ERROR_INVALID_LEVEL)
! 152: {
! 153: // This err usually occurs when we try to view a WFW machine.
! 154: // So, the PM decided to use our own version of the err msg.
! 155: szErrMessage = AllocAndLoadString(IDS_ERRWFW);
! 156: }
! 157: else if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
1.1 root 158: NULL, dwError, 0/*LANG_USER_DEFAULT*/, (LPTSTR)&szErrMessage, 0, NULL))
159: {
160: szErrMessage[lstrlen(szErrMessage) - 2] = '\0'; // remove /r/n
161: }
162: else if(hLibrary = LoadLibrary(MESSAGE_FILENAME))
163: {
164: if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE,
165: (LPVOID)hLibrary, dwError, 0, (LPTSTR)&szErrMessage, 0, NULL))
166: {
167: szErrMessage[lstrlen(szErrMessage) - 2] = '\0'; // remove /r/n
168: }
169: FreeLibrary(hLibrary);
170: }
171:
172: return szErrMessage;
173: }
174:
175: // TRUE: turn on timer
176: // FALSE: turn it off
177: void
178: PunchTimer(BOOL fNewState)
179: {
180: static BOOL fCurrentState = FALSE;
181:
182: if(fCurrentState == fNewState)
183: return;
184:
185: if(fNewState)
186: SetTimer(hwndMain, TIMERID, dwTimerInterval, NULL);
187: else
188: KillTimer(hwndMain, TIMERID);
189:
190: fCurrentState = fNewState;
191: }
192:
193: void
194: UpdateWindowText(HWND hwnd, BOOL fForceUpdate)
195: {
196: static DWORD dwNumUsersCache;
197:
198: if(fForceUpdate || dwNumUsersCache != dwNumUsers)
199: {
200: if(!szServerName)
201: lstrcpy(szBuffer, szAppName);
202: else if(dwNumUsers == 1)
203: wsprintf(szBuffer, szFromIDS1(IDS_WINDOWTEXT1),
204: szAppName, dwNumUsers, szServerName);
205: else
206: wsprintf(szBuffer, szFromIDS1(IDS_WINDOWTEXT),
207: szAppName, dwNumUsers, szServerName);
208:
209: if(IsIconic(hwnd))
210: InvalidateRect(hwnd, NULL, TRUE);
211:
212: SetWindowText(hwnd, szBuffer);
213:
214: dwNumUsersCache = dwNumUsers;
215: }
216: }
217:
218: void
219: ShowTitle(HWND hwnd, int nCmdShow)
220: {
221: static HMENU hMenu = NULL;
222: DWORD dwStyle;
223:
224: dwStyle = GetWindowLong(hwnd, GWL_STYLE);
225: if(hMenu)
226: {
227: dwStyle = WS_TILEDWINDOW | dwStyle;
228: SetMenu(hwnd, hMenu);
229: hMenu = NULL;
230: }
231: else
232: {
233: dwStyle &= ~(WS_DLGFRAME | WS_SYSMENU |
234: WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
235:
236: hMenu = GetMenu(hwnd);
237: SetMenu(hwnd, NULL);
238: }
239:
240: SetWindowLong(hwnd, GWL_STYLE, dwStyle);
241: SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
242: SWP_NOZORDER | SWP_FRAMECHANGED);
243:
244: ShowWindow(hwnd, nCmdShow);
245: }
246:
247: // takes whatever is in szServerName and puts it
248: // in the caption - returns nas if it can't find szNewServerName
249: // assumes szNewServerName has \\ in front of it
250: NET_API_STATUS
251: SetWindowTextAndServerName(HWND hwnd, LPTSTR szNewServerName)
252: {
253: SERVER_INFO_100 *si100 = NULL;
254: SHARE_INFO_2 *shi2 = NULL;
255: LPTSTR szT = NULL;
256: NET_API_STATUS nas;
257: DWORD dwDummy;
258:
259: SetCursor(LoadCursor(NULL, IDC_WAIT));
260:
261: nas = NetServerGetInfo(szNewServerName, 100, (LPBYTE *)&si100);
262: if(nas || !si100 || !si100[0].sv100_name)
263: goto err;
264:
265: // make room for the \\ that NetServerGetInfo doesn't add
266: szT = GlobalAllocPtr(GHND,
267: (lstrlen(si100[0].sv100_name) + 3) * sizeof(TCHAR));
268: if(!szT)
269: goto err;
270:
271: szT[0] = szT[1] = '\\';
272: lstrcpy(&szT[2], si100[0].sv100_name);
273:
274: nas = NetShareEnum(szT, 2, (LPBYTE *)&shi2,
275: MAX_PREFERRED_LENGTH, &dwDummy, &dwDummy, NULL);
276: if(nas)
277: goto err;
278:
279: GlobalFreeNullPtr(szServerName);
280: szServerName = szT;
281:
282: UpdateWindowText(hwndMain, TRUE);
283: PostMessage(hwndMain, WM_TIMER, 0, 0L);
284:
285: err:
286: SetCursor(LoadCursor(NULL, IDC_ARROW));
287:
288: if(nas)
289: {
290: TCHAR *szErrMessage;
291:
292: if(nas == ERROR_BAD_NETPATH)
293: {
294: wsprintf(szBuffer, szFromIDS1(IDS_COMPNOTFOUND), szNewServerName);
295: MessageBox(hwnd, szBuffer, szAppName, MB_ICONEXCLAMATION);
296: }
297: else if(szErrMessage = GetSystemErrMessage(nas))
298: {
299: MessageBox(hwnd, szErrMessage, szAppName, MB_ICONEXCLAMATION);
300: LocalFree((HLOCAL)szErrMessage);
301: }
302: else
303: MessageBox(hwnd, szFromIDS1(IDS_ERRMEMORY), szAppName, MB_ICONEXCLAMATION);
304: }
305:
306: NetApiBufferFree(si100);
307: NetApiBufferFree(shi2);
308: return nas;
309: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.