void TextConsoleViewer::view() { #ifdef _WIN32 int topline, leftpos; leftpos = topline = 0; INPUT_RECORD ir; HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hConI = CreateFile("CONIN$", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (hConI == INVALID_HANDLE_VALUE) return; SetConsoleMode(hConI, ENABLE_MOUSE_INPUT|ENABLE_WINDOW_INPUT); CONSOLE_SCREEN_BUFFER_INFO csbi; hCon = CreateConsoleScreenBuffer(GENERIC_WRITE|GENERIC_READ, 0, 0, CONSOLE_TEXTMODE_BUFFER, 0); SetConsoleActiveScreenBuffer(hCon); GetConsoleScreenBufferInfo(hCon, &csbi); CONSOLE_CURSOR_INFO cci; cci.dwSize = 100; cci.bVisible = FALSE; SetConsoleCursorInfo(hCon, &cci); CHAR_INFO *buffer = new CHAR_INFO[csbi.dwSize.X * csbi.dwSize.Y]; bool unc_fault = false; do { int lline = csbi.dwSize.Y; if (topline+lline > textLinesStore->getLineCount()) lline = textLinesStore->getLineCount()-topline; baseEditor->visibleTextEvent(topline, lline); for(int i = topline; i < topline + csbi.dwSize.Y; i++) { int Y = i-topline; int li; for(li = 0; li < csbi.dwSize.X; li++) { buffer[Y*csbi.dwSize.X + li].Char.UnicodeChar = ' '; buffer[Y*csbi.dwSize.X + li].Attributes = background; }; if (i >= textLinesStore->getLineCount()) continue; DString iLine = textLinesStore->getLine(i); for(li = 0; li < csbi.dwSize.X; li++) { if (leftpos+li >= iLine.length()) break; buffer[Y*csbi.dwSize.X + li].Char.UnicodeChar = iLine[leftpos+li]; if (unc_fault) buffer[Y*csbi.dwSize.X + li].Char.AsciiChar = Encodings::toChar(encoding, iLine[leftpos+li]); }; for(LineRegion *l1 = baseEditor->getLineRegions(i); l1 != null; l1 = l1->next) { if (l1->special || l1->rdef == null) continue; int end = l1->end; if (end == -1) end = iLine.length(); int X = l1->start - leftpos; int len = end - l1->start; if (X < 0) { len += X; X = 0; }; if (len < 0 || X >= csbi.dwSize.X) continue; if (len+X > csbi.dwSize.X) len = csbi.dwSize.X-X; WORD color = (WORD)(l1->styled()->fore + (l1->styled()->back<<4)); if (!l1->styled()->bfore) color = (color&0xF0) + (background&0xF); if (!l1->styled()->bback) color = (color&0xF) + (background&0xF0); for(int li = 0; li < len; li++) buffer[Y*csbi.dwSize.X + X + li].Attributes = color; }; }; COORD coor; coor.X = coor.Y = 0; SMALL_RECT sr; sr.Left = 0; sr.Right = csbi.dwSize.X-1; sr.Top = 0; sr.Bottom = csbi.dwSize.Y-1; if (!unc_fault && !WriteConsoleOutputW(hCon, buffer, csbi.dwSize, coor, &sr)) { unc_fault = true; continue; }; if (unc_fault) WriteConsoleOutputA(hCon, buffer, csbi.dwSize, coor, &sr); // managing the keyboard do { DWORD tmp; ReadConsoleInput(hConI, &ir, 1, &tmp); if (ir.EventType == WINDOW_BUFFER_SIZE_EVENT) { GetConsoleScreenBufferInfo(hCon, &csbi); delete[] buffer; buffer = new CHAR_INFO[csbi.dwSize.X * csbi.dwSize.Y]; break; }; if (ir.EventType == MOUSE_EVENT && ir.Event.MouseEvent.dwEventFlags == 0x4) { switch(ir.Event.MouseEvent.dwButtonState) { case 0x780000: topline-=csbi.dwSize.Y; if (topline < 0) topline = 0; break; case 0xFF880000: topline += csbi.dwSize.Y; if (topline > textLinesStore->getLineCount() - csbi.dwSize.Y) topline = textLinesStore->getLineCount() - csbi.dwSize.Y; if (topline < 0) topline = 0; break; }; break; }; if (ir.EventType == KEY_EVENT && ir.Event.KeyEvent.bKeyDown) { // moving view position switch(ir.Event.KeyEvent.wVirtualKeyCode) { case VK_UP: if (topline) topline--; break; case VK_DOWN: if (topline+csbi.dwSize.Y < textLinesStore->getLineCount()) topline++; break; case VK_LEFT: leftpos--; if (ir.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) leftpos -= 15; if (leftpos < 0) leftpos = 0; break; case VK_RIGHT: leftpos++; if (ir.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) leftpos += 15; break; case VK_PRIOR: topline-=csbi.dwSize.Y; if (topline < 0) topline = 0; break; case VK_NEXT: case VK_SPACE: topline += csbi.dwSize.Y; if (topline > textLinesStore->getLineCount() - csbi.dwSize.Y) topline = textLinesStore->getLineCount() - csbi.dwSize.Y; if (topline < 0) topline = 0; break; case VK_HOME: leftpos = topline = 0; break; case VK_END: topline = textLinesStore->getLineCount()-csbi.dwSize.Y; if (topline < 0) topline = 0; leftpos = 0; break; }; break; }; } while(true); } while(ir.Event.KeyEvent.wVirtualKeyCode != VK_ESCAPE); delete[] buffer; SetConsoleActiveScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE)); CloseHandle(hCon); #else printf("unix edition doesn't support interactive text viewing\n\n"); for(int i = 0; i < textLinesStore->getLineCount(); i++) { DString line = textLinesStore->getLine(i); printf("%s\n", line.getChars()); }; #endif };
int DServerSock::sendPacket ( int hSock, const DString & packet, bool checkSock ) { ssize_t numberChar; fd_set stFdSet; struct timeval stTime; DString buffer; long int timeout; if ( checkSock ) { // check if socket is opened timeout = m_timeout; setTimeout ( 10 ); m_status = readMessage ( hSock, buffer ); setTimeout ( timeout ); } if ( m_hSocket < 0 || m_status == NO_SOCKET ) { m_status = NO_SOCKET; m_lastError = "No opened socket found"; return m_status; } FD_ZERO ( &stFdSet ); FD_SET ( hSock, &stFdSet ); stTime.tv_sec = m_timeout; stTime.tv_usec = 0; if (m_debug) { printMessage(packet); } // Check if data can be sent without any blocking if ( ( select ( hSock+1, NULL, &stFdSet, NULL, &stTime ) != -1 ) && ( FD_ISSET ( hSock, &stFdSet ) ) ) { numberChar = send ( hSock, packet.c_str(), packet.length(), 0 ); if ( numberChar == static_cast<ssize_t> ( packet.length() ) ) { m_lastError = ""; m_status = SUCCESS; } else { m_lastError = "No data sent, "; m_lastError = + strerror ( errno ); m_status = NO_SEND; } } else { m_lastError = "No data sent, "; m_lastError = + strerror ( errno ); m_status = NO_SEND; } return m_status; }
void CFindOptions::QueryParser( const DString& query ) { mPureQuery = query; mQuery.clear(); // TODO Добавлять еще в начале и конце (.*) если нет кавычек в запросе UINT _length = query.length(); for(UINT i=0;i<_length;i++) { if( (query[i] == Character::ASTERISK) || (query[i] == Character::SPACE) ) { mQuery += L"(.*)"; continue; } if( (query[i] == Character::PLUS) // + ||(query[i] == Character::QUESTION_MARK) // ? ||(query[i] == Character::CARET_CURCUMFLEX) // ^ ||(query[i] == Character::DOLLAR_SIGN) // $ ||(query[i] == Character::EXCLAMATION_POINT) // ! ||(query[i] == Character::OPEN_BRACE) // { ||(query[i] == Character::CLOSE_BRACE) // } ||(query[i] == Character::BACKSLASH) // '\'' ||(query[i] == Character::GREATER_THAN_SIGN) // > ||(query[i] == Character::LESS_THAN_SIGN) // < ||(query[i] == Character::VERTICAL_BAR) // | ||(query[i] == Character::OPEN_BRACKET) // ( ||(query[i] == Character::CLOSE_BRACKET) // ) ||(query[i] == Character::EQUALS_SIGN) // = ||(query[i] == Character::LEFT_SQUARE_BRACKET) // [ ||(query[i] == Character::RIGHT_SQUARE_BRACKET) // ] ||(query[i] == Character::COLON) // : ||(query[i] == Character::HYPHEN_MINUS) // - ||(query[i] == Character::PERIOD) ) // . { mQuery += L'\\'; // And continue... } mQuery += query[i]; } }
int DServerSock::readMessage ( int hSock, DString &message ) { int numberChar; int availableNbChar = 0; char * bufchar; DString buffer; bool finished = false; // clear line message.clear(); if ( hSock < 0 || m_status == NO_SOCKET ) { m_status = NO_SOCKET; m_lastError = "No opened socket found"; return m_status; } bufchar = new char[ m_buffSize + 1 ]; while ( ! finished ) { ioctl( hSock, FIONREAD, &availableNbChar ); if ( availableNbChar ) { memset ( bufchar, 0x0, m_buffSize + 1 ); numberChar = recv ( hSock, bufchar, sizeof( bufchar ), 0 ); if ( numberChar < 0 ) { if ( ! message.length() ) { m_lastError = "No data, "; m_lastError += strerror ( errno ); m_status = RECV_NOTHING; //break; } } else if ( numberChar == 0 ) { m_lastError = "Socket disconnected, "; m_lastError += strerror ( errno ); m_status = NO_SOCKET; break; } else { buffer = bufchar; buffer.truncate ( numberChar ); if ( buffer.length() > 0 ) { if (m_debug) { printMessage(buffer); } if ( buffer.right(2) == "\r\n" ) { finished = true; } message += buffer; m_status = SUCCESS; m_lastError = ""; } else { if ( ! message.length() ) { m_status = RECV_EMPTY; m_lastError = "Receive an empty message"; } break; } } } else { finished = true; } } delete[]( bufchar ); return m_status; }