void ServiceMessageLoop() { Message msg; int result; printf("[Speaker]Service started.\n"); for( ;; ){ //Remember to reset msg every time. memset( &msg, 0, sizeof(msg) ); result = WaitMessage( &msg ); if( result < 0 ){ printf("[Speaker] Failed in WaitMessage: result = %d\n", result ); continue; } msg.Code = 0; //set it to success switch( msg.Command ){ case 1: test(); break; case 2: play( msg.Arguments[0], msg.Arguments[1] ); break; case 3: beep(); break; default: printf("[Speaker]Unknown command: %x\n", msg.Command ); } ReplyMessage( &msg ); } }
void parse( Message& msg ) { int ret; switch( msg.Command ){ default: printf("[time]Unknown command: %x\n", msg.Command ); msg.Code = -ERR_WRONGARG; } ReplyMessage( &msg ); }
LONG APIENTRY WndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) { PCOPYDATASTRUCT CopyData; char *szSkypeMsg=NULL; switch (message) { case WM_COPYDATA: // LOG("WM_COPYDATA", "start"); if(hSkypeWnd==(HWND)wParam) { CopyData=(PCOPYDATASTRUCT)lParam; szSkypeMsg=strdup(CopyData->lpData); ReplyMessage(1); if (!strcmp(szSkypeMsg, "PONG")) { WatchDog=1; break; } // Hide PING-PONG LOG(("< %s", szSkypeMsg)); if (!strcmp(szSkypeMsg, "USERSTATUS LOGGEDOUT")) { OUTPUT("Skype shut down gracefully. I'll leave too, bye.. :)"); bail_out(1); } #ifdef USE_AUTHENTICATION if (password && !Authenticated) break; #endif if (AcceptSocket!=INVALID_SOCKET) { unsigned int length=strlen(szSkypeMsg); if (send(AcceptSocket, (char *)&length, sizeof(length), 0)==SOCKET_ERROR || send(AcceptSocket, szSkypeMsg, length, 0)==SOCKET_ERROR) OUTPUT("Cannot send to client :("); } } break; case WM_DESTROY: PostQuitMessage(0); break; default: if(message==ControlAPIAttach) { // Skype responds with Attach to the discover-message AttachStatus=lParam; if (AttachStatus==SKYPECONTROLAPI_ATTACH_SUCCESS) hSkypeWnd=(HWND)wParam; // Skype gave us the communication window handle if (AttachStatus!=SKYPECONTROLAPI_ATTACH_API_AVAILABLE) SetEvent(SkypeReady); break; } return (DefWindowProc(hWnd, message, wParam, lParam)); } // LOG("WM_COPYDATA", "exit"); if (szSkypeMsg) free(szSkypeMsg); return 1; }
// 设备注册服务 static void dev_service() { Message msg; int ret; ret = SmNotifyService( DeviceManagerId, 0, "DeviceManager" ); if( ret < 0 ){ printf("[vfs]notify service failed. ret=%d\n", ret ); SysExitSpace((uint)-1); } printf("[vfs]dev_service started.\n"); for(;;){ memset( &msg, 0, sizeof(msg) ); ret = WaitMessage(&msg); if( ret<0 ){ printf("[vfs]receive error in dev_service()\n"); continue; } msg.Code = 0; switch( msg.Command ){ case Device_Register: { printf("[vfs]Register %s\n", (char*)&msg.Arguments[3] ); ReplyMessage( &msg ); device_t *d = device_register( msg.Arguments[0], //Device Type msg.Arguments[1], //ServiceThreadId msg.Arguments[2], //Device No. (char*)&msg.Arguments[3] //Device Name ); break; } case Device_Unregister: //Not implemented. msg.Code = -ERR_NOIMP; ReplyMessage( &msg ); break; } } SmRemoveService( DeviceManagerId ); SysExitThread(0); }
/* * EnterSoftMode: * * go into soft mode. We subclass all the task windows, and reply * to any outstanding messages. * * NOTE: we currently do subclassing but we still do the message loop thing. * the subclassing is just to prevent the application's window proc * from being called re-entrantly when the softmode loop calls GetMessage */ void EnterSoftMode( void ) { MSG msg; if( InSoftMode ) { return; } InSoftMode = TRUE; Out((OUT_SOFT,"Entering Soft Mode, task at fault=%04x", TaskAtFault )); while( QuerySendMessage( NULL, NULL, NULL, &msg ) ) { Out((OUT_SOFT,"--- Replying to a message")); ReplyMessage( 1 ); } } /* EnterSoftMode */
void TWIN_ReceiveMessage(BOOL yield) { LRESULT lResult; MSG *lpMsg; if (!lpSendMessageStack) return; if (lpSendMessageStack->hReceivingTask == GetCurrentTask() && !lpSendMessageStack->bSendCompleted && !lpSendMessageStack->bSendReceived) { ITSMINFO *saved_ptr = lpSendMessageStack; int saved_msg = lpSendMessageStack->msg.message; /* We are being sent a message. */ lpSendMessageStack->bSendReceived = TRUE; lpMsg = &lpSendMessageStack->msg; lResult = SendMessage(lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam); if (saved_ptr == lpSendMessageStack && saved_msg == lpSendMessageStack->msg.message) { ReplyMessage(lResult); } else if (yield) { Yield(); } } else if (yield) { Yield(); } }
//================================================================================================ //-----------------------------------------------------+++--> T-Clock Menu Command Message Handler: LRESULT OnTClockCommand(HWND hwnd, WPARAM wParam) //----------------------------------+++--> { WORD wID = LOWORD(wParam); switch(wID) { case IDM_REFRESHTCLOCK: RefreshUs(); break; case IDM_SHOWPROP: MyPropertySheet(-1); break; case IDM_PROP_ALARM: MyPropertySheet(1); break; case IDM_EXIT: SendMessage(hwnd,WM_CLOSE,0,0); break; case IDM_SHOWCALENDER: ToggleCalendar(1); // 1=own calendar break; case IDM_DISPLAYPROP: if(api.OS >= TOS_VISTA) api.Exec(L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\1\\::{C555438B-3C23-4769-A71F-B6D3D9B6053A}", NULL, NULL); else api.Exec(L"control", L"desk.cpl, display,1", NULL); break; case IDM_VOLUMECONTROL: //-------------------------------+++--> Volume Controls #ifndef _WIN64 # define OPEN_VOLUME L"SndVol32" #else # define OPEN_VOLUME L"SndVol" #endif // _WIN64 api.Exec(OPEN_VOLUME, NULL, NULL); break; case IDM_AUDIOPROP: //----------------------------------+++--> Audio settings / devices api.Exec(L"control", L"mmsys.cpl", NULL); break; case IDM_RECYCLEBIN: api.Exec(L"::{645FF040-5081-101B-9F08-00AA002F954E}", NULL, NULL); break; case IDM_RECYCLEBIN_PURGE:{ SHQUERYRBINFO info = {sizeof(info)}; // Windows seriously asks : SHQueryRecycleBin(NULL, &info); // "are you sure to delete all items" if(info.i64NumItems > 0 || api.OS == TOS_2000) // when the recycle bin is actually empty... SHEmptyRecycleBin(g_hwndTClockMain, NULL, 0); break;} case IDM_MAPDRIVE: //----------------------------------+++--> Map Network Drive WNetConnectionDialog(hwnd, RESOURCETYPE_DISK); break; case IDM_DISCONNECT: //-------------------------+++--> Disconnect Network Drive WNetDisconnectDialog(hwnd, RESOURCETYPE_DISK); break; case IDM_TOGGLE_DT: //---------------------------+++--> Show / Hide the Desktop ToggleDesk(); break; case IDM_QUICKY_WINEXP: { //-----------------//--+++--> Windows Explorer Opened api.Exec(L"Explorer", L"/e, ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", hwnd); break;} case IDM_QUICKY_DOS: { // Command Prompt api.Exec(L"cmd", L"/f:on /t:0a", hwnd); break;} case IDM_QUICKY_EMPTYRB: SHEmptyRecycleBin(0, NULL, SHERB_NOCONFIRMATION); break; case IDM_SHUTDOWN: if(!ShutDown()) MessageBox(0, L"Shutdown Request Failed!", L"ERROR", MB_OK|MB_ICONERROR|MB_SETFOREGROUND); break; case IDM_REBOOT: if(!ReBoot()) MessageBox(0, L"Reboot Request Failed!", L"ERROR", MB_OK|MB_ICONERROR|MB_SETFOREGROUND); break; case IDM_LOGOFF: if(!LogOff()) MessageBox(0, L"Logoff Request Failed!", L"ERROR", MB_OK|MB_ICONERROR|MB_SETFOREGROUND); break; case IDM_FWD_CASCADE: case IDM_FWD_SIDEBYSIDE: case IDM_FWD_STACKED: case IDM_FWD_SHOWDESKTOP: case IDM_FWD_MINALL: case IDM_FWD_UNDO: g_undo=(wID!=IDM_FWD_UNDO); /* fall through */ case IDM_FWD_DATETIME: case IDM_FWD_CUSTOMNOTIFYICONS: case IDM_FWD_TASKMAN: case IDM_FWD_LOCKTASKBAR: case IDM_FWD_LOCKALLTASKBAR: case IDM_FWD_TASKBARPROP: case IDM_FWD_RUNAPP: case IDM_FWD_EXITEXPLORER:{ HWND hwndTray = FindWindowA("Shell_TrayWnd", NULL); if(hwndTray) PostMessage(hwndTray, WM_COMMAND, wID, 0); break;} case IDM_DATETIME_EX:{ HWND hwnd1, hwnd2; int wait = 40; api.Exec(L"timedate.cpl", L"", 0); while((hwnd2=FindWindowA((char*)(uintptr_t)32770,"Date and Time"))==0 && wait--) Sleep(50); if(hwnd2){ SetActiveWindow(hwnd2); wait = 10; while((hwnd1=FindWindowExA(hwnd2,NULL,(char*)(uintptr_t)32770,"Date and Time"))==0 && wait--) Sleep(50); if(hwnd1){ hwnd2 = GetDlgItem(hwnd1,116); if(hwnd2) PostMessage(hwnd2,BM_CLICK,0,0); } } break;} case IDM_CHIME: /// Alarms AlarmChimeEnable(-1); break; case IDM_STOPWATCH: /// Timers DialogStopWatch(); break; case IDM_STOPWATCH_START: case IDM_STOPWATCH_RESUME: if(!IsWindow(g_hDlgStopWatch)) DialogStopWatch(); StopWatch_Resume(g_hDlgStopWatch); break; case IDM_STOPWATCH_STOP: case IDM_STOPWATCH_PAUSE: if(IsWindow(g_hDlgStopWatch)) StopWatch_Pause(g_hDlgStopWatch); break; case IDM_STOPWATCH_RESET: if(IsWindow(g_hDlgStopWatch)) StopWatch_Reset(g_hDlgStopWatch); break; case IDM_STOPWATCH_LAP: if(IsWindow(g_hDlgStopWatch)) StopWatch_Lap(g_hDlgStopWatch,0); break; case IDM_TIMER: DialogTimer(0); break; case IDM_TIMEWATCH: WatchTimer(0); // Shelter All the Homeless Timers. break; case IDM_TIMEWATCHRESET: WatchTimer(1); // Shelter All the Homeless Timers. break; case IDM_SNTP:{ short just_elevated = HIWORD(wParam); if(!just_elevated || HaveSetTimePermissions()) { ReplyMessage(1); NetTimeConfigDialog(0); return 1; // handled } else { if(IsWindow(g_hDlgSNTP)) SendMessage(g_hDlgSNTP, WM_CLOSE, 1, 0); // close window but safe changes } return 0;} case IDM_SYNCTIME: case IDM_SNTP_SYNC:{ short just_elevated = HIWORD(wParam); int can_sync = HaveSetTimePermissions(); if(!just_elevated || can_sync) { ReplyMessage(1); if(can_sync) { SyncTimeNow(); } else { if(api.ExecElevated(GetClockExe(),L"/UAC /Sync",NULL) != 0) { MessageBox(0, L"T-Clock must be elevated to set your system time,\nbut elevation was canceled", L"Time Sync Failed", MB_OK|MB_ICONERROR|MB_SETFOREGROUND); } } return 1; // handled } return 0;} default: #ifdef _DEBUG DBGOUT("%s: unknown ID: %.5i(0x%.4x) (hwnd:%p)", __FUNCTION__, wID, wID, hwnd); #endif // _DEBUG break; } return 0; }
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; POINT point; switch (message) { case WM_SHOWGUI: createGUI(hWnd); break; case WM_TRAYICON: switch((UINT)lParam) { case WM_LBUTTONDOWN: if (allowTrayMenu) SendMessage(hWnd,WM_SHOWMENU,2,0); SetForegroundWindow(hWnd); break; case WM_RBUTTONDOWN: if (allowTrayMenu) SendMessage(hWnd,WM_SHOWMENU,1,0); SetForegroundWindow(hWnd); break; } break; case WM_COPYDATA: { COPYDATASTRUCT *pc = (COPYDATASTRUCT *)lParam; LOG_DEBUG("URL request: %s",pc->lpData); if (pc->dwData == WM_PLAYCHANNEL) { ChanInfo info; servMgr->procConnectArgs((char *)pc->lpData,info); chanMgr->findAndPlayChannel(info,false); } //sys->callLocalURL((const char *)pc->lpData,servMgr->serverHost.port); } break; case WM_GETPORTNUMBER: { int port; port=servMgr->serverHost.port; ReplyMessage(port); } break; case WM_SHOWMENU: { SetForegroundWindow(hWnd); bool skipMenu=false; allowTrayMenu = false; // check for notifications if (currNotify & ServMgr::NT_UPGRADE) { if (servMgr->downloadURL[0]) { if ((sys->getTime()-seenNewVersionTime) > (60*60)) // notify every hour { if (MessageBox(hWnd,"A newer version of PeerCast is available, press OK to upgrade.","PeerCast",MB_OKCANCEL|MB_APPLMODAL|MB_ICONEXCLAMATION) == IDOK) sys->getURL(servMgr->downloadURL); seenNewVersionTime=sys->getTime(); skipMenu=true; } } } if (!skipMenu) { GetCursorPos(&point); HMENU menu; switch (wParam) { case 1: menu = GetSubMenu(trayMenu,0); addAllChannelsMenu(GetSubMenu(menu,0)); addRelayedChannelsMenu(GetSubMenu(menu,1)); break; case 2: menu = GetSubMenu(ltrayMenu,0); addAllChannelsMenu(menu); break; } if (!TrackPopupMenu(menu,TPM_RIGHTALIGN,point.x,point.y,0,hWnd,NULL)) { LOG_ERROR("Can`t track popup menu: %d",GetLastError()); } PostMessage(hWnd,WM_NULL,0,0); } allowTrayMenu = true; } break; case WM_CREATE: if (showGUI) createGUI(hWnd); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); if ((wmId >= INFO_CMD) && (wmId < INFO_CMD+MAX_CHANNELS)) { int c = wmId - INFO_CMD; chanInfo = getChannelInfo(c); chanInfoIsRelayed = false; DialogBox(hInst, (LPCTSTR)IDD_CHANINFO, hWnd, (DLGPROC)ChanInfoProc); return 0; } if ((wmId >= URL_CMD) && (wmId < URL_CMD+MAX_CHANNELS)) { int c = wmId - URL_CMD; chanInfo = getChannelInfo(c); if (chanInfo.url.isValidURL()) sys->getURL(chanInfo.url); return 0; } if ((wmId >= PLAY_CMD) && (wmId < PLAY_CMD+MAX_CHANNELS)) { int c = wmId - PLAY_CMD; chanInfo = getChannelInfo(c); chanMgr->findAndPlayChannel(chanInfo,false); return 0; } if ((wmId >= RELAY_CMD) && (wmId < RELAY_CMD+MAX_CHANNELS)) { int c = wmId - RELAY_CMD; chanInfo = getChannelInfo(c); chanMgr->findAndPlayChannel(chanInfo,true); return 0; } // Parse the menu selections: switch (wmId) { case ID_POPUP_SHOWMESSAGES_PEERCAST: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_PEERCAST,ServMgr::NT_PEERCAST); break; case ID_POPUP_SHOWMESSAGES_BROADCASTERS: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_BROADCASTERS,ServMgr::NT_BROADCASTERS); break; case ID_POPUP_SHOWMESSAGES_TRACKINFO: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_TRACKINFO,ServMgr::NT_TRACKINFO); break; case ID_POPUP_ABOUT: case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case ID_POPUP_SHOWGUI: case IDM_SETTINGS_GUI: case ID_POPUP_ADVANCED_SHOWGUI: { createGUI(hWnd); break; } case ID_POPUP_YELLOWPAGES: sys->getURL("http://yp.peercast.org/"); break; case ID_POPUP_ADVANCED_VIEWLOG: showHTML("viewlog.html"); break; case ID_POPUP_ADVANCED_SAVESETTINGS: servMgr->saveSettings(iniFileName.cstr()); break; case ID_POPUP_ADVANCED_INFORMATION: showHTML("index.html"); break; case ID_FIND_CHANNELS: case ID_POPUP_ADVANCED_ALLCHANNELS: case ID_POPUP_UPGRADE: sys->callLocalURL("admin?cmd=upgrade",servMgr->serverHost.port); break; case ID_POPUP_ADVANCED_RELAYEDCHANNELS: case ID_POPUP_FAVORITES_EDIT: showHTML("relays.html"); break; case ID_POPUP_ADVANCED_BROADCAST: showHTML("broadcast.html"); break; case ID_POPUP_SETTINGS: showHTML("settings.html"); break; case ID_POPUP_CONNECTIONS: showHTML("connections.html"); break; case ID_POPUP_HELP: sys->getURL("http://www.peercast.org/help.php"); break; case ID_POPUP_EXIT_CONFIRM: case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
LRESULT CALLBACK khm_main_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPNMHDR lpnm; switch(uMsg) { case WM_CREATE: khm_create_main_window_controls(hwnd); kmq_subscribe_hwnd(KMSG_CRED, hwnd); kmq_subscribe_hwnd(KMSG_ACT, hwnd); kmq_subscribe_hwnd(KMSG_KMM, hwnd); mw_restart_refresh_timer(hwnd); /* if the plug-ins finished loading before the window was created, we would have missed the KMSG_KMM_I_DONE message. So we check if the module load is complete and if so, fire off KMSG_ACT_BEGIN_CMDLINE. */ if (!kmm_load_pending()) kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); break; case WM_DESTROY: khm_pre_shutdown(); kmq_unsubscribe_hwnd(KMSG_ACT, hwnd); kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); kmq_unsubscribe_hwnd(KMSG_KMM, hwnd); HtmlHelp(NULL, NULL, HH_CLOSE_ALL, 0); PostQuitMessage(0); break; case WM_NOTIFY: lpnm = (LPNMHDR) lParam; if(lpnm->hwndFrom == khui_main_menu_toolbar) { return khm_menu_notify_main(lpnm); } else if(lpnm->hwndFrom == khui_hwnd_standard_toolbar) { return khm_toolbar_notify(lpnm); } else if(lpnm->hwndFrom == khm_hwnd_rebar) { return khm_rebar_notify(lpnm); } else if(lpnm->hwndFrom == khm_hwnd_statusbar) { return khm_statusbar_notify(lpnm); } break; case WM_HELP: khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); break; case WM_COMMAND: switch(LOWORD(wParam)) { /* general actions */ case KHUI_ACTION_VIEW_REFRESH: khm_cred_refresh(); InvalidateRect(khm_hwnd_main_cred, NULL, FALSE); return 0; case KHUI_ACTION_PASSWD_ID: if (khm_startup.processing) return 0; khm_cred_change_password(NULL); return 0; case KHUI_ACTION_NEW_CRED: if (khm_startup.processing) return 0; khm_cred_obtain_new_creds(NULL); return 0; case KHUI_ACTION_RENEW_CRED: if (khm_startup.processing) return 0; khm_cred_renew_creds(); return 0; case KHUI_ACTION_DESTROY_CRED: if (khm_startup.processing) return 0; khm_cred_destroy_creds(FALSE, FALSE); return 0; case KHUI_ACTION_SET_DEF_ID: if (khm_startup.processing) return 0; khm_cred_set_default(); return 0; case KHUI_ACTION_EXIT: DestroyWindow(hwnd); return 0; case KHUI_ACTION_OPEN_APP: khm_show_main_window(); return 0; case KHUI_ACTION_CLOSE_APP: khm_hide_main_window(); return 0; case KHUI_ACTION_OPT_KHIM: { khui_config_node node = NULL; khui_cfg_open(NULL, L"KhmGeneral", &node); khm_show_config_pane(node); } return 0; case KHUI_ACTION_OPT_IDENTS: { khui_config_node node = NULL; khui_cfg_open(NULL, L"KhmIdentities", &node); khm_show_config_pane(node); } return 0; case KHUI_ACTION_OPT_APPEAR: { khui_config_node node = NULL; khui_cfg_open(NULL, L"KhmAppear", &node); khm_show_config_pane(node); } return 0; case KHUI_ACTION_OPT_NOTIF: { khui_config_node node = NULL; khui_cfg_open(NULL, L"KhmNotifications", &node); khm_show_config_pane(node); } return 0; case KHUI_ACTION_OPT_PLUGINS: { khui_config_node node = NULL; khui_cfg_open(NULL, L"KhmPlugins", &node); khm_show_config_pane(node); } return 0; case KHUI_ACTION_HELP_CTX: khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); return 0; case KHUI_ACTION_HELP_CONTENTS: khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_TOC, 0); return 0; case KHUI_ACTION_HELP_INDEX: khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_INDEX, (DWORD_PTR) L""); return 0; case KHUI_ACTION_HELP_ABOUT: khm_create_about_window(); return 0; case KHUI_ACTION_IMPORT: khm_cred_import(); return 0; case KHUI_ACTION_PROPERTIES: /* properties are not handled by the main window. Just bounce it to credwnd. However, use SendMessage instead of PostMessage so we don't lose context */ return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); case KHUI_ACTION_UICB: khm_ui_cb(lParam); return 0; /* layout control */ case KHUI_ACTION_VIEW_ALL_IDS: return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); case KHUI_ACTION_LAYOUT_MINI: if (khm_main_wnd_mode == KHM_MAIN_WND_MINI) { khm_set_main_window_mode(KHM_MAIN_WND_NORMAL); } else { khm_set_main_window_mode(KHM_MAIN_WND_MINI); } return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); case KHUI_ACTION_LAYOUT_RELOAD: return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); case KHUI_ACTION_LAYOUT_ID: case KHUI_ACTION_LAYOUT_TYPE: case KHUI_ACTION_LAYOUT_LOC: case KHUI_ACTION_LAYOUT_CUST: khm_set_main_window_mode(KHM_MAIN_WND_NORMAL); return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); /* menu commands */ case KHUI_PACTION_MENU: if(HIWORD(lParam) == 1) mm_last_hot_item = LOWORD(lParam); return khm_menu_activate(MENU_ACTIVATE_DEFAULT); case KHUI_PACTION_ESC: /* if esc is pressed while no menu is active, we close the main window */ if (mm_last_hot_item == -1) { khm_close_main_window(); return 0; } /* generic, retargetting */ case KHUI_PACTION_UP: case KHUI_PACTION_UP_TOGGLE: case KHUI_PACTION_UP_EXTEND: case KHUI_PACTION_PGUP: case KHUI_PACTION_PGUP_EXTEND: case KHUI_PACTION_DOWN: case KHUI_PACTION_DOWN_TOGGLE: case KHUI_PACTION_DOWN_EXTEND: case KHUI_PACTION_PGDN: case KHUI_PACTION_PGDN_EXTEND: case KHUI_PACTION_LEFT: case KHUI_PACTION_RIGHT: case KHUI_PACTION_ENTER: /* menu tracking */ if(mm_last_hot_item != -1) { switch(LOWORD(wParam)) { case KHUI_PACTION_LEFT: khm_menu_activate(MENU_ACTIVATE_LEFT); break; case KHUI_PACTION_RIGHT: khm_menu_activate(MENU_ACTIVATE_RIGHT); break; case KHUI_PACTION_ESC: case KHUI_PACTION_ENTER: khm_menu_activate(MENU_ACTIVATE_NONE); break; case KHUI_PACTION_DOWN: khm_menu_track_current(); break; } return 0; } /*FALLTHROUGH*/ case KHUI_PACTION_DELETE: case KHUI_PACTION_SELALL: /* otherwise fallthrough and bounce to the creds window */ return SendMessage(khm_hwnd_main_cred, uMsg, wParam, lParam); default: /* handle custom actions here */ { khui_action * act; /* check if this is an identity menu action. (custom actions that were created for renewing or destroying specific identities). */ if (khm_check_identity_menu_action(LOWORD(wParam))) break; act = khui_find_action(LOWORD(wParam)); if (act && act->listener) { kmq_post_sub_msg(act->listener, KMSG_ACT, KMSG_ACT_ACTIVATE, act->cmd, NULL); return 0; } } } break; /* WM_COMMAND */ case WM_SYSCOMMAND: switch(wParam & 0xfff0) { case SC_MINIMIZE: khm_hide_main_window(); return 0; case SC_CLOSE: khm_close_main_window(); return 0; } break; case WM_MEASUREITEM: /* sent to measure the bitmaps associated with a menu item */ if(!wParam) /* sent by menu */ return khm_menu_measure_item(wParam, lParam); break; case WM_DRAWITEM: /* sent to draw a menu item */ if(!wParam) return khm_menu_draw_item(wParam, lParam); break; case WM_ERASEBKGND: /* Don't erase the background. The whole client area is covered with children. It doesn't need to be erased */ return TRUE; break; case WM_SIZE: if(hwnd == khm_hwnd_main && (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)) { int cwidth, cheight; RECT r_rebar, r_status; cwidth = LOWORD(lParam); cheight = HIWORD(lParam); /* resize the rebar control */ SendMessage(khm_hwnd_rebar, WM_SIZE, 0, 0); khm_update_statusbar(hwnd); GetWindowRect(khm_hwnd_rebar, &r_rebar); GetWindowRect(khm_hwnd_statusbar, &r_status); /* the cred window fills the area between the rebar and the status bar */ MoveWindow(khm_hwnd_main_cred, 0, r_rebar.bottom - r_rebar.top, r_status.right - r_status.left, r_status.top - r_rebar.bottom, TRUE); SetTimer(hwnd, MW_RESIZE_TIMER, MW_RESIZE_TIMEOUT, NULL); return 0; } break; case WM_MOVE: { SetTimer(hwnd, MW_RESIZE_TIMER, MW_RESIZE_TIMEOUT, NULL); return 0; } break; case WM_MOVING: { RECT * r; r = (RECT *) lParam; khm_adjust_window_dimensions_for_display(r, KHM_DOCK_AUTO | KHM_DOCKF_XBORDER); } return TRUE; case WM_TIMER: if (wParam == MW_RESIZE_TIMER) { main_wnd_save_sizepos(); return 0; } else if (wParam == MW_REFRESH_TIMER) { kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); return 0; } break; case WM_MENUSELECT: return khm_menu_handle_select(wParam, lParam); case KMQ_WM_DISPATCH: { kmq_message * m; khm_int32 rv = KHM_ERROR_SUCCESS; kmq_wm_begin(lParam, &m); if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_REFRESH) { khm_menu_refresh_items(); khm_update_standard_toolbar(); } else if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_BEGIN_CMDLINE) { khm_cred_begin_startup_actions(); } else if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_CONTINUE_CMDLINE) { khm_cred_process_startup_actions(); } else if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_END_CMDLINE) { /* nothing yet */ } else if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_SYNC_CFG) { khm_refresh_config(); } else if (m->type == KMSG_ACT && m->subtype == KMSG_ACT_ACTIVATE) { /* some custom action fired */ khm_int32 action; khui_action * paction; action = m->uparam; paction = khui_find_action(action); if (paction && paction->data == (void *) CFGACTION_MAGIC) { /* a custom configuration needs to be invoked */ khui_config_node node; if (KHM_SUCCEEDED(khui_cfg_open(NULL, paction->name, &node))) { khm_show_config_pane(node); khui_cfg_release(node); } } } else if (m->type == KMSG_CRED && m->subtype == KMSG_CRED_REFRESH) { mw_restart_refresh_timer(hwnd); } else if (m->type == KMSG_CRED && m->subtype == KMSG_CRED_ADDR_CHANGE) { khm_cred_addr_change(); } else if (m->type == KMSG_CRED && m->subtype == KMSG_CRED_ROOTDELTA) { khm_refresh_identity_menus(); } else if (m->type == KMSG_KMM && m->subtype == KMSG_KMM_I_DONE) { kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); } return kmq_wm_end(m, rv); } case WM_KHUI_ASSIGN_COMMANDLINE_V1: { HANDLE hmap; void * xfer; wchar_t mapname[256]; khm_startup_options_v1 * pv1opt; int code = KHM_ERROR_SUCCESS; StringCbPrintf(mapname, sizeof(mapname), COMMANDLINE_MAP_FMT, (DWORD) lParam); hmap = OpenFileMapping(FILE_MAP_READ, FALSE, mapname); if (hmap == NULL) return 1; xfer = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, sizeof(*pv1opt)); if (xfer) { pv1opt = (khm_startup_options_v1 *) xfer; khm_startup.init = pv1opt->init; khm_startup.import = pv1opt->import; khm_startup.renew = pv1opt->renew; khm_startup.destroy = pv1opt->destroy; khm_startup.autoinit = pv1opt->autoinit; khm_startup.error_exit = FALSE; khm_startup.no_main_window = FALSE; khm_startup.remote_exit = FALSE; khm_startup.display = 0; UnmapViewOfFile(xfer); } else { code = KHM_ERROR_NOT_FOUND; } CloseHandle(hmap); if(InSendMessage()) ReplyMessage(code); if (code == KHM_ERROR_SUCCESS) { khm_startup.exit = FALSE; khm_startup.seen = FALSE; khm_startup.remote = TRUE; #ifdef DEBUG assert(!khm_startup.processing); #endif khm_startup.processing = FALSE; khm_cred_begin_startup_actions(); } return code; } case WM_KHUI_ASSIGN_COMMANDLINE_V2: { HANDLE hmap; void * xfer; wchar_t mapname[256]; khm_startup_options_v2 *pv2opt = NULL; khm_startup_options_v3 *pv3opt = NULL; int code = KHM_ERROR_SUCCESS; StringCbPrintf(mapname, sizeof(mapname), COMMANDLINE_MAP_FMT, (DWORD) lParam); hmap = OpenFileMapping(FILE_MAP_WRITE, FALSE, mapname); if (hmap == NULL) return 1; xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, sizeof(*pv2opt)); if (xfer) { pv2opt = (khm_startup_options_v2 *) xfer; if (pv2opt->magic != STARTUP_OPTIONS_MAGIC || (pv2opt->cb_size != sizeof(*pv2opt) && pv2opt->cb_size != sizeof(*pv3opt))) { code = KHM_ERROR_INVALID_PARAM; goto done_with_v2_opt; } khm_startup.init = pv2opt->init; khm_startup.import = pv2opt->import; khm_startup.renew = pv2opt->renew; khm_startup.destroy = pv2opt->destroy; khm_startup.autoinit = pv2opt->autoinit; khm_startup.exit = pv2opt->remote_exit; pv2opt->code = KHM_ERROR_SUCCESS; if (pv2opt->cb_size == sizeof(*pv3opt)) { pv3opt = (khm_startup_options_v3 *) xfer; khm_startup.display = pv3opt->remote_display; } else { khm_startup.display = 0; } done_with_v2_opt: UnmapViewOfFile(xfer); } else { code = KHM_ERROR_NOT_FOUND; } CloseHandle(hmap); if(InSendMessage()) ReplyMessage(code); if (code == KHM_ERROR_SUCCESS) { khm_startup.seen = FALSE; khm_startup.remote = TRUE; #ifdef DEBUG assert(!khm_startup.processing); #endif khm_startup.processing = FALSE; khm_cred_begin_startup_actions(); } return code; } case WM_KHUI_QUERY_APP_VERSION: { HANDLE hmap; void * xfer; wchar_t mapname[256]; StringCbPrintf(mapname, sizeof(mapname), QUERY_APP_VER_MAP_FMT, (DWORD) lParam); hmap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapname); if (hmap == NULL) return 1; xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, sizeof(khm_query_app_version)); if (xfer) { khm_process_query_app_ver((khm_query_app_version *) xfer); UnmapViewOfFile(xfer); } CloseHandle(hmap); } return 0; } return DefWindowProc(hwnd,uMsg,wParam,lParam); }
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; POINT point; char buf[1024]; if(message == g_iTaskbarCreated) // for PCRaw (tray icon) loadIcons(hInst, hWnd); switch (message) { case WM_SHOWGUI: createGUI(hWnd); break; case WM_TRAYICON: switch((UINT)lParam) { case WM_LBUTTONDOWN: if (allowTrayMenu) SendMessage(hWnd,WM_SHOWMENU,2,0); SetForegroundWindow(hWnd); break; case WM_RBUTTONDOWN: if (allowTrayMenu) SendMessage(hWnd,WM_SHOWMENU,1,0); SetForegroundWindow(hWnd); break; case WM_LBUTTONDBLCLK: createGUI(hWnd); break; } break; case WM_COPYDATA: { COPYDATASTRUCT *pc = (COPYDATASTRUCT *)lParam; LOG_DEBUG("URL request: %s",pc->lpData); if (pc->dwData == WM_PLAYCHANNEL) { ChanInfo info; servMgr->procConnectArgs((char *)pc->lpData,info); chanMgr->findAndPlayChannel(info,false); } //sys->callLocalURL((const char *)pc->lpData,servMgr->serverHost.port); } break; case WM_GETPORTNUMBER: { int port; port=servMgr->serverHost.port; ReplyMessage(port); } break; case WM_SHOWMENU: { if (servMgr->saveGuiPos) { CheckMenuItem(trayMenu, ID_POPUP_SAVE_GUI_POS, MF_CHECKED|MF_BYCOMMAND); } else { CheckMenuItem(trayMenu, ID_POPUP_SAVE_GUI_POS, MF_UNCHECKED|MF_BYCOMMAND); } SetForegroundWindow(hWnd); bool skipMenu=false; allowTrayMenu = false; // check for notifications if (currNotify & ServMgr::NT_UPGRADE) { if (servMgr->downloadURL[0]) { if ((sys->getTime()-seenNewVersionTime) > (60*60)) // notify every hour { if (MessageBox(hWnd,"A newer version of PeerCast is available, press OK to upgrade.","PeerCast",MB_OKCANCEL|MB_APPLMODAL|MB_ICONEXCLAMATION) == IDOK) sys->getURL(servMgr->downloadURL); seenNewVersionTime=sys->getTime(); skipMenu=true; } } } if (!skipMenu) { RECT rcWnd; HMENU menu; UINT flg = 0; SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWnd, 0); GetCursorPos(&point); if (point.x < rcWnd.left) { point.x = rcWnd.left; flg |= TPM_LEFTALIGN; } if (point.x > rcWnd.right) { point.x = rcWnd.right; flg |= TPM_RIGHTALIGN; } if (point.y < rcWnd.top) { point.y = rcWnd.top; flg |= TPM_TOPALIGN; } if (point.y > rcWnd.bottom) { point.y = rcWnd.bottom; flg |= TPM_BOTTOMALIGN; } if (flg == 0) { flg = TPM_RIGHTALIGN; } switch (wParam) { case 1: menu = GetSubMenu(trayMenu,0); addAllChannelsMenu(GetSubMenu(menu,0)); addRelayedChannelsMenu(GetSubMenu(menu,1)); break; case 2: menu = GetSubMenu(ltrayMenu,0); addAllChannelsMenu(menu); break; } if (!TrackPopupMenu(menu,flg,point.x,point.y,0,hWnd,NULL)) { LOG_ERROR("Can`t track popup menu: %d",GetLastError()); } PostMessage(hWnd,WM_NULL,0,0); } allowTrayMenu = true; } break; case WM_CREATE: if (showGUI) createGUI(hWnd); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); if ((wmId >= INFO_CMD) && (wmId < INFO_CMD+MAX_CHANNELS)) { int c = wmId - INFO_CMD; chanInfo = getChannelInfo(c); chanInfoIsRelayed = false; if (winDistinctionNT) DialogBox(hInst, (LPCTSTR)IDD_CHANINFO, hWnd, (DLGPROC)ChanInfoProc); else { HWND WKDLG; //JP-Patch WKDLG = CreateDialog(hInst, (LPCTSTR)IDD_CHANINFO, hWnd, (DLGPROC)ChanInfoProc); //JP-Patch ShowWindow(WKDLG,SW_SHOWNORMAL); //JP-Patch } return 0; } if ((wmId >= URL_CMD) && (wmId < URL_CMD+MAX_CHANNELS)) { int c = wmId - URL_CMD; chanInfo = getChannelInfo(c); if (chanInfo.url.isValidURL()) sys->getURL(chanInfo.url); return 0; } if ((wmId >= PLAY_CMD) && (wmId < PLAY_CMD+MAX_CHANNELS)) { int c = wmId - PLAY_CMD; chanInfo = getChannelInfo(c); chanMgr->findAndPlayChannel(chanInfo,false); return 0; } if ((wmId >= RELAY_CMD) && (wmId < RELAY_CMD+MAX_CHANNELS)) { int c = wmId - RELAY_CMD; chanInfo = getChannelInfo(c); chanMgr->findAndPlayChannel(chanInfo,true); return 0; } // Parse the menu selections: switch (wmId) { case ID_POPUP_SHOWMESSAGES_PEERCAST: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_PEERCAST,ServMgr::NT_PEERCAST); break; case ID_POPUP_SHOWMESSAGES_BROADCASTERS: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_BROADCASTERS,ServMgr::NT_BROADCASTERS); break; case ID_POPUP_SHOWMESSAGES_TRACKINFO: flipNotifyPopup(ID_POPUP_SHOWMESSAGES_TRACKINFO,ServMgr::NT_TRACKINFO); break; case ID_POPUP_ABOUT: case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case ID_POPUP_SHOWGUI: case IDM_SETTINGS_GUI: case ID_POPUP_ADVANCED_SHOWGUI: { createGUI(hWnd); break; } case ID_POPUP_YELLOWPAGES: sys->getURL("http://yp.peercast.org/"); break; case ID_POPUP_YELLOWPAGES1: sprintf(buf, "http://%s",servMgr->rootHost.cstr()); sys->getURL(buf); break; case ID_POPUP_YELLOWPAGES2: sprintf(buf, "http://%s",servMgr->rootHost2.cstr()); sys->getURL(buf); break; case ID_POPUP_ADVANCED_VIEWLOG: showHTML("viewlog.html"); break; case ID_POPUP_ADVANCED_SAVESETTINGS: servMgr->saveSettings(iniFileName.cstr()); break; case ID_POPUP_ADVANCED_INFORMATION: showHTML("index.html"); break; case ID_FIND_CHANNELS: case ID_POPUP_ADVANCED_ALLCHANNELS: case ID_POPUP_UPGRADE: sys->callLocalURL("admin?cmd=upgrade",servMgr->serverHost.port); break; case ID_POPUP_ADVANCED_RELAYEDCHANNELS: case ID_POPUP_FAVORITES_EDIT: showHTML("relays.html"); break; case ID_POPUP_ADVANCED_BROADCAST: showHTML("broadcast.html"); break; case ID_POPUP_SETTINGS: showHTML("settings.html"); break; case ID_POPUP_CONNECTIONS: showHTML("connections.html"); break; case ID_POPUP_HELP: sys->getURL("http://www.peercast.org/help.php"); break; case ID_POPUP_SAVE_GUI_POS: if (servMgr->saveGuiPos) { servMgr->saveGuiPos = false; CheckMenuItem(trayMenu, ID_POPUP_SAVE_GUI_POS, MF_UNCHECKED|MF_BYCOMMAND); } else { servMgr->saveGuiPos = true; CheckMenuItem(trayMenu, ID_POPUP_SAVE_GUI_POS, MF_CHECKED|MF_BYCOMMAND); } peercastInst->saveSettings(); break; case ID_POPUP_KEEP_DOWNSTREAMS: if (servMgr->keepDownstreams) { servMgr->keepDownstreams = false; CheckMenuItem(trayMenu, ID_POPUP_KEEP_DOWNSTREAMS, MF_UNCHECKED|MF_BYCOMMAND); } else { servMgr->keepDownstreams = true; CheckMenuItem(trayMenu, ID_POPUP_KEEP_DOWNSTREAMS, MF_CHECKED|MF_BYCOMMAND); } //peercastInst->saveSettings(); break; case ID_POPUP_EXIT_CONFIRM: case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }