|
OpenMAXBellagio 0.9.3
|
00001 00026 #include "content_pipe_file.h" 00027 00029 static CPresult Create( CPhandle *hContent, CPstring szURI ) 00030 { 00031 file_ContentPipe* pFilePipe = (file_ContentPipe*) hContent; 00032 char* pathname = szURI + 7; 00033 CPresult err = 0; 00034 int flags, ret; 00035 00036 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00037 00038 if(0 != strncmp(szURI, "file://", 7)) 00039 err = KD_EINVAL; 00040 00041 flags = O_WRONLY | O_CREAT; 00042 00043 if(0 == err) { 00044 ret = open(pathname, flags, 0); 00045 if(-1 != ret) { 00046 pFilePipe->fd = ret; 00047 } else { 00048 err = KD_EIO; /* ??? */ 00049 } 00050 } 00051 00052 return err; 00053 } 00054 00056 static CPresult Open( CPhandle* hContent, CPstring szURI, CP_ACCESSTYPE eAccess ) 00057 { 00058 file_ContentPipe* pFilePipe = (file_ContentPipe*) hContent; 00059 CPresult err = 0; 00060 int flags, ret; 00061 00062 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00063 00064 if(0 != strncmp(szURI, "file://", 7)) 00065 err = KD_EINVAL; 00066 00067 if(0 == err) 00068 switch(eAccess) { 00069 case CP_AccessRead: 00070 flags = O_RDONLY; 00071 break; 00072 case CP_AccessWrite: 00073 flags = O_WRONLY; 00074 break; 00075 case CP_AccessReadWrite: 00076 flags = O_RDWR; 00077 break; 00078 default: 00079 err = KD_EINVAL; /* ??? */ 00080 break; 00081 } 00082 00083 if(0 == err) { 00084 char* pathname = szURI + 7; 00085 ret = open(pathname, flags); 00086 if(-1 != ret) { 00087 pFilePipe->fd = ret; 00088 } else { 00089 /* Map errno */ 00090 err = KD_EIO; /* ??? */ 00091 } 00092 } 00093 00094 return err; 00095 } 00096 00098 static CPresult Close( CPhandle hContent ) 00099 { 00100 file_ContentPipe* pFilePipe = (file_ContentPipe*) hContent; 00101 CPresult err = 0; 00102 int ret; 00103 00104 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00105 00106 ret = close(pFilePipe->fd); 00107 if(ret == -1) { 00108 /* Map errno */ 00109 err = KD_EIO; /* ??? */ 00110 } 00111 00112 return err; 00113 } 00114 00116 static CPresult CheckAvailableBytes( CPhandle hContent, CPuint nBytesRequested, CP_CHECKBYTESRESULTTYPE *eResult ) 00117 { 00118 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00119 00120 return KD_EBADF; 00121 } 00122 00124 static CPresult SetPosition( CPhandle hContent, CPint nOffset, CP_ORIGINTYPE eOrigin) 00125 { 00126 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00127 00128 return KD_EBADF; 00129 } 00130 00132 static CPresult GetPosition( CPhandle hContent, CPuint *pPosition) 00133 { 00134 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00135 00136 return KD_EBADF; 00137 } 00138 00141 static CPresult Read( CPhandle hContent, CPbyte *pData, CPuint nSize) 00142 { 00143 file_ContentPipe* pFilePipe = (file_ContentPipe*) hContent; 00144 CPresult err = 0; 00145 ssize_t count; 00146 00147 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00148 00149 count = read(pFilePipe->fd, (void*) pData, (size_t) nSize); 00150 00151 if(count < nSize) { 00152 err = KD_EIO; /* ??? */ 00153 } else if(count == -1) { 00154 err = KD_EIO; /* ??? */ 00155 } 00156 00157 return err; 00158 } 00159 00172 static CPresult ReadBuffer( CPhandle hContent, CPbyte **ppBuffer, CPuint *nSize, CPbool bForbidCopy) 00173 { 00174 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00175 00176 return KD_EBADF; 00177 } 00178 00180 static CPresult ReleaseReadBuffer(CPhandle hContent, CPbyte *pBuffer) 00181 { 00182 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00183 00184 return KD_EBADF; 00185 } 00186 00189 static CPresult Write( CPhandle hContent, CPbyte *pData, CPuint nSize) 00190 { 00191 file_ContentPipe* pFilePipe = (file_ContentPipe*) hContent; 00192 CPresult err = 0; 00193 ssize_t ret; 00194 00195 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00196 00197 ret = write(pFilePipe->fd, (void*) pData, (size_t) nSize); 00198 00199 if(ret < nSize) { 00200 err = KD_EIO; /* ??? */ 00201 } else if(ret == -1) { 00202 err = KD_EIO; /* ??? */ 00203 } 00204 00205 return err; 00206 } 00207 00211 static CPresult GetWriteBuffer( CPhandle hContent, CPbyte **ppBuffer, CPuint nSize) 00212 { 00213 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00214 00215 return KD_EBADF; 00216 } 00217 00220 static CPresult WriteBuffer( CPhandle hContent, CPbyte *pBuffer, CPuint nFilledSize) 00221 { 00222 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00223 00224 return KD_EBADF; 00225 } 00226 00228 static CPresult RegisterCallback( CPhandle hContent, CPresult (*ClientCallback)(CP_EVENTTYPE eEvent, CPuint iParam)) 00229 { 00230 DEBUG(DEB_LEV_FUNCTION_NAME, "content_pipe_file:%s \n", __func__); 00231 00232 return KD_EBADF; 00233 } 00234 00235 CPresult file_pipe_Constructor(CP_PIPETYPE **ppPipe, CPstring szURI) 00236 { 00237 file_ContentPipe* pFilePipe; 00238 00239 pFilePipe = (file_ContentPipe*) calloc(1, sizeof(file_ContentPipe)); 00240 00241 if(NULL != pFilePipe) { 00242 00243 pFilePipe->pipe.Open = Open; 00244 pFilePipe->pipe.Close = Close; 00245 pFilePipe->pipe.Create = Create; 00246 pFilePipe->pipe.CheckAvailableBytes = CheckAvailableBytes; 00247 pFilePipe->pipe.SetPosition = SetPosition; 00248 pFilePipe->pipe.GetPosition = GetPosition; 00249 pFilePipe->pipe.Read = Read; 00250 pFilePipe->pipe.ReadBuffer = ReadBuffer; 00251 pFilePipe->pipe.ReleaseReadBuffer = ReleaseReadBuffer; 00252 pFilePipe->pipe.Write = Write; 00253 pFilePipe->pipe.GetWriteBuffer = GetWriteBuffer; 00254 pFilePipe->pipe.WriteBuffer = WriteBuffer; 00255 pFilePipe->pipe.RegisterCallback = RegisterCallback; 00256 00257 pFilePipe->fd = -1; /* An invalid value */ 00258 00259 *ppPipe = (CP_PIPETYPE*) pFilePipe; 00260 } 00261 00262 return 0; 00263 } 00264