..back /****************************************************************************** Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. remnet.c : Remote networking ******************************************************************************/ #include <windows.h> #include <windowsx.h> #include <tchar.h> #include "string.h" #include "memory.h" #include "commctrl.h" #include "wcommctl.h" //#include "shlobj.h" //#include "wceshell.h" //#include "aygshell.h" #ifdef USE_SIP # include <sipapi.h> #endif #include "resource.h" #include "remnet.h" #ifdef DEBUG DBGPARAM dpCurSettings = { TEXT("RemoteNet"), { TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Unused"), TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Unused"), TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Misc"), TEXT("Alloc"),TEXT("Function"),TEXT("Warning"),TEXT("Error") }, 0x0000C000 //0xFFFF }; #endif // DEBUG ITEMINFO EditItem; HINSTANCE v_hInst; HWND v_hMainWnd; HWND v_hListWnd; HWND v_hCmdBar; HWND v_hDialogWnd; HFONT v_hfont; RECT v_ClientRect; RECT v_ListRect; DWORD v_WizDialog; DWORD v_PrevWizDialog; BOOL v_fInRename; BOOL v_fPortrait; #ifdef USE_SIP LPFNSIP g_pSipGetInfo, g_pSipSetInfo; LPFNSIPSTATUS g_pSipStatus; HINSTANCE g_hSipLib; #endif extern DWORD v_EnteredAsAWizard; DWORD v_DialogPages[DLG_NUMDLGS] = { IDD_RAS_WIZ_1, IDD_RAS_WIZ_2, IDD_RAS_WIZ_3, IDD_RAS_WIZ_4, IDD_RAS_WIZ_5, IDD_RAS_TCPIP_GEN, IDD_RAS_TCPIP_NAME_SERV }; const TCHAR szAppName[] = TEXT("RemoteNet"); TCHAR szTitle[36]; const static TBBUTTON tbButton[] = { {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1}, {STD_DELETE+12,ID_FILE_DELETE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, {STD_PROPERTIES+12,ID_FILE_PROPERTIES,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1}, {VIEW_LARGEICONS, ID_VIEW_LARGEICON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,-1}, {VIEW_SMALLICONS, ID_VIEW_SMALLICON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,-1}, {VIEW_DETAILS, ID_VIEW_DETAILS, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0, 0, -1}, }; static TBBUTTON tbButtonPortrait[] = { {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1}, {0,ID_CONN_CONN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1}, // {0, ID_CONN_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, {STD_PROPERTIES+12,ID_CONN_EDIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, {STD_DELETE+12,ID_CONN_DELETE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1}, }; TCHAR nonStr[10]; TCHAR deleteStr[30]; TCHAR propertiesStr[30]; TCHAR largeIconStr[30]; TCHAR smallIconStr[30]; TCHAR detailsStr[30]; const LPTSTR ToolTipsTbl[] = { nonStr, deleteStr, propertiesStr, largeIconStr, smallIconStr, detailsStr }; const LPTSTR ToolTipsTblPortrait[] = { nonStr, largeIconStr, smallIconStr, propertiesStr, deleteStr, }; // Declare the CommCtrl stuff. DECLARE_COMMCTRL_TABLE; void FAR PASCAL RegisterIPClass(HINSTANCE); void FAR PASCAL UnregisterIPClass(HINSTANCE); void PositionSIP(int nSipState) { #ifdef USE_SIP // Do we have the sip function? if (g_pSipGetInfo && g_pSipSetInfo) { SIPINFO si; // See whether the SIP is up or down memset(&si, 0, sizeof(SIPINFO)); si.cbSize = sizeof(SIPINFO); if ((*g_pSipGetInfo)(&si)) { // Has the SIP state changed? if ((!(si.fdwFlags & SIPF_ON) && SIP_UP == nSipState) || (si.fdwFlags & SIPF_ON && !(SIP_UP == nSipState))) { si.fdwFlags ^= SIPF_ON; (*g_pSipSetInfo)(&si); } } } #endif } BOOL CreateShortcut(TCHAR *pEntryName) { TCHAR szFmtStr[256]; TCHAR szPath[256]; TCHAR szFile[256]; char szAnsiTarget[128]; HANDLE hFile; int nLinks = 1; int Len; LoadString(v_hInst, IDS_DESKTOP_PATH, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); wsprintf(szPath, szFmtStr, pEntryName); hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); while (hFile == INVALID_HANDLE_VALUE) { if (nLinks++ > 20) return FALSE; LoadString(v_hInst, IDS_DESKTOP_PATH2, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); wsprintf(szPath, szFmtStr, pEntryName, nLinks); hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); } LoadString(v_hInst, IDS_SHORTCUT_STRING, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); wsprintf(szFile, szFmtStr, pEntryName); Len = _tcslen(szFile); wsprintf(szPath, TEXT("%d#%s"), Len, szFile); Len = WideCharToMultiByte(CP_ACP, 0, szPath, -1, szAnsiTarget, 128, NULL, NULL); WriteFile(hFile, szAnsiTarget, Len, &Len, NULL); CloseHandle(hFile); return TRUE; } VOID UpdateView (DWORD What) { HMENU hMenu; hMenu = CallCommCtrlFunc(CommandBar_GetMenu)(v_hCmdBar, 0); if (ID_VIEW_LARGEICON == What) CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON, ID_VIEW_DETAILS, ID_VIEW_LARGEICON, MF_BYCOMMAND); if (ID_VIEW_SMALLICON == What) CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON, ID_VIEW_DETAILS, ID_VIEW_SMALLICON, MF_BYCOMMAND); if (ID_VIEW_DETAILS == What) CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND); SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_LARGEICON, MAKELONG((ID_VIEW_LARGEICON == What) ? TRUE : FALSE, 0)); SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_SMALLICON, MAKELONG((ID_VIEW_SMALLICON == What) ? TRUE : FALSE, 0)); SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_DETAILS, MAKELONG((ID_VIEW_DETAILS == What) ? TRUE : FALSE, 0)); } VOID SetMenu() { HMENU hMenu; DWORD cb; LV_ITEM lvi; MENUITEMINFO MenuItemInfo; TCHAR szTemp[128]; cb = ListView_GetSelectedCount (v_hListWnd); lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED); hMenu = CallCommCtrlFunc(CommandBar_GetMenu)(v_hCmdBar, 0); // Set the File->Connect/Create menu to connect MenuItemInfo.cbSize = sizeof(MENUITEMINFO); MenuItemInfo.fMask = MIIM_TYPE; MenuItemInfo.dwTypeData = szTemp; MenuItemInfo.cch = sizeof(szTemp)/sizeof(TCHAR); GetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE, &MenuItemInfo); MenuItemInfo.fMask = MIIM_TYPE; MenuItemInfo.cch = LoadString(v_hInst, IDS_CONNECT, MenuItemInfo.dwTypeData, sizeof(szTemp)/sizeof(TCHAR)); SetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE, &MenuItemInfo); EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE, MF_GRAYED); EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT, MF_GRAYED); EnableMenuItem (hMenu, ID_FILE_DELETE, MF_GRAYED); EnableMenuItem (hMenu, ID_FILE_RENAME, MF_GRAYED); EnableMenuItem (hMenu, ID_FILE_PROPERTIES, MF_GRAYED); EnableMenuItem (hMenu, ID_EDIT_CREATECOPY, MF_GRAYED); // Portrait mode menu EnableMenuItem (hMenu, ID_CONN_CONN, MF_GRAYED); EnableMenuItem (hMenu, ID_CONN_EDIT, MF_GRAYED); EnableMenuItem (hMenu, ID_CONN_DELETE, MF_GRAYED); EnableMenuItem (hMenu, ID_CONN_RENAME, MF_GRAYED); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_EDIT, MAKELONG(FALSE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN, MAKELONG(FALSE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE, MAKELONG(FALSE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE, MAKELONG(FALSE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_PROPERTIES, MAKELONG(FALSE, 0)); if (cb == 1) { if (lvi.iItem == 0) { // Make new connection // Set File->Connect/Create menu to create and enable MenuItemInfo.fMask = MIIM_TYPE; MenuItemInfo.cch = LoadString(v_hInst, IDS_CREATE, MenuItemInfo.dwTypeData, sizeof(szTemp)/sizeof(TCHAR)); SetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE, &MenuItemInfo); EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE, MF_ENABLED); } else { EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_DELETE, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_RENAME, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_PROPERTIES, MF_ENABLED); EnableMenuItem (hMenu, ID_EDIT_CREATECOPY, MF_ENABLED); EnableMenuItem (hMenu, ID_CONN_CONN, MF_ENABLED); EnableMenuItem (hMenu, ID_CONN_EDIT, MF_ENABLED); EnableMenuItem (hMenu, ID_CONN_DELETE, MF_ENABLED); EnableMenuItem (hMenu, ID_CONN_RENAME, MF_ENABLED); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_EDIT, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_PROPERTIES, MAKELONG(TRUE, 0)); } } else { if (cb != 0) { // allow shortcuts for multiple items if (lvi.iItem > 0) { EnableMenuItem (hMenu, ID_EDIT_CREATECOPY, MF_ENABLED); } EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT, MF_ENABLED); EnableMenuItem (hMenu, ID_FILE_DELETE, MF_ENABLED); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE, MAKELONG(TRUE, 0)); SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE, MAKELONG(TRUE, 0)); EnableMenuItem (hMenu, ID_CONN_DELETE, MF_ENABLED); } } } // ---------------------------------------------------------------- // // NotifyHandler () // // Handle Notification events for the ListView // // ---------------------------------------------------------------- LRESULT NotifyHandler (HWND hWnd, NM_LISTVIEW *pnm, LV_DISPINFO *plvdi) { LV_ITEM lvi; PITEMINFO pItemInfo; HWND hwndEdit; DWORD dwTemp; int nFormatId; TCHAR szTemp[128]; TCHAR szFmtStr[128]; DEBUGMSG (ZONE_MISC, (TEXT("Got WM_NOTIFY hdr.code=%d\r\n"), pnm->hdr.code)); switch (pnm->hdr.code) { case LVN_DELETEALLITEMS : DEBUGMSG (ZONE_MISC, (TEXT("Got LVN_DELETEALLITEMS\r\n"))); return FALSE; case LVN_DELETEITEM : if (0 != pnm->iItem) { DEBUGMSG (ZONE_MISC, (TEXT("Got LVN_DELETEITEM %d\r\n"), pnm->iItem)); LocalFree ((HLOCAL)pnm->lParam); } break; case LVN_GETDISPINFO : DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO\r\n"))); if (!(plvdi->item.mask & LVIF_TEXT)) { DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO: Not Text? Mask=0x%X\r\n"), plvdi->item.mask)); break; } SetMenu(); if (0 == plvdi->item.iItem) { if (0 == plvdi->item.iSubItem) { LoadString(v_hInst, IDS_MAKE_NEW, plvdi->item.pszText, plvdi->item.cchTextMax); } break; } pItemInfo = (PITEMINFO)plvdi->item.lParam; switch (plvdi->item.iSubItem) { case 0 : _tcsncpy (plvdi->item.pszText, pItemInfo->EntryName, plvdi->item.cchTextMax); break; case 1 : _tcsncpy (plvdi->item.pszText, pItemInfo->szPhone, plvdi->item.cchTextMax); break; case 2 : _tcsncpy (plvdi->item.pszText, ((PITEMINFO)plvdi->item.lParam)->Entry.szDeviceName, plvdi->item.cchTextMax); break; } DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO: Returning string '%s'\r\n"), plvdi->item.pszText)); break; case LVN_COLUMNCLICK: break; case LVN_BEGINLABELEDIT: DEBUGMSG (ZONE_MISC, (TEXT("BeginEdit\r\n"))); if (plvdi->item.iItem == 0) { DEBUGMSG (ZONE_MISC, (TEXT("Can't edit the 'Make New' icon\r\n"))); return TRUE; // Can't edit the Make New icon } v_fInRename = TRUE; PositionSIP(SIP_UP); ListView_EnsureVisible(v_hListWnd, plvdi->item.iItem, FALSE); if (hwndEdit = ListView_GetEditControl(v_hListWnd)) { SendMessage(hwndEdit, EM_LIMITTEXT, RAS_MaxEntryName, 0); } return FALSE; // Return FALSE to let the user edit case LVN_ENDLABELEDIT: v_fInRename = FALSE; PositionSIP(SIP_DOWN); if (plvdi->item.pszText == NULL) { DEBUGMSG (ZONE_MISC|ZONE_ERROR, (TEXT("ENDLABELEIDT: Text is NULL\r\n"))); break; } // if it's the same as before then it's a no-op. if (!_tcsicmp (plvdi->item.pszText, ((PITEMINFO)plvdi->item.lParam)->EntryName)) { } if (dwTemp = RasValidateEntryName(NULL, plvdi->item.pszText)) { if (dwTemp == ERROR_ALREADY_EXISTS) { nFormatId = IDS_ALREADY_EXISTS; } else if (*(plvdi->item.pszText)) { nFormatId = IDS_BADNAME; } else { nFormatId = IDS_NULLNAME; } LoadString(v_hInst, nFormatId, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); PostMessage (v_hListWnd, LVM_EDITLABEL, (WPARAM)(int)plvdi->item.iItem, 0); break; } RasRenameEntry(NULL, ((PITEMINFO)plvdi->item.lParam)->EntryName, plvdi->item.pszText); dwTemp = plvdi->item.iItem; InitListViewItems(v_hListWnd); ListView_SetItemState (v_hListWnd, 0, 0, LVIS_SELECTED); ListView_SetItemState (v_hListWnd, dwTemp, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); SetFocus (v_hListWnd); break; case NM_RCLICK: PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0); break; case NM_CLICK: if (GetKeyState(VK_MENU) < 0) { PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0); } break; case NM_DBLCLK: if (GetKeyState(VK_MENU) < 0) { PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0); break; } lvi.mask = LVIF_PARAM; lvi.iSubItem = 0; lvi.iItem = pnm->iItem; if (lvi.iItem == 0) { // Allow them to make a new item. PostMessage(v_hMainWnd, WM_COMMAND, ID_CONNECTIONS_MAKENEWCONNECTION, 0); } else if (lvi.iItem != -1) { ListView_SetItemState (v_hListWnd, lvi.iItem, LVIS_SELECTED, LVIS_SELECTED); // They want to connect. SendMessage(v_hMainWnd, WM_COMMAND, ID_FILE_CONNECTCREATE, 0); } break; case LVN_KEYDOWN: switch (((LV_KEYDOWN *) plvdi)->wVKey) { case VK_RETURN : lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED); if (lvi.iItem == 0) { PostMessage(v_hMainWnd, WM_COMMAND, ID_CONNECTIONS_MAKENEWCONNECTION, 0); } else if (lvi.iItem != -1) { ListView_SetItemState (v_hListWnd, lvi.iItem, LVIS_SELECTED, LVIS_SELECTED); // They want to connect. SendMessage(v_hMainWnd, WM_COMMAND, ID_FILE_CONNECTCREATE, 0); } break; case VK_CONTROL : if (GetAsyncKeyState(VK_MENU)) { PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0); } break; } break; default: break; } return 0; } // ---------------------------------------------------------------- // // WndProc // // Main window Proc // // ---------------------------------------------------------------- LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { NM_LISTVIEW *pnm; LV_DISPINFO *plvdi; LV_ITEM lvi; TCHAR szTemp[128]; TCHAR szFmtStr[128]; DWORD dwTemp; DWORD cb; RECT rc; HMENU hMenu, hMenuTrack; POINT pt; int nFormatId; TCHAR TmpEntryName[2*RAS_MaxEntryName]; DWORD dwSize, dwDevSize; PBYTE pDevConfig; BOOL bRefresh; int iCopyNum; DWORD i; switch (message) { case WM_HELP: RETAILMSG (1, (TEXT("PegHelp file:rnetw.htm#Main_Contents\r\n"))); CreateProcess(TEXT("peghelp"),TEXT("file:rnetw.htm#Main_Contents"), NULL,NULL,FALSE,0,NULL,NULL,NULL,NULL); break; case WM_SIZE : GetClientRect (hWnd, &rc); rc.top += CallCommCtrlFunc(CommandBar_Height)(v_hCmdBar); MoveWindow (v_hListWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); break; case WM_NOTIFY : pnm = (NM_LISTVIEW *)lParam; plvdi = (LV_DISPINFO *)lParam; if (pnm->hdr.idFrom != IDD_LISTVIEW) { break; } return NotifyHandler (hWnd, pnm, plvdi); break; case WM_COMMAND : switch (LOWORD(wParam)) { case ID_HELP : SendMessage (v_hMainWnd, WM_HELP, 0, 0); break; case ID_CONN_CONN : case ID_FILE_CONNECTCREATE : // Start RNAApp for each item selected for (lvi.iItem = -1; (-1 != (lvi.iItem = ListView_GetNextItem(v_hListWnd, lvi.iItem, LVNI_SELECTED)));) { // First item is special, Invoke the Make New wizard if (0 == lvi.iItem) { PostMessage(v_hMainWnd, WM_COMMAND, ID_CONNECTIONS_MAKENEWCONNECTION, 0); continue; } lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem(v_hListWnd, &lvi); // Actually start the process wsprintf (szTemp, TEXT("-e\"%s\""), ((PITEMINFO)lvi.lParam)->EntryName); DEBUGMSG (ZONE_MISC, (TEXT("Starting RNAAPP '%s'\r\n"), szTemp)); if (FALSE == CreateProcess (TEXT("rnaapp"), szTemp, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL)) { LoadString (v_hInst, IDS_CREATE_PROC_ERR, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); } } break; case ID_FILE_CREATESHORTCUT : if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } if ((cb = ListView_GetSelectedCount (v_hListWnd)) == 0) break; for (lvi.iItem = -1; (-1 != (lvi.iItem = ListView_GetNextItem(v_hListWnd, lvi.iItem, LVNI_SELECTED)));) { if (0 == lvi.iItem) { LoadString(v_hInst, IDS_NOSHORTCUT, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); continue; } lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem(v_hListWnd, &lvi); if (!CreateShortcut(((PITEMINFO)lvi.lParam)->EntryName)) { LoadString(v_hInst, IDS_SHORTCUTFAILED, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); } } break; case ID_CONN_DELETE : case ID_FILE_DELETE : dwTemp = ListView_GetSelectedCount (v_hListWnd); if (dwTemp == 0) { break; } lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED); if (dwTemp == 1 && (lvi.iItem == 0)) { break; } if (dwTemp == 1) { LoadString(v_hInst, IDS_DELCON1, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); } else { LoadString(v_hInst, IDS_DELCON2, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); } LoadString(v_hInst, IDS_CONFDEL, szTemp, sizeof(szTemp)/sizeof(TCHAR)); if (IDYES != MessageBox (hWnd, szFmtStr, szTemp, MB_DEFBUTTON2 | MB_YESNO | MB_ICONWARNING)) { break; } do { // Can't delete to the MakeNew Item if (0 == lvi.iItem) { continue; } lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem(v_hListWnd, &lvi); RasDeleteEntry (NULL, ((PITEMINFO)lvi.lParam)->EntryName); } while ((lvi.iItem = ListView_GetNextItem(v_hListWnd, lvi.iItem, LVNI_SELECTED)) != -1); // Refresh the list? InitListViewItems(v_hListWnd); SetFocus (v_hListWnd); break; case ID_FILE_RENAME : case ID_CONN_RENAME : DEBUGMSG (ZONE_MISC, (TEXT("ID_????_RENAME\r\n"))); if (1 != ListView_GetSelectedCount (v_hListWnd)) { LoadString(v_hInst, IDS_TOOMANYENT, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_ERROR, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); break; } lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED); if (lvi.iItem == 0) { LoadString(v_hInst, IDS_RENAMENEW, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_ERROR, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); break; } // Does it need focus? SetFocus (v_hListWnd); ListView_EditLabel(v_hListWnd, lvi.iItem); break; case ID_CONN_EDIT : case ID_FILE_PROPERTIES: if (v_hDialogWnd) { SetForegroundWindow(v_hDialogWnd); break; } // Which item is selected? if ((cb = ListView_GetSelectedCount(v_hListWnd)) == 0) { break; } if (1 != cb) { DEBUGMSG (ZONE_MISC, (TEXT("ID_FILE_PROPERTIES %d items selected\r\n"), ListView_GetSelectedCount(v_hListWnd))); LoadString(v_hInst, IDS_TOOMANYENT, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_ERROR, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); break; } // Get the selected item lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED); // Can't get properites for the MakeNew Item if (0 == lvi.iItem) { LoadString(v_hInst, IDS_PLEASE, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_ERROR, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); break; } lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem(v_hListWnd, &lvi); memcpy(&EditItem, (PITEMINFO)lvi.lParam, sizeof(ITEMINFO)); // Direct or Dial-up v_WizDialog = _tcscmp(EditItem.Entry.szDeviceType, RASDT_Direct) ? v_DialogPages[DLG_PG_2] : v_DialogPages[DLG_PG_4]; v_EnteredAsAWizard = FALSE; v_hDialogWnd = CreateDialog (v_hInst, MAKEINTRESOURCE(v_WizDialog), hWnd, ConnWizDlgProc); if (NULL == v_hDialogWnd) { ERRORMSG (1, (TEXT("Unable to CreateDialog\r\n"))); SetFocus (v_hListWnd); } InitListViewItems(v_hListWnd); break; case ID_FILE_EXIT : case ID_CONN_EXIT : DestroyWindow(hWnd); break; case ID_EDIT_CREATECOPY: if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } bRefresh = FALSE; lvi.iItem = -1; for(;;){ lvi.iItem = ListView_GetNextItem(v_hListWnd, lvi.iItem, LVNI_SELECTED); if (lvi.iItem <= 0) break; lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem(v_hListWnd, &lvi); memcpy(&EditItem, (PITEMINFO)lvi.lParam, sizeof(ITEMINFO)); LoadString(v_hInst, IDS_COPYOF, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); wsprintf(TmpEntryName, szFmtStr, EditItem.EntryName); // Truncate it if(RAS_MaxEntryName <= _tcslen(TmpEntryName)){ RETAILMSG (1, (TEXT("Name '%s' was too long, truncating\r\n"), TmpEntryName)); TmpEntryName[RAS_MaxEntryName] = TEXT('\0'); } if (dwTemp = RasValidateEntryName(NULL, TmpEntryName)) { if (dwTemp == ERROR_ALREADY_EXISTS) { RETAILMSG (1, (TEXT("Duplicate name found, trying again\r\n"))); iCopyNum = 2; LoadString(v_hInst, IDS_COPY_NUM_OF, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); for(;;){ if (iCopyNum > 100) { // Terminate loop at some point break; } if(_tcsstr(szFmtStr, TEXT("%d")) < _tcsstr(szFmtStr, TEXT("%s"))){ wsprintf(TmpEntryName, szFmtStr, iCopyNum, EditItem.EntryName); } else { wsprintf(TmpEntryName, szFmtStr, EditItem.EntryName, iCopyNum); } // Truncate it TmpEntryName[RAS_MaxEntryName] = TEXT('\0'); if (dwTemp = RasValidateEntryName(NULL, TmpEntryName)) { if (dwTemp == ERROR_ALREADY_EXISTS) { iCopyNum++; continue; } else { break; } } else { break; } } } } RETAILMSG (1, (TEXT("Final name is '%s'\r\n"), TmpEntryName)); if (dwTemp = RasValidateEntryName(NULL, TmpEntryName)) { if (dwTemp == ERROR_ALREADY_EXISTS) { nFormatId = IDS_ALREADY_EXISTS; } else if (*TmpEntryName) { nFormatId = IDS_BADNAME; } else { nFormatId = IDS_NULLNAME; } LoadString(v_hInst, nFormatId, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING); } else { pDevConfig = NULL; dwSize = sizeof(EditItem.Entry); dwDevSize = 0; dwTemp = RasGetEntryProperties (NULL, EditItem.EntryName, &(EditItem.Entry), &dwSize, NULL, &dwDevSize); if (dwDevSize && (ERROR_BUFFER_TOO_SMALL == dwTemp)) { pDevConfig = (PBYTE)LocalAlloc (LPTR, dwDevSize); if (pDevConfig) { dwTemp = RasGetEntryProperties (NULL, EditItem.EntryName, &(EditItem.Entry), &dwSize, pDevConfig, &dwDevSize); DEBUGMSG (dwTemp, (TEXT("Error %d from RasGetEntryProperties\r\n"))); ASSERT (dwTemp == 0); } } _tcscpy(EditItem.EntryName, TmpEntryName); RasSetEntryProperties (NULL, EditItem.EntryName, &(EditItem.Entry), sizeof(EditItem.Entry), pDevConfig, dwDevSize); if (pDevConfig) { LocalFree (pDevConfig); } bRefresh = TRUE; } } // Refresh the list? if(bRefresh){ InitListViewItems(v_hListWnd); } break; case ID_EDIT_SELECTALL: dwTemp = ListView_GetItemCount (v_hListWnd); // Get the selected item ListView_SetItemState(v_hListWnd, 0, 0, LVIS_SELECTED); for (i=1; i<dwTemp; i++) { ListView_SetItemState(v_hListWnd, i, LVIS_SELECTED, LVIS_SELECTED); } break; case ID_VIEW_LARGEICON : if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } UpdateView (ID_VIEW_LARGEICON); SetWindowLong (v_hListWnd, GWL_STYLE, (GetWindowLong (v_hListWnd, GWL_STYLE) & ~LVS_TYPEMASK) | LVS_ICON); break; case ID_VIEW_SMALLICON : if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } UpdateView (ID_VIEW_SMALLICON); SetWindowLong (v_hListWnd, GWL_STYLE, (GetWindowLong (v_hListWnd, GWL_STYLE) & ~LVS_TYPEMASK) | LVS_SMALLICON); break; case ID_VIEW_DETAILS : if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } UpdateView (ID_VIEW_DETAILS); SetWindowLong (v_hListWnd, GWL_STYLE, (GetWindowLong (v_hListWnd, GWL_STYLE) & ~LVS_TYPEMASK) | LVS_REPORT); break; case ID_VIEW_REFRESH: if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } InitListViewItems(v_hListWnd); break; case ID_HELP_ABOUT : if (v_fPortrait) { RETAILMSG (1, (TEXT("Command %d for landscape mode only\r\n"), LOWORD(wParam))); break; } LoadString(v_hInst, IDS_COPYRIGHT, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_HELPABOUT, szTemp, sizeof(szTemp)/sizeof(TCHAR)); MessageBox (hWnd, szFmtStr, szTemp, MB_OK); break; case ID_CONN_NEW : case ID_CONNECTIONS_MAKENEWCONNECTION : if (v_hDialogWnd) { SetForegroundWindow(v_hDialogWnd); break; } // Initialize the EntryInfo memset ((char *)&EditItem, 0, sizeof(EditItem)); // Loop over calls to RasValidateEntryName until // we get a unique name. cb = 1; do { LoadString(v_hInst, IDS_MYCONN1, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR)); LoadString(v_hInst, IDS_MYCONN2, szTemp, sizeof(szTemp)/sizeof(TCHAR)); if (1 == cb) { _tcscpy (EditItem.EntryName, szFmtStr); } else { wsprintf (EditItem.EntryName, szTemp, cb); } cb++; } while (RasValidateEntryName(NULL, EditItem.EntryName)); EditItem.Entry.dwSize = sizeof(RASENTRY); // Get a defailt RasEntry cb = sizeof(RASENTRY); RasGetEntryProperties (NULL, TEXT(""), &(EditItem.Entry), &cb, NULL, NULL); v_PrevWizDialog = 0; v_WizDialog = v_DialogPages[DLG_PG_1]; v_EnteredAsAWizard = TRUE; v_hDialogWnd = CreateDialog (v_hInst, MAKEINTRESOURCE(v_WizDialog), hWnd, ConnWizDlgProc); // The dialog is entered, bring up the SIP, if we can if (v_hDialogWnd) { // Bring the SIP up PositionSIP(SIP_UP); } break; case ID_SHORTCUT : // Get first item selected. lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED | LVIS_FOCUSED); // Get number selected cb = ListView_GetSelectedCount (v_hListWnd); if (lvi.iItem == -1) { // BackGround menu break; } else { // Get location of item ListView_GetItemRect (v_hListWnd, lvi.iItem, &rc, LVIR_BOUNDS); hMenu = LoadMenu (v_hInst, MAKEINTRESOURCE(IDR_CONTEXT_MENU)); // Is it the Make New icon? if (lvi.iItem == 0) { hMenuTrack = GetSubMenu(hMenu, 0); } else { hMenuTrack = GetSubMenu(hMenu, 1); EnableMenuItem (hMenuTrack, ID_FILE_CONNECTCREATE, (cb >= 1) ? MF_ENABLED : MF_GRAYED); EnableMenuItem (hMenuTrack, ID_FILE_RENAME, (cb == 1) ? MF_ENABLED : MF_GRAYED); EnableMenuItem (hMenuTrack, ID_FILE_PROPERTIES, (cb == 1) ? MF_ENABLED : MF_GRAYED); } } dwTemp = GetMessagePos(); pt.x = LOWORD(dwTemp); pt.y = HIWORD(dwTemp); TrackPopupMenu(hMenuTrack, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); break; default : DEBUGMSG (ZONE_MISC, (TEXT("Got WM_COMMAND=%d\r\n"), LOWORD(wParam))); return (DefWindowProc(hWnd, message, wParam, lParam)); } break; case WM_WININICHANGE: #ifdef USE_SIP if (g_pSipGetInfo && (wParam == SPI_SETSIPINFO)) { // SIP most likely either was raised or lowered SIPINFO si; memset(&si, 0, sizeof(SIPINFO)); si.cbSize = sizeof(si); if ((*g_pSipGetInfo)(&si) ) { // Resize the main window and the listview SetWindowPos(hWnd, NULL, si.rcVisibleDesktop.left, si.rcVisibleDesktop.top, si.rcVisibleDesktop.right - si.rcVisibleDesktop.left, si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top, SWP_NOACTIVATE | SWP_NOZORDER); // And the listview--must convert to client coordinates here si.rcVisibleDesktop.top += CallCommCtrlFunc(CommandBar_Height)(v_hCmdBar); MapWindowRect(NULL, GetParent(v_hListWnd), &si.rcVisibleDesktop); SetWindowPos(v_hListWnd, NULL, si.rcVisibleDesktop.left, si.rcVisibleDesktop.top, si.rcVisibleDesktop.right - si.rcVisibleDesktop.left, si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top, SWP_NOACTIVATE | SWP_NOZORDER); } } #endif break; case WM_DESTROY: // Clean up the image list ImageList_Destroy (ListView_GetImageList(v_hListWnd, LVSIL_NORMAL)); ImageList_Destroy (ListView_GetImageList(v_hListWnd, LVSIL_SMALL)); PostQuitMessage(0); break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { SetFocus (v_hListWnd); } break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0); } BOOL InitApplication(HINSTANCE hInstance) { WNDCLASS wc; // Register IP class window RegisterIPClass(hInstance); wc.style = 0; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = 0; wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szAppName; return(RegisterClass(&wc)); } // InitListViewImageList - creates image lists for a list view. // Returns TRUE if successful or FALSE otherwise. // hwndLV - handle of the list view control BOOL WINAPI InitListViewImageLists(HWND hwndLV) { HICON hiconItem; // icon for list view items HIMAGELIST himlLarge; // image list for icon view HIMAGELIST himlSmall; // image list for other views // Create the full-sized and small icon image lists. himlLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), TRUE, 1, 1); himlSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), TRUE, 1, 1); // Add an icon to each image list. hiconItem = LoadIcon(v_hInst, MAKEINTRESOURCE(IDI_NEWCONN)); ImageList_AddIcon(himlLarge, hiconItem); hiconItem = (HICON)LoadImage(v_hInst, MAKEINTRESOURCE(IDI_NEWCONN), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ImageList_AddIcon(himlSmall, hiconItem); DeleteObject(hiconItem); hiconItem = LoadIcon(v_hInst, MAKEINTRESOURCE((v_fPortrait ? IDI_RNA2 : IDI_RNA))); ImageList_AddIcon(himlLarge, hiconItem); hiconItem = (HICON)LoadImage(v_hInst, MAKEINTRESOURCE((v_fPortrait ? IDI_RNA2 : IDI_RNA)), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ImageList_AddIcon(himlSmall, hiconItem); DeleteObject(hiconItem); hiconItem = LoadIcon(v_hInst, MAKEINTRESOURCE(IDI_DIRECTCC)); ImageList_AddIcon(himlLarge, hiconItem); hiconItem = (HICON)LoadImage(v_hInst, MAKEINTRESOURCE(IDI_DIRECTCC), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ImageList_AddIcon(himlSmall, hiconItem); DeleteObject(hiconItem); // Assign the image lists to the list view control. ListView_SetImageList(hwndLV, himlLarge, LVSIL_NORMAL); ListView_SetImageList(hwndLV, himlSmall, LVSIL_SMALL); return TRUE; } // InitListViewColumns - adds columns to a list view control. // Returns TRUE if successful or FALSE otherwise. // hwndLV - handle of the list view control BOOL WINAPI InitListViewColumns(HWND hwndLV) { TCHAR szTemp[256]; // temporary buffer LV_COLUMN lvc; int iCol; // Initialize the LV_COLUMN structure. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = szTemp; // Add the columns. for (iCol = 0; iCol < NUM_LV_COLUMNS; iCol++) { lvc.iSubItem = iCol; switch (iCol) { case 0 : lvc.cx = 150; break; case 2 : lvc.cx = 225; break; default: lvc.cx = 100; } LoadString(v_hInst, IDS_ENTRYCOL + iCol, szTemp, sizeof(szTemp)); if (ListView_InsertColumn(hwndLV, iCol, &lvc) == -1) return FALSE; } return TRUE; } // InitListViewItems - adds items and subitems to a list view. // Returns TRUE if successful or FALSE otherwise. // hwndLV - handle of the list view control // pfData - text file containing list view items with columns // separated by semicolons BOOL WINAPI InitListViewItems(HWND hwndLV) { int iItem; // Item we're working on LV_ITEM lvi; // Current Item structure DWORD cb; // Number of bytes in RasEntryName list. LPRASENTRYNAME lpRasEntries; // Pointer to the RasEntries. DWORD cEntries; // Number of Entries found DWORD Index; PITEMINFO pItemInfo; ListView_DeleteAllItems (hwndLV); // Initialize LV_ITEM members that are common to all items. lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = LVIS_SELECTED | LVIS_FOCUSED; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; // app. maintains text lvi.iImage = 0; // image list index lvi.iItem = 0; lvi.iSubItem = 0; lvi.lParam = (LPARAM) 0; // item data // Add the item. ListView_InsertItem(hwndLV, &lvi); lvi.state = 0; // The rest of the items are not selected. // Now get the current RasEntryNames RasEnumEntries (NULL, NULL, NULL, &cb, NULL); if (cb) { // Now we have to do something with the list. lpRasEntries = (LPRASENTRYNAME)LocalAlloc (LPTR, cb); if (!RasEnumEntries (NULL, NULL, lpRasEntries, &cb, &cEntries)) { // Walk the list iItem = 1; for ( Index = 0; Index < cEntries; Index++) { if (lpRasEntries[Index].szEntryName[0] == TEXT('`')) { DEBUGMSG (1, (TEXT("Skipping entry \"%s\"\r\n"), lpRasEntries[Index].szEntryName)); continue; } pItemInfo = (PITEMINFO)LocalAlloc (LPTR, sizeof(ITEMINFO)); memset ((char *)pItemInfo, 0, sizeof(ITEMINFO)); _tcscpy (pItemInfo->EntryName, lpRasEntries[Index].szEntryName); // Get the Entry properties. cb = sizeof(pItemInfo->Entry); pItemInfo->Entry.dwSize = sizeof(RASENTRY); if (RasGetEntryProperties (NULL, pItemInfo->EntryName, &(pItemInfo->Entry), &cb, NULL, NULL)) { LocalFree (pItemInfo); continue; } // This should use lineTranslateAddress to get a pretty version // But should handle VPN and Direct entries nicely. _tcsncpy (pItemInfo->szPhone, pItemInfo->Entry.szLocalPhoneNumber, sizeof(pItemInfo->szPhone)/sizeof(TCHAR)); // Initialize item-specific LV_ITEM members. lvi.iItem = iItem++; lvi.iSubItem = 0; lvi.lParam = (LPARAM) pItemInfo; // save item data lvi.iImage = _tcscmp (pItemInfo->Entry.szDeviceType, RASDT_Direct) ? 1 : 2; // Add the item. ListView_InsertItem(hwndLV, &lvi); lvi.state = 0; // The rest of the items are not selected. } } // Free the RasEntry info LocalFree ((HLOCAL)lpRasEntries); } return TRUE; } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { RECT rc; HICON hIcon; HMENU hMenu = NULL; int rv, nWidth, nHeight, x, y; v_hInst = hInstance; // OK, create the window, taking the position of the SIP into account nWidth = CW_USEDEFAULT; nHeight = CW_USEDEFAULT; x = y = CW_USEDEFAULT; #ifdef USE_SIP if (g_pSipGetInfo) { SIPINFO si; memset(&si, 0, sizeof(SIPINFO)); si.cbSize = sizeof(si); if((*g_pSipGetInfo)(&si) ) { nWidth = si.rcVisibleDesktop.right - si.rcVisibleDesktop.left; nHeight = si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top; x = si.rcVisibleDesktop.left; y = si.rcVisibleDesktop.top; } } #endif v_hMainWnd = CreateWindowEx(0, szAppName, szTitle, WS_CLIPCHILDREN, x, y, nWidth, nHeight, NULL, hMenu, hInstance, NULL); if ( v_hMainWnd == 0 ) { return (FALSE); } // Set remnets icon for the task bar hIcon = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_REMOTENW), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); SendMessage(v_hMainWnd, WM_SETICON, FALSE, (WPARAM)hIcon); DEBUGMSG (ZONE_MISC, (TEXT("After CreateWindowEx\r\n"))); GetClientRect (v_hMainWnd, &rc); v_hCmdBar = CallCommCtrlFunc(CommandBar_Create) (hInstance, v_hMainWnd, 1); if (v_fPortrait) { CallCommCtrlFunc(CommandBar_InsertMenubar)(v_hCmdBar, hInstance, IDR_PORTRAIT_MENU, 0); } else { CallCommCtrlFunc(CommandBar_InsertMenubar)(v_hCmdBar, hInstance, IDR_MAIN_MENU, 0); } // NOTE: Add the command buttons CallCommCtrlFunc(CommandBar_AddBitmap)(v_hCmdBar, HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR, 12, 16, 16); CallCommCtrlFunc(CommandBar_AddBitmap)(v_hCmdBar, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, 15, 16, 16); if (!v_fPortrait) { CommandBar_AddButtons(v_hCmdBar, sizeof(tbButton)/sizeof(TBBUTTON), tbButton); LoadString(v_hInst, IDS_TLTP_NON, nonStr, sizeof(nonStr)); LoadString(v_hInst, IDS_TLTP_DELETE, deleteStr, sizeof(deleteStr)); LoadString(v_hInst, IDS_TLTP_PRPTY, propertiesStr, sizeof(propertiesStr)); LoadString(v_hInst, IDS_TLTP_LARGE, largeIconStr, sizeof(largeIconStr)); LoadString(v_hInst, IDS_TLTP_SMOLL, smallIconStr, sizeof(smallIconStr)); LoadString(v_hInst, IDS_TLTP_DETAILS, detailsStr, sizeof(detailsStr)); CommandBar_AddToolTips(v_hCmdBar, 6, (LPARAM)ToolTipsTbl); CallCommCtrlFunc(CommandBar_AddAdornments)(v_hCmdBar, STD_HELP, ID_FILE_EXIT); SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_LARGEICON, MAKELONG(TRUE, 0)); // Set the default view checkbox hMenu = CallCommCtrlFunc(CommandBar_GetMenu)(v_hCmdBar, 0); CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON, ID_VIEW_DETAILS, ID_VIEW_LARGEICON, MF_BYCOMMAND); } else { rv = CallCommCtrlFunc(CommandBar_AddBitmap)(v_hCmdBar, v_hInst, IDB_TOOLBAR, 2, 16, 16); tbButtonPortrait[1].iBitmap = rv+1; // tbButtonPortrait[3].iBitmap = rv; CommandBar_AddButtons(v_hCmdBar, sizeof(tbButtonPortrait)/sizeof(TBBUTTON), tbButtonPortrait); LoadString(v_hInst, IDS_TLTP_NON, nonStr, sizeof(nonStr)); LoadString(v_hInst, IDS_TLTP_CONNECT, largeIconStr, sizeof(largeIconStr)); LoadString(v_hInst, IDS_TLTP_EDIT, smallIconStr, sizeof(smallIconStr)); LoadString(v_hInst, IDS_TLTP_DELETEP, propertiesStr, sizeof(propertiesStr)); CommandBar_AddToolTips(v_hCmdBar, 4, (LPARAM)ToolTipsTblPortrait); CallCommCtrlFunc(CommandBar_AddAdornments)(v_hCmdBar, STD_HELP, ID_CONN_EXIT); } rc.top += CallCommCtrlFunc(CommandBar_Height)(v_hCmdBar); v_hListWnd = CreateWindow (WC_LISTVIEW, TEXT(""), WS_VISIBLE|WS_CHILD|WS_VSCROLL| LVS_SHOWSELALWAYS|LVS_AUTOARRANGE| 0x0040|LVS_EDITLABELS| LVS_ICON, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, v_hMainWnd, (HMENU)IDD_LISTVIEW, v_hInst, NULL); if ( v_hListWnd == 0 ) { return (FALSE); } if (!InitListViewImageLists(v_hListWnd) || !InitListViewColumns(v_hListWnd) || !InitListViewItems(v_hListWnd)) { DestroyWindow(v_hListWnd); return FALSE; } ShowWindow(v_hMainWnd, SW_SHOW); UpdateWindow(v_hMainWnd); // Focus in on the list view. SetFocus (v_hListWnd); return TRUE; } void LoadSIP(void) { #ifdef USE_SIP if( (g_hSipLib = LoadLibrary( TEXT("coredll.dll") )) && (g_pSipStatus = (LPFNSIPSTATUS)GetProcAddress( g_hSipLib, TEXT("SipStatus"))) && (g_pSipGetInfo = (LPFNSIP)GetProcAddress( g_hSipLib, TEXT("SipGetInfo"))) && (g_pSipSetInfo = (LPFNSIP)GetProcAddress( g_hSipLib, TEXT("SipSetInfo"))) && (SIP_STATUS_AVAILABLE == g_pSipStatus()) ) { DEBUGMSG(1, (L"REMNET: Using SIP!\r\n")); } else { g_pSipStatus = NULL; g_pSipGetInfo = NULL; g_pSipSetInfo = NULL; if(g_hSipLib) FreeLibrary(g_hSipLib); } #endif } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPWSTR pszCmdLine, int nCmdShow) { MSG msg; HWND hPrevWind; HANDLE hAccelTable; DEBUGREGISTER(0); if (GetSystemMetrics(SM_CXSCREEN) < 480) { v_fPortrait = TRUE; } // Check if SIP is present LoadSIP(); #ifdef DEBUG // Scan command line { while (*pszCmdLine) { // Skip leading blanks while (' ' == *pszCmdLine) { pszCmdLine++; } if ('\0' == *pszCmdLine) { break; } if ((TEXT('-') == *pszCmdLine) || (TEXT('/') == *pszCmdLine)) { pszCmdLine++; while ((TEXT(' ') != *pszCmdLine) && (TEXT('\0') != *pszCmdLine)) { switch (*pszCmdLine) { case 'p' : case 'P' : v_fPortrait = TRUE; break; case 'l' : case 'L' : v_fPortrait = FALSE; break; case 'd' : case 'D' : // Get debug flag dpCurSettings.ulZoneMask = 0; pszCmdLine++; while ((TEXT('0') <= *pszCmdLine) && (TEXT('9') >= *pszCmdLine)) { dpCurSettings.ulZoneMask *= 10; dpCurSettings.ulZoneMask += *pszCmdLine - TEXT('0'); pszCmdLine++; } pszCmdLine--; DEBUGMSG (1, (TEXT("New ulZoneMask=%d\r\n"), dpCurSettings.ulZoneMask)); break; default : DEBUGMSG (1, (TEXT("Unknown switch '%s'\r\n"), pszCmdLine)); break; } pszCmdLine++; } } else { DEBUGMSG (1, (TEXT("Bad commandline parm '%s'\r\n"), pszCmdLine)); break; } } } #endif LoadString(hInstance, (v_fPortrait) ? IDS_CONNECTIONS : IDS_TITLE, szTitle, sizeof(szTitle) / sizeof(TCHAR)); if (hPrevWind = FindWindow (szAppName, szTitle)) { SetForegroundWindow((HWND) ((ULONG) hPrevWind | 0x00000001)); return FALSE; } if (!InitCommCtrlTable()) { DEBUGMSG (ZONE_ERROR, (TEXT("Unable to load commctrl.dll\r\n"))); return FALSE; } CallCommCtrlFunc(InitCommonControls)(); { INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(INITCOMMONCONTROLSEX); icce.dwICC = ICC_TOOLTIP_CLASSES|ICC_CAPEDIT_CLASS; CallCommCtrlFunc(InitCommonControlsEx)(&icce); } if ( hInstPrev != 0 ) { return FALSE; } DEBUGMSG (ZONE_MISC, (TEXT("About to InitApplication\r\n"))); if ( InitApplication(hInstance) == FALSE ) { return(FALSE); } DEBUGMSG (ZONE_MISC, (TEXT("About to InitInstance\r\n"))); if ( InitInstance(hInstance, nCmdShow) == FALSE ) { // Unregister IP class window UnregisterIPClass(hInstance); return(FALSE); } if (v_fPortrait) { // Update dialogs ID table with small version. v_DialogPages[DLG_PG_1] = IDD_RAS_WIZ_1P; v_DialogPages[DLG_PG_2] = IDD_RAS_WIZ_2P; v_DialogPages[DLG_PG_3] = IDD_RAS_WIZ_3P; v_DialogPages[DLG_PG_4] = IDD_RAS_WIZ_4P; v_DialogPages[DLG_PG_5] = IDD_RAS_WIZ_5P; v_DialogPages[DLG_TCP_GEN] = IDD_RAS_TCPIP_GENP; v_DialogPages[DLG_TCP_NS] = IDD_RAS_TCPIP_NAME_SERVP; } hAccelTable = LoadAccelerators (hInstance,TEXT("REMNET_ACCEL")); SetMenu(); DEBUGMSG (ZONE_MISC, (TEXT("About to enter GetMessage Loop\r\n"))); while ( GetMessage(&msg, NULL, 0, 0) != FALSE ) { if (v_hDialogWnd && IsDialogMessage (v_hDialogWnd, &msg)) { continue; } if (v_fInRename || !TranslateAccelerator (v_hMainWnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } // Unregister IP class window UnregisterIPClass(hInstance); DEBUGMSG (ZONE_MISC, (TEXT("Exiting WinMain\r\n"))); return(msg.wParam); }


Legal Declaration: it is for studying wince(MicroSoft Windows CE) only! : http://www.vxworks6.com