|
|
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.