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(
77bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            int32_t sessionID, const void *data, ssize_t size = -1);
78bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
79bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    enum NotificationReason {
80bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatError,
81bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatConnected,
82bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatClientConnected,
83bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatData,
84bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatDatagram,
85bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kWhatBinaryData,
86bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    };
87bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
88bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprotected:
89bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    virtual ~ANetworkSession();
90bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
91bb197f84c4119651e5face418285688ddaf08ea3Andreas Huberprivate:
92bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    struct NetworkThread;
93bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    struct Session;
94bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
95bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    Mutex mLock;
96bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    sp<Thread> mThread;
97bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
98bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    int32_t mNextSessionID;
99bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
100bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    int mPipeFd[2];
101bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
102bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    KeyedVector<int32_t, sp<Session> > mSessions;
103bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
104bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    enum Mode {
105bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kModeCreateUDPSession,
106bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber        kModeCreateTCPDatagramSessionPassive,
107bd08e2f93bafd02abf2c25d740e9fb8bce455a99Andreas Huber        kModeCreateTCPDatagramSessionActive,
108bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kModeCreateRTSPServer,
109bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber        kModeCreateRTSPClient,
110bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    };
111bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    status_t createClientOrServer(
112bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            Mode mode,
113bcf09f8c995221e75c7cd328f25c7cc6d2b5f7c9Andreas Huber            const struct in_addr *addr,
114bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            unsigned port,
115bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            const char *remoteHost,
116bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            unsigned remotePort,
117bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            const sp<AMessage> &notify,
118bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber            int32_t *sessionID);
119bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
120bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    void threadLoop();
121bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    void interrupt();
122bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
123bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    static status_t MakeSocketNonBlocking(int s);
124bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
125bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ANetworkSession);
126bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber};
127bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
128bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber}  // namespace android
129bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber
130bb197f84c4119651e5face418285688ddaf08ea3Andreas Huber#endif  // A_NETWORK_SESSION_H_
131