Beispiel #1
0
static void
read_file (struct buffer *buffer)
{
  int fd;
  void *map = MAP_FAILED;

  struct line line_buffer;
  size_t line_length;

  const char *line_begin, *line_end, *end;

  char newline[8];
  size_t newline_length = 0;

  off_t size = 0;
  uint32_t digest = 0;

  if (-1 == (fd = open (buffer->path + 7, O_RDONLY)))
    {
      if (errno != ENOENT)
        {
          set_error (_("Failed to open '%s' for reading: %s"),
                     buffer->path, strerror (errno));

          goto failed;
        }

      buffer->charset = CHARSET_UTF8;
      buffer->line_ending = LINE_ENDING_LF;

      buffer->log = log_open (buffer->undo_path, buffer, 0);

      if (!buffer->log)
        goto failed;

      return;
    }

  if (-1 == (size = lseek (fd, 0, SEEK_END)))
    {
      static const size_t readbuf_size = 65536;
      char *readbuf;
      const char *begin, *end;
      int ret;

      struct line encoded_buffer;

      readbuf = malloc (readbuf_size);

      ARRAY_INIT (&encoded_buffer);

      while (0 < (ret = read (fd, readbuf, readbuf_size)))
        {
          digest = crc32 (digest, readbuf, ret);

          if (!buffer->charset)
            {
              charset_detect (&buffer->charset, &buffer->line_ending, readbuf, ret);

              newline_length = charset_encode_line_ending (newline, buffer->charset, buffer->line_ending);
            }

          begin = readbuf;
          end = readbuf + ret;

          while (begin != end)
            {
              line_end = memmem (begin, end - begin, newline, newline_length);

              if (!line_end)
                {
                  ARRAY_ADD_SEVERAL (&encoded_buffer, begin, end - begin);

                  break;
                }

              ARRAY_ADD_SEVERAL (&encoded_buffer, begin, line_end - begin);

              begin = line_end + newline_length;

              line_length = charset_decode (0, buffer->charset,
                                            &ARRAY_GET (&encoded_buffer, 0),
                                            ARRAY_COUNT (&encoded_buffer));

              ARRAY_INIT (&line_buffer);
              ARRAY_RESERVE (&line_buffer, line_length);

              charset_decode (&ARRAY_GET (&line_buffer, 0), buffer->charset,
                              &ARRAY_GET (&encoded_buffer, 0),
                              ARRAY_COUNT (&encoded_buffer));

              ARRAY_COUNT (&line_buffer) = line_length;

              pthread_mutex_lock (&buffer->lock);

              ARRAY_ADD (&buffer->lines, line_buffer);

              pthread_mutex_unlock (&buffer->lock);

              ARRAY_RESET (&encoded_buffer);
            }
        }
    }
  else if (size > 0)
    {
      if (MAP_FAILED == (map = mmap (0, size, PROT_READ, MAP_SHARED, fd, 0)))
        {
          set_error (_("Failed to mmap '%s': %s"), buffer->path, strerror (errno));

          goto failed;
        }

      digest = crc32 (0, map, size);

      charset_detect (&buffer->charset, &buffer->line_ending, map, size);

      newline_length = charset_encode_line_ending (newline, buffer->charset, buffer->line_ending);

      end = (char *) map + size;

      for (line_begin = map; line_begin < end; line_begin = line_end + newline_length)
        {
          line_end = memmem (line_begin, end - line_begin,
                             newline, newline_length);

          if (!line_end)
            line_end = end;

          line_length = charset_decode (0, buffer->charset, line_begin,
                                        line_end - line_begin);

          ARRAY_INIT (&line_buffer);
          ARRAY_RESERVE (&line_buffer, line_length);

          charset_decode (&ARRAY_GET (&line_buffer, 0), buffer->charset,
                          line_begin, line_end - line_begin);

          ARRAY_COUNT (&line_buffer) = line_length;

          pthread_mutex_lock (&buffer->lock);

          ARRAY_ADD (&buffer->lines, line_buffer);

          pthread_mutex_unlock (&buffer->lock);

          /* XXX: Avoid issuing full repaints when nothing really happens onscreen */

          gui_repaint ();
        }
    }
  else
    {
      buffer->charset = CHARSET_UTF8;
      buffer->line_ending = LINE_ENDING_LF;
    }

  buffer->log = log_open (buffer->undo_path, buffer, digest);

failed:

  if (fd != -1)
    close (fd);

  if (map != MAP_FAILED)
    munmap (map, size);
}
Beispiel #2
0
int ConvertCDDB2Utf8(PCDDB_INFO pCDDBInfo)
{
	int i, n, len;
	Z_BUF zBuf;
	char *ret = NULL;
	char encoding[MAX_ENCODING_NAME] = {0};
	iconv_t conv = (iconv_t)(-1);
	char tmpArray[BUF_2048_BITS];

	/* init */
	ZUtilBufInit(&zBuf, 0);

	if(pCDDBInfo->uCount > 0){
		//artist
		ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->artistname);
		ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER);
		//album
		ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->albumname);
		ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER);
		//genre
		ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->genrename);
		ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER);
	}

	/* package buf for detect charset */
	for(i=0;i<pCDDBInfo->uCount;i++){
		//track[i]
		ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[i]->trackTitle);
		ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER);
	}

	ZUtilAppendStr(&zBuf, ZCHAR_ENDFLAG);

	ret = charset_detect(zBuf.buf, zBuf.length);

	if(ret){
		strncpy(encoding, ret, MAX_ENCODING_NAME);
		ZFREE(ret);
	}
	ZUtilBufDestroy(&zBuf);

	/* Need to convert ??? */
	if(strlen(encoding)<=0)
		return ZAPP_FAILED;
	if(!strcasecmp("UTF-8", encoding))
		return ZAPP_SUCCESS;

	/* Converting...Now!!! */
	conv = iconv_open("UTF-8", encoding);
	if(conv < 0){
		dprintf("Failed to open iconv.\n");
		goto errOut;
	}

	for(i=0;i<pCDDBInfo->uCount;i++){
		//artistname
		if(pCDDBInfo->trackMeta[i]->artistname){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->artistname,
					strlen(pCDDBInfo->trackMeta[i]->artistname),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert artistname.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->artistname);
				pCDDBInfo->trackMeta[i]->artistname = strdup(tmpArray);
			}
		}

		//albumname
		if(pCDDBInfo->trackMeta[i]->albumname){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->albumname,
					strlen(pCDDBInfo->trackMeta[i]->albumname),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert albumname.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->albumname);
				pCDDBInfo->trackMeta[i]->albumname = strdup(tmpArray);
			}
		}
		//genrename
		if(pCDDBInfo->trackMeta[i]->genrename){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->genrename,
					strlen(pCDDBInfo->trackMeta[i]->genrename),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert genrename.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->genrename);
				pCDDBInfo->trackMeta[i]->genrename = strdup(tmpArray);
			}
		}
		//trackTitle
		if(pCDDBInfo->trackMeta[i]->trackTitle){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->trackTitle,
					strlen(pCDDBInfo->trackMeta[i]->trackTitle),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert trackTitle.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->trackTitle);
				pCDDBInfo->trackMeta[i]->trackTitle = strdup(tmpArray);
			}
		}

		//composername
		if(pCDDBInfo->trackMeta[i]->composername){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->composername,
					strlen(pCDDBInfo->trackMeta[i]->composername),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert composername.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->composername);
				pCDDBInfo->trackMeta[i]->composername= strdup(tmpArray);
			}
		}

		//workname
		if(pCDDBInfo->trackMeta[i]->workname){
			len = BUF_2048_BITS;
			memset(tmpArray, 0, BUF_2048_BITS);
			n = convert(conv, pCDDBInfo->trackMeta[i]->workname,
					strlen(pCDDBInfo->trackMeta[i]->workname),
					tmpArray, &len);
			if(n < 0){
				dprintf("Failed to convert workname.\n");
			}
			else{
				free(pCDDBInfo->trackMeta[i]->workname);
				pCDDBInfo->trackMeta[i]->workname= strdup(tmpArray);
			}
		}

		METACONVTOUTF(pCDDBInfo->trackMeta[i]->albumattribute1);    /*zapp usage totalduration*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->artwork);        /*artwork*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->artworkArtist);      /*artworkArtist*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->albumDescription);   /*albumDescription*/

		METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerDescription);    /*workComposerDescription*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->storyline);          /*storyline*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->workDescription);        /*workDescription*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerFirstname);      /*workComposerFirstname*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerLastname);       /*workComposerLastname*/

		METACONVTOUTF(pCDDBInfo->trackMeta[i]->act);                /*act*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->arrangedBy);         /*arrangedBy*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->artistLink);         /*artistLink*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->bpm);                /*bpm*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->cadenza);            /*cadenza*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->chorus);         /*chorus*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->composerFirstname);      /*composerFirstname*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->conductorFirstname);     /*conductorFirstname*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->conductorLastname);      /*conductorLastname*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->instruments);            /*instruments*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->ISRC);               /*ISRC*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->musicKey);           /*musicKey*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->lyricistLibrettist);     /*lyricistLibrettist*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->lyricsLibretto);     /*lyricsLibretto*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->orchestra);          /*orchestra*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->orchestraLink);          /*orchestraLink*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->originalArtistSoloist);      /*originalArtistSoloist*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->recOriginal);            /*recOriginal*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->trackLanguage);          /*trackLanguage*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->additionalArtists);      /*additionalArtists*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->musicalPeriod);          /*musicalPeriod*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->producer);           /*producer*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->publisher);          /*publisher*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->publisherLink);          /*publisherLink*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->recLocation);            /*recLocation*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->recMethod);          /*recMethod*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->videoLink);          /*videoLink*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->whoWouldHaveThought);        /*whoWouldHaveThought*/
		METACONVTOUTF(pCDDBInfo->trackMeta[i]->scene);              /*scene*/

#if 0	
		int ioffset = 0;
		int totoffset = sizeof(ZDB_METATRACK)/sizeof(char *);
		char **pmeta_data = (char **)pCDDBInfo->trackMeta[i];
		for(ioffset = 5;ioffset < totoffset;ioffset++){

			if(*(pmeta_data + ioffset)){
				len = BUF_2048_BITS;
				memset(tmpArray, 0, BUF_2048_BITS);
				n = convert(conv, *(pmeta_data + ioffset),
						strlen(*(pmeta_data + ioffset)),
						tmpArray, &len);
				if(n < 0){
					dprintf("Failed to convert workname.\n");
				}
				else{
					free(*(pmeta_data + ioffset));
					*(pmeta_data + ioffset) = strdup(tmpArray);
				}
			}
		}
#endif
	}
	iconv_close(conv);
	return ZAPP_SUCCESS;

errOut:
	iconv_close(conv);
	return ZAPP_FAILED;
}