summaryrefslogtreecommitdiffstats
path: root/lib/libUPnP/Platinum/Source/Core/PltProtocolInfo.h
blob: d86ef0c38db0da9184ffeb6196de69be22a48208 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*****************************************************************
|
|   Platinum - AV Media Protocol Info
|
| Copyright (c) 2004-2010, Plutinosoft, LLC.
| All rights reserved.
| http://www.plutinosoft.com
|
| This program is free software; you can redistribute it and/or
| modify it under the terms of the GNU General Public License
| as published by the Free Software Foundation; either version 2
| of the License, or (at your option) any later version.
|
| OEMs, ISVs, VARs and other distributors that combine and 
| distribute commercially licensed software with Platinum software
| and do not wish to distribute the source code for the commercially
| licensed software under version 2, or (at your option) any later
| version, of the GNU General Public License (the "GPL") must enter
| into a commercial license agreement with Plutinosoft, LLC.
| licensing@plutinosoft.com
| 
| This program is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
| GNU General Public License for more details.
|
| You should have received a copy of the GNU General Public License
| along with this program; see the file LICENSE.txt. If not, write to
| the Free Software Foundation, Inc., 
| 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
| http://www.gnu.org/licenses/gpl-2.0.html
|
****************************************************************/

/** @file
 UPnP AV Media Object Protocol Info.
 */

#ifndef _PLT_PROTOCOL_INFO_H_
#define _PLT_PROTOCOL_INFO_H_

/*----------------------------------------------------------------------
|   includes
+---------------------------------------------------------------------*/
#include "Neptune.h"
#include "PltHttp.h"

/*----------------------------------------------------------------------
|   forward declarations
+---------------------------------------------------------------------*/
class PLT_HttpRequestContext;

/*----------------------------------------------------------------------
|   typedefs
+---------------------------------------------------------------------*/
typedef struct PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry {
    const char* mime_type;
    const char* dlna_ext;
} PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry ;

/*----------------------------------------------------------------------
|   PLT_ProtocolInfo
+---------------------------------------------------------------------*/
/**
 The PLT_ProtocolInfo class holds information about the protocol info of a 
 given UPnP Media Item resource.
 */
class PLT_ProtocolInfo
{
public:
    class FieldEntry {
    public:
        FieldEntry(const char* key, const char* value) :
            m_Key(key), m_Value(value) {}
        NPT_String m_Key;
        NPT_String m_Value;
    };

    // class methods
    static NPT_String  GetMimeTypeFromProtocolInfo(const char* protocol_info);
    
    static const char* GetDlnaExtension(const char* mime_type, 
                                        const PLT_HttpRequestContext* context = NULL);
    static const char* GetDlnaExtension(const char* mime_type, 
                                        PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
    
    static PLT_ProtocolInfo GetProtocolInfo(const char* filename, 
                                            bool with_dlna_extension = true, 
                                            const PLT_HttpRequestContext* context = NULL);
    static PLT_ProtocolInfo GetProtocolInfo(const char* filename, 
                                            bool with_dlna_extension = true, 
                                            PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);
    
    static PLT_ProtocolInfo GetProtocolInfoFromMimeType(const char* mime_type, 
                                                        bool with_dlna_extension = true, 
                                                        const PLT_HttpRequestContext* context = NULL);
    static PLT_ProtocolInfo GetProtocolInfoFromMimeType(const char* mime_type, 
                                                        bool with_dlna_extension = true, 
                                                        PLT_DeviceSignature signature = PLT_DEVICE_UNKNOWN);

    // methods
    PLT_ProtocolInfo();
    //PLT_ProtocolInfo(NPT_String protocol_info);
    PLT_ProtocolInfo(const char* protocol_info);
    PLT_ProtocolInfo(const char* protocol,
                     const char* mask,
                     const char* content_type,
                     const char* extra);
    const NPT_String& GetProtocol()     const { return m_Protocol;  }
    const NPT_String& GetMask()         const { return m_Mask; }
    const NPT_String& GetContentType()  const { return m_ContentType;  }
    const NPT_String& GetExtra()        const { return m_Extra; }
    
    const NPT_String& GetDLNA_PN()      const { return m_DLNA_PN; }

    bool IsValid() { return m_Valid; }

    NPT_String ToString() const;

    bool Match(const PLT_ProtocolInfo& other) const;

private:
	typedef enum {
		PLT_PROTINFO_PARSER_STATE_START,
		PLT_PROTINFO_PARSER_STATE_PN,
		PLT_PROTINFO_PARSER_STATE_OP,
		PLT_PROTINFO_PARSER_STATE_PS,
		PLT_PROTINFO_PARSER_STATE_CI,
		PLT_PROTINFO_PARSER_STATE_FLAGS,
		PLT_PROTINFO_PARSER_STATE_MAXSP,
		PLT_PROTINFO_PARSER_STATE_OTHER
	} PLT_ProtocolInfoParserState;

    NPT_Result SetProtocolInfo(const char* protocol_info);
    NPT_Result ValidateField(const char*  val, 
                        const char*  valid_chars, 
                        NPT_Cardinal num_chars = 0); // 0 means variable number of chars
    NPT_Result ParseExtra(NPT_List<FieldEntry>& entries);
    NPT_Result ValidateExtra();

private:
    NPT_String           m_Protocol;
    NPT_String           m_Mask;
    NPT_String           m_ContentType;
    NPT_String           m_Extra;
    
    NPT_String           m_DLNA_PN;    // DLNA.ORG_PN Parameter (pn-param)
    NPT_String           m_DLNA_OP;    // Operations Parameter (op-param)
    NPT_String           m_DLNA_PS;    // Server-Side PlaySpeeds Parameter (ps-param)
    NPT_String           m_DLNA_CI;    // Conversion Indicator Flag (ci-param)
    NPT_String           m_DLNA_FLAGS; // Flags Parameter (flags-param)
    NPT_String           m_DLNA_MAXSP; // Maximum RTSP Speed Header value (maxsp-param)
    NPT_List<FieldEntry> m_DLNA_OTHER; // Vendor-defined 4th field Parameters (other-param)
    
    bool                 m_Valid;
};

#endif /* _PLT_PROTOCOL_INFO_H_ */