#############################################################################
## Name:        XS/MimeTypes.xsp
## Purpose:     XS++ for wxMimeTypesManager and related classes
## Author:      Mattia Barbon
## Modified by:
## Created:     28/03/2005
## RCS-ID:      $Id: MimeTypes.xsp 2911 2010-04-26 19:51:34Z mbarbon $
## Copyright:   (c) 2005-2010 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%module{Wx};

%{
#if wxUSE_MIMETYPE
#include <wx/mimetype.h>
%}
        
%typemap{wxMimeTypesManager*}{simple};
%typemap{wxFileType*}{simple};
%typemap{wxIconLocation*}{simple};
%typemap{wxFileTypeInfo*}{simple};
%typemap{const wxFileTypeInfo*}{parsed}{
    %cpp_type{%wxFileTypeInfo*%};
};

#if WXPERL_W_VERSION_GE( 2, 5, 2 )

%name{Wx::IconLocation} class wxIconLocation
{
    bool IsOk() const;
};

#endif

%name{Wx::FileTypeInfo} class wxFileTypeInfo
{
    bool IsValid() const;
    void SetIcon( const wxString& iconFile, int iconIndex = 0 );
    void SetShortDesc( const wxString& shortDesc );

    const wxString& GetMimeType() const;
    const wxString& GetOpenCommand() const;
    const wxString& GetPrintCommand() const;
    const wxString& GetShortDesc() const;
    const wxString& GetDescription() const;
    int GetExtensionsCount() const;
    const wxString& GetIconFile();
    int GetIconIndex() const;
};

%{
wxFileTypeInfo*
wxFileTypeInfo::new( strings )
    wxArrayString strings

void
wxFileTypeInfo::GetExtensions()
  PPCODE:
    const wxArrayString& extensions = THIS->GetExtensions();
    PUTBACK;
    wxPli_stringarray_push( aTHX_ extensions );
    SPAGAIN;

%}

%name{Wx::FileType} class wxFileType
{
};

%{
void
wxFileType::GetMimeTypes()
  PREINIT:
    wxArrayString mimeTypes;
  PPCODE:
    bool ok = THIS->GetMimeTypes( mimeTypes );
    if( ok )
    {
        PUTBACK;
        wxPli_stringarray_push( aTHX_ mimeTypes );
        SPAGAIN;
    }
    else
        XSRETURN_EMPTY;

void
wxFileType::GetMimeType()
  PREINIT:
    wxString mimeType;
  PPCODE:
    bool ok = THIS->GetMimeType( &mimeType );
    if( ok )
    {
        XPUSHs( wxPli_wxString_2_sv( aTHX_ mimeType, sv_newmortal() ) );
    }
    else
        XSRETURN_EMPTY;

void
wxFileType::GetExtensions()
  PREINIT:
    wxArrayString extensions;
  PPCODE:
    bool ok = THIS->GetExtensions( extensions );
    if( ok )
    {
        PUTBACK;
        wxPli_stringarray_push( aTHX_ extensions );
        SPAGAIN;
    }
    else
        XSRETURN_EMPTY;

void
wxFileType::GetIcon()
  PREINIT:
#if WXPERL_W_VERSION_GE( 2, 5, 2 )
    wxIconLocation iconLoc;
#else
    wxIcon iconLoc;
#endif
  PPCODE:
    bool ok = THIS->GetIcon( &iconLoc );
    if( ok )
    {
#if WXPERL_W_VERSION_GE( 2, 5, 2 )
        XPUSHs( wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                       new wxIconLocation( iconLoc ),
                                       "Wx::IconLocation" ) );
#else
        XPUSHs( wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                       new wxIcon( iconLoc ),
                                       "Wx::Icon" ) );
#endif
    }
    else
        XSRETURN_EMPTY;

void
wxFileType::GetDescription()
  PREINIT:
    wxString desc;
  PPCODE:
    bool ok = THIS->GetDescription( &desc );
    if( ok )
    {
        XPUSHs( wxPli_wxString_2_sv( aTHX_ desc, sv_newmortal() ) );
    }
    else
        XSRETURN_EMPTY;

void
wxFileType::GetOpenCommand( file, mimeType = wxEmptyString )
    wxString file
    wxString mimeType
  PREINIT:
    wxString command;
  PPCODE:
    bool ok = THIS->GetOpenCommand( &command,
                                    wxFileType::MessageParameters
                                        ( file, mimeType ) );
    if( ok )
        XPUSHs( wxPli_wxString_2_sv( aTHX_ command, sv_newmortal() ) );
    else
        XSRETURN_EMPTY;

void
wxFileType::GetPrintCommand( file, mimeType = wxEmptyString )
    wxString file
    wxString mimeType
  PREINIT:
    wxString command;
  PPCODE:
    bool ok = THIS->GetPrintCommand( &command,
                                     wxFileType::MessageParameters
                                         ( file, mimeType ) );
    if( ok )
        XPUSHs( wxPli_wxString_2_sv( aTHX_ command, sv_newmortal() ) );
    else
        XSRETURN_EMPTY;

%}

%name{Wx::MimeTypesManager} class wxMimeTypesManager
{
    wxMimeTypesManager();

%{
static void
wxMimeTypesManager::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}
    ## // thread OK
    ~wxMimeTypesManager()
        %code{% wxPli_thread_sv_unregister( aTHX_ "Wx::MimeTypesManager", THIS, ST(0) );
                delete THIS;
                %};

    void AddFallbacks( const wxFileTypeInfo *fallbacks );
    wxFileType* GetFileTypeFromExtension( const wxString& extension );
    wxFileType* GetFileTypeFromMimeType( const wxString& mimeType );
    bool IsOfType( const wxString& mimeType, const wxString& wildcard );
#if WXPERL_W_VERSION_LT( 2, 9, 0 )
    bool ReadMailcap( const wxString& filename, bool fallback = false );
    bool ReadMimeTypes( const wxString& filename );
#endif
};

%{
#endif // wxUSE_MIMETYPE
%}
