static size_t StreamObjectHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data) { size_t realsize = size* nmemb; StreamObject* sp = (StreamObject*)data; sp->writeHeader((const char*)ptr, realsize); return realsize; }
size_t EasyCurl::StreamMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; StreamObject* sp = (StreamObject*)data; sp->write((const char*)ptr, realsize); return realsize; }
void ZipObject::closeArchive() { if(mZipArchive == NULL) return; for(S32 i = 0;i < mStreamPool.size();++i) { StreamObject *so = mStreamPool[i]; if(so && so->getStream() != NULL) closeFile(so); SAFE_DELETE_OBJECT(mStreamPool[i]); } mStreamPool.clear(); mZipArchive->closeArchive(); SAFE_DELETE(mZipArchive); }
StreamObject *ZipObject::createStreamObject(Stream *stream) { for(S32 i = 0;i < mStreamPool.size();++i) { StreamObject *so = mStreamPool[i]; if(so == NULL) { // Reuse any free locations in the pool so = new StreamObject(stream); so->registerObject(); mStreamPool[i] = so; return so; } if(so->getStream() == NULL) { // Existing unused stream, update it and return it so->setStream(stream); return so; } } // No free object found, create a new one StreamObject *so = new StreamObject(stream); so->registerObject(); mStreamPool.push_back(so); return so; }
osgDB::ReaderWriter::WriteResult EasyCurl::write(const std::string& proxyAddress, const std::string& fileName, StreamObject& sp, const osgDB::ReaderWriter::Options *options) { setOptions(proxyAddress, fileName, sp, options); char* postedContent = NULL; // Copy data from istream into buffer. long contentLength = 0; const int bufferSize = 4096; while(true) { postedContent = (char *)realloc(postedContent, contentLength + bufferSize); size_t gotBytes = sp.read(postedContent + contentLength, bufferSize); if (gotBytes == 0) break; contentLength += gotBytes; }; // Extract name and mime type of buffer to upload. std::string uploadFileName = getFileNameFromURL(fileName); std::string ext = osgDB::getLowerCaseFileExtension(uploadFileName); std::string mimeType = getMimeTypeForExtension(ext); // Construct "multipart/form-data" (RFC 1867) form elements for file upload. struct curl_httppost* post = NULL; struct curl_httppost* last = NULL; curl_formadd(&post, &last, CURLFORM_COPYNAME, "upload", CURLFORM_CONTENTTYPE, mimeType.c_str(), CURLFORM_BUFFER, uploadFileName.c_str(), CURLFORM_BUFFERPTR, postedContent, CURLFORM_BUFFERLENGTH, contentLength, CURLFORM_END); // Tell curl to use HTTP POST to send the form data. curl_easy_setopt(_curl, CURLOPT_HTTPPOST, post); CURLcode responseCode = curl_easy_perform(_curl); if (post) curl_formfree(post); if (postedContent) free(postedContent); curl_easy_setopt(_curl, CURLOPT_HTTPPOST, (void *)0); curl_easy_setopt(_curl, CURLOPT_HTTPGET, 1L); curl_easy_setopt(_curl, CURLOPT_WRITEDATA, (void *)0); if (processResponse(responseCode, proxyAddress, fileName, sp).success()) { osgDB::ReaderWriter::WriteResult result(osgDB::ReaderWriter::WriteResult::FILE_SAVED); std::stringstream* ss = dynamic_cast<std::stringstream*>(sp._outputStream); if (ss) { // Put the server response in the message part of the result object. result.message() = ss->str(); } return result; } else { return osgDB::ReaderWriter::WriteResult::ERROR_IN_WRITING_FILE; } }