1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftrfork.c                                                              */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Embedded resource forks accessor (body).                             */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 2004-2010, 2013 by                                           */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  Masatake YAMATO and Redhat K.K.                                        */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  derived from ftobjs.c.                                                 */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Development of the code in this file is support of                      */
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Information-technology Promotion Agency, Japan.                         */
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_RFORK_H
31e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#include "basepic.h"
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_raccess
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****               Resource fork directory access                    ****/
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( FT_Error )
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Raccess_Get_HeaderInfo( FT_Library  library,
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Stream   stream,
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Long     rfork_offset,
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Long    *map_offset,
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Long    *rdata_pos )
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error       error;
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    unsigned char  head[16], head2[16];
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long        map_pos, rdata_len;
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int            allzeros, allmatch, i;
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long        type_list;
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( library );
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Seek( stream, rfork_offset );
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  ( head[1] << 16 ) |
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  ( head[2] <<  8 ) |
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    head[3]         );
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    map_pos    = rfork_offset + ( ( head[4] << 24 ) |
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  ( head[5] << 16 ) |
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  ( head[6] <<  8 ) |
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    head[7]         );
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rdata_len = ( head[ 8] << 24 ) |
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                ( head[ 9] << 16 ) |
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                ( head[10] <<  8 ) |
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  head[11];
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* map_len = head[12] .. head[15] */
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
89a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Seek( stream, map_pos );
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    allzeros = 1;
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    allmatch = 1;
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < 16; ++i )
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( head2[i] != 0 )
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        allzeros = 0;
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( head2[i] != head[i] )
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        allmatch = 0;
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !allzeros && !allmatch )
111a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If we have reached this point then it is probably a mac resource */
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* file.  Now, does it contain any interesting resources?           */
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Skip handle to next resource map, the file resource number, and  */
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* attributes.                                                      */
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          + 2      /* skip file resource number */
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          + 2 );   /* skip attributes */
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_USHORT( type_list ) )
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( type_list == -1 )
124a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Seek( stream, map_pos + type_list );
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *map_offset = map_pos + type_list;
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_RFork_Ref*  b )
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( a->res_id < b->res_id )
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return -1;
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( a->res_id > b->res_id )
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return 1;
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return 0;
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( FT_Error )
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Raccess_Get_DataOffsets( FT_Library  library,
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long     map_offset,
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long     rdata_pos,
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long     tag,
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long   **offsets,
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *count )
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error      error;
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int           i, j, cnt, subcnt;
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long       tag_internal, rpos;
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory     memory = library->memory;
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long       temp;
162c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Long       *offsets_internal = NULL;
163c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_RFork_Ref  *ref = NULL;
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Seek( stream, map_offset );
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_USHORT( cnt ) )
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cnt++;
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < cnt; ++i )
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_READ_LONG( tag_internal ) ||
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           FT_READ_USHORT( subcnt )     ||
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           FT_READ_USHORT( rpos )       )
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_TRACE2(( "Resource tags: %c%c%c%c\n",
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  (char)( 0xff & ( tag_internal >> 24 ) ),
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  (char)( 0xff & ( tag_internal >> 16 ) ),
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  (char)( 0xff & ( tag_internal >>  8 ) ),
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  (char)( 0xff & ( tag_internal >>  0 ) ) ));
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( tag_internal == tag )
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *count = subcnt + 1;
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        rpos  += map_offset;
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = FT_Stream_Seek( stream, rpos );
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return error;
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_NEW_ARRAY( ref, *count ) )
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return error;
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( j = 0; j < *count; ++j )
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( FT_READ_USHORT( ref[j].res_id ) )
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Exit;
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Exit;
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( FT_READ_LONG( temp ) )
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Exit;
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Exit;
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ref[j].offset = temp & 0xFFFFFFL;
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  ( int(*)(const void*, const void*) )
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  ft_raccess_sort_ref_by_id );
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_NEW_ARRAY( offsets_internal, *count ) )
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Exit;
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: duplicated reference ID,
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         *      gap between reference IDs are acceptable?
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         *      further investigation on Apple implementation is needed.
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         */
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( j = 0; j < *count; ++j )
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          offsets_internal[j] = rdata_pos + ref[j].offset;
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *offsets = offsets_internal;
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error    = FT_Err_Ok;
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Exit:
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FREE( ref );
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    return FT_THROW( Cannot_Open_Resource );
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                     Guessing functions                          ****/
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****            When you add a new guessing function,                ****/
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_double( FT_Library  library,
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset );
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_single( FT_Library  library,
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset );
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_ufs_export( FT_Library  library,
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   FT_Stream   stream,
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   char       *base_file_name,
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   char      **result_file_name,
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   FT_Long    *result_offset );
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_newvfs( FT_Library  library,
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Stream   stream,
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char       *base_file_name,
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char      **result_file_name,
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Long    *result_offset );
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_hfsplus( FT_Library  library,
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Stream   stream,
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char       *base_file_name,
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char      **result_file_name,
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Long    *result_offset );
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_vfat( FT_Library  library,
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Stream   stream,
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      char       *base_file_name,
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      char      **result_file_name,
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Long    *result_offset );
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_cap( FT_Library  library,
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Stream   stream,
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           char       *base_file_name,
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           char      **result_file_name,
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Long    *result_offset );
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_double( FT_Library  library,
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset );
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_netatalk( FT_Library  library,
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Stream   stream,
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char       *base_file_name,
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char      **result_file_name,
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Long    *result_offset );
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
320e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
321e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                                  ft_raccess_guess_rec)
322e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)
323e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)
324e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
325e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)
326e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)
327e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)
328e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)
329e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)
330e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)
331e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  CONST_FT_RFORK_RULE_ARRAY_END
332e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
333e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                       Helper functions                          ****/
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /****                                                                 ****/
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_generic( FT_Library  library,
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Stream   stream,
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char       *base_file_name,
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Int32    magic,
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Long    *result_offset );
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_double_from_file_name( FT_Library  library,
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                             char *      file_name,
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                             FT_Long    *result_offset );
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static char *
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_make_file_name( FT_Memory    memory,
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const char  *original_name,
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const char  *insertion );
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( void )
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Raccess_Guess( FT_Library  library,
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Stream   stream,
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    char*       base_name,
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    char      **new_names,
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Long    *offsets,
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Error   *errors )
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
365a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Int  i;
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      new_names[i] = NULL;
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( NULL != stream )
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        errors[i] = FT_Stream_Seek( stream, 0 );
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        errors[i] = FT_Err_Ok;
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( errors[i] )
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        continue ;
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
3808583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner                                                 stream, base_name,
3818583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner                                                 &(new_names[i]),
3828583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner                                                 &(offsets[i]) );
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
389e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#ifndef FT_MACINTOSH
3908583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  static FT_RFork_Rule
391e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  raccess_get_rule_type_from_rule_index( FT_Library  library,
392e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                                         FT_UInt     rule_index )
3938583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  {
394e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    FT_UNUSED( library );
395e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang
3968583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    if ( rule_index >= FT_RACCESS_N_RULES )
3978583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      return FT_RFork_Rule_invalid;
3988583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
399e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
4008583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  }
4018583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
4028583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
403e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  /*
404e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang   * For this function, refer ftbase.h.
405e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang   */
4068583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  FT_LOCAL_DEF( FT_Bool )
407e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang  ft_raccess_rule_by_darwin_vfs( FT_Library  library,
408e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang                                 FT_UInt     rule_index )
4098583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  {
410e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
4118583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    {
4128583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      case FT_RFork_Rule_darwin_newvfs:
4138583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      case FT_RFork_Rule_darwin_hfsplus:
4148583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner        return TRUE;
4158583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
4168583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner      default:
4178583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner        return FALSE;
4188583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner    }
4198583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner  }
420e3b631da8034f7c6ecc6d809cd9e46d306215c32Xianzhu Wang#endif
4218583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
4228583905b8952672a083f21fd8945f329b98aa35bDavid 'Digit' Turner
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_double( FT_Library  library,
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset )
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
43077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    FT_Int32  magic = ( 0x00 << 24 ) |
43177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                      ( 0x05 << 16 ) |
43277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                      ( 0x16 <<  8 ) |
43377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                        0x07;
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = NULL;
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( NULL == stream )
438a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Cannot_Open_Stream );
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return raccess_guess_apple_generic( library, stream, base_file_name,
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                        magic, result_offset );
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_single( FT_Library  library,
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset )
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
45277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    FT_Int32  magic = ( 0x00 << 24 ) |
45377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                      ( 0x05 << 16 ) |
45477f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                      ( 0x16 <<  8 ) |
45577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner                        0x00;
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = NULL;
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( NULL == stream )
460a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Cannot_Open_Stream );
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return raccess_guess_apple_generic( library, stream, base_file_name,
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                        magic, result_offset );
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_ufs_export( FT_Library  library,
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   FT_Stream   stream,
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   char       *base_file_name,
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   char      **result_file_name,
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   FT_Long    *result_offset )
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*      newpath;
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory  = library->memory;
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    newpath = raccess_make_file_name( memory, base_file_name, "._" );
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !newpath )
484a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Out_Of_Memory );
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = raccess_guess_linux_double_from_file_name( library, newpath,
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                       result_offset );
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *result_file_name = newpath;
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( newpath );
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_hfsplus( FT_Library  library,
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Stream   stream,
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char       *base_file_name,
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char      **result_file_name,
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Long    *result_offset )
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Only meaningful on systems with hfs+ drivers (or Macs).
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
508c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    char*      newpath = NULL;
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
510a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( base_file_len + 6 > FT_INT_MAX )
518a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Array_Too_Large );
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ALLOC( newpath, base_file_len + 6 ) )
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_COPY( newpath, base_file_name, base_file_len );
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = newpath;
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_offset    = 0;
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_darwin_newvfs( FT_Library  library,
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Stream   stream,
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char       *base_file_name,
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char      **result_file_name,
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Long    *result_offset )
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Only meaningful on systems with Mac OS X (> 10.1).
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
544c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    char*      newpath = NULL;
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
546a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( base_file_len + 18 > FT_INT_MAX )
554a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Array_Too_Large );
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ALLOC( newpath, base_file_len + 18 ) )
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_COPY( newpath, base_file_name, base_file_len );
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = newpath;
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_offset    = 0;
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_vfat( FT_Library  library,
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Stream   stream,
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      char       *base_file_name,
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      char      **result_file_name,
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Long    *result_offset )
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*      newpath;
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    newpath = raccess_make_file_name( memory, base_file_name,
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      "resource.frk/" );
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !newpath )
587a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Out_Of_Memory );
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = newpath;
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_offset    = 0;
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_cap( FT_Library  library,
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Stream   stream,
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           char       *base_file_name,
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           char      **result_file_name,
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Long    *result_offset )
602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*      newpath;
604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !newpath )
613a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Out_Of_Memory );
614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_file_name = newpath;
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *result_offset    = 0;
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Err_Ok;
619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_double( FT_Library  library,
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Stream   stream,
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char       *base_file_name,
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              char      **result_file_name,
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long    *result_offset )
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*      newpath;
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    newpath = raccess_make_file_name( memory, base_file_name, "%" );
639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !newpath )
640a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Out_Of_Memory );
641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = raccess_guess_linux_double_from_file_name( library, newpath,
643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                       result_offset );
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *result_file_name = newpath;
646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( newpath );
648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_netatalk( FT_Library  library,
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Stream   stream,
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char       *base_file_name,
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                char      **result_file_name,
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_Long    *result_offset )
659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*      newpath;
661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory;
663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = library->memory;
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    newpath = raccess_make_file_name( memory, base_file_name,
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      ".AppleDouble/" );
671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !newpath )
672a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Out_Of_Memory );
673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = raccess_guess_linux_double_from_file_name( library, newpath,
675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                       result_offset );
676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !error )
677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *result_file_name = newpath;
678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FREE( newpath );
680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_apple_generic( FT_Library  library,
687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Stream   stream,
688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               char       *base_file_name,
689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Int32    magic,
690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_Long    *result_offset )
691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   magic_from_stream;
693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   version_number = 0;
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  n_of_entries;
696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int        i;
698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  entry_id, entry_offset, entry_length = 0;
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const FT_UInt32  resource_fork_entry_id = 0x2;
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( library );
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( base_file_name );
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( version_number );
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( entry_length   );
706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_LONG( magic_from_stream ) )
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( magic_from_stream != magic )
711a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_LONG( version_number ) )
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* filler */
717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_Skip( stream, 16 );
718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_READ_USHORT( n_of_entries ) )
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n_of_entries == 0 )
724a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      return FT_THROW( Unknown_File_Format );
725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < n_of_entries; i++ )
727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_READ_LONG( entry_id ) )
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( entry_id == resource_fork_entry_id )
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_READ_LONG( entry_offset ) ||
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_READ_LONG( entry_length ) )
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          continue;
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *result_offset = entry_offset;
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return FT_Err_Ok;
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
74077f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner      {
74177f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */
74277f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner        if ( error )
74377f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner          return error;
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
74577f63d23f7d380b0ff02c18fd6a154ab9063128aDavid 'Digit' Turner    }
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
747a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    return FT_THROW( Unknown_File_Format );
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_guess_linux_double_from_file_name( FT_Library  library,
753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                             char       *file_name,
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                             FT_Long    *result_offset )
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Open_Args  args2;
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Stream     stream2;
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char *        nouse = NULL;
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error      error;
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args2.flags    = FT_OPEN_PATHNAME;
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args2.pathname = file_name;
764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = FT_Stream_New( library, &args2, &stream2 );
765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = raccess_guess_apple_double( library, stream2, file_name,
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                        &nouse, result_offset );
770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Stream_Free( stream2, 0 );
772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static char*
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  raccess_make_file_name( FT_Memory    memory,
779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const char  *original_name,
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const char  *insertion )
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
782aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    char*        new_name = NULL;
783295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    const char*  tmp;
784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    const char*  slash;
785295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    size_t       new_length;
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error     error = FT_Err_Ok;
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( error );
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    new_length = ft_strlen( original_name ) + ft_strlen( insertion );
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ALLOC( new_name, new_length + 1 ) )
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return NULL;
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tmp = ft_strrchr( original_name, '/' );
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( tmp )
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ft_strncpy( new_name, original_name, tmp - original_name + 1 );
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      new_name[tmp - original_name + 1] = '\0';
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slash = tmp + 1;
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      slash       = original_name;
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      new_name[0] = '\0';
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_strcat( new_name, insertion );
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ft_strcat( new_name, slash );
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return new_name;
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                  Dummy function; just sets errors                     */
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE_DEF( void )
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Raccess_Guess( FT_Library  library,
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Stream   stream,
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    char       *base_name,
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    char      **new_names,
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Long    *offsets,
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Error   *errors )
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
830a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    FT_Int  i;
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( library );
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( stream );
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( base_name );
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      new_names[i] = NULL;
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      offsets[i]   = 0;
841a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      errors[i]    = FT_ERR( Unimplemented_Feature );
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
850