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;
 }
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
    }
}