OpenMAXBellagio 0.9.3
content_pipe_file.c
Go to the documentation of this file.
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