BOOL HttpRequest(HTTPREQ* req, const wchar_t* url, const wchar_t* header, DWORD header_length, const char* body, DWORD body_length) { BOOL ret = FALSE; req->internet = WinHttpOpen(NULL, NULL, NULL, NULL, NULL); if (req->internet != NULL) { URL_COMPONENTS urlinfo = {0}; urlinfo.dwStructSize = sizeof(URL_COMPONENTS); urlinfo.dwSchemeLength = (DWORD)-1; urlinfo.dwUserNameLength = (DWORD)-1; urlinfo.dwHostNameLength = (DWORD)-1; urlinfo.dwUrlPathLength = (DWORD)-1; urlinfo.dwExtraInfoLength = (DWORD)-1; urlinfo.dwPasswordLength = (DWORD)-1; if (WinHttpCrackUrl(url, wcslen(url), 0, &urlinfo)) { if (WinHttpSetTimeouts(req->internet, req->resolveTimeout, req->connectTimeout, req->sendTimeout, req->receiveTimeout)) { TCHAR* host = new TCHAR[urlinfo.dwHostNameLength + 1]; wmemset(host, 0, urlinfo.dwHostNameLength + 1); StrCpyN(host, urlinfo.lpszHostName, urlinfo.dwHostNameLength + 1); req->connect = WinHttpConnect(req->internet, host, urlinfo.nPort, 0); if (req->connect != NULL) { if (body == NULL || body_length == 0) req->request = WinHttpOpenRequest(req->connect, L"GET", urlinfo.lpszUrlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); else req->request = WinHttpOpenRequest(req->connect, L"POST", urlinfo.lpszUrlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if (req->request != NULL) { if (WinHttpSendRequest(req->request, header, header_length, (void*)body, body_length, body_length, 0) && WinHttpReceiveResponse(req->request, 0)) { TCHAR status[16] = {0}; DWORD size = sizeof(status); if (WinHttpQueryHeaders(req->request, WINHTTP_QUERY_STATUS_CODE, NULL, status, &size, 0)) { if (StrCmp(status, L"200") == 0) { char buffer[4096] = {0}; DWORD length = 0; while (TRUE) { if (WinHttpReadData(req->request, buffer, sizeof(buffer), &length) && length > 0) { AppendBuffer(&req->buffer, req->dataLength, req->bufferLength, buffer, length); length = 0; } else break; } ret = TRUE; } } } } } SAFE_DELETE_ARRAY(host); } } } return ret; }
size_t XMLClient::bytesToRead(const error_code& error, size_t bytes_read) { size_t result = bytes_read; _timer->cancel(); // Connection closed cleanly by peer // asio errors http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/reference/error__basic_errors.html if (error == boost::asio::error::eof || boost::asio::error::connection_reset == error) { Disconnect(); return 0; } else if (error == boost::asio::error::operation_aborted) { Globals::ErrorMessage(" In bytesToRead Timer expired error \n"); } else if (error) { // This error stops asynchronous reads std::stringstream s; s << "unknown bytesToRead error = (" << error << ") " << error.message() << std::endl; Globals::ErrorMessage(s.str()); return 0; } if (bytes_read > 0) { AppendBuffer(std::string(data_, data_ + bytes_read)); if (_endtag == NonsenseTag()) { _endtag = FindLeadingElement(_current); if (_endtag.empty()) _endtag = NonsenseTag(); } //BufferHandler(std::string(data_, data_+bytes_read), "</CRCLStatus>") ; BufferHandler(_endtag); } StartAyncRead(); return result; }
void* CMirrorBuffer::GetBuffer(uint32 uSlot) { size_t stIndex = uSlot * m_uDataSize; size_t stSize = m_pVecBuffer->size(); Ast(stIndex <= stSize); //如果buffer已经用完,那我们加入一块新数据 if(stIndex == stSize) { AppendBuffer(m_uDataSize); } return &(m_pVecBuffer->at(stIndex)); }
HRESULT CDXVADecoderMpeg2::DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop) { TRACE_MPEG2 ("CDXVADecoderMpeg2::DecodeFrame() : %d\n", nSize); AppendBuffer (pDataIn, nSize, rtStart, rtStop); HRESULT hr = S_OK; while (FindPicture (max (m_nMPEG2BufferPos-int(nSize)-4, 0), 0x00)) { if (m_MPEG2BufferTime[0].nBuffPos != INT_MIN && m_MPEG2BufferTime[0].nBuffPos < m_nMPEG2PicEnd) { rtStart = m_MPEG2BufferTime[0].rtStart; rtStop = m_MPEG2BufferTime[0].rtStop; } else { rtStart = rtStop = INVALID_TIME; } hr = DecodeFrameInternal (m_pMPEG2Buffer, m_nMPEG2PicEnd, rtStart, rtStop); ShrinkBuffer(); } return hr; }
wchar_t* GetMP3Tag(const id3_tag* tag, const char* name) { wchar_t* content = NULL; id3_frame* frame = id3_tag_findframe(tag, name, 0); if (frame != NULL) { id3_field* field = id3_frame_field(frame, 0); id3_field_textencoding encoding = id3_field_gettextencoding(field); field = id3_frame_field(frame, 1); switch (id3_field_type(field)) { case ID3_FIELD_TYPE_STRING: content = GetMP3Text(encoding, field, id3_field_getstring(field)); break; case ID3_FIELD_TYPE_STRINGFULL: content = GetMP3Text(encoding, field, id3_field_getfullstring(field)); break; case ID3_FIELD_TYPE_STRINGLIST: { DWORD dataLength = 0, bufferLength = 0; unsigned int n = id3_field_getnstrings(field); for (unsigned int i = 0; i < n; i++) { wchar_t* p = GetMP3Text(encoding, field, id3_field_getstrings(field, i)); if (p == NULL) continue; AppendBuffer((char**)&content, dataLength, bufferLength, (const char*)p, wcslen(p) * 2 + 1); SAFE_DELETE_ARRAY(p); } } break; } } return content; }
void CMirrorBuffer::Swap(CMirrorBuffer* pOtBuf) { size_t stMySize = m_pVecBuffer->size(); size_t stOtSize = pOtBuf->m_pVecBuffer->size(); size_t stMyIDSize = m_pIDStack->GetIDSize(); size_t stOtIDSize = pOtBuf->m_pIDStack->GetIDSize(); if(stMySize > stOtSize) { pOtBuf->AppendBuffer(stMySize - stOtSize); Ast(stMyIDSize > stOtIDSize); pOtBuf->m_pIDStack->ExpandIdleID(uint32(stMyIDSize - 1) ); } else if(stMySize < stOtSize) { AppendBuffer(stOtSize - stMySize); Ast(stMyIDSize < stOtIDSize); m_pIDStack->ExpandIdleID(stOtIDSize - 1); } swap(m_pVecBuffer, pOtBuf->m_pVecBuffer); swap(m_pIDStack, pOtBuf->m_pIDStack); swap(m_uVersion, pOtBuf->m_uVersion); /* vector<char>* pBuf = m_pVecBuffer; m_pVecBuffer = pOtBuf->m_pVecBuffer; pOtBuf->m_pVecBuffer = pBuf; TIDStack<uint32>* pIDStack = m_pIDStack; m_pIDStack = pOtBuf->m_pIDStack; pOtBuf->m_pIDStack = pIDStack; uint64 uVersion = m_uVersion; m_uVersion = pOtBuf->m_uVersion; pOtBuf->m_uVersion = uVersion; */ }
/** * \pre fp Points to an open infile in which a multi-line dbString has been * reached */ static char *dbReadString(FILE *fp) { char tempLine[125], *p = NULL, *y; int fin = 0, firstLn = 0; while(!fin && sfgets(tempLine, 124, db.is)) { y = strrchr(tempLine, '~'); assert(y != NULL); *y = '\0'; if (y[1] == '$') fin = 1; strcat(tempLine, "\n"); if (*tempLine != '\n') AppendBuffer(&p, tempLine); firstLn = 0; *y = '~'; } if (p && *p) p[strlen(p) - 1] = '\0'; return p; }
// 添加二元运算 const CQString &CQString::operator += ( const CQString &ss ) { AppendBuffer( ss._szBuffer, ss._nLength ) ; return ( *this ) ; }
// 添加二元运算 const CQString &CQString::operator += ( const char *sz ) { AppendBuffer( sz ) ; return ( *this ) ; }
bool LocateConverter::GeneratePatch(const wchar_t *qqwry1_path, const wchar_t *qqwry2_path) { QQWryReader QQWry1(qqwry1_path); QQWryReader QQWry2(qqwry2_path); if ( !QQWry1.IsAvailable() ) return false; if ( !QQWry2.IsAvailable() ) return false; if(QQWry1.GetInfo()->time==QQWry2.GetInfo()->time) return false; // 根据时间交换,低版本在前 QQWryReader *qqwry1 = &QQWry1; QQWryReader *qqwry2 = &QQWry2; if(QQWry1.GetInfo()->time>QQWry2.GetInfo()->time) { QQWryReader *temp = qqwry1; qqwry1 = qqwry2; qqwry2 = temp; } uint32_t i = 0; uint32_t j = 0; uint8_t flag = 0; uint32_t n = 0; uint32_t m = 0; //int x = 1; StringTable string_table1; StringTable string_table2; Buffer RecordBuffer; // 记录 Buffer ResultBuffer; // 最终结果 while(i<qqwry1->GetInfo()->count && j<qqwry2->GetInfo()->count) { LocateItem *Item1 = qqwry1->GetItem(i + 1); LocateItem *Item2 = qqwry2->GetItem(j + 1); if( Item1->begin_ip != Item2->begin_ip ) { if( Item1->begin_ip < Item2->begin_ip ) i++; else j++; flag = 1; continue; } if( Item1->end_ip != Item2->end_ip ) { if( Item1->end_ip < Item2->end_ip ) i++; else j++; flag = 1; continue; } if(flag==1) { flag = 0; //printf("%d-%d,%d-%d\n",n+1,i,m+1,j); for(uint32_t k=0; k<i-n; k++) { DIFFITEM record; record.line = n + 1 + k; record.method = REMOVE; record.begin_ip = 0; record.table1 = 0; record.table2 = 0; AppendBuffer(RecordBuffer, (uint8_t*)&record, sizeof(record)); //printf("%d: 删除 %d\n",x++,n+1+k); } for(uint32_t l=0; l<j-m; l++) { Item2 = qqwry2->GetItem(m + l + 1); DIFFITEM record; record.line = i; record.method = INSERT; record.begin_ip = Item2->begin_ip; record.table1 = string_table1.Append(Item2->region); record.table2 = string_table2.Append(Item2->address); AppendBuffer(RecordBuffer, (uint8_t*)&record, sizeof(record)); //printf("%d: 添加 (%d) -> %d\n", x++, m+1+k, i); } } Item1 = qqwry1->GetItem(i + 1); Item2 = qqwry2->GetItem(j + 1); if( strcmp(Item1->region, Item2->region) || strcmp(Item1->address, Item2->address) ) { DIFFITEM record; record.line = i + 1; record.method = MODIFY; record.begin_ip = 0; record.table1 = string_table1.Append(Item2->region); record.table2 = string_table2.Append(Item2->address); AppendBuffer(RecordBuffer, (uint8_t*)&record, sizeof(record)); //printf("%d: 修改 (%d) -> %d\n", x++, j+1, i+1); } i++; j++; n = i; m = j; } //合并数据区 Buffer *string_table1_buffer = string_table1; Buffer *string_table2_buffer = string_table2; std::copy(RecordBuffer.begin(), RecordBuffer.end(), std::back_inserter(ResultBuffer)); std::copy(string_table1_buffer->begin(), string_table1_buffer->end(), std::back_inserter(ResultBuffer)); std::copy(string_table2_buffer->begin(), string_table2_buffer->end(), std::back_inserter(ResultBuffer)); //生成文件头 DIFFHEADER header; header.magic = DIFF_MAGIC; header.total1 = qqwry1->GetInfo()->count; header.total2 = qqwry2->GetInfo()->count; header.time1 = qqwry1->GetInfo()->time; header.time2 = qqwry2->GetInfo()->time; header.table1 = sizeof(header) + RecordBuffer.size();; header.table2 = header.table1 + string_table1_buffer->size(); header.size = ResultBuffer.size(); header.crc32 = CRC32_MEM((uint8_t*)&header, sizeof(header) - 4); //准备压缩 uint32_t lzma_buffer_len = ResultBuffer.size(); uint8_t *lzma_buffer = (uint8_t *)malloc(lzma_buffer_len); size_t prop_size = LZMA_PROPS_SIZE; BYTE outProps[LZMA_PROPS_SIZE]; LzmaCompress(lzma_buffer, &lzma_buffer_len, &ResultBuffer[0], ResultBuffer.size(), NULL, outProps, &prop_size, 5, 1<<27, 8, 0, 2, 64, 4); //保存文件 char temp[1024]; sprintf(temp,"%d-%d.dif",qqwry1->GetInfo()->time,qqwry2->GetInfo()->time); FILE * out = fopen(temp, "wb"); fwrite(&header, 1, sizeof(header), out); fwrite(outProps, 1, sizeof(outProps), out); fwrite(lzma_buffer, 1, lzma_buffer_len, out); //fwrite(&ResultBuffer[0], 1, ResultBuffer.size(), out); fclose(out); free(lzma_buffer); return true; }
void Append(PLOCATE record) { AppendBuffer( (uint8_t*)record, sizeof(LOCATE)); }
bool LocateConverter::LocateToQQWry(const wchar_t *locate, const wchar_t *qqwry) { LocateReader loc(locate); if ( !loc.IsAvailable() ) return false; uint32_t idx_first = 0; uint32_t idx_last = 0; uint32_t offset = 8; Buffer RecordBuffer; Buffer IndexBuffer; map <string, StrResource> strings; for(uint32_t i=0; i<loc.GetInfo()->count; i++) { LocateItem *item = loc.GetItem(i + 1); AppendBuffer(RecordBuffer, (uint8_t*)&item->end_ip, sizeof(item->end_ip)); offset += 4; if( strings.count(item->region)!=0 ) { if( strings.find(item->region)->second.addresss.count(item->address)!=0 ) { unsigned char redirect = 0x01; AppendBuffer(RecordBuffer, (uint8_t*)&redirect, sizeof(redirect)); AppendBuffer(RecordBuffer, (uint8_t*)&strings.find(item->region)->second.addresss.find(item->address)->second, 3); //printf("%s %s ",item->region,item->address); //printf("%d", strings.find(item->region)->second.addresss.find(item->address)->second); //getchar(); } else { //getchar(); strings.find(item->region)->second.addresss[item->address] = offset; unsigned char redirect = 0x02; AppendBuffer(RecordBuffer, (uint8_t*)&redirect, sizeof(redirect)); AppendBuffer(RecordBuffer, (uint8_t*)&strings.find(item->region)->second.offset, 3); if( strlen(item->address)>3 && strings.count(item->address)!=0 ) { unsigned char redirect = 0x02; AppendBuffer(RecordBuffer, (uint8_t*)&redirect, sizeof(redirect)); AppendBuffer(RecordBuffer, (uint8_t*)&strings.find(item->address)->second.offset, 3); //printf("%s %s ",item->region,item->address); //printf("%X", strings.find(item->region)->second.addresss.find(item->address)->second); //getchar(); } else { StrResource tr; tr.offset = offset + 4; strings[item->address] = tr; AppendBuffer(RecordBuffer, (uint8_t*)item->address, strlen(item->address) + 1); } } } else { StrResource rec; rec.offset = offset; uint32_t len = strlen(item->region) + 1; AppendBuffer(RecordBuffer, (uint8_t*)item->region, len); rec.addresss[item->address] = rec.offset; if( strlen(item->address)>3 && strings.count(item->address)!=0 ) { unsigned char redirect = 0x02; AppendBuffer(RecordBuffer, (uint8_t*)&redirect, sizeof(redirect)); AppendBuffer(RecordBuffer, (uint8_t*)&strings.find(item->address)->second.offset, 3); //printf("1 %s %s %d %d\n",item->region,item->address, strings.find(item->address)->second.offset,rec.offset); } else { StrResource tr; tr.offset = offset + len; strings[item->address] = tr; //printf("2 %s %s %d %d\n",item->region,item->address,tr.offset,rec.offset); AppendBuffer(RecordBuffer, (uint8_t*)item->address, strlen(item->address) + 1); } strings[item->region] = rec; } offset -= 4; AppendBuffer(IndexBuffer, (uint8_t*)&item->begin_ip, sizeof(item->begin_ip)); AppendBuffer(IndexBuffer, (uint8_t*)&offset, 3); offset = RecordBuffer.size() + 8; } idx_first = offset; idx_last = offset + IndexBuffer.size() - 7; FILE * out = _wfopen(qqwry, L"wb"); fwrite(&idx_first, 1, sizeof(idx_first), out); fwrite(&idx_last, 1, sizeof(idx_last), out); fwrite(&RecordBuffer[0], 1, RecordBuffer.size(), out); fwrite(&IndexBuffer[0], 1, IndexBuffer.size(), out); fclose(out); return true; }
nsresult nsByteArray::AppendString(const char *string) { PRUint32 strLength = (string) ? PL_strlen(string) : 0; return AppendBuffer(string, strLength); }