commit 9312fa241f263965efb86503b01a29a359deaea8
Author: Christophe Fergeau <[email protected]>
Date: Sun Oct 18 17:34:47 2009 +0200
add LGPL headers
src/itdb_iphone.c | 19 ++++++
src/itdb_sqlite.c | 19 ++++++
src/itdb_sqlite_queries.h | 140 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 178 insertions(+), 0 deletions(-)
---
diff --git a/src/itdb_iphone.c b/src/itdb_iphone.c
index e598130..4f2cea2 100644
--- a/src/itdb_iphone.c
+++ b/src/itdb_iphone.c
@@ -1,3 +1,22 @@
+/*
+| Copyright (C) 2009 Nikias Bassen <[email protected]>
+| Part of the gtkpod project.
+|
+| The code contained in this file is free software; you can redistribute
+| it and/or modify it under the terms of the GNU Lesser General Public
+| License as published by the Free Software Foundation; either version
+| 2.1 of the License, or (at your option) any later version.
+|
+| This file is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+| Lesser General Public License for more details.
+|
+| You should have received a copy of the GNU Lesser General Public
+| License along with this code; if not, write to the Free Software
+| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+| USA
+*/
#include <itdb.h>
#include <itdb_private.h>
#include <errno.h>
diff --git a/src/itdb_sqlite.c b/src/itdb_sqlite.c
index 16c593c..fd0f6f3 100644
--- a/src/itdb_sqlite.c
+++ b/src/itdb_sqlite.c
@@ -1,3 +1,22 @@
+/*
+| Copyright (C) 2009 Nikias Bassen <[email protected]>
+| Copyright (C) 2009 Christophe Fergeau <[email protected]>
+
+| The code contained in this file is free software; you can redistribute
+| it and/or modify it under the terms of the GNU Lesser General Public
+| License as published by the Free Software Foundation; either version
+| 2.1 of the License, or (at your option) any later version.
+|
+| This file is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+| Lesser General Public License for more details.
+|
+| You should have received a copy of the GNU Lesser General Public
+| License along with this code; if not, write to the Free Software
+| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+| USA
+*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
diff --git a/src/itdb_sqlite_queries.h b/src/itdb_sqlite_queries.h
new file mode 100644
index 0000000..f50d093
--- /dev/null
+++ b/src/itdb_sqlite_queries.h
@@ -0,0 +1,140 @@
+/*
+| Copyright (C) 2009 Nikias Bassen <[email protected]>
+
+| The code contained in this file is free software; you can redistribute
+| it and/or modify it under the terms of the GNU Lesser General Public
+| License as published by the Free Software Foundation; either version
+| 2.1 of the License, or (at your option) any later version.
+|
+| This file is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+| Lesser General Public License for more details.
+|
+| You should have received a copy of the GNU Lesser General Public
+| License along with this code; if not, write to the Free Software
+| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+| USA
+*/
+#ifndef __LIBITDBPREP_H
+#define __LIBITDBPREP_H
+
+/** creation statement for 'Dynamic.itdb' */
+static const char Dynamic_create[] =
+ "BEGIN TRANSACTION;" \
+ "CREATE TABLE item_stats (item_pid INTEGER NOT NULL, has_been_played
INTEGER DEFAULT 0, date_played INTEGER DEFAULT 0, play_count_user INTEGER
DEFAULT 0, play_count_recent INTEGER DEFAULT 0, date_skipped INTEGER DEFAULT 0,
skip_count_user INTEGER DEFAULT 0, skip_count_recent INTEGER DEFAULT 0,
bookmark_time_ms REAL, bookmark_time_ms_common REAL, user_rating INTEGER
DEFAULT 0, user_rating_common INTEGER DEFAULT 0, hidden INTEGER DEFAULT 0,
deleted INTEGER DEFAULT 0, has_changes INTEGER DEFAULT 0, PRIMARY KEY
(item_pid));" \
+ "CREATE TABLE rental_info (rental_date_started INTEGER DEFAULT 0,
rental_duration INTEGER DEFAULT 0, rental_playback_date_started INTEGER DEFAULT
0, rental_playback_duration INTEGER DEFAULT 0);" \
+ "ANALYZE sqlite_master;" \
+ "COMMIT;";
+
+/** creation statement for 'Extras.itdb' */
+static const char Extras_create[] =
+ "BEGIN TRANSACTION;" \
+ "CREATE TABLE chapter (item_pid INTEGER NOT NULL, data BLOB, PRIMARY
KEY (item_pid));" \
+ "CREATE TABLE lyrics (item_pid INTEGER NOT NULL, checksum INTEGER,
lyrics TEXT, PRIMARY KEY (item_pid));" \
+ "ANALYZE sqlite_master;" \
+ "CREATE TABLE db_schema_upgrade_info (user_version INTEGER,
device_version INTEGER);" \
+ "INSERT INTO \"db_schema_upgrade_info\" VALUES(8,19);" \
+ "COMMIT;";
+
+/** creation statement for 'Genius.itdb' */
+static const char Genius_create[] =
+ "BEGIN TRANSACTION;" \
+ "CREATE TABLE genius_metadata (genius_id INTEGER NOT NULL, version
INTEGER, data BLOB, PRIMARY KEY (genius_id));" \
+ "CREATE TABLE genius_similarities (genius_id INTEGER NOT NULL, version
INTEGER, data BLOB, PRIMARY KEY (genius_id));" \
+ "CREATE TABLE genius_config (id INTEGER NOT NULL, version INTEGER,
default_num_results INTEGER DEFAULT 0, min_num_results INTEGER DEFAULT 0, data
BLOB, PRIMARY KEY (id), UNIQUE (version));" \
+ "COMMIT;";
+
+/** creation statement for 'Library.itdb' */
+static const char Library_create[] =
+ "BEGIN TRANSACTION;" \
+ "CREATE TABLE version_info (id INTEGER PRIMARY KEY, major INTEGER,
minor INTEGER, compatibility INTEGER DEFAULT 0, update_level INTEGER DEFAULT 0,
platform INTEGER DEFAULT 0);" \
+ "CREATE TABLE db_info (pid INTEGER NOT NULL, primary_container_pid
INTEGER, media_folder_url TEXT, audio_language INTEGER, subtitle_language
INTEGER, bib BLOB, rib BLOB, PRIMARY KEY (pid));" \
+ "CREATE TABLE item (pid INTEGER NOT NULL, revision_level INTEGER,
media_kind INTEGER DEFAULT 0, is_song INTEGER DEFAULT 0, is_audio_book INTEGER
DEFAULT 0, is_music_video INTEGER DEFAULT 0, is_movie INTEGER DEFAULT 0,
is_tv_show INTEGER DEFAULT 0, is_ringtone INTEGER DEFAULT 0, is_voice_memo
INTEGER DEFAULT 0, is_rental INTEGER DEFAULT 0, is_podcast INTEGER DEFAULT 0,
date_modified INTEGER DEFAULT 0, date_backed_up INTEGER DEFAULT 0, year INTEGER
DEFAULT 0, content_rating INTEGER DEFAULT 0, content_rating_level INTEGER
DEFAULT 0, is_compilation INTEGER, is_user_disabled INTEGER DEFAULT 0,
remember_bookmark INTEGER DEFAULT 0, exclude_from_shuffle INTEGER DEFAULT 0,
artwork_status INTEGER, artwork_cache_id INTEGER DEFAULT 0, start_time_ms REAL
DEFAULT 0, stop_time_ms REAL DEFAULT 0, total_time_ms REAL DEFAULT 0,
total_burn_time_ms REAL, track_number INTEGER DEFAULT 0, track_count INTEGER
DEFAULT 0, disc_number INTEGER DEFAULT 0, disc_count INTEGER DEFAULT 0, bpm
INTEGER DEFAULT 0, relative_volume INTEGER, eq_preset TEXT, radio_stream_status
TEXT, genius_id INTEGER DEFAULT 0, genre_id INTEGER DEFAULT 0, category_id
INTEGER DEFAULT 0, album_pid INTEGER DEFAULT 0, artist_pid INTEGER DEFAULT 0,
composer_pid INTEGER DEFAULT 0, title TEXT, artist TEXT, album TEXT,
album_artist TEXT, composer TEXT, sort_title TEXT, sort_artist TEXT, sort_album
TEXT, sort_album_artist TEXT, sort_composer TEXT, title_order INTEGER,
artist_order INTEGER, album_order INTEGER, genre_order INTEGER, composer_order
INTEGER, album_artist_order INTEGER, album_by_artist_order INTEGER,
series_name_order INTEGER, comment TEXT, grouping TEXT, description TEXT,
description_long TEXT, in_songs_collection INTEGER NOT NULL DEFAULT 0,
title_blank INTEGER NOT NULL DEFAULT 0, artist_blank INTEGER NOT NULL DEFAULT
0, album_artist_blank INTEGER NOT NULL DEFAULT 0, album_blank INTEGER NOT NULL
DEFAULT 0, composer_blank INTEGER NOT NULL DEFAULT 0, grouping_blank INTEGER
NOT NULL DEFAULT 0, title_section_order BLOB, artist_section_order BLOB,
album_section_or
BLOB, album_artist_section_order BLOB, composer_section_order BLOB,
genre_section_order BLOB, series_name_section_order BLOB, PRIMARY KEY (pid));" \
+ "CREATE TABLE avformat_info (item_pid INTEGER NOT NULL, sub_id INTEGER
NOT NULL DEFAULT 0, audio_format INTEGER, bit_rate INTEGER DEFAULT 0,
sample_rate REAL DEFAULT 0, duration INTEGER, gapless_heuristic_info INTEGER,
gapless_encoding_delay INTEGER, gapless_encoding_drain INTEGER,
gapless_last_frame_resynch INTEGER, analysis_inhibit_flags INTEGER,
audio_fingerprint INTEGER, volume_normalization_energy INTEGER, PRIMARY KEY
(item_pid,sub_id));" \
+ "CREATE TABLE video_info (item_pid INTEGER NOT NULL,
has_alternate_audio INTEGER, has_subtitles INTEGER, characteristics_valid
INTEGER, has_closed_captions INTEGER, is_self_contained INTEGER, is_compressed
INTEGER, is_anamorphic INTEGER, season_number INTEGER, audio_language INTEGER,
audio_track_index INTEGER, audio_track_id INTEGER, subtitle_language INTEGER,
subtitle_track_index INTEGER, subtitle_track_id INTEGER, series_name TEXT,
sort_series_name TEXT, episode_id TEXT, episode_sort_id INTEGER, network_name
TEXT, extended_content_rating TEXT, movie_info TEXT, PRIMARY KEY (item_pid));" \
+ "CREATE TABLE video_characteristics (item_pid INTEGER, sub_id INTEGER
DEFAULT 0, track_id INTEGER, height INTEGER, width INTEGER, depth INTEGER,
codec INTEGER, frame_rate REAL, percentage_encrypted REAL, bit_rate INTEGER,
peak_bit_rate INTEGER, buffer_size INTEGER, profile INTEGER, level INTEGER,
complexity_level INTEGER, UNIQUE (item_pid,sub_id,track_id));" \
+ "CREATE TABLE store_info (item_pid INTEGER NOT NULL, store_kind
INTEGER, date_purchased INTEGER DEFAULT 0, date_released INTEGER DEFAULT 0,
account_id INTEGER, key_versions INTEGER, key_platform_id INTEGER, key_id
INTEGER, key_id2 INTEGER, store_item_id INTEGER, artist_id INTEGER, composer_id
INTEGER, genre_id INTEGER, playlist_id INTEGER, storefront_id INTEGER,
store_link_id INTEGER, relevance REAL, popularity REAL, PRIMARY KEY
(item_pid));" \
+ "CREATE TABLE store_link (id INTEGER NOT NULL, url TEXT, PRIMARY KEY
(id));" \
+ "CREATE TABLE podcast_info (item_pid INTEGER NOT NULL, external_guid
TEXT, feed_url TEXT, feed_keywords TEXT, PRIMARY KEY (item_pid));" \
+ "CREATE TABLE container (pid INTEGER NOT NULL, distinguished_kind
INTEGER, date_created INTEGER, name TEXT, name_order INTEGER, parent_pid
INTEGER, media_kinds INTEGER, workout_template_id INTEGER, is_hidden INTEGER,
smart_is_folder INTEGER, smart_is_dynamic INTEGER, smart_is_filtered INTEGER,
smart_is_genius INTEGER, smart_enabled_only INTEGER, smart_is_limited INTEGER,
smart_limit_kind INTEGER, smart_limit_order INTEGER, smart_limit_value INTEGER,
smart_reverse_limit_order INTEGER, smart_criteria BLOB, PRIMARY KEY (pid));" \
+ "CREATE TABLE item_to_container (item_pid INTEGER, container_pid
INTEGER, physical_order INTEGER, shuffle_order INTEGER);" \
+ "CREATE TABLE container_seed (container_pid INTEGER NOT NULL, item_pid
INTEGER NOT NULL, seed_order INTEGER DEFAULT 0, UNIQUE
(container_pid,item_pid));" \
+ "CREATE TABLE album (pid INTEGER NOT NULL, kind INTEGER, artwork_status
INTEGER, artwork_item_pid INTEGER, artist_pid INTEGER, user_rating INTEGER,
name TEXT, name_order INTEGER, all_compilations INTEGER, feed_url TEXT,
season_number INTEGER, PRIMARY KEY (pid));" \
+ "CREATE TABLE item_to_album (item_pid INTEGER, album_pid INTEGER);" \
+ "CREATE TABLE artist (pid INTEGER NOT NULL, kind INTEGER,
artwork_status INTEGER, artwork_album_pid INTEGER, name TEXT, name_order
INTEGER, sort_name TEXT, PRIMARY KEY (pid));" \
+ "CREATE TABLE item_to_artist (item_pid INTEGER, artist_pid INTEGER);" \
+ "CREATE TABLE composer (pid INTEGER NOT NULL, name TEXT, name_order
INTEGER, sort_name TEXT, PRIMARY KEY (pid));" \
+ "CREATE TABLE item_to_composer (item_pid INTEGER, composer_pid
INTEGER);" \
+ "CREATE TABLE location_kind_map (id INTEGER NOT NULL, kind TEXT NOT
NULL, PRIMARY KEY (id), UNIQUE (kind));" \
+ "CREATE TABLE genre_map (id INTEGER NOT NULL, genre TEXT NOT NULL,
genre_order INTEGER DEFAULT 0, PRIMARY KEY (id), UNIQUE (genre));" \
+ "CREATE TABLE category_map (id INTEGER NOT NULL, category TEXT NOT
NULL, PRIMARY KEY (id), UNIQUE (category));" \
+ "CREATE TABLE ext_item_view_membership (item_pid INTEGER PRIMARY KEY,
movie_mbr INTEGER, movie_rental_mbr INTEGER );" \
+ "ANALYZE sqlite_master;" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('ext_item_view_membership','ext_item_view_membership_idx_movie_rental_mbr','1
1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('ext_item_view_membership','ext_item_view_membership_idx_movie_mbr','1
1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_composer','1
1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_album_artist','1
1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_album','1 1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_artist','1 1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_title','1 1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_genre_id','1
1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('item','item_idx_is_compilation','1 1');" \
+ "INSERT INTO \"sqlite_stat1\" VALUES('item','item_idx_media_kind','1
1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('avformat_info','avformat_info_idx_audio_format','1 1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('avformat_info','sqlite_autoindex_avformat_info_1','1 1 1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('item_to_container','itc_idx_item_pid','1 1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('item_to_container','itc_idx_container_pid','1 1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('item_to_container','itc_idx_physical_order','1 1');" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('location_kind_map','sqlite_autoindex_location_kind_map_1','1 1');" \
+ "CREATE TABLE ml_database_status (key TEXT, value TEXT, PRIMARY
KEY(key));" \
+ "INSERT INTO \"ml_database_status\"
VALUES('iTunesCommandsExecuted','8');" \
+ "CREATE TRIGGER update_item_in_songs_collection AFTER UPDATE OF
media_kind, is_rental ON item BEGIN UPDATE item SET in_songs_collection =
((item.media_kind&1) AND ((item.media_kind&2)=0 AND item.is_rental=0)) WHERE
item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_title_blank AFTER UPDATE OF title ON item
BEGIN UPDATE item SET title_blank = (title = '' OR title IS NULL) WHERE
item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_artist_blank AFTER UPDATE OF artist ON item
BEGIN UPDATE item SET artist_blank = (artist = '' OR artist IS NULL) WHERE
item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_album_artist_blank AFTER UPDATE OF
album_artist ON item BEGIN UPDATE item SET album_artist_blank = (album_artist =
'' OR album_artist IS NULL) WHERE item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_album_blank AFTER UPDATE OF album ON item
BEGIN UPDATE item SET album_blank = (album = '' OR album IS NULL) WHERE
item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_composer_blank AFTER UPDATE OF composer ON
item BEGIN UPDATE item SET composer_blank = (composer = '' OR composer IS NULL)
WHERE item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_item_grouping_blank AFTER UPDATE OF grouping ON
item BEGIN UPDATE item SET grouping_blank = (grouping = '' OR grouping IS NULL)
WHERE item.pid = new.pid; END;" \
+ "CREATE TRIGGER update_is_kind_of_field AFTER UPDATE OF is_song,
is_audio_book, is_music_video, is_movie, is_tv_show, is_ringtone, is_podcast,
is_rental ON item BEGIN " \
+ "INSERT OR REPLACE INTO ext_item_view_membership(item_pid, movie_mbr,
movie_rental_mbr) VALUES(new.pid, (new.is_movie AND (NOT new.is_rental) AND
(NOT new.is_podcast)), (new.is_movie AND new.is_rental));" \
+ "END;" \
+ "CREATE TRIGGER insert_item AFTER INSERT ON item BEGIN " \
+ "INSERT OR IGNORE INTO ext_item_view_membership(item_pid, movie_mbr,
movie_rental_mbr) VALUES(new.pid, 0, 0);" \
+ "UPDATE item SET in_songs_collection = ((new.media_kind&1) AND
((new.media_kind&2)=0 AND new.is_rental=0)), title_blank = (title = '' OR title
IS NULL), artist_blank = (artist = '' OR artist IS NULL), album_blank = (album
= '' OR album IS NULL), album_artist_blank = (album_artist = '' OR album_artist
IS NULL), composer_blank = (composer = '' OR composer IS NULL), grouping_blank
= (grouping = '' OR grouping IS NULL) WHERE item.pid = new.pid;" \
+ "UPDATE item SET is_song=((new.media_kind&1)!=0),
is_audio_book=((new.media_kind&8)!=0), is_music_video=((new.media_kind&32)!=0),
is_movie=((new.media_kind&2)!=0), is_tv_show=((new.media_kind&64)!=0),
is_ringtone=((new.media_kind&16384)!=0), is_podcast=((new.media_kind&4)!=0),
is_rental=((new.media_kind&32768)!=0) WHERE pid = new.pid;" \
+ "END;" \
+ "CREATE TRIGGER update_item_media_kind AFTER UPDATE OF media_kind ON
item BEGIN " \
+ "UPDATE item SET is_song=((new.media_kind&1)!=0),
is_audio_book=((new.media_kind&8)!=0), is_music_video=((new.media_kind&32)!=0),
is_movie=((new.media_kind&2)!=0), is_tv_show=((new.media_kind&64)!=0),
is_ringtone=((new.media_kind&16384)!=0), is_podcast=((new.media_kind&4)!=0),
is_rental=((new.media_kind&32768)!=0) WHERE pid = new.pid;" \
+ "END;" \
+ "CREATE INDEX item_idx_media_kind ON item (media_kind);" \
+ "CREATE INDEX item_idx_is_compilation ON item (is_compilation);" \
+ "CREATE INDEX avformat_info_idx_audio_format ON avformat_info
(audio_format);" \
+ "CREATE INDEX itc_idx_physical_order ON item_to_container
(physical_order);" \
+ "CREATE INDEX itc_idx_container_pid ON item_to_container
(container_pid);" \
+ "CREATE INDEX itc_idx_item_pid ON item_to_container (item_pid);" \
+ "CREATE INDEX video_info_idx_season_number ON video_info
(season_number);" \
+ "CREATE INDEX video_info_idx_episode_sort_id ON video_info
(episode_sort_id);" \
+ "CREATE INDEX item_idx_genre_id ON item (genre_id);" \
+ "CREATE INDEX ext_item_view_membership_idx_movie_mbr ON
ext_item_view_membership (movie_mbr);" \
+ "CREATE INDEX ext_item_view_membership_idx_movie_rental_mbr ON
ext_item_view_membership (movie_rental_mbr);" \
+ "CREATE INDEX item_idx_title ON item (title);" \
+ "CREATE INDEX item_idx_artist ON item (artist);" \
+ "CREATE INDEX item_idx_album ON item (album);" \
+ "CREATE INDEX item_idx_album_artist ON item (album_artist);" \
+ "CREATE INDEX item_idx_composer ON item (composer);" \
+ "COMMIT;";
+
+/** creation statement for 'Locations.itdb' */
+static const char Locations_create[] =
+ "BEGIN TRANSACTION;" \
+ "CREATE TABLE location (item_pid INTEGER NOT NULL, sub_id INTEGER NOT
NULL DEFAULT 0, base_location_id INTEGER DEFAULT 0, location_type INTEGER,
location TEXT, extension INTEGER, kind_id INTEGER DEFAULT 0, date_created
INTEGER DEFAULT 0, file_size INTEGER DEFAULT 0, file_creator INTEGER, file_type
INTEGER, num_dir_levels_file INTEGER, num_dir_levels_lib INTEGER, PRIMARY KEY
(item_pid,sub_id));" \
+ "CREATE TABLE base_location (id INTEGER NOT NULL, path TEXT, PRIMARY
KEY (id));" \
+ "INSERT INTO \"base_location\" VALUES(1,'iTunes_Control/Music');" \
+ "INSERT INTO \"base_location\" VALUES(4,'Podcasts');" \
+ "INSERT INTO \"base_location\" VALUES(6,'iTunes_Control/Ringtones');" \
+ "ANALYZE sqlite_master;" \
+ "INSERT INTO \"sqlite_stat1\"
VALUES('location','sqlite_autoindex_location_1','1 1 1');" \
+ "COMMIT;";
+
+#endif
------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2