ANetworkSession.h revision bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9
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 61bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t destroySession(int32_t sessionID); 62bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 63bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t sendRequest( 64bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t sessionID, const void *data, ssize_t size = -1); 65bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 66bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber enum NotificationReason { 67bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatError, 68bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatConnected, 69bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatClientConnected, 70bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatData, 71bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatDatagram, 72bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kWhatBinaryData, 73bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber }; 74bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 75bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprotected: 76bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber virtual ~ANetworkSession(); 77bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 78bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprivate: 79bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber struct NetworkThread; 80bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber struct Session; 81bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 82bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber Mutex mLock; 83bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber sp<Thread> mThread; 84bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 85bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t mNextSessionID; 86bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 87bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int mPipeFd[2]; 88bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 89bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber KeyedVector<int32_t, sp<Session> > mSessions; 90bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 91bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber enum Mode { 92bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateUDPSession, 93bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateRTSPServer, 94bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber kModeCreateRTSPClient, 95bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber }; 96bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber status_t createClientOrServer( 97bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber Mode mode, 98bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber const struct in_addr *addr, 99bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned port, 100bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const char *remoteHost, 101bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber unsigned remotePort, 102bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber const sp<AMessage> ¬ify, 103bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber int32_t *sessionID); 104bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 105bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber void threadLoop(); 106bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber void interrupt(); 107bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 108bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber static status_t MakeSocketNonBlocking(int s); 109bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 110bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ANetworkSession); 111bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber}; 112bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 113bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber} // namespace android 114bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber 115bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#endif // A_NETWORK_SESSION_H_ 116