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> &notify,
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> &notify, int32_t *sessionID);
476f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber
486f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber    status_t createUDPSession(
496f9aebc2da485775c7e8df2d5ac0a4e07c9978bfAndreas Huber            unsigned localPort, const sp<AMessage> &notify, 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> &notify,
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> &notify, 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> &notify,
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> &notify,
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