ANetworkSession.h revision 8060060217ff16cd67c8f6a15c649f44c343acf0
1bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber/* 2bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Copyright 2012, The Android Open Source Project 3bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * 4bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * you may not use this file except in compliance with the License. 6bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * You may obtain a copy of the License at 7bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * 8bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * 10bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * See the License for the specific language governing permissions and 14bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber * limitations under the License. 15bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber */ 16bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 17bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#ifndef A_NETWORK_SESSION_H_ 18bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 19bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#define A_NETWORK_SESSION_H_ 20bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 21bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <media/stagefright/foundation/ABase.h> 22bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <utils/KeyedVector.h> 23bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <utils/RefBase.h> 24bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#include <utils/Thread.h> 25bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 26bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber#include <netinet/in.h> 27bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber 28bb197f84c4119651e5face418285688ddaf08ea3Andreas Hubernamespace android { 29bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 30bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberstruct AMessage; 31bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// Helper class to manage a number of live sockets (datagram and stream-based) 33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber// on a single thread. Clients are notified about activity through AMessages. 34bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberstruct ANetworkSession : public RefBase { 35bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber ANetworkSession(); 36bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 37bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t start(); 38bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t stop(); 39bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 40bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createRTSPClient( 41bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const char *host, unsigned port, const sp<AMessage> ¬ify, 42bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t *sessionID); 43bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 44bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createRTSPServer( 45bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber const struct in_addr &addr, unsigned port, 46bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber const sp<AMessage> ¬ify, int32_t *sessionID); 47bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 48bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createUDPSession( 49bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned localPort, const sp<AMessage> ¬ify, int32_t *sessionID); 50bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 51bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createUDPSession( 52bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned localPort, 53bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const char *remoteHost, 54bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned remotePort, 55bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const sp<AMessage> ¬ify, 56bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t *sessionID); 57bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 58bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t connectUDPSession( 59bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t sessionID, const char *remoteHost, unsigned remotePort); 60bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 61bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber // passive 62bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber status_t createTCPDatagramSession( 63bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber const struct in_addr &addr, unsigned port, 64bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber const sp<AMessage> ¬ify, int32_t *sessionID); 65bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber 66bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber // active 67bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber status_t createTCPDatagramSession( 68bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber unsigned localPort, 69bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber const char *remoteHost, 70bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber unsigned remotePort, 71bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber const sp<AMessage> ¬ify, 72bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber int32_t *sessionID); 73bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber 74bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t destroySession(int32_t sessionID); 75bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 76bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t sendRequest( 77a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber int32_t sessionID, const void *data, ssize_t size = -1, 78a239dd722e760fe4fd7379b454d7722e1f312928Andreas Huber bool timeValid = false, int64_t timeUs = -1ll); 79bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 808060060217ff16cd67c8f6a15c649f44c343acf0Andreas Huber status_t switchToWebSocketMode(int32_t sessionID); 818060060217ff16cd67c8f6a15c649f44c343acf0Andreas Huber 82bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber enum NotificationReason { 83bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatError, 84bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatConnected, 85bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatClientConnected, 86bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatData, 87bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatDatagram, 88bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatBinaryData, 898060060217ff16cd67c8f6a15c649f44c343acf0Andreas Huber kWhatWebSocketMessage, 90126568c7aeeb5570789e70a310477f44dbdbd885Andreas Huber kWhatNetworkStall, 91bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber }; 92bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 93bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprotected: 94bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber virtual ~ANetworkSession(); 95bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 96bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprivate: 97bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber struct NetworkThread; 98bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber struct Session; 99bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 100bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber Mutex mLock; 101bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber sp<Thread> mThread; 102bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 103bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t mNextSessionID; 104bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 105bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int mPipeFd[2]; 106bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 107bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber KeyedVector<int32_t, sp<Session> > mSessions; 108bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 109bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber enum Mode { 110bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateUDPSession, 111bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber kModeCreateTCPDatagramSessionPassive, 112bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber kModeCreateTCPDatagramSessionActive, 113bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateRTSPServer, 114bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateRTSPClient, 115bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber }; 116bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createClientOrServer( 117bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber Mode mode, 118bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber const struct in_addr *addr, 119bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned port, 120bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const char *remoteHost, 121bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned remotePort, 122bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const sp<AMessage> ¬ify, 123bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t *sessionID); 124bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 125bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber void threadLoop(); 126bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber void interrupt(); 127bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 128bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber static status_t MakeSocketNonBlocking(int s); 129bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 130bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ANetworkSession); 131bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber}; 132bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 133bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber} // namespace android 134bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 135bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#endif // A_NETWORK_SESSION_H_ 136