1cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber/* 2cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 4cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * you may not use this file except in compliance with the License. 6cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * You may obtain a copy of the License at 7cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 8cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * 10cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * Unless required by applicable law or agreed to in writing, software 11cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * See the License for the specific language governing permissions and 14cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber * limitations under the License. 15cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber */ 16cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 17cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#ifndef A_RTSP_CONNECTION_H_ 18cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 19cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#define A_RTSP_CONNECTION_H_ 20cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 21cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/AHandler.h> 22cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/AString.h> 23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 24cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Hubernamespace android { 25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 26cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberstruct ABuffer; 27cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 28cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberstruct ARTSPResponse : public RefBase { 29cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber unsigned long mStatusCode; 30cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber AString mStatusLine; 31cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber KeyedVector<AString,AString> mHeaders; 32cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber sp<ABuffer> mContent; 33cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}; 34cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 35cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberstruct ARTSPConnection : public AHandler { 369b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber ARTSPConnection(bool uidValid = false, uid_t uid = 0); 37cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 38cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void connect(const char *url, const sp<AMessage> &reply); 39cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void disconnect(const sp<AMessage> &reply); 40cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 41cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void sendRequest(const char *request, const sp<AMessage> &reply); 42cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 430792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber void observeBinaryData(const sp<AMessage> &reply); 440792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber 454579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber static bool ParseURL( 464579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber const char *url, AString *host, unsigned *port, AString *path, 474579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber AString *user, AString *pass); 484579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber 49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberprotected: 50cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber virtual ~ARTSPConnection(); 51cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 53cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberprivate: 54cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber enum State { 55cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber DISCONNECTED, 56cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CONNECTING, 57cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CONNECTED, 58cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber }; 59cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 60cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber enum { 61cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatConnect = 'conn', 62cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatDisconnect = 'disc', 63cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatCompleteConnection = 'comc', 64cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatSendRequest = 'sreq', 65cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatReceiveResponse = 'rres', 660792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber kWhatObserveBinaryData = 'obin', 67cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber }; 68cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 694579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber enum AuthType { 704579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber NONE, 714579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber BASIC, 724579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber DIGEST 734579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber }; 744579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber 75cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber static const int64_t kSelectTimeoutUs; 76cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber bool mUIDValid; 789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber uid_t mUID; 79cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber State mState; 804579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber AString mUser, mPass; 814579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber AuthType mAuthType; 824579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber AString mNonce; 83cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int mSocket; 84cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int32_t mConnectionID; 85cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int32_t mNextCSeq; 86cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool mReceiveResponseEventPending; 87cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 88cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber KeyedVector<int32_t, sp<AMessage> > mPendingRequests; 89cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 900792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber sp<AMessage> mObserveBinaryMessage; 910792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber 92e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber AString mUserAgent; 93e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber 940fbe0577cfeda28bd016110e670708cce0752044Andreas Huber void performDisconnect(); 950fbe0577cfeda28bd016110e670708cce0752044Andreas Huber 96cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onConnect(const sp<AMessage> &msg); 97cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onDisconnect(const sp<AMessage> &msg); 98cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onCompleteConnection(const sp<AMessage> &msg); 99cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onSendRequest(const sp<AMessage> &msg); 100cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onReceiveResponse(); 101cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 102cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void flushPendingRequests(); 103cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void postReceiveReponseEvent(); 104cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 105cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // Return false iff something went unrecoverably wrong. 106cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool receiveRTSPReponse(); 1070792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber status_t receive(void *data, size_t size); 108cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool receiveLine(AString *line); 1090792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber sp<ABuffer> receiveBinaryData(); 110cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool notifyResponseListener(const sp<ARTSPResponse> &response); 111cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1124579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber bool parseAuthMethod(const sp<ARTSPResponse> &response); 1134579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber void addAuthentication(AString *request); 1144579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber 115e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber void addUserAgent(AString *request) const; 116e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber 1174579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber status_t findPendingRequest( 1184579b7d49f6dd4f37e6043e59debfd72d69b8e7bAndreas Huber const sp<ARTSPResponse> &response, ssize_t *index) const; 119cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 1205ef152132b477a07fa31b2ddd39f4cf7a29f68b4Andreas Huber bool handleServerRequest(const sp<ARTSPResponse> &request); 1215ef152132b477a07fa31b2ddd39f4cf7a29f68b4Andreas Huber 122cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber static bool ParseSingleUnsignedLong( 123cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber const char *from, unsigned long *x); 124cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 125e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber static void MakeUserAgent(AString *userAgent); 126e681b91c27439907f216cb6c88426929bc5194bfAndreas Huber 127cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ARTSPConnection); 128cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}; 129cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 130cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} // namespace android 131cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 132cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif // A_RTSP_CONNECTION_H_ 133