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> &notify,
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> &notify, int32_t *sessionID);
47bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
48bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    status_t createUDPSession(
49bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            unsigned localPort, const sp<AMessage> &notify, 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> &notify,
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> &notify, 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> &notify,
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> &notify,
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