internal PICSProductInfoCallback( CMsgPICSProductInfoResponse msg )
#endif
            {
                MetaDataOnly = msg.meta_data_only;
                ResponsePending = msg.response_pending;
                UnknownPackages = new ReadOnlyCollection<uint>( msg.unknown_packageids );
                UnknownApps = new ReadOnlyCollection<uint>( msg.unknown_appids );
                Packages = new Dictionary<uint, PICSProductInfo>();
                Apps = new Dictionary<uint, PICSProductInfo>();

                foreach ( var package_info in msg.packages )
                {
                    Packages.Add( package_info.packageid, new PICSProductInfo( package_info ) );
                }

                foreach ( var app_info in msg.apps )
                {
                    Apps.Add( app_info.appid, new PICSProductInfo( app_info ) );
                }
            }
                internal PICSProductInfo( CMsgPICSProductInfoResponse.PackageInfo package_info )
                {
                    this.ID = package_info.packageid;
                    this.ChangeNumber = package_info.change_number;
                    this.MissingToken = package_info.missing_token;
                    this.SHAHash = package_info.sha;

                    this.KeyValues = new KeyValue();
                    using ( MemoryStream ms = new MemoryStream( package_info.buffer ) )
                    using ( var br = new BinaryReader( ms ) )
                    {
                        br.ReadUInt32();
                        this.KeyValues.ReadAsBinary( ms );
                    }
                }
 internal PICSProductInfoCallback( SteamClient client, CMsgPICSProductInfoResponse msg )
     : base( client )
                internal PICSProductInfo( CMsgPICSProductInfoResponse.AppInfo app_info )
                {
                    this.ID = app_info.appid;
                    this.ChangeNumber = app_info.change_number;
                    this.MissingToken = app_info.missing_token;
                    this.SHAHash = app_info.sha;

                    this.KeyValues = new KeyValue();
                    using (MemoryStream ms = new MemoryStream(app_info.buffer, 0, app_info.buffer.Length - 1))
                        this.KeyValues.ReadAsText(ms);

                    this.OnlyPublic = app_info.only_public;
                }