Exemplo n.º 1
0
// originally from libdtv, Copyright Rolf Hakenes <*****@*****.**>
void String::decodeText(char *buffer, int size) {
   const unsigned char *from=data.getData(0);
   char *to=buffer;
   int len=getLength();
   if (len <= 0) {
      *to = '\0';
      return;
      }
   bool singleByte;
   const char *cs = getCharacterTable(from, len, &singleByte);
   // FIXME Need to make this UTF-8 aware (different control codes).
   // However, there's yet to be found a broadcaster that actually
   // uses UTF-8 for the SI data... (kls 2007-06-10)
   for (int i = 0; i < len; i++) {
      if (*from == 0)
         break;
      if (    ((' ' <= *from) && (*from <= '~'))
           || (*from == '\n')
           || (0xA0 <= *from)
         )
         *to++ = *from;
      else if (*from == 0x8A)
         *to++ = '\n';
      from++;
      if (to - buffer >= size - 1)
         break;
   }
   *to = '\0';
   if (!singleByte || !SystemCharacterTableIsSingleByte) {
      char convBuffer[size];
      if (convertCharacterTable(buffer, strlen(buffer), convBuffer, sizeof(convBuffer), cs))
         strncpy(buffer, convBuffer, strlen(convBuffer) + 1);
   }
}
Exemplo n.º 2
0
bool CFarInetMessage::SetEncoding( long Encoding )
{
  if ( Encoding == FCT_DEFAULT )
  {
    Encoding = FCT__INVALID;

    CMimeContent mc(GetKludge(K_RFC_ContentType));
    if (FarSF::LStricmp(mc.getType(), "text") == 0)
    {
      LPCSTR charset = mc.getDataValue("charset");
      if (charset != NULL)
        Encoding = getCharacterTable(charset);
    }
  }
  else if ( Encoding == FCT_DETECT )
    Encoding = Far::DetectCharTable( (LPSTR)m_Data.data, m_Data.size );

  return CInetMessageT::SetEncoding( Encoding );
}
Exemplo n.º 3
0
// originally from libdtv, Copyright Rolf Hakenes <*****@*****.**>
void String::decodeText(char *buffer, int size) {
   const unsigned char *from=data.getData(0);
   char *to=buffer;
   int len=getLength();
   if (len <= 0) {
      *to = '\0';
      return;
   }
   bool singleByte;
   const char *cs = getCharacterTable(from, len, &singleByte);
   if (singleByte && SystemCharacterTableIsSingleByte || !convertCharacterTable((const char *)from, len, to, size, cs)) {
      if (len >= size)
         len = size - 1;
      strncpy(to, (const char *)from, len);
      to[len] = 0;
   }
   else
      len = strlen(to); // might have changed
   // Handle control codes:
   while (len > 0) {
      int l = Utf8CharLen(to);
      if (l <= 2) {
         unsigned char *p = (unsigned char *)to;
         if (l == 2 && *p == 0xC2) // UTF-8 sequence
            p++;
         bool Move = true;
         switch (*p) {
           case 0x8A: *to = '\n'; break;
           case 0xA0: *to = ' ';  break;
           default:   Move = false;
         }
         if (l == 2 && Move) {
            memmove(p, p + 1, len - 1); // we also copy the terminating 0!
            len -= 1;
            l = 1;
         }
      }
      to += l;
      len -= l;
   }
}
Exemplo n.º 4
0
bool CFarInetMessage::setEncoding( LPCSTR encoding )
{
  return encoding ? SetEncoding( getCharacterTable( encoding ) ) : false;
}
Exemplo n.º 5
0
Arquivo: si.c Projeto: suborb/reelvdr
void String::decodeText(char *buffer, int size, const char* charset) {
#else
void String::decodeText(char *buffer, int size) {
#endif
   const unsigned char *from=data.getData(0);
   char *to=buffer;
   int len=getLength();
   if (len <= 0) {
      *to = '\0';
      return;
      }
   bool singleByte;

   if ( from[0] == 0x1f ) {
       char *temp = freesat_huffman_decode(from, len);
       if (temp ) {
           len = strlen(temp);
           len = len < size - 1 ? len : size - 1;
           strncpy(buffer, temp, len);
           buffer[len] = 0;
           free(temp);
          return;
       }
   }
#ifdef USE_PROVIDERCHARSET
const char* cs;
if (charset)
	cs = charset;
else
	cs = getCharacterTable(from, len, &singleByte);
#else
   const char *cs = getCharacterTable(from, len, &singleByte);
#endif
   // FIXME Need to make this UTF-8 aware (different control codes).
   // However, there's yet to be found a broadcaster that actually
   // uses UTF-8 for the SI data... (kls 2007-06-10)
   for (int i = 0; i < len; i++) {
      if (*from == 0)
         break;
      if (    ((' ' <= *from) && (*from <= '~'))
           || (*from == '\n')
           || (0xA0 <= *from)
         )
         *to++ = *from;
      else if (*from == 0x8A)
         *to++ = '\n';
      from++;
      if (to - buffer >= size - 1)
         break;
   }
   *to = '\0';
   if (!singleByte || !SystemCharacterTableIsSingleByte) {
      char convBuffer[size];
      if (convertCharacterTable(buffer, strlen(buffer), convBuffer, sizeof(convBuffer), cs))
         strncpy(buffer, convBuffer, strlen(convBuffer) + 1);
   }
}

#ifdef USE_PROVIDERCHARSET
void String::decodeText(char *buffer, char *shortVersion, int sizeBuffer, int sizeShortVersion, const char* charset) {
#else
void String::decodeText(char *buffer, char *shortVersion, int sizeBuffer, int sizeShortVersion) {
#endif
   const unsigned char *from=data.getData(0);
   unsigned char *temp = NULL;
   char *to=buffer;
   char *toShort=shortVersion;
   int IsShortName=0;
   int len=getLength();
   if (len <= 0) {
      *to = '\0';
      *toShort = '\0';
      return;
      }


   if ( from[0] == 0x1f ) {
       temp = ( unsigned char *)freesat_huffman_decode(from, len);
       from = temp;
   }


   bool singleByte;
#ifdef USE_PROVIDERCHARSET
const char* cs;
if (charset)
	cs = charset;
else
	cs = getCharacterTable(from, len, &singleByte);
#else
   const char *cs = getCharacterTable(from, len, &singleByte);
#endif
   // FIXME Need to make this UTF-8 aware (different control codes).
   // However, there's yet to be found a broadcaster that actually
   // uses UTF-8 for the SI data... (kls 2007-06-10)
   for (int i = 0; i < len; i++) {
      if (    ((' ' <= *from) && (*from <= '~'))
           || (*from == '\n')
           || (0xA0 <= *from)
         )
      {
         *to++ = *from;
         if (IsShortName)
            *toShort++ = *from;
      }
      else if (*from == 0x8A)
         *to++ = '\n';
      else if (*from == 0x86)
         IsShortName++;
      else if (*from == 0x87)
         IsShortName--;
      else if (*from == 0)
         break;
      from++;
      if (to - buffer >= sizeBuffer - 1 || toShort - shortVersion >= sizeShortVersion - 1)
         break;
   }
   *to = '\0';
   *toShort = '\0';
   if (!singleByte || !SystemCharacterTableIsSingleByte) {
      char convBuffer[sizeBuffer];
      if (convertCharacterTable(buffer, strlen(buffer), convBuffer, sizeof(convBuffer), cs))
         strncpy(buffer, convBuffer, strlen(convBuffer) + 1);
      char convShortVersion[sizeShortVersion];
      if (convertCharacterTable(shortVersion, strlen(shortVersion), convShortVersion, sizeof(convShortVersion), cs))
         strncpy(shortVersion, convShortVersion, strlen(convShortVersion) + 1);
   }
   if (temp) free(temp);
}

Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain, bool returnUnimplemetedDescriptor) {
   Descriptor *d=0;
   switch (domain) {
   case SI:
      switch ((DescriptorTag)da.getData<DescriptorHeader>()->descriptor_tag) {
         case CaDescriptorTag:
            d=new CaDescriptor();
            break;
         case CarouselIdentifierDescriptorTag:
            d=new CarouselIdentifierDescriptor();
            break;
         case NetworkNameDescriptorTag:
            d=new NetworkNameDescriptor();
            break;
         case ServiceListDescriptorTag:
            d=new ServiceListDescriptor();
            break;
         case SatelliteDeliverySystemDescriptorTag:
            d=new SatelliteDeliverySystemDescriptor();
            break;
         case CableDeliverySystemDescriptorTag:
            d=new CableDeliverySystemDescriptor();
            break;
         case TerrestrialDeliverySystemDescriptorTag:
            d=new TerrestrialDeliverySystemDescriptor();
            break;
         case BouquetNameDescriptorTag:
            d=new BouquetNameDescriptor();
            break;
         case ServiceDescriptorTag:
            d=new ServiceDescriptor();
            break;
         case NVODReferenceDescriptorTag:
            d=new NVODReferenceDescriptor();
            break;
         case TimeShiftedServiceDescriptorTag:
            d=new TimeShiftedServiceDescriptor();
            break;
         case ComponentDescriptorTag:
            d=new ComponentDescriptor();
            break;
         case StreamIdentifierDescriptorTag:
            d=new StreamIdentifierDescriptor();
            break;
         case SubtitlingDescriptorTag:
            d=new SubtitlingDescriptor();
            break;
         case MultilingualNetworkNameDescriptorTag:
            d=new MultilingualNetworkNameDescriptor();
            break;
         case MultilingualBouquetNameDescriptorTag:
            d=new MultilingualBouquetNameDescriptor();
            break;
         case MultilingualServiceNameDescriptorTag:
            d=new MultilingualServiceNameDescriptor();
            break;
         case MultilingualComponentDescriptorTag:
            d=new MultilingualComponentDescriptor();
            break;
         case PrivateDataSpecifierDescriptorTag:
            d=new PrivateDataSpecifierDescriptor();
            break;
         case ServiceMoveDescriptorTag:
            d=new ServiceMoveDescriptor();
            break;
         case FrequencyListDescriptorTag:
            d=new FrequencyListDescriptor();
            break;
         case ServiceIdentifierDescriptorTag:
            d=new ServiceIdentifierDescriptor();
            break;
         case CaIdentifierDescriptorTag:
            d=new CaIdentifierDescriptor();
            break;
         case ShortEventDescriptorTag:
            d=new ShortEventDescriptor();
            break;
         case ExtendedEventDescriptorTag:
            d=new ExtendedEventDescriptor();
            break;
         case TimeShiftedEventDescriptorTag:
            d=new TimeShiftedEventDescriptor();
            break;
         case ContentDescriptorTag:
            d=new ContentDescriptor();
            break;
         case ParentalRatingDescriptorTag:
            d=new ParentalRatingDescriptor();
            break;
         case TeletextDescriptorTag:
         case VBITeletextDescriptorTag:
            d=new TeletextDescriptor();
            break;
         case ApplicationSignallingDescriptorTag:
            d=new ApplicationSignallingDescriptor();
            break;
         case LocalTimeOffsetDescriptorTag:
            d=new LocalTimeOffsetDescriptor();
            break;
         case LinkageDescriptorTag:
            d=new LinkageDescriptor();
            break;
         case ISO639LanguageDescriptorTag:
            d=new ISO639LanguageDescriptor();
            break;
         case PDCDescriptorTag:
            d=new PDCDescriptor();
            break;
         case AncillaryDataDescriptorTag:
            d=new AncillaryDataDescriptor();
            break;
         case S2SatelliteDeliverySystemDescriptorTag:
            d=new S2SatelliteDeliverySystemDescriptor();
            break;
         case ExtensionDescriptorTag:
            d=new ExtensionDescriptor();
            break;
         case RegistrationDescriptorTag:
            d=new RegistrationDescriptor();
            break;
         case ContentIdentifierDescriptorTag:
            d=new ContentIdentifierDescriptor();
            break;
         case DefaultAuthorityDescriptorTag:
            d=new DefaultAuthorityDescriptor();
            break;

         //note that it is no problem to implement one
         //of the unimplemented descriptors.

         //defined in ISO-13818-1
         case VideoStreamDescriptorTag:
         case AudioStreamDescriptorTag:
         case HierarchyDescriptorTag:
         case DataStreamAlignmentDescriptorTag:
         case TargetBackgroundGridDescriptorTag:
         case VideoWindowDescriptorTag:
         case SystemClockDescriptorTag:
         case MultiplexBufferUtilizationDescriptorTag:
         case CopyrightDescriptorTag:
         case MaximumBitrateDescriptorTag:
         case PrivateDataIndicatorDescriptorTag:
         case SmoothingBufferDescriptorTag:
         case STDDescriptorTag:
         case IBPDescriptorTag:

         //defined in ETSI EN 300 468
         case StuffingDescriptorTag:
         case VBIDataDescriptorTag:
         case CountryAvailabilityDescriptorTag:
         case MocaicDescriptorTag:
         case TelephoneDescriptorTag:
         case CellListDescriptorTag:
         case CellFrequencyLinkDescriptorTag:
         case ServiceAvailabilityDescriptorTag:
         case ShortSmoothingBufferDescriptorTag:
         case PartialTransportStreamDescriptorTag:
         case DataBroadcastDescriptorTag:
         case DataBroadcastIdDescriptorTag:
         case ScramblingDescriptorTag:
         case AC3DescriptorTag:
         case DSNGDescriptorTag:
         case AnnouncementSupportDescriptorTag:
         case AdaptationFieldDataDescriptorTag:
         case TransportStreamDescriptorTag:

         //defined in ETSI EN 300 468 v 1.7.1
         case RelatedContentDescriptorTag:
         case TVAIdDescriptorTag:
         case TimeSliceFecIdentifierDescriptorTag:
         case ECMRepetitionRateDescriptorTag:
         case EnhancedAC3DescriptorTag:
         case DTSDescriptorTag:
         case AACDescriptorTag:
         default:
            if (!returnUnimplemetedDescriptor)
               return 0;
            d=new UnimplementedDescriptor();
            break;
      }
      break;
   case MHP:
      switch ((DescriptorTag)da.getData<DescriptorHeader>()->descriptor_tag) {
      // They once again start with 0x00 (see page 234, MHP specification)
         case MHP_ApplicationDescriptorTag:
            d=new MHP_ApplicationDescriptor();
            break;
         case MHP_ApplicationNameDescriptorTag:
            d=new MHP_ApplicationNameDescriptor();
            break;
         case MHP_TransportProtocolDescriptorTag:
            d=new MHP_TransportProtocolDescriptor();
            break;
         case MHP_DVBJApplicationDescriptorTag:
            d=new MHP_DVBJApplicationDescriptor();
            break;
         case MHP_DVBJApplicationLocationDescriptorTag:
            d=new MHP_DVBJApplicationLocationDescriptor();
            break;
         case MHP_SimpleApplicationLocationDescriptorTag:
            d=new MHP_SimpleApplicationLocationDescriptor();
            break;
      // 0x05 - 0x0A is unimplemented this library
         case MHP_ExternalApplicationAuthorisationDescriptorTag:
         case MHP_IPv4RoutingDescriptorTag:
         case MHP_IPv6RoutingDescriptorTag:
         case MHP_DVBHTMLApplicationDescriptorTag:
         case MHP_DVBHTMLApplicationLocationDescriptorTag:
         case MHP_DVBHTMLApplicationBoundaryDescriptorTag:
         case MHP_ApplicationIconsDescriptorTag:
         case MHP_PrefetchDescriptorTag:
         case MHP_DelegatedApplicationDescriptorTag:
         case MHP_ApplicationStorageDescriptorTag:
         default:
            if (!returnUnimplemetedDescriptor)
               return 0;
            d=new UnimplementedDescriptor();
            break;
      }
      break;
   case PCIT:
      switch ((DescriptorTag)da.getData<DescriptorHeader>()->descriptor_tag) {
         case ContentDescriptorTag:
            d=new ContentDescriptor();
            break;
         case ShortEventDescriptorTag:
            d=new ShortEventDescriptor();
            break;
         case ExtendedEventDescriptorTag:
            d=new ExtendedEventDescriptor();
            break;
         case PremiereContentTransmissionDescriptorTag:
            d=new PremiereContentTransmissionDescriptor();
            break;
         default:
            if (!returnUnimplemetedDescriptor)
               return 0;
            d=new UnimplementedDescriptor();
            break;
      }
      break;
   default: ; // unknown domain, nothing to do
   }
   d->setData(da);
   return d;
}