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/Cinder.h"
00026 #include "cinder/Stream.h"
00027
00028 typedef void CURL;
00029 typedef void CURLM;
00030
00031 namespace cinder {
00032
00033 class Url {
00034 public:
00035 Url() {}
00036 explicit Url( const std::string &urlString );
00037
00038 std::string str() const { return mStr; }
00039 const char* c_str() const { return mStr.c_str(); }
00040
00041 private:
00042 std::string mStr;
00043 };
00044
00046 typedef shared_ptr<class IStreamUrl> IStreamUrlRef;
00047
00049 class IStreamUrl : public IStream {
00050 public:
00052 static IStreamUrlRef createRef( const std::string &url, const std::string &user, const std::string &password );
00053 ~IStreamUrl();
00054
00055 virtual size_t readDataAvailable( void *dest, size_t maxSize );
00056 virtual void seekAbsolute( off_t absoluteOffset );
00057 virtual void seekRelative( off_t relativeOffset );
00058 virtual off_t tell() const { return mBufferFileOffset + mBufferOffset; }
00059 virtual off_t size() const;
00060
00061 virtual bool isEof() const;
00062
00063 std::string getUser() const { return mUser; }
00064 std::string getPassword() const { return mPassword; }
00065 long getResponseCode() const;
00066 std::string getEffectiveUrl() const;
00067
00068
00069 protected:
00070 IStreamUrl( const std::string &url, const std::string &user, const std::string &password );
00071
00072 virtual void IORead( void *t, size_t size );
00073 virtual void IOWrite( const void *t, size_t size ) {}
00074
00075 int bufferRemaining() const { return mBufferedBytes - mBufferOffset; }
00076 void fillBuffer( int wantBytes ) const;
00077
00078 static size_t writeCallback( char *buffer, size_t size, size_t nitems, void *userp );
00079
00080 private:
00081 CURL *mCurl;
00082 CURLM *mMulti;
00083 const std::string mUser, mPassword;
00084 std::string mUserColonPassword;
00085
00086 mutable int still_running;
00087 mutable bool mStartedRead;
00088
00089 mutable off_t mSize;
00090 mutable bool mSizeCached;
00091 mutable long mResponseCode;
00092 mutable char *mEffectiveUrl;
00093
00094 mutable uint8_t *mBuffer;
00095 mutable int mBufferSize;
00096 mutable int mBufferOffset, mBufferedBytes;
00097 mutable off_t mBufferFileOffset;
00098 static const int DEFAULT_BUFFER_SIZE = 4096;
00099 };
00100
00101 IStreamUrlRef loadUrlStream( const Url &url );
00102 IStreamUrlRef loadUrlStream( const std::string &url, const std::string &user = "", const std::string &password = "" );
00103
00104 }