16f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber/* 26f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * Copyright 2012, The Android Open Source Project 36f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * 46f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 56f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * you may not use this file except in compliance with the License. 66f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * You may obtain a copy of the License at 76f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * 86f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 96f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * 106f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * Unless required by applicable law or agreed to in writing, software 116f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 126f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * See the License for the specific language governing permissions and 146f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber * limitations under the License. 156f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber */ 166f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 176f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#ifndef A_NETWORK_SESSION_H_ 186f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 196f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#define A_NETWORK_SESSION_H_ 206f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 216f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#include <media/stagefright/foundation/ABase.h> 226f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#include <utils/KeyedVector.h> 236f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#include <utils/RefBase.h> 246f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#include <utils/Thread.h> 256f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 26ab1bd84889273bc21efdabe5ff6f4633eb918a85Andreas Huber#include <netinet/in.h> 27ab1bd84889273bc21efdabe5ff6f4633eb918a85Andreas Huber 286f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Hubernamespace android { 296f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 306f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huberstruct AMessage; 316f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 3235213f1420c669f43314cb75eadea450d21a75cbAndreas Huber// Helper class to manage a number of live sockets (datagram and stream-based) 3335213f1420c669f43314cb75eadea450d21a75cbAndreas Huber// on a single thread. Clients are notified about activity through AMessages. 346f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huberstruct ANetworkSession : public RefBase { 356f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber ANetworkSession(); 366f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 376f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t start(); 386f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t stop(); 396f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 406f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t createRTSPClient( 416f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber const char *host, unsigned port, const sp<AMessage> ¬ify, 426f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int32_t *sessionID); 436f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 446f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t createRTSPServer( 45ab1bd84889273bc21efdabe5ff6f4633eb918a85Andreas Huber const struct in_addr &addr, unsigned port, 46ab1bd84889273bc21efdabe5ff6f4633eb918a85Andreas Huber const sp<AMessage> ¬ify, int32_t *sessionID); 476f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 486f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t createUDPSession( 496f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber unsigned localPort, const sp<AMessage> ¬ify, int32_t *sessionID); 506f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 516f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t createUDPSession( 526f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber unsigned localPort, 536f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber const char *remoteHost, 546f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber unsigned remotePort, 556f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber const sp<AMessage> ¬ify, 566f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int32_t *sessionID); 576f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 586f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t connectUDPSession( 596f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int32_t sessionID, const char *remoteHost, unsigned remotePort); 606f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 617d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber // passive 627d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber status_t createTCPDatagramSession( 637d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber const struct in_addr &addr, unsigned port, 647d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber const sp<AMessage> ¬ify, int32_t *sessionID); 657d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber 667d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber // active 677d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber status_t createTCPDatagramSession( 687d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber unsigned localPort, 697d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber const char *remoteHost, 707d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber unsigned remotePort, 717d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber const sp<AMessage> ¬ify, 727d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber int32_t *sessionID); 737d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber 746f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t destroySession(int32_t sessionID); 756f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 766f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t sendRequest( 77632177b7446185a0407b7df96f684a9b8b980765Andreas Huber int32_t sessionID, const void *data, ssize_t size = -1, 78632177b7446185a0407b7df96f684a9b8b980765Andreas Huber bool timeValid = false, int64_t timeUs = -1ll); 796f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 806f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber enum NotificationReason { 816f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatError, 826f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatConnected, 836f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatClientConnected, 846f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatData, 856f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatDatagram, 866f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kWhatBinaryData, 87e2aef54fee88fdeb585a41e1e9834e3d975b263cAndreas Huber kWhatNetworkStall, 886f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber }; 896f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 906f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huberprotected: 916f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber virtual ~ANetworkSession(); 926f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 936f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huberprivate: 946f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber struct NetworkThread; 956f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber struct Session; 966f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 976f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber Mutex mLock; 986f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber sp<Thread> mThread; 996f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1006f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int32_t mNextSessionID; 1016f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1026f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int mPipeFd[2]; 1036f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1046f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber KeyedVector<int32_t, sp<Session> > mSessions; 1056f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1066f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber enum Mode { 1076f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kModeCreateUDPSession, 1087d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber kModeCreateTCPDatagramSessionPassive, 1097d34f83f64919295baff4b0e260267af3efb4f9fAndreas Huber kModeCreateTCPDatagramSessionActive, 1106f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kModeCreateRTSPServer, 1116f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber kModeCreateRTSPClient, 1126f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber }; 1136f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber status_t createClientOrServer( 1146f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber Mode mode, 115ab1bd84889273bc21efdabe5ff6f4633eb918a85Andreas Huber const struct in_addr *addr, 1166f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber unsigned port, 1176f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber const char *remoteHost, 1186f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber unsigned remotePort, 1196f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber const sp<AMessage> ¬ify, 1206f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber int32_t *sessionID); 1216f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1226f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber void threadLoop(); 1236f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber void interrupt(); 1246f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1256f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber static status_t MakeSocketNonBlocking(int s); 1266f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1276f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(ANetworkSession); 1286f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber}; 1296f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1306f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber} // namespace android 1316f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber 1326f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber#endif // A_NETWORK_SESSION_H_ 133