Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Url.h"
00026
00027 typedef void CURL;
00028 typedef void CURLM;
00029
00030 namespace cinder {
00031
00032 class IStreamUrlImplCurl : public IStreamUrlImpl {
00033 public:
00034 IStreamUrlImplCurl( const std::string &url, const std::string &user, const std::string &password );
00035 ~IStreamUrlImplCurl();
00036
00037 virtual size_t readDataAvailable( void *dest, size_t maxSize );
00038 virtual void seekAbsolute( off_t absoluteOffset );
00039 virtual void seekRelative( off_t relativeOffset );
00040 virtual off_t tell() const;
00041 virtual off_t size() const;
00042
00043 virtual bool isEof() const;
00044 virtual void IORead( void *t, size_t size );
00045
00046 private:
00047 int bufferRemaining() const { return mBufferedBytes - mBufferOffset; }
00048 void fillBuffer( int wantBytes ) const;
00049
00050 static size_t writeCallback( char *buffer, size_t size, size_t nitems, void *userp );
00051
00052 CURL *mCurl;
00053 CURLM *mMulti;
00054
00055 std::string mUserColonPassword;
00056
00057 mutable int still_running;
00058 mutable bool mStartedRead;
00059
00060 mutable off_t mSize;
00061 mutable bool mSizeCached;
00062 mutable long mResponseCode;
00063 mutable char *mEffectiveUrl;
00064
00065 mutable uint8_t *mBuffer;
00066 mutable int mBufferSize;
00067 mutable int mBufferOffset, mBufferedBytes;
00068 mutable off_t mBufferFileOffset;
00069 static const int DEFAULT_BUFFER_SIZE = 4096;
00070 };
00071
00072 }