ARTSPConnection.h revision 0792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2
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 { 36cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber ARTSPConnection(); 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 45cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberprotected: 46cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber virtual ~ARTSPConnection(); 47cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 48cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huberprivate: 50cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber enum State { 51cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber DISCONNECTED, 52cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CONNECTING, 53cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber CONNECTED, 54cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber }; 55cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 56cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber enum { 57cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatConnect = 'conn', 58cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatDisconnect = 'disc', 59cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatCompleteConnection = 'comc', 60cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatSendRequest = 'sreq', 61cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber kWhatReceiveResponse = 'rres', 620792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber kWhatObserveBinaryData = 'obin', 63cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber }; 64cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 65cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber static const int64_t kSelectTimeoutUs; 66cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 67cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber State mState; 68cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int mSocket; 69cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int32_t mConnectionID; 70cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber int32_t mNextCSeq; 71cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool mReceiveResponseEventPending; 72cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 73cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber KeyedVector<int32_t, sp<AMessage> > mPendingRequests; 74cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 750792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber sp<AMessage> mObserveBinaryMessage; 760792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber 77cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onConnect(const sp<AMessage> &msg); 78cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onDisconnect(const sp<AMessage> &msg); 79cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onCompleteConnection(const sp<AMessage> &msg); 80cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onSendRequest(const sp<AMessage> &msg); 81cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void onReceiveResponse(); 82cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 83cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void flushPendingRequests(); 84cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber void postReceiveReponseEvent(); 85cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 86cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber // Return false iff something went unrecoverably wrong. 87cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool receiveRTSPReponse(); 880792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber status_t receive(void *data, size_t size); 89cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool receiveLine(AString *line); 900792ce7e0924ebb0dbe7b7cfcd79d12cbdb03ed2Andreas Huber sp<ABuffer> receiveBinaryData(); 91cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber bool notifyResponseListener(const sp<ARTSPResponse> &response); 92cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 93cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber static bool ParseURL( 94cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber const char *url, AString *host, unsigned *port, AString *path); 95cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 96cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber static bool ParseSingleUnsignedLong( 97cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber const char *from, unsigned long *x); 98cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 99cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ARTSPConnection); 100cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber}; 101cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 102cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber} // namespace android 103cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber 104cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#endif // A_RTSP_CONNECTION_H_ 105