Annotation of mstools/samples/sdktools/netwatch/utils.c, revision 1.1.1.2

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.