bool Open() { if (0 <= sFd) return true; if (!SetGraphicsMode()) return false; ScopedClose fd(open("/dev/graphics/fb0", O_RDWR)); if (0 > fd.get()) { LOG("Error opening framebuffer device"); return false; } struct fb_fix_screeninfo fi; if (0 > ioctl(fd.get(), FBIOGET_FSCREENINFO, &fi)) { LOG("Error getting fixed screeninfo"); return false; } if (0 > ioctl(fd.get(), FBIOGET_VSCREENINFO, &sVi)) { LOG("Error getting variable screeninfo"); return false; } sMappedSize = fi.smem_len; void* mem = mmap(0, sMappedSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd.rwget(), 0); if (MAP_FAILED == mem) { LOG("Error mmap'ing framebuffer"); return false; } sFd = fd.get(); fd.forget(); // The android porting doc requires a /dev/graphics/fb0 device // that's double buffered with r5g6b5 format. Hence the // hard-coded numbers here. gfxASurface::gfxImageFormat format = gfxASurface::ImageFormatRGB16_565; int bytesPerPixel = gfxASurface::BytePerPixelFromFormat(format); if (!sScreenSize) { sScreenSize = new gfxIntSize(sVi.xres, sVi.yres); } long stride = fi.line_length; size_t numFrameBytes = stride * sScreenSize->height; sBuffers = new BufferVector(2); unsigned char* data = static_cast<unsigned char*>(mem); for (size_t i = 0; i < 2; ++i, data += numFrameBytes) { memset(data, 0, numFrameBytes); Buffers()[i] = new gfxImageSurface(data, *sScreenSize, stride, format); } // Clear the framebuffer to a known state. Present(nsIntRect()); return true; }
void Close() { if (0 > sFd) return; munmap(Buffers()[0]->Data(), sMappedSize); delete sBuffers; sBuffers = NULL; close(sFd); sFd = -1; }
void AsioTcpSocket::StartSending() { // если в очереди ничего нет, проверить, не нужно ли закрыть сокет if(sendQueue.empty()) { if(sendClosed) try { socket.shutdown(boost::asio::ip::tcp::socket::shutdown_send); } catch(boost::system::system_error) { } } else { // очередь не пуста, начинаем отправку socket.async_write_some(Buffers(sendQueue.begin(), sendQueue.end(), firstItemSent), SentBinder(this)); } }
int SSL_SOCKET :: s_ssend(char* b,int sz) { // QueryContextAttributes // Encrypt Message // ssend SecPkgContext_StreamSizes Sizes; SECURITY_STATUS ss = 0; ss = QueryContextAttributes(&hCtx,SECPKG_ATTR_STREAM_SIZES,&Sizes); if (FAILED(ss)) return -1; Z<SecBuffer> Buffers(100); int mPos = 0; for(;;) { Z<char> mmsg(Sizes.cbMaximumMessage*2); Z<char> mhdr(Sizes.cbHeader*2); Z<char> mtrl(Sizes.cbTrailer*2); unsigned int dwMessage = sz - mPos; if (dwMessage == 0) break; // all ok! if (dwMessage > Sizes.cbMaximumMessage) { dwMessage = Sizes.cbMaximumMessage; } memcpy(mmsg,b + mPos,dwMessage); mPos += dwMessage; Buffers[0].pvBuffer = mhdr; Buffers[0].cbBuffer = Sizes.cbHeader; Buffers[0].BufferType = SECBUFFER_STREAM_HEADER; Buffers[2].pvBuffer = mtrl; Buffers[2].cbBuffer = Sizes.cbTrailer; Buffers[2].BufferType = SECBUFFER_STREAM_TRAILER; Buffers[3].pvBuffer = 0; Buffers[3].cbBuffer = 0; Buffers[3].BufferType = SECBUFFER_EMPTY; Buffers[1].pvBuffer = mmsg; Buffers[1].cbBuffer = dwMessage; Buffers[1].BufferType = SECBUFFER_DATA; sbin.ulVersion = SECBUFFER_VERSION; sbin.pBuffers = Buffers; sbin.cBuffers = 4; ss = EncryptMessage(&hCtx,0,&sbin,0); if (FAILED(ss)) return -1; // Send this message int rval; rval = ssend_p((char*)Buffers[0].pvBuffer,Buffers[0].cbBuffer); if (rval != Buffers[0].cbBuffer) return rval; rval = ssend_p((char*)Buffers[1].pvBuffer,Buffers[1].cbBuffer); if (rval != Buffers[1].cbBuffer) return rval; rval = ssend_p((char*)Buffers[2].pvBuffer,Buffers[2].cbBuffer); if (rval != Buffers[2].cbBuffer) return rval; } return sz; }
static gfxASurface* FrontBuffer() { return Buffers()[sActiveBuffer]; }
gfxASurface* BackBuffer() { return Buffers()[!sActiveBuffer]; }