int ehttp:: read_header( int fd, void *cookie, string &header, MemoryBuffer &message ) { header=""; unsigned int offset=0; int r = 0; while((offset=header.find("\r\n\r\n"))==string::npos ) { input_buffer[0]=0; r=pRecv((void*)fd,&input_buffer[0],INPUT_BUFFER_SIZE,cookie); if( r < 0 ) return EHTTP_ERR_GENERIC; input_buffer[r]=0; header+=input_buffer; } //message=header.substr(offset+4); // gotta have our shit globally i guess // gotta calculate somehow =/ hmmmm cuz r isnt good enough since some might be leftover // no cuz its teh offset in the full recieved header not our input buffer // input buffer is oging to change right we are interested in the last chunk of it only ahh DWORD inputPos = (offset + 4) % INPUT_BUFFER_SIZE; message.Add(&input_buffer[inputPos], r - inputPos); // then isntead of message add to our MemBuffer // can't we take the message from parse_message, and add it to our buffer if len > 0? // keep in mind that null will f**k us up =/ah so it would be pretty much this // and message= would be adding to mem buffer instead /* Fix the case where only "GET /xxxxx HTTP1.0\r\n\r\n" is sent (no other headers)*/ if(offset == header.find("\r\n")) header=header.substr(0,offset+2); else header=header.substr(0,offset); // DebugMsg( "HTTPServer-embed","Header:-->%s<--\r\n",header.c_str()); // DebugMsg( "HTTPServer-embed","Message:-->%s<--\r\n",message.c_str()); return EHTTP_ERR_OK; }
int ehttp:: parse_message( int fd, void *cookie, MemoryBuffer &message ) { if( !contentlength ) return EHTTP_ERR_OK; DebugMsg( "HTTPServer-embed","Parsed content length:%d\r\n",contentlength); DebugMsg( "HTTPServer-embed","Actual message length read in:%d\r\n", message.GetDataLength()); unsigned int recieved = message.GetDataLength(); while( recieved < contentlength) { input_buffer[0]=0; int r = recv((int)fd, input_buffer, INPUT_BUFFER_SIZE, 0); if( r < 0 ) return EHTTP_ERR_GENERIC; message.Add(input_buffer, r); DebugMsg( "HTTPServer-embed", "Message Length: %d", r); // Decrement our recieved content recieved += r; } if(request_header["Content-Type"].find("multipart") == 0) { DebugMsg("HTTPServer-embed", "Parsing Multipart Upload"); if(parse_out_chunks(cookie, message, post_chunks) == EHTTP_ERR_OK) { if(parse_out_entries(cookie, post_chunks) == EHTTP_ERR_OK) { if(parse_out_entry_headers( cookie, post_chunks) == EHTTP_ERR_OK) { DebugMsg("HTTPServer-embed", "Parsing Successful"); } } } } else { // Got here, good, we got the entire reported msg length //DebugMsg( "HTTPServer-embed","Entire message is <%s>\r\n",message.c_str()); string test = (char*)message.GetData(); parse_out_pairs(cookie, test, post_parms); } return EHTTP_ERR_OK; }
HRESULT ConvertMemoryBufferToBMPBuffer( MemoryBuffer &image_in, MemoryBuffer &image_out) { // Check to ensure that our data has a valid length before proceeding if( image_in.GetDataLength() == 0 ) return S_FALSE; // Set up a timer class to profile our code ATG::Timer m_Timer; double timeStart, timeStop; // Begin Profiling our Texture Creation Code timeStart = m_Timer.GetAbsoluteTime(); IDirect3DTexture9 * pTexture; HRESULT retVal = D3DXCreateTextureFromFileInMemoryEx( CFreestyleApp::getInstance().m_pd3dDevice, image_in.GetData(), image_in.GetDataLength(), D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 1, D3DUSAGE_CPU_CACHED_MEMORY, D3DFMT_LIN_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &pTexture ); // End Profiling our Texture Creation Code timeStop = m_Timer.GetAbsoluteTime(); DebugMsg("ConvertImageToBMP", "Texture Creation took %4.2f seconds to complete", (float)(timeStop - timeStart)); // If our texture was created successfully, if(retVal = D3D_OK) { //Begin Profiling our Data Manipulation Code timeStart = m_Timer.GetAbsoluteTime(); // Get our level desc D3DSURFACE_DESC desc; pTexture->GetLevelDesc(0, &desc); // Now lock our data D3DLOCKED_RECT lock; RECT rect = {0, 0, desc.Width, desc.Height}; pTexture->LockRect(0, &lock, &rect, D3DLOCK_READONLY); //Read our data DWORD headerSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); DWORD dataLen = lock.Pitch * desc.Height; DWORD * dataBuffer = (DWORD*)malloc( dataLen + headerSize ); DWORD * address = (DWORD*)lock.pBits; // Create file our header BITMAPFILEHEADER* fHead = (BITMAPFILEHEADER*)dataBuffer; fHead->bfType = 0x424D; // "BM" fHead->bfSize = SwapDWORD(dataLen + headerSize); fHead->bfReserved1 = 0; fHead->bfReserved2 = 0; fHead->bfOffBits = SwapDWORD(headerSize); // Create our info header BITMAPINFOHEADER* iHead = (BITMAPINFOHEADER*)(fHead + 1); ZeroMemory(iHead, sizeof(BITMAPINFOHEADER)); iHead->biSize = SwapDWORD(sizeof(BITMAPINFOHEADER)); iHead->biWidth = SwapDWORD(desc.Width); iHead->biHeight = SwapDWORD(desc.Height); iHead->biPlanes = SwapWORD(1); iHead->biBitCount = SwapWORD(32); iHead->biSizeImage = SwapDWORD(dataLen); // Copy over our raw (BGRA) DWORD* rawPtr = (DWORD*)(iHead + 1); for(int y = desc.Height - 1; y >= 0; y--) { for(DWORD x = 0; x < desc.Width; x++) { DWORD cp = (y * lock.Pitch) + (x * 4); DWORD * temp = (DWORD*)(address + (cp / 4)); *rawPtr = SwapDWORD(*temp); rawPtr++; } } // Unlock our texture pTexture->UnlockRect(0); // End Profiling our Data Modification Code timeStop = m_Timer.GetAbsoluteTime(); DebugMsg("ConvertImageToBMP", "Data Modification took %4.2f seconds to complete", (float)(timeStop - timeStart)); // Begin Profiling our Memory Copy Code timeStart = m_Timer.GetAbsoluteTime(); // Copy our completed data to our new buffer image_out.Add(dataBuffer, (headerSize + dataLen)); // End Profiling our Memory Copy Code timeStop = m_Timer.GetAbsoluteTime(); DebugMsg("ConvertImageToBMP", "Image Memory Copy took %4.2f seconds to complete", (float)(timeStop - timeStart)); } else { DebugMsg("ConvertImageInMemoryToBMPBuffer", "Conversion To BMP From Memory Failed. [%X]", retVal); } return retVal; }