xref: /haiku/src/add-ons/media/plugins/ape_reader/MAClib/APELink.cpp (revision 58481f0f6ef1a61ba07283f012cafbc2ed874ead)
1 #include "NoWindows.h"
2 
3 #include "All.h"
4 #include "APELink.h"
5 #include "CharacterHelper.h"
6 #include IO_HEADER_FILE
7 
8 #define APE_LINK_HEADER                 "[Monkey's Audio Image Link File]"
9 #define APE_LINK_IMAGE_FILE_TAG         "Image File="
10 #define APE_LINK_START_BLOCK_TAG        "Start Block="
11 #define APE_LINK_FINISH_BLOCK_TAG       "Finish Block="
12 
13 CAPELink::CAPELink(const str_utf16 * pFilename)
14 {
15     // empty
16     m_bIsLinkFile = FALSE;
17     m_nStartBlock = 0;
18     m_nFinishBlock = 0;
19     m_cImageFilename[0] = 0;
20 
21     // open the file
22     IO_CLASS_NAME ioLinkFile;
23     if (ioLinkFile.Open(pFilename) == ERROR_SUCCESS)
24     {
25         // create a buffer
26         CSmartPtr<char> spBuffer(new char [1024], TRUE);
27 
28         // fill the buffer from the file and null terminate it
29         unsigned int nBytesRead = 0;
30         ioLinkFile.Read(spBuffer.GetPtr(), 1023, &nBytesRead);
31         spBuffer[nBytesRead] = 0;
32 
33         // call the other constructor (uses a buffer instead of opening the file)
34         ParseData(spBuffer, pFilename);
35     }
36 }
37 
38 CAPELink::CAPELink(const char * pData, const str_utf16 * pFilename)
39 {
40     ParseData(pData, pFilename);
41 }
42 
43 CAPELink::~CAPELink()
44 {
45 }
46 
47 void CAPELink::ParseData(const char * pData, const str_utf16 * pFilename)
48 {
49     // empty
50     m_bIsLinkFile = FALSE;
51     m_nStartBlock = 0;
52     m_nFinishBlock = 0;
53     m_cImageFilename[0] = 0;
54 
55     if (pData != NULL)
56     {
57         // parse out the information
58         char * pHeader = strstr(pData, APE_LINK_HEADER);
59         char * pImageFile = strstr(pData, APE_LINK_IMAGE_FILE_TAG);
60         char * pStartBlock = strstr(pData, APE_LINK_START_BLOCK_TAG);
61         char * pFinishBlock = strstr(pData, APE_LINK_FINISH_BLOCK_TAG);
62 
63         if (pHeader && pImageFile && pStartBlock && pFinishBlock)
64         {
65             if ((_strnicmp(pHeader, APE_LINK_HEADER, strlen(APE_LINK_HEADER)) == 0) &&
66                 (_strnicmp(pImageFile, APE_LINK_IMAGE_FILE_TAG, strlen(APE_LINK_IMAGE_FILE_TAG)) == 0) &&
67                 (_strnicmp(pStartBlock, APE_LINK_START_BLOCK_TAG, strlen(APE_LINK_START_BLOCK_TAG)) == 0) &&
68                 (_strnicmp(pFinishBlock, APE_LINK_FINISH_BLOCK_TAG, strlen(APE_LINK_FINISH_BLOCK_TAG)) == 0))
69             {
70                 // get the start and finish blocks
71                 m_nStartBlock = atoi(&pStartBlock[strlen(APE_LINK_START_BLOCK_TAG)]);
72                 m_nFinishBlock = atoi(&pFinishBlock[strlen(APE_LINK_FINISH_BLOCK_TAG)]);
73 
74                 // get the path
75                 char cImageFile[MAX_PATH + 1]; int nIndex = 0;
76                 char * pImageCharacter = &pImageFile[strlen(APE_LINK_IMAGE_FILE_TAG)];
77                 while ((*pImageCharacter != 0) && (*pImageCharacter != '\r') && (*pImageCharacter != '\n'))
78                     cImageFile[nIndex++] = *pImageCharacter++;
79                 cImageFile[nIndex] = 0;
80 
81                 CSmartPtr<str_utf16> spImageFileUTF16(GetUTF16FromUTF8((UCHAR *) cImageFile), TRUE);
82 
83                 // process the path
84                 // SHINTA: w_char -> char -->
85                 if (strrchr(spImageFileUTF16, '\\') == NULL)
86                 {
87                     str_utf16 cImagePath[MAX_PATH + 1];
88                     strcpy(cImagePath, pFilename);
89                     strcpy(strrchr(cImagePath, '\\') + 1, spImageFileUTF16);
90                     strcpy(m_cImageFilename, cImagePath);
91                 }
92                 else
93                 {
94                     strcpy(m_cImageFilename, spImageFileUTF16);
95                 }
96 				// <-- SHINTA
97 
98                 // this is a valid link file
99                 m_bIsLinkFile = TRUE;
100             }
101         }
102     }
103 }
104 
105 int CAPELink::GetStartBlock()
106 {
107     return m_nStartBlock;
108 }
109 
110 int CAPELink::GetFinishBlock()
111 {
112     return m_nFinishBlock;
113 }
114 
115 const str_utf16 * CAPELink::GetImageFilename()
116 {
117     return m_cImageFilename;
118 }
119 
120 BOOL CAPELink::GetIsLinkFile()
121 {
122     return m_bIsLinkFile;
123 }
124 
125