11156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber/*
21156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Copyright (C) 2011 The Android Open Source Project
31156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
41156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * you may not use this file except in compliance with the License.
61156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * You may obtain a copy of the License at
71156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
81156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *
101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Unless required by applicable law or agreed to in writing, software
111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * See the License for the specific language governing permissions and
141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * limitations under the License.
151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */
161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#ifndef CHROME_HTTP_DATA_SOURCE_H_
181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#define CHROME_HTTP_DATA_SOURCE_H_
201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/foundation/AString.h>
221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <utils/threads.h>
231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "HTTPBase.h"
251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android {
271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstruct SfDelegate;
291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstruct ChromiumHTTPDataSource : public HTTPBase {
311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    ChromiumHTTPDataSource(uint32_t flags = 0);
321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual status_t connect(
341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            const char *uri,
351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            const KeyedVector<String8, String8> *headers = NULL,
361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            off64_t offset = 0);
371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual void disconnect();
391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual status_t initCheck() const;
411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual ssize_t readAt(off64_t offset, void *data, size_t size);
431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual status_t getSize(off64_t *size);
441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual uint32_t flags();
451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
469d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    virtual sp<DecryptHandle> DrmInitialization(const char *mime);
471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
48b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client);
491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual String8 getUri();
511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
526511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    virtual String8 getMIMEType() const;
536511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
540683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    virtual status_t reconnectAtOffset(off64_t offset);
550683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
56b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber    static status_t UpdateProxyConfig(
57b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber            const char *host, int32_t port, const char *exclusionList);
58b7319a7eb0a06ef4fd3a0c9157ee63e637ad7aa1Andreas Huber
591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberprotected:
601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    virtual ~ChromiumHTTPDataSource();
611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberprivate:
631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    friend struct SfDelegate;
641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    enum State {
661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        DISCONNECTED,
671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        CONNECTING,
681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        CONNECTED,
691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        READING,
701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        DISCONNECTING
711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    };
721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    const uint32_t mFlags;
741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mutable Mutex mLock;
761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Condition mCondition;
771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    State mState;
791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    SfDelegate *mDelegate;
811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    AString mURI;
831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    KeyedVector<String8, String8> mHeaders;
841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    off64_t mCurrentOffset;
861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    // Any connection error or the result of a read operation
881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    // (for the lattter this is the number of bytes read, if successful).
891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    ssize_t mIOResult;
901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    int64_t mContentSize;
921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
936511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    String8 mContentType;
946511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
95b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    sp<DecryptHandle> mDecryptHandle;
961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    DrmManagerClient *mDrmManagerClient;
971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void disconnect_l();
991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    status_t connect_l(
1011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            const char *uri,
1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            const KeyedVector<String8, String8> *headers,
1031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            off64_t offset);
1041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    static void InitiateRead(
1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            ChromiumHTTPDataSource *me, void *data, size_t size);
1071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void initiateRead(void *data, size_t size);
1091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1106511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    void onConnectionEstablished(
1116511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            int64_t contentSize, const char *contentType);
1126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
1131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void onConnectionFailed(status_t err);
1141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void onReadCompleted(ssize_t size);
1151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void onDisconnectComplete();
116e2492dc46f5476e3abc617ee21d74f44198591ddMartin Storsjo    void onRedirect(const char *url);
1171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    void clearDRMState_l();
1191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ChromiumHTTPDataSource);
1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber};
1221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}  // namespace android
1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#endif  // CHROME_HTTP_DATA_SOURCE_H_
126