void TLUserData::write(TLFrame& dest, size_t& wp) const { #if 1 // First write TP-User-Data-Length dest.writeField(wp,mLength,8); // Then write TP-User-Data // This tail() works because UD is always the last field in the PDU. BitVector ud_dest = dest.tail(wp); mRawData.copyTo(ud_dest); ud_dest.LSB8MSB(); #else // Stuff we don't support... assert(!mUDHI); assert(mDCS==0); unsigned numChar = strlen(mData); dest.writeField(wp,numChar,8); // This tail() works because UD is always the last field in the PDU. BitVector chars = dest.tail(wp); chars.zero(); for (unsigned i=0; i<numChar; i++) { char gsm = encodeGSMChar(mData[i]); dest.writeFieldReversed(wp,gsm,7); } chars.LSB8MSB(); #endif }
void TLAddress::write(TLFrame& dest, size_t& wp) const { dest.writeField(wp,mDigits.size(),8); dest.writeField(wp, 0x01, 1); dest.writeField(wp, mType, 3); dest.writeField(wp, mPlan, 4); mDigits.write(dest,wp); }
void TLDeliver::writeBody(TLFrame& dest, size_t& wp) const { writeMMS(dest); writeRP(dest); writeUDHI(dest, mUD.UDHI()); writeSRI(dest); mOA.write(dest,wp); dest.writeField(wp,mPID,8); dest.writeField(wp,mUD.DCS(),8); mSCTS.write(dest,wp); writeUnused(dest); mUD.write(dest,wp); }
// (pat) See 3GPP 3.40 9.2.2 void TLDeliver::writeBody(TLFrame& dest, size_t& wp) const { writeMMS(dest); // more messages to send bit. writeRP(dest); // reply path bit. writeUDHI(dest, mUD.UDHI()); // User-data-header-indicator bit writeSRI(dest); // status-report-indication bit mOA.write(dest,wp); // originating address dest.writeField(wp,mPID,8); // protocol id dest.writeField(wp,mUD.DCS(),8); // Data-coding-scheme mSCTS.write(dest,wp); // service-centre-time-stamp writeUnused(dest); // user-data-length. (pat) Why empty? mUD.write(dest,wp); // user data. }
void TLValidityPeriod::write(TLFrame& dest, size_t& wp) const { if (mVPF==0) return; // We only support VPF==1. assert(mVPF==1); int seconds = mExpiration.seconds() - time(NULL); int minutes = seconds/60; if (minutes<1) minutes=1; unsigned vp; if (minutes<=720) vp = (minutes-1)/5; else if (minutes<1440) vp = 143 + (minutes-720)/30; else if (minutes<43200) vp = 166 + minutes/(24*60); else vp = 192 + minutes/(7*24*60); if (vp>255) vp=255; dest.writeField(wp,vp,8); }
void TLUserData::write(TLFrame& dest, size_t& wp) const { // Stuff we don't support... assert(!mUDHI); assert(mDCS==0); unsigned numChar = strlen(mData); dest.writeField(wp,numChar,8); // This tail() works because UD is always the last field in the PDU. BitVector chars = dest.tail(wp); chars.zero(); for (unsigned i=0; i<numChar; i++) { char gsm = encodeGSMChar(mData[i]); dest.writeFieldReversed(wp,gsm,7); } chars.LSB8MSB(); }