| @@ -519,7 +519,6 @@ | |||
| #include <windows.h> | |||
| #include <windowsx.h> | |||
| #include <commdlg.h> | |||
| #include <ws2tcpip.h> | |||
| #include <shellapi.h> | |||
| #include <mmsystem.h> | |||
| #include <vfw.h> | |||
| @@ -8966,6 +8965,7 @@ END_JUCE_NAMESPACE | |||
| /*** Start of inlined file: juce_Socket.cpp ***/ | |||
| #if JUCE_WINDOWS | |||
| #include <winsock2.h> | |||
| #include <ws2tcpip.h> | |||
| #if JUCE_MSVC | |||
| #pragma warning (push) | |||
| @@ -13433,8 +13433,8 @@ struct StringEncodingConverter | |||
| CharPointerType_Src text (source.getCharPointer()); | |||
| const size_t extraBytesNeeded = CharPointerType_Dest::getBytesRequiredFor (text); | |||
| const size_t endOffset = text.sizeInBytes(); | |||
| const size_t endOffset = (text.sizeInBytes() + 3) & ~3; // the new string must be word-aligned or many win32 | |||
| // functions will fail to read it correctly! | |||
| source.preallocateBytes (endOffset + extraBytesNeeded); | |||
| text = source.getCharPointer(); | |||
| @@ -283438,6 +283438,7 @@ BEGIN_JUCE_NAMESPACE | |||
| JAVACLASS (componentPeerViewClass, "com/juce/ComponentPeerView") \ | |||
| JAVACLASS (fileClass, "java/io/File") \ | |||
| JAVACLASS (systemClass, "java/lang/System") \ | |||
| JAVACLASS (stringBufferClass, "java/lang/StringBuffer") \ | |||
| JAVACLASS (contextClass, "android/content/Context") \ | |||
| JAVACLASS (canvasClass, "android/graphics/Canvas") \ | |||
| JAVACLASS (paintClass, "android/graphics/Paint") \ | |||
| @@ -283477,6 +283478,9 @@ BEGIN_JUCE_NAMESPACE | |||
| METHOD (activityClass, excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \ | |||
| METHOD (activityClass, renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \ | |||
| STATICMETHOD (activityClass, createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;ILjava/lang/StringBuffer;)Lcom/juce/JuceAppActivity$HTTPStream;") \ | |||
| \ | |||
| METHOD (stringBufferClass, stringBufferConstructor, "<init>", "()V") \ | |||
| METHOD (stringBufferClass, stringBufferToString, "toString", "()Ljava/lang/String;") \ | |||
| \ | |||
| METHOD (httpStreamClass, httpStreamRelease, "release", "()V") \ | |||
| METHOD (httpStreamClass, httpStreamRead, "read", "([BI)I") \ | |||
| @@ -285395,46 +285399,94 @@ class WebInputStream : public InputStream | |||
| { | |||
| public: | |||
| WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, | |||
| WebInputStream (const String& address, bool isPost, const MemoryBlock& postData, | |||
| URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, | |||
| const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) | |||
| const String& headers, int timeOutMs, StringPairArray* responseHeaders) | |||
| { | |||
| // TODO | |||
| openedOk = false; | |||
| jbyteArray postDataArray = 0; | |||
| if (postData.getSize() > 0) | |||
| { | |||
| postDataArray = getEnv()->NewByteArray (postData.getSize()); | |||
| getEnv()->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); | |||
| } | |||
| LocalRef<jobject> responseHeaderBuffer (getEnv()->NewObject (android.stringBufferClass, android.stringBufferConstructor)); | |||
| stream = GlobalRef (android.activity.callObjectMethod (android.createHTTPStream, | |||
| javaString (address).get(), | |||
| (jboolean) isPost, | |||
| postDataArray, | |||
| javaString (headers).get(), | |||
| (jint) timeOutMs, | |||
| responseHeaderBuffer.get())); | |||
| getEnv()->DeleteLocalRef (postDataArray); | |||
| if (stream != 0) | |||
| { | |||
| StringArray headerLines; | |||
| { | |||
| LocalRef<jstring> headersString ((jstring) getEnv()->CallObjectMethod (responseHeaderBuffer.get(), | |||
| android.stringBufferToString)); | |||
| headerLines.addLines (juceString (headersString)); | |||
| } | |||
| for (int i = 0; i < headerLines.size(); ++i) | |||
| { | |||
| const String& header = headerLines[i]; | |||
| const String key (header.upToFirstOccurrenceOf (": ", false, false)); | |||
| const String value (header.fromFirstOccurrenceOf (": ", false, false)); | |||
| const String previousValue ((*responseHeaders) [key]); | |||
| responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); | |||
| } | |||
| } | |||
| } | |||
| ~WebInputStream() | |||
| { | |||
| stream.callVoidMethod (android.httpStreamRelease); | |||
| } | |||
| bool isExhausted() | |||
| { | |||
| return true; // TODO | |||
| return stream != 0 && stream.callBooleanMethod (android.isExhausted); | |||
| } | |||
| int64 getPosition() | |||
| { | |||
| return 0; // TODO | |||
| return stream != 0 ? stream.callLongMethod (android.getPosition) : 0; | |||
| } | |||
| int64 getTotalLength() | |||
| { | |||
| return -1; // TODO | |||
| return stream != 0 ? stream.callLongMethod (android.getTotalLength) : 0; | |||
| } | |||
| int read (void* buffer, int bytesToRead) | |||
| bool setPosition (int64 wantedPos) | |||
| { | |||
| // TODO | |||
| return 0; | |||
| return stream != 0 && stream.callBooleanMethod (android.setPosition, (jlong) wantedPos); | |||
| } | |||
| bool setPosition (int64 wantedPos) | |||
| int read (void* buffer, int bytesToRead) | |||
| { | |||
| // TODO | |||
| return false; | |||
| JNIEnv* env = getEnv(); | |||
| jbyteArray javaArray = env->NewByteArray (bytesToRead); | |||
| int numBytes = stream.callIntMethod (android.httpStreamRead, javaArray, (jint) bytesToRead); | |||
| if (numBytes > 0) | |||
| env->GetByteArrayRegion (javaArray, 0, numBytes, (jbyte*) buffer); | |||
| env->DeleteLocalRef (javaArray); | |||
| return numBytes; | |||
| } | |||
| bool openedOk; | |||
| GlobalRef stream; | |||
| private: | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); | |||
| @@ -285448,7 +285500,7 @@ InputStream* URL::createNativeStream (const String& address, bool isPost, const | |||
| progressCallback, progressCallbackContext, | |||
| headers, timeOutMs, responseHeaders)); | |||
| return wi->openedOk ? wi.release() : 0; | |||
| return wi->stream != 0 ? wi.release() : 0; | |||
| } | |||
| #endif | |||
| @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||
| */ | |||
| #define JUCE_MAJOR_VERSION 1 | |||
| #define JUCE_MINOR_VERSION 53 | |||
| #define JUCE_BUILDNUMBER 42 | |||
| #define JUCE_BUILDNUMBER 43 | |||
| /** Current Juce version number. | |||
| @@ -33,7 +33,7 @@ | |||
| */ | |||
| #define JUCE_MAJOR_VERSION 1 | |||
| #define JUCE_MINOR_VERSION 53 | |||
| #define JUCE_BUILDNUMBER 42 | |||
| #define JUCE_BUILDNUMBER 43 | |||
| /** Current Juce version number. | |||
| @@ -27,6 +27,7 @@ | |||
| #if JUCE_WINDOWS | |||
| #include <winsock2.h> | |||
| #include <ws2tcpip.h> | |||
| #if JUCE_MSVC | |||
| #pragma warning (push) | |||
| @@ -104,6 +104,7 @@ BEGIN_JUCE_NAMESPACE | |||
| JAVACLASS (componentPeerViewClass, "com/juce/ComponentPeerView") \ | |||
| JAVACLASS (fileClass, "java/io/File") \ | |||
| JAVACLASS (systemClass, "java/lang/System") \ | |||
| JAVACLASS (stringBufferClass, "java/lang/StringBuffer") \ | |||
| JAVACLASS (contextClass, "android/content/Context") \ | |||
| JAVACLASS (canvasClass, "android/graphics/Canvas") \ | |||
| JAVACLASS (paintClass, "android/graphics/Paint") \ | |||
| @@ -146,6 +147,9 @@ BEGIN_JUCE_NAMESPACE | |||
| METHOD (activityClass, excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \ | |||
| METHOD (activityClass, renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \ | |||
| STATICMETHOD (activityClass, createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;ILjava/lang/StringBuffer;)Lcom/juce/JuceAppActivity$HTTPStream;") \ | |||
| \ | |||
| METHOD (stringBufferClass, stringBufferConstructor, "<init>", "()V") \ | |||
| METHOD (stringBufferClass, stringBufferToString, "toString", "()Ljava/lang/String;") \ | |||
| \ | |||
| METHOD (httpStreamClass, httpStreamRelease, "release", "()V") \ | |||
| METHOD (httpStreamClass, httpStreamRead, "read", "([BI)I") \ | |||
| @@ -51,48 +51,96 @@ class WebInputStream : public InputStream | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, | |||
| WebInputStream (const String& address, bool isPost, const MemoryBlock& postData, | |||
| URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, | |||
| const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) | |||
| const String& headers, int timeOutMs, StringPairArray* responseHeaders) | |||
| { | |||
| // TODO | |||
| openedOk = false; | |||
| jbyteArray postDataArray = 0; | |||
| if (postData.getSize() > 0) | |||
| { | |||
| postDataArray = getEnv()->NewByteArray (postData.getSize()); | |||
| getEnv()->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); | |||
| } | |||
| LocalRef<jobject> responseHeaderBuffer (getEnv()->NewObject (android.stringBufferClass, android.stringBufferConstructor)); | |||
| stream = GlobalRef (android.activity.callObjectMethod (android.createHTTPStream, | |||
| javaString (address).get(), | |||
| (jboolean) isPost, | |||
| postDataArray, | |||
| javaString (headers).get(), | |||
| (jint) timeOutMs, | |||
| responseHeaderBuffer.get())); | |||
| getEnv()->DeleteLocalRef (postDataArray); | |||
| if (stream != 0) | |||
| { | |||
| StringArray headerLines; | |||
| { | |||
| LocalRef<jstring> headersString ((jstring) getEnv()->CallObjectMethod (responseHeaderBuffer.get(), | |||
| android.stringBufferToString)); | |||
| headerLines.addLines (juceString (headersString)); | |||
| } | |||
| for (int i = 0; i < headerLines.size(); ++i) | |||
| { | |||
| const String& header = headerLines[i]; | |||
| const String key (header.upToFirstOccurrenceOf (": ", false, false)); | |||
| const String value (header.fromFirstOccurrenceOf (": ", false, false)); | |||
| const String previousValue ((*responseHeaders) [key]); | |||
| responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); | |||
| } | |||
| } | |||
| } | |||
| ~WebInputStream() | |||
| { | |||
| stream.callVoidMethod (android.httpStreamRelease); | |||
| } | |||
| //============================================================================== | |||
| bool isExhausted() | |||
| { | |||
| return true; // TODO | |||
| return stream != 0 && stream.callBooleanMethod (android.isExhausted); | |||
| } | |||
| int64 getPosition() | |||
| { | |||
| return 0; // TODO | |||
| return stream != 0 ? stream.callLongMethod (android.getPosition) : 0; | |||
| } | |||
| int64 getTotalLength() | |||
| { | |||
| return -1; // TODO | |||
| return stream != 0 ? stream.callLongMethod (android.getTotalLength) : 0; | |||
| } | |||
| int read (void* buffer, int bytesToRead) | |||
| bool setPosition (int64 wantedPos) | |||
| { | |||
| // TODO | |||
| return 0; | |||
| return stream != 0 && stream.callBooleanMethod (android.setPosition, (jlong) wantedPos); | |||
| } | |||
| bool setPosition (int64 wantedPos) | |||
| int read (void* buffer, int bytesToRead) | |||
| { | |||
| // TODO | |||
| return false; | |||
| JNIEnv* env = getEnv(); | |||
| jbyteArray javaArray = env->NewByteArray (bytesToRead); | |||
| int numBytes = stream.callIntMethod (android.httpStreamRead, javaArray, (jint) bytesToRead); | |||
| if (numBytes > 0) | |||
| env->GetByteArrayRegion (javaArray, 0, numBytes, (jbyte*) buffer); | |||
| env->DeleteLocalRef (javaArray); | |||
| return numBytes; | |||
| } | |||
| //============================================================================== | |||
| bool openedOk; | |||
| GlobalRef stream; | |||
| private: | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); | |||
| @@ -106,7 +154,7 @@ InputStream* URL::createNativeStream (const String& address, bool isPost, const | |||
| progressCallback, progressCallbackContext, | |||
| headers, timeOutMs, responseHeaders)); | |||
| return wi->openedOk ? wi.release() : 0; | |||
| return wi->stream != 0 ? wi.release() : 0; | |||
| } | |||
| #endif | |||
| @@ -54,7 +54,6 @@ | |||
| #include <windows.h> | |||
| #include <windowsx.h> | |||
| #include <commdlg.h> | |||
| #include <ws2tcpip.h> | |||
| #include <shellapi.h> | |||
| #include <mmsystem.h> | |||
| #include <vfw.h> | |||
| @@ -2067,8 +2067,8 @@ struct StringEncodingConverter | |||
| CharPointerType_Src text (source.getCharPointer()); | |||
| const size_t extraBytesNeeded = CharPointerType_Dest::getBytesRequiredFor (text); | |||
| const size_t endOffset = text.sizeInBytes(); | |||
| const size_t endOffset = (text.sizeInBytes() + 3) & ~3; // the new string must be word-aligned or many win32 | |||
| // functions will fail to read it correctly! | |||
| source.preallocateBytes (endOffset + extraBytesNeeded); | |||
| text = source.getCharPointer(); | |||