void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) { sp<AMessage> reply; CHECK(msg->findMessage("reply", &reply)); if (mState != CONNECTED) { reply->setInt32("result", -ENOTCONN); reply->post(); return; } AString request; CHECK(msg->findString("request", &request)); // Just in case we need to re-issue the request with proper authentication // later, stash it away. reply->setString("original-request", request.c_str(), request.size()); addAuthentication(&request); addUserAgent(&request); // Find the boundary between headers and the body. ssize_t i = request.find("\r\n\r\n"); CHECK_GE(i, 0); int32_t cseq = mNextCSeq++; AString cseqHeader = "CSeq: "; cseqHeader.append(cseq); cseqHeader.append("\r\n"); request.insert(cseqHeader, i + 2); ALOGV("request: '%s'", request.c_str()); size_t numBytesSent = 0; while (numBytesSent < request.size()) { ssize_t n = send(mSocket, request.c_str() + numBytesSent, request.size() - numBytesSent, 0); if (n < 0 && errno == EINTR) { continue; } if (n <= 0) { performDisconnect(); if (n == 0) { // Server closed the connection. ALOGE("Server unexpectedly closed the connection."); reply->setInt32("result", ERROR_IO); reply->post(); } else { ALOGE("Error sending rtsp request. (%s)", strerror(errno)); reply->setInt32("result", -errno); reply->post(); } return; } numBytesSent += (size_t)n; } mPendingRequests.add(cseq, reply); }
void ARTSPConnection::onSendRequest(const sp<AMessage> &msg) { #ifndef ANDROID_DEFAULT_CODE int32_t backup; if (msg->findInt32("backup-keep-tcp", &backup)) { mForceQuitTCP = backup; } #endif sp<AMessage> reply; CHECK(msg->findMessage("reply", &reply)); if (mState != CONNECTED) { reply->setInt32("result", -ENOTCONN); reply->post(); return; } AString request; CHECK(msg->findString("request", &request)); // Just in case we need to re-issue the request with proper authentication // later, stash it away. reply->setString("original-request", request.c_str(), request.size()); #ifndef ANDROID_DEFAULT_CODE // mtk80902: ALPS01139972 - SETUP resp with a wrong Session "xxx\0\0\0.." // so the followed \r\n is ignored by find's strstr operation if (request.find("\r\n\r\n") < 0) { ALOGW("what the hell with this req?"); // seems print str is useless.. reply->setInt32("result", -EBADMSG); reply->post(); return; } #endif addAuthentication(&request); addUserAgent(&request); // Find the boundary between headers and the body. ssize_t i = request.find("\r\n\r\n"); CHECK_GE(i, 0); int32_t cseq = mNextCSeq++; AString cseqHeader = "CSeq: "; cseqHeader.append(cseq); cseqHeader.append("\r\n"); request.insert(cseqHeader, i + 2); #ifndef ANDROID_DEFAULT_CODE ALOGI("request: '%s'", request.c_str()); #else ALOGV("request: '%s'", request.c_str()); #endif size_t numBytesSent = 0; while (numBytesSent < request.size()) { ssize_t n = #ifndef ANDROID_DEFAULT_CODE send(mSocket, request.c_str() + numBytesSent, request.size() - numBytesSent, MTK_SEND_FLAG); #else send(mSocket, request.c_str() + numBytesSent, request.size() - numBytesSent, 0); #endif if (n < 0 && errno == EINTR) { continue; } if (n <= 0) { performDisconnect(); if (n == 0) { // Server closed the connection. ALOGE("Server unexpectedly closed the connection."); reply->setInt32("result", ERROR_IO); reply->post(); } else { ALOGE("Error sending rtsp request. (%s)", strerror(errno)); reply->setInt32("result", -errno); reply->post(); } return; } numBytesSent += (size_t)n; } mPendingRequests.add(cseq, reply); #ifndef ANDROID_DEFAULT_CODE sp<AMessage> timeout = new AMessage(kWhatTimeout, id()); timeout->setInt32("cseq", cseq); int64_t t; if (reply->findInt64("timeout", &t)) { timeout->post(t); } else { timeout->post(kRequestTimeout); } #endif // #ifndef ANDROID_DEFAULT_CODE }