/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Console Server DLL * FILE: win32ss/user/winsrv/consrv/frontendctl.c * PURPOSE: Terminal Front-Ends Control * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) */ /* INCLUDES *******************************************************************/ #include "consrv.h" #define NDEBUG #include /* PUBLIC SERVER APIS *********************************************************/ /********************************************************************** * HardwareStateProperty * * DESCRIPTION * Set/Get the value of the HardwareState and switch * between direct video buffer ouput and GDI windowed * output. * ARGUMENTS * Client hands us a CONSOLE_GETSETHWSTATE object. * We use the same object to Request. * NOTE * ConsoleHwState has the correct size to be compatible * with NT's, but values are not. */ #if 0 static NTSTATUS SetConsoleHardwareState(PCONSRV_CONSOLE Console, ULONG ConsoleHwState) { DPRINT1("Console Hardware State: %d\n", ConsoleHwState); if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState) ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState)) { if (Console->HardwareState != ConsoleHwState) { /* TODO: implement switching from full screen to windowed mode */ /* TODO: or back; now simply store the hardware state */ Console->HardwareState = ConsoleHwState; } return STATUS_SUCCESS; } return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */ } #endif CSR_API(SrvGetConsoleHardwareState) { #if 0 NTSTATUS Status; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest; PCONSOLE_SCREEN_BUFFER Buff; PCONSRV_CONSOLE Console; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n"); return Status; } Console = Buff->Header.Console; HardwareStateRequest->State = Console->HardwareState; ConSrvReleaseScreenBuffer(Buff, TRUE); return Status; #else UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; #endif } CSR_API(SrvSetConsoleHardwareState) { #if 0 NTSTATUS Status; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest; PCONSOLE_SCREEN_BUFFER Buff; PCONSRV_CONSOLE Console; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n"); return Status; } DPRINT("Setting console hardware state.\n"); Console = Buff->Header.Console; Status = SetConsoleHardwareState(Console, HardwareStateRequest->State); ConSrvReleaseScreenBuffer(Buff, TRUE); return Status; #else UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; #endif } CSR_API(SrvGetConsoleDisplayMode) { NTSTATUS Status; PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest; PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; GetDisplayModeRequest->DisplayMode = TermGetDisplayMode(Console); ConSrvReleaseConsole(Console, TRUE); return STATUS_SUCCESS; } CSR_API(SrvSetConsoleDisplayMode) { NTSTATUS Status; PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest; PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetDisplayModeRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; Console = (PCONSRV_CONSOLE)Buff->Header.Console; if (TermSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode)) { SetDisplayModeRequest->NewSBDim = Buff->ScreenBufferSize; Status = STATUS_SUCCESS; } else { Status = STATUS_INVALID_PARAMETER; } ConSrvReleaseScreenBuffer(Buff, TRUE); return Status; } CSR_API(SrvGetLargestConsoleWindowSize) { NTSTATUS Status; PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest; PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), GetLargestWindowSizeRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; Console = Buff->Header.Console; /* * Retrieve the largest possible console window size, without * taking into account the size of the console screen buffer * (thus differs from ConDrvGetConsoleScreenBufferInfo). */ TermGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size); ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvShowConsoleCursor) { NTSTATUS Status; PCONSOLE_SHOWCURSOR ShowCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ShowCursorRequest; PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ShowCursorRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; Console = Buff->Header.Console; ShowCursorRequest->RefCount = TermShowMouseCursor(Console, ShowCursorRequest->Show); ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvSetConsoleCursor) { NTSTATUS Status; BOOL Success; PCONSOLE_SETCURSOR SetCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorRequest; PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; // NOTE: Tests show that this function is used only for graphics screen buffers // and otherwise it returns FALSE and sets last error to ERROR_INVALID_HANDLE. // I find that behaviour is ridiculous but ok, let's accept it at the moment... Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetCursorRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; Console = (PCONSRV_CONSOLE)Buff->Header.Console; Success = TermSetMouseCursor(Console, SetCursorRequest->CursorHandle); ConSrvReleaseScreenBuffer(Buff, TRUE); return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); } CSR_API(SrvConsoleMenuControl) { NTSTATUS Status; PCONSOLE_MENUCONTROL MenuControlRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.MenuControlRequest; PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), MenuControlRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; Console = (PCONSRV_CONSOLE)Buff->Header.Console; MenuControlRequest->MenuHandle = TermMenuControl(Console, MenuControlRequest->CmdIdLow, MenuControlRequest->CmdIdHigh); ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvSetConsoleMenuClose) { NTSTATUS Status; BOOL Success; PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetMenuCloseRequest; PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; Success = TermSetMenuClose(Console, SetMenuCloseRequest->Enable); ConSrvReleaseConsole(Console, TRUE); return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); } CSR_API(SrvGetConsoleWindow) { NTSTATUS Status; PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest; PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; GetWindowRequest->WindowHandle = TermGetConsoleWindowHandle(Console); ConSrvReleaseConsole(Console, TRUE); return STATUS_SUCCESS; } CSR_API(SrvSetConsoleIcon) { NTSTATUS Status; PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest; PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; Status = (TermChangeIcon(Console, SetIconRequest->IconHandle) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvGetConsoleSelectionInfo) { NTSTATUS Status; PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetSelectionInfoRequest; PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; Status = (TermGetSelectionInfo(Console, &GetSelectionInfoRequest->Info) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvGetConsoleNumberOfFonts) { NTSTATUS Status; PCONSOLE_GETNUMFONTS GetNumFontsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetNumFontsRequest; PCONSOLE /*PCONSRV_CONSOLE*/ Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; // FIXME! // TermGetNumberOfFonts(Console, ...); DPRINT1("%s not yet implemented\n", __FUNCTION__); GetNumFontsRequest->NumFonts = 0; ConSrvReleaseConsole(Console, TRUE); return STATUS_SUCCESS; } CSR_API(SrvGetConsoleFontInfo) { NTSTATUS Status; PCONSOLE_GETFONTINFO GetFontInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetFontInfoRequest; // PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), GetFontInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; // FIXME! // Console = Buff->Header.Console; // TermGetFontInfo(Console, ...); DPRINT1("%s not yet implemented\n", __FUNCTION__); GetFontInfoRequest->NumFonts = 0; ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvGetConsoleFontSize) { NTSTATUS Status; PCONSOLE_GETFONTSIZE GetFontSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetFontSizeRequest; // PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), GetFontSizeRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; // FIXME! // Console = Buff->Header.Console; // TermGetFontSize(Console, ...); DPRINT1("%s not yet implemented\n", __FUNCTION__); ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvGetConsoleCurrentFont) { NTSTATUS Status; PCONSOLE_GETCURRENTFONT GetCurrentFontRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCurrentFontRequest; // PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), GetCurrentFontRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; // FIXME! // Console = Buff->Header.Console; // TermGetCurrentFont(Console, ...); DPRINT1("%s not yet implemented\n", __FUNCTION__); GetCurrentFontRequest->FontIndex = 0; ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } CSR_API(SrvSetConsoleFont) { NTSTATUS Status; PCONSOLE_SETFONT SetFontRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetFontRequest; // PCONSOLE /*PCONSRV_CONSOLE*/ Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetFontRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; // FIXME! // Console = Buff->Header.Console; // TermSetFont(Console, ...); DPRINT1("%s not yet implemented\n", __FUNCTION__); ConSrvReleaseScreenBuffer(Buff, TRUE); return STATUS_SUCCESS; } /* EOF */