/* * Copyright 2012, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef A_NETWORK_SESSION_H_ #define A_NETWORK_SESSION_H_ #include #include #include #include #include namespace android { struct AMessage; // Helper class to manage a number of live sockets (datagram and stream-based) // on a single thread. Clients are notified about activity through AMessages. struct ANetworkSession : public RefBase { ANetworkSession(); status_t start(); status_t stop(); status_t createRTSPClient( const char *host, unsigned port, const sp ¬ify, int32_t *sessionID); status_t createRTSPServer( const struct in_addr &addr, unsigned port, const sp ¬ify, int32_t *sessionID); status_t createUDPSession( unsigned localPort, const sp ¬ify, int32_t *sessionID); status_t createUDPSession( unsigned localPort, const char *remoteHost, unsigned remotePort, const sp ¬ify, int32_t *sessionID); status_t connectUDPSession( int32_t sessionID, const char *remoteHost, unsigned remotePort); // passive status_t createTCPDatagramSession( const struct in_addr &addr, unsigned port, const sp ¬ify, int32_t *sessionID); // active status_t createTCPDatagramSession( unsigned localPort, const char *remoteHost, unsigned remotePort, const sp ¬ify, int32_t *sessionID); status_t destroySession(int32_t sessionID); status_t sendRequest( int32_t sessionID, const void *data, ssize_t size = -1, bool timeValid = false, int64_t timeUs = -1ll); enum NotificationReason { kWhatError, kWhatConnected, kWhatClientConnected, kWhatData, kWhatDatagram, kWhatBinaryData, kWhatNetworkStall, }; protected: virtual ~ANetworkSession(); private: struct NetworkThread; struct Session; Mutex mLock; sp mThread; int32_t mNextSessionID; int mPipeFd[2]; KeyedVector > mSessions; enum Mode { kModeCreateUDPSession, kModeCreateTCPDatagramSessionPassive, kModeCreateTCPDatagramSessionActive, kModeCreateRTSPServer, kModeCreateRTSPClient, }; status_t createClientOrServer( Mode mode, const struct in_addr *addr, unsigned port, const char *remoteHost, unsigned remotePort, const sp ¬ify, int32_t *sessionID); void threadLoop(); void interrupt(); static status_t MakeSocketNonBlocking(int s); DISALLOW_EVIL_CONSTRUCTORS(ANetworkSession); }; } // namespace android #endif // A_NETWORK_SESSION_H_