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

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

unix.superglobalmegacorp.com

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