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