static QString p_getenv( QString name ) { DWORD len = QT_WA_INLINE( GetEnvironmentVariableW ( ( LPCWSTR ) qt_winTchar ( name, true ), NULL, 0 ), GetEnvironmentVariableA ( ( LPCSTR ) name.ascii(), NULL, 0 ) ); if ( len == 0 ) return QString::null; /* ansi: we allocate too much memory, but this shouldn't be the problem here ... */ LPTSTR buf = new WCHAR[ len ]; len = QT_WA_INLINE( GetEnvironmentVariableW ( ( LPCWSTR ) qt_winTchar ( name, true ), buf, len ), GetEnvironmentVariableA ( ( LPCSTR ) name.ascii(), ( char* ) buf, len ) ); if ( len == 0 ) return QString::null; QString ret = qt_winQString ( buf ); delete[] buf; return ret; }
bool RDTTYDevice::open(int mode) { DWORD flags=0; WCHAR name[255]; DCB dcb; COMMTIMEOUTS timeouts; tty_mode=mode; if((mode&IO_ReadWrite)==IO_ReadWrite) { flags|=GENERIC_WRITE|GENERIC_READ; } else { if(((mode&IO_WriteOnly)!=0)) { flags|=GENERIC_WRITE; } if(((mode&IO_ReadOnly)!=0)) { flags|=GENERIC_READ; } } wcscpy(name,(TCHAR*)qt_winTchar(tty_name,true)); tty_fd=CreateFile(name,flags,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(tty_fd==INVALID_HANDLE_VALUE) { tty_status=IO_OpenError; return false; } tty_open=true; tty_status=IO_Ok; SetupComm(tty_fd,WIN32_BUFFER_SIZE,WIN32_BUFFER_SIZE); switch(tty_parity) { case RDTTYDevice::None: BuildCommDCB((TCHAR*)qt_winTchar(QString(). sprintf("%d,N,%d,1", tty_speed,tty_length), true),&dcb); break; case RDTTYDevice::Even: BuildCommDCB((TCHAR*)qt_winTchar(QString(). sprintf("%d,E,%d,1", tty_speed,tty_length), true),&dcb); break; case RDTTYDevice::Odd: BuildCommDCB((TCHAR*)qt_winTchar(QString(). sprintf("%d,O,%d,1", tty_speed,tty_length), true),&dcb); break; } SetCommState(tty_fd,&dcb); timeouts.ReadIntervalTimeout=MAXDWORD; timeouts.ReadTotalTimeoutMultiplier=0; timeouts.ReadTotalTimeoutConstant=0; timeouts.WriteTotalTimeoutMultiplier=0; timeouts.WriteTotalTimeoutConstant=0; SetCommTimeouts(tty_fd,&timeouts); return true; }
bool QPrinter::cmd( int c, QPainter *paint, QPDevCmdParam *p ) { if ( c == PdcBegin ) { if ( state == PST_IDLE ) { if ( output_file ) { #if defined(_OS_WIN32_) int fd; if ( qt_winver == Qt::WV_NT ) fd = _topen( qt_winTchar(output_filename,TRUE), _O_CREAT | _O_BINARY | _O_TRUNC | _O_WRONLY ); else fd = _open( output_filename.ascii(), _O_CREAT | _O_BINARY | _O_TRUNC | _O_WRONLY ); #else int fd = ::open( output_filename.local8Bit(), O_CREAT | O_NOCTTY | O_TRUNC | O_WRONLY, 0666 ); #endif if ( fd >= 0 ) { pdrv = new QPSPrinter( this, fd ); state = PST_ACTIVE; } } else { QString pr; if ( printer_name ) pr = printer_name; #if defined(_OS_WIN32_) // Not implemented // lpr needs -Sserver argument #else QApplication::flushX(); int fds[2]; if ( pipe( fds ) != 0 ) { qWarning( "QPSPrinter: could not open pipe to print" ); state = PST_ERROR; return FALSE; } #if 0 && defined(_OS_OS2EMX_) // this code is still not used, and maybe it's not // usable either, any more. if you want to use it, // you may need to fix it first. // old comment: // this code is usable but not in use. spawn() is // preferable to fork()/exec() for very large // programs. if fork()/exec() is a problem and you // use OS/2, remove '0 && ' from the #if. int tmp; tmp = dup(0); dup2( fds[0], 0 ); ::close( fds[0] ); fcntl(tmp, F_SETFD, FD_CLOEXEC); fcntl(fds[1], F_SETFD, FD_CLOEXEC); pr.prepend( option_string ? option_string : "-P" ); // ### if ( spawnlp(P_NOWAIT,print_prog.data(), print_prog.data(), pr.data(), output->name(), 0) == -1 ) { ; // couldn't exec, ignored } dup2( tmp, 0 ); ::close( tmp ); pdrv = new QPSPrinter( this, fds[1] ); state = PST_ACTIVE; #else pid = fork(); if ( pid == 0 ) { // child process // if possible, exit quickly, so the actual lp/lpr // becomes a child of init, and ::waitpid() is // guaranteed not to wait. if ( ( pid = fork() ) > 0 ) { exit( 0 ); } dup2( fds[0], 0 ); // hack time... getting the maximum number of open // files, if possible. if not we assume it's the // larger of 256 and the fd we got int i; #if defined(_SC_OPEN_MAX) i = (int)sysconf( _SC_OPEN_MAX ); #elif defined(_POSIX_OPEN_MAX) i = (int)_POSIX_OPEN_MAX; #elif defined(OPEN_MAX) i = (int)OPEN_MAX; #else i = QMAX( 256, fds[0] ); #endif // ways-to-set i while( --i > 0 ) ::close( i ); if ( print_prog ) { pr.prepend( option_string ? option_string : QString::fromLatin1( "-P" ) ); (void)execlp( print_prog.ascii(), print_prog.ascii(), pr.ascii(), 0 ); } else { // if no print program has been specified, be smart // about the option string too. const char * lprarg = 0; QString lprhack; const char * lparg = 0; QString lphack; if ( pr || option_string ) { lprhack = pr; lprhack.prepend( option_string ? option_string : QString::fromLatin1( "-P" ) ); lprarg = lprhack.ascii(); lphack = pr; lphack.prepend( option_string ? option_string : QString::fromLatin1( "-d" ) ); lparg = lphack.ascii(); } (void)execlp( "lp", "lp", lparg, 0 ); (void)execlp( "lpr", "lpr", lprarg, 0 ); (void)execl( "/bin/lp", "lp", lparg, 0 ); (void)execl( "/bin/lpr", "lpr", lprarg, 0 ); (void)execl( "/usr/bin/lp", "lp", lparg, 0 ); (void)execl( "/usr/bin/lpr", "lpr", lprarg, 0 ); } // if we couldn't exec anything, close the fd, // wait for a second so the parent process (the // child of the GUI process) has exited. then // exit. ::close( 0 ); (void)::sleep( 1 ); ::exit( 0 ); } else { // parent process ::close( fds[0] ); pdrv = new QPSPrinter( this, fds[1] ); state = PST_ACTIVE; } #endif // else part of _OS_OS2EMX_ #endif // else part for #if _OS_WIN32_ } if ( state == PST_ACTIVE && pdrv ) return ((QPSPrinter*)pdrv)->cmd( c, paint, p ); } else { // ignore it? I don't know } } else { bool r = FALSE; if ( state == PST_ACTIVE && pdrv ) { r = ((QPSPrinter*)pdrv)->cmd( c, paint, p ); if ( c == PdcEnd ) { state = PST_IDLE; delete pdrv; pdrv = 0; if ( pid ) { (void)::waitpid( pid, 0, 0 ); pid = 0; } } } return r; } return TRUE; }