opwavehxdataf.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:22k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: opwavehxdataf.cpp,v 1.1.32.3 2004/07/09 01:44:17 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hlxclib/sys/types.h"
  50. #include "hlxclib/sys/stat.h"
  51. //#include <unistd.h>
  52. #include "hlxclib/fcntl.h"
  53. #include "hlxclib/errno.h"
  54. #include "hxtypes.h"
  55. #include "hxcom.h"
  56. #include "hxresult.h"
  57. #include "ihxpckts.h"
  58. #include "hxbuffer.h"
  59. #include "debug.h"
  60. #include "opwavehxdataf.h"
  61. #include "op_fs.h"
  62. /////////////////////////////////////////////////////////////////////////
  63. //
  64. //  Method:
  65. //      OpenwaveHXDataFile::QueryInterface
  66. //  Purpose:
  67. //      Implement this to export the interfaces supported by your
  68. //      object.
  69. //
  70. STDMETHODIMP
  71. OpenwaveHXDataFile::QueryInterface(REFIID riid, void** ppvObj)
  72. {
  73.     if (IsEqualIID(riid, IID_IHXDataFile))
  74.     {
  75.         AddRef();
  76.         *ppvObj = (IHXDataFile*)this;
  77.         return HXR_OK;
  78.     }
  79.     
  80.     *ppvObj = NULL;
  81.     return HXR_NOINTERFACE;
  82. }   
  83. /////////////////////////////////////////////////////////////////////////
  84. //
  85. //  Method:
  86. //      OpenwaveHXDataFile::AddRef
  87. //  Purpose:
  88. //      Everyone usually implements this the same... feel free to use
  89. //      this implementation.
  90. //
  91. STDMETHODIMP_(ULONG32)
  92. OpenwaveHXDataFile::AddRef()
  93. {
  94.     return InterlockedIncrement(&m_lRefCount);
  95. }   
  96. /////////////////////////////////////////////////////////////////////////
  97. //
  98. //  Method:
  99. //      OpenwaveHXDataFile::Release
  100. //  Purpose:
  101. //      Everyone usually implements this the same... feel free to use
  102. //      this implementation.
  103. //
  104. STDMETHODIMP_(ULONG32)
  105. OpenwaveHXDataFile::Release()
  106. {
  107.     if (InterlockedDecrement(&m_lRefCount) > 0)
  108.     {
  109.         return m_lRefCount;
  110.     }
  111.     
  112.     delete this;
  113.     return 0;
  114. }   
  115. OpenwaveHXDataFile::OpenwaveHXDataFile(IUnknown** ppCommonObj)
  116.     : m_ulPos(0),
  117.   m_lRefCount(0),
  118.       m_LastError(0),
  119.       m_pFileName(0),
  120.       m_Fd(-1),
  121.       m_Flags(0),
  122.       m_Begin(0),
  123.       m_BufSize(0),
  124.       m_BufFill(0),
  125.       m_Offset(0),
  126.       m_FileOffset(0),
  127.       m_FlushSize(0),
  128.       m_pBuf(0),
  129.       m_Dirty(0)
  130. {
  131.     m_pFileName = new CHXBuffer;
  132.     m_pFileName->AddRef();
  133.     m_BufSize = GetPageSize();
  134. }
  135. OpenwaveHXDataFile::~OpenwaveHXDataFile()
  136. {
  137.     Close();
  138.     FreeBuf();
  139.     HX_RELEASE(m_pFileName);
  140. }
  141. /////////////////////////////////////////////////////////////////////////
  142. //
  143. // Method:
  144. //     OpenwaveHXDataFile::Bind:
  145. // Purpose:
  146. //     Cache the file name for opening.
  147. //     If file already open, close it.
  148. //
  149. STDMETHODIMP_(void)
  150. OpenwaveHXDataFile::Bind(const char* pFileName)
  151. {
  152.     if (m_Fd >= 0)
  153. Close();
  154.     m_pFileName->Set((BYTE *)pFileName, ::strlen(pFileName)+1);
  155. }
  156. /////////////////////////////////////////////////////////////////////////
  157. //
  158. // Method:
  159. //     OpenwaveHXDataFile::Create
  160. // Purpose:
  161. //     Creates a datafile using the specified mode
  162. //     uOpenMode - File Open mode - HX_FILEFLAG_READ/HX_FILEFLAG_WRITE/HX_FILEFLAG_BINARY
  163. //
  164. STDMETHODIMP
  165. OpenwaveHXDataFile::Create(UINT16 uOpenMode)
  166. {
  167.     return HXR_NOTIMPL;
  168. }
  169. /////////////////////////////////////////////////////////////////////////
  170. //
  171. //  Method:
  172. //      HXBufferedDatatFile::Open
  173. //  Purpose:
  174. //      Open for buffered i/o.  If file is already open, ignore this
  175. //      open and return HXR_OK status.  Flags can have 3 possible values
  176. //
  177. //    HX_FILEFLAG_READ:     Open file read only
  178. //
  179. //    HX_FILEFLAG_WRITE:    Open file for writing.  If file does not
  180. //      exists, it is created.
  181. //
  182. //    HX_FILEFLAG_READ|HX_FILEFLAG_WRITE:                
  183. //                           Open file for both read and writing.
  184. //
  185. //  Note:
  186. //      HX_FILEFLAG_WRITE implies both reads and writes to the file.  It
  187. //      also implies the file can be randomly updated any where in the
  188. //      file as well as appended onto the end. If the file exists,
  189. //      then the file contents are buffered in before updating.  As a
  190. //      result, writing implies both system reads and writes.
  191. //
  192. //      If open succeeds, returns HXR_OK, otherwise HXR_FAIL.
  193. //
  194. STDMETHODIMP
  195. OpenwaveHXDataFile::Open(UINT16 flags)
  196. {
  197. // flags don't match close and reopen
  198.     if (m_Fd >= 0 && flags != m_Flags)
  199.     {
  200. Close();
  201.     }
  202.     int status = HXR_OK;
  203.     if (m_Fd < 0)
  204.     {
  205. OpFsFlags oflags = 0;
  206. m_Flags = flags;
  207. m_LastError = 0;
  208. if (m_Flags & HX_FILEFLAG_WRITE)
  209. {
  210. oflags = (kOpFsFlagCreate|kOpFsFlagRdwr);
  211. if (!(m_Flags & HX_FILEFLAG_NOTRUNC))
  212. {
  213. oflags |= kOpFsFlagRdwr;
  214. }
  215. }
  216. else if (m_Flags & HX_FILEFLAG_READ)
  217. oflags = kOpFsFlagRdOnly;
  218. else
  219. return HXR_FAIL;
  220. if ((m_Fd =
  221. //::open((const char*) m_pFileName->GetBuffer(), oflags, 0644)) < 0)
  222. OpFsOpen( (const char*) m_pFileName->GetBuffer(), oflags, 0644 )) == kOpFsErrAny)
  223. {
  224. status = HXR_FAIL;
  225. m_LastError = errno;
  226. }
  227. else // open ok: initialize
  228. {
  229. if (m_pBuf == 0)
  230. AllocBuf();
  231. m_ulPos = 0;
  232. m_Begin = 0;
  233. m_BufFill = 0;
  234. m_Offset = 0;
  235. m_FileOffset = 0;
  236. m_FlushSize = 0;
  237. m_LastError = 0;
  238. m_Dirty = 0;
  239. }
  240.     }
  241.     return status;
  242. }
  243. /////////////////////////////////////////////////////////////////////////
  244. //
  245. // Method:
  246. //     OpenwaveHXDataFile::Close:
  247. //  Purpose:
  248. //     Flush the file buffer (if open of writing and close the file.
  249. //     Note that file is not closed when there are multiple references
  250. //     to this object.
  251. //
  252. STDMETHODIMP
  253. OpenwaveHXDataFile::Close()
  254. {
  255.     int status = HXR_OK;
  256.     if (m_Fd >= 0 && m_lRefCount <= 1)
  257.     {
  258. if (m_Flags & HX_FILEFLAG_WRITE)
  259.     FlushBuf();
  260. //if (::close(m_Fd) == -1)
  261. if (OpFsClose( m_Fd ) != kOpFsErrOk )
  262. {
  263.     status = HXR_FAIL;
  264.   m_LastError = errno;
  265. }
  266. m_Fd = -1;
  267.     }
  268.     return status;
  269. }
  270. /////////////////////////////////////////////////////////////////////////
  271. //
  272. // Method:
  273. //     OpenwaveHXDataFile::Name
  274. // Purpose:
  275. //     Name returns the currently bound file name in FileName.
  276. //     and returns TRUE, if the a name has been bound.  Otherwise
  277. //     FALSE is returned.
  278. //
  279. STDMETHODIMP_(BOOL)
  280. OpenwaveHXDataFile::Name(REF(IHXBuffer*) pFileName)
  281. {
  282.     if (m_pFileName && m_pFileName->GetSize())
  283.     {
  284. pFileName = m_pFileName;
  285. pFileName->AddRef();
  286. return TRUE;
  287.     }
  288.     return FALSE;
  289. }
  290. /////////////////////////////////////////////////////////////////////////
  291. //
  292. // Method:
  293. //     OpenwaveHXDataFile::IsOpen()
  294. // Purpose:
  295. //     IsOpen returns TRUE if file is open.  Otherwise FALSE.
  296. //
  297. BOOL
  298. OpenwaveHXDataFile::IsOpen()
  299. {
  300.     return (m_Fd >= 0 ? TRUE : FALSE);
  301. }
  302. /////////////////////////////////////////////////////////////////////////
  303. //
  304. // Method
  305. //     OpenwaveHXDataFile::Seek:
  306. // Purpose:
  307. //     Just move the seek offset according to the value of whense.
  308. //     This only sets the local idea of the current offset, no system
  309. //     level seek is performed.  If seek is ok, the current value of
  310. //     seek offset is returned.  Otherwise -1 is returned.
  311. //
  312. //     XXXBH:  24-Mar-99
  313. //       Note that most of callers expect HXR_OK as return value, not
  314. //       the current offset.  So the above comment is a noop.   Also
  315. //       the offset is passed in as an unsigned, it should be signed to
  316. //       allow seeks in both directions.  Right now we do the ugly cast.
  317. //
  318. STDMETHODIMP
  319. OpenwaveHXDataFile::Seek(ULONG32 offset, UINT16 whense)
  320. {
  321.    
  322.     m_LastError = 0;
  323.     if (m_Fd > 0)
  324.     {
  325. if (OpFsSeek( m_Fd, (OpFsSize)offset, (U8CPU)whense) == kOpFsErrAny)
  326. {
  327. m_LastError = errno;
  328. return HXR_INVALID_FILE;
  329. }
  330. return HXR_OK;
  331.     }
  332. return HXR_INVALID_FILE;
  333. }
  334. /////////////////////////////////////////////////////////////////////////
  335. //
  336. // Method:
  337. //     OpenwaveHXDataFile::Tell()
  338. // Purpose:
  339. //      Tell returns the current (logical) file position in the file
  340. //
  341. STDMETHODIMP_(ULONG32)
  342. OpenwaveHXDataFile::Tell()
  343. {
  344.     INT32 offset = -1;
  345.     if (m_Fd > 0)
  346.     {
  347. m_LastError = kOpFsErrOk;
  348. // so we do this instead....
  349. if ((offset = (INT32)OpFsSeek( m_Fd, 0, kOpFsSeekCur)) == kOpFsErrAny)
  350. {
  351. m_LastError = kOpFsErrAny;
  352. }
  353.     }
  354.     return (ULONG32)offset;
  355. }
  356. /////////////////////////////////////////////////////////////////////////
  357. //
  358. // Method:
  359. //     OpenwaveHXDataFile::Read:
  360. // Purpose
  361. // Read reads up to count bytes of data into buf.
  362. // returns the number of bytes read, EOF, or -1 if the read failed 
  363. //
  364. STDMETHODIMP_(ULONG32)
  365. OpenwaveHXDataFile::Read(REF(IHXBuffer *) pBuf, ULONG32 count)
  366. {
  367. UINT32 ncnt = 0; 
  368. m_LastError = 0;
  369. pBuf = new CHXBuffer();
  370.     pBuf->AddRef();
  371.     pBuf->SetSize(count);
  372.     if (m_Fd > 0)
  373.     { 
  374. if ((int)(ncnt = OpFsRead(m_Fd, (void *)pBuf->GetBuffer(), count)) == kOpFsErrAny)
  375. {
  376. m_LastError = kOpFsErrAny;
  377. pBuf->Release();
  378. pBuf = NULL;
  379. /*
  380.  * XXX PM Have to return 0 here because it is unsigned
  381.  * return value.
  382. */
  383. return 0;
  384. }
  385. else
  386. {
  387. m_ulPos += ncnt;
  388. }
  389. if (ncnt < count)
  390. {
  391. pBuf->SetSize(ncnt);
  392. }
  393.     }
  394.     return (ULONG32)ncnt;
  395. }
  396. /////////////////////////////////////////////////////////////////////////
  397. //
  398. // Method:
  399. //     OpenwaveHXDataFile::Write:
  400. // Purpose:
  401. //      Write the requested number of bytes.  The number of bytes
  402. //      written are return.  If errors occur, -1 is returned.  The
  403. //      LastError() member function returns the value of errno from
  404. //      the last system request.
  405. //
  406. STDMETHODIMP_(ULONG32)
  407. OpenwaveHXDataFile::Write(REF(IHXBuffer *) pBuf)
  408. {
  409.     if (m_Fd >= 0)
  410.     {
  411. pBuf->AddRef();
  412. ULONG32 count = pBuf->GetSize();
  413. ULONG32 nleft = count;
  414. INT32 rval = 0;
  415. const unsigned char* buf = pBuf->GetBuffer();
  416. while (nleft > 0)
  417. {
  418. // If we enter this block, m_Offset
  419. // lies within the current buffer.
  420.     if (m_Begin <= m_Offset && m_Offset < m_Begin + m_BufSize ||
  421. (rval = NewBuf()) >= 0)
  422.     {
  423. UINT32 off = m_Offset - m_Begin;  // offset within buffer
  424.   // and how much to copy
  425. UINT32 ncopy = m_Begin + m_BufSize - m_Offset;
  426. if (nleft < ncopy)
  427.     ncopy = nleft;
  428. ::memcpy((void*) (m_pBuf+off), (const void*) buf, ncopy); /* Flawfinder: ignore */
  429. m_Dirty = 1;
  430. nleft -= ncopy;
  431. m_Offset += ncopy;
  432. buf += ncopy;
  433. // data extend beyond what was read in
  434. if (m_Offset-m_Begin > m_BufFill)
  435.     m_BufFill = m_Offset-m_Begin;
  436.     }
  437. // NewBuf() could not make the above
  438. // assertion, true because an error occured.
  439.     else
  440. break;
  441. }
  442. pBuf->Release();
  443. return rval >= 0 ? count - nleft : HXR_FAIL;
  444.     }
  445.     return HXR_FAIL;
  446. }
  447. /////////////////////////////////////////////////////////////////////////
  448. //
  449. // Method:
  450. //     OpenwaveHXDataFile::Flush()
  451. // Purpose:
  452. //     Flush out the data in case of buffered I/O
  453. //  
  454. STDMETHODIMP
  455. OpenwaveHXDataFile::Flush()
  456. {
  457.     if (m_Flags & HX_FILEFLAG_WRITE)
  458. return FlushBuf() > 0 ? HXR_OK : HXR_FAIL;
  459.     return HXR_OK;
  460. }
  461. /////////////////////////////////////////////////////////////////////////
  462. //
  463. // Method:
  464. //     OpenwaveHXDataFile::Stat
  465. // Purpose:
  466. //     Return info about the data file such as permissions, time of
  467. //     creation size in bytes, etc.  Note that if this method is
  468. //     called with unflushed extensions to the file, the st_size field
  469. //     will not be correct.  We could Flush before filling in the stat
  470. //     data, but this is a const function.  The other alternative is
  471. //     to set the st.st_size field to the value returned by
  472. //     LogicalSize() (which includes unflushed extensions to the
  473. //     file).
  474. //
  475. STDMETHODIMP
  476. OpenwaveHXDataFile::Stat(struct stat* buf)
  477. {
  478.     return GetFileStat(buf);
  479. }
  480. STDMETHODIMP
  481. OpenwaveHXDataFile::Delete()
  482. {
  483. return HXR_OK;
  484. }
  485. STDMETHODIMP_(INT16)
  486. OpenwaveHXDataFile::GetFd()
  487. {   
  488.     return m_Fd;
  489. }
  490. /////////////////////////////////////////////////////////////////////////
  491. //
  492. // Method:
  493. //     OpenwaveHXDataFile::GetLastError:
  494. // Purpose:
  495. //     Returns the value of errno from the last system request.
  496. //
  497. STDMETHODIMP
  498. OpenwaveHXDataFile::GetLastError()
  499. {
  500.     return m_LastError;
  501. }
  502. STDMETHODIMP_(void) 
  503. OpenwaveHXDataFile::GetLastError(REF(IHXBuffer*) err)
  504. {
  505.     char* str = ::strerror(m_LastError);
  506.     err = new CHXBuffer;
  507.     err->Set((BYTE*) str, ::strlen(str)+1);
  508.     err->AddRef();
  509. }
  510. /////////////////////////////////////////////////////////////////////////
  511. //
  512. //  Method:
  513. //      OpenwaveHXDataFile::FlushSize():
  514. //  Purpose:
  515. //       Return flushed file size.  We assume that only this object
  516. //       has changed the size of the file.  The size returned does NOT
  517. //       include bytes in the buffer not yet flushed to the file.
  518. //
  519. ULONG32
  520. OpenwaveHXDataFile::FlushSize()
  521. {
  522.     if (m_FlushSize == 0)
  523.     {
  524. struct stat st;
  525. if (GetFileStat(&st) == HXR_OK)
  526.     m_FlushSize = st.st_size;
  527.     }
  528.     return m_FlushSize;
  529. }
  530. /////////////////////////////////////////////////////////////////////////
  531. //
  532. //  Method:
  533. //      OpenwaveHXDataFile::LogicalSize():
  534. //  Purpose:
  535. //       Return logical file size.  We assume that only this object
  536. //       has changed the size of the file.  The size returned includes
  537. //       bytes in the buffer not yet flushed to the file.
  538. //
  539. ULONG32
  540. OpenwaveHXDataFile::LogicalSize()
  541. {
  542. // If the flushed size is <= the
  543. // beginning of the current buffer,
  544. // we have extended the file, but
  545. // have not flushed it.
  546.     ULONG32 size = FlushSize();
  547.     if (size <= m_Begin)
  548.     {
  549. size = m_Begin + m_BufFill;
  550.     }
  551.     return size;
  552. }
  553. /////////////////////////////////////////////////////////////////////////
  554. //
  555. // Method:
  556. //     OpenwaveHXDataFile::NewBuf:
  557. //  Purpose:
  558. //      Utility method.
  559. //      Request an new i/o buffer.  If the file is en for writing,
  560. //      the buffer is flushed if marked dirty.  If the file is open
  561. //      for reading a new buffer containing the current seek offset is
  562. //      read in from the file.  Note for files open for writing, the
  563. //      current buffer is flushed, before the new buffer is read in.
  564. //      Returns vales:
  565. //
  566. //         1       Buffer was successfully refreshed.
  567. //         0       If file is open for reading, cureent seek offset
  568. //                 is at or beyond EOF.
  569. //        -1       Error occured during flushing or filling.
  570. //
  571. INT32 OpenwaveHXDataFile::NewBuf()
  572. {
  573.     int status = 1;
  574. // if writing flush the current buffer 
  575.     if (m_Flags & HX_FILEFLAG_WRITE)
  576.     {
  577. status = FlushBuf();
  578.     }
  579. // fill buffer from file
  580.     if (status > 0)
  581.     {
  582. status = FillBuf();
  583.     }
  584.     return status;
  585. }
  586. /////////////////////////////////////////////////////////////////////////
  587. //
  588. // Method:
  589. //     OpenwaveHXDataFile::FillBuf:
  590. //
  591. // Purpose   
  592. //      Utility method:
  593. //      Fill buffer with file contents at current offset.
  594. //      Returns:
  595. //         1   Buffer filled.  If End of Buffer is beyond EOF,
  596. //             buffer is partially filled.  m_BufFill is set
  597. //             to how much of buffer is filled.
  598. //         0   End of File
  599. //        -1   Read or seek error, or file not open
  600. //
  601. INT32
  602. OpenwaveHXDataFile::FillBuf()
  603. {
  604.     int status = -1;
  605.     m_LastError = 0;
  606.     if (m_Fd >= 0)
  607.     {
  608. // Get beginning of buffer on a
  609. // m_BufSize boundry.  If the beginning
  610. // of the buffer is less then the current
  611. // flushed file size, seek and read it in.
  612. m_Begin = (m_Offset/m_BufSize)*m_BufSize;
  613. m_BufFill = 0;
  614. if (m_Begin < FlushSize())
  615. {
  616.     INT32 rval = -1;
  617.     m_BufFill = 0;
  618.     if ((rval = Pread((void*) m_pBuf, m_BufSize, m_Begin)) > 0)
  619.     {
  620. m_BufFill = rval;
  621. status = 1;
  622.     }
  623.     else if (rval < 0) // lseek or read error
  624.     {
  625. m_LastError = errno;
  626. status = -1;
  627.     }
  628.     else // EOF: zero buffer
  629.     {
  630. ::memset((void*) m_pBuf, 0, m_BufSize);
  631. status = 0;
  632.     }
  633. }
  634. else // m_Begin is beyond EOF: zero buffer
  635. {
  636.     ::memset((void*) m_pBuf, 0, m_BufSize);
  637.     status = 0;
  638. }
  639.     }
  640.     return status;
  641. }
  642. /////////////////////////////////////////////////////////////////////////
  643. //
  644. // Method:
  645. //     OpenwaveHXDataFile::FlushBuf:
  646. // Purpose:
  647. //    Utility method:
  648. //    If file is open for writing and the current i/o buffer is dirty,
  649. //    write the contents to the file.
  650. //    Returns:
  651. //         1   Buffer Flushed.
  652. //        -1   Read or seek error, or file not open or read only.
  653. //
  654. INT32
  655. OpenwaveHXDataFile::FlushBuf()
  656. {
  657.     int status = -1;
  658.     m_LastError = 0;
  659.     if (m_Fd >= 0 && (m_Flags & HX_FILEFLAG_WRITE))
  660.     {
  661. // buffer has been scribbled on.
  662. if (m_Dirty && m_BufFill > 0)
  663. {
  664.     int rval = -1;
  665.     if ((rval = Pwrite((const void*) m_pBuf, m_BufFill, m_Begin)) > 0)
  666.     {
  667. status = 1;
  668. m_Dirty = 0;
  669.     }
  670.     else
  671.     {
  672. status = -1;
  673. m_LastError = errno;
  674.     }
  675. }
  676. else // already flushed.
  677.     status = 1;
  678.     }
  679.     return status;
  680. }
  681. /////////////////////////////////////////////////////////////////////////
  682. //
  683. // Method:
  684. //     OpenwaveHXDataFile::AllocBuf:
  685. // Purpose:
  686. //     Allocate  the i/o buffer off of heap.
  687. //
  688. void
  689. OpenwaveHXDataFile::AllocBuf()
  690. {
  691.     if (m_BufSize > 0)
  692.     {
  693. m_pBuf = new char[m_BufSize];
  694.     }
  695. }
  696. /////////////////////////////////////////////////////////////////////////
  697. //
  698. // Method:
  699. //     OpenwaveHXDataFile::FreeBuf:
  700. //  Purpose:
  701. //     Free the i/o buffer.
  702. //
  703. void
  704. OpenwaveHXDataFile::FreeBuf()
  705. {
  706. if (m_pBuf)
  707.     {
  708. delete [] m_pBuf;
  709. m_pBuf = 0;
  710. }
  711.     m_BufFill = 0;
  712.     m_Begin = 0;
  713. }
  714. /////////////////////////////////////////////////////////////////////////
  715. //
  716. // Method:
  717. //     OpenwaveHXDataFile::Pread:
  718. // Purpose:
  719. //     Read data at requrested position.
  720. //     Number of bytes read is returned 0 if at EOF, or -1 on error
  721. //
  722. INT32
  723. OpenwaveHXDataFile::Pread(void* buf, INT32 nbytes, ULONG32 offset)
  724. {
  725.     //INT32 nread = -1;
  726. OpFsSize nread = kOpFsErrAny;
  727.     m_LastError = 0;
  728.     if (m_Fd >= 0)
  729.     {
  730. if (m_FileOffset == offset ||
  731.    // ::lseek(m_Fd, offset, SEEK_SET) != -1)
  732.    OpFsSeek( m_Fd, (OpFsSize)offset, kOpFsSeekCur) != kOpFsErrAny)
  733. {
  734.     m_FileOffset = offset;
  735.     //if ((nread = ::read(m_Fd, buf, nbytes)) > 0)
  736. if ((nread = OpFsRead( m_Fd, buf, nbytes)) != kOpFsErrAny)
  737. m_FileOffset += nread;
  738.     else if (nread < 0)
  739. m_LastError = errno;
  740. }
  741.     }
  742.     return nread;
  743. }
  744. /////////////////////////////////////////////////////////////////////////
  745. //
  746. // Method:
  747. //     OpenwaveHXDataFile::Pwrite:
  748. // Purpose:
  749. //     Write data at requrested position.
  750. //     Number of bytes read is returned, or -1 on error
  751. //
  752. INT32
  753. OpenwaveHXDataFile::Pwrite(const void* buf, INT32 nbytes, ULONG32 offset)
  754. {
  755.     //INT32 nwrite = -1;
  756. OpFsSize nwrite = kOpFsErrAny;
  757.     m_LastError = 0;
  758.     if (m_Fd >= 0)
  759.     {
  760. if (m_FileOffset == offset ||
  761.     //::lseek(m_Fd, offset, SEEK_SET) != -1)
  762. OpFsSeek( m_Fd, (OpFsSize)offset, kOpFsSeekCur) != kOpFsErrAny)
  763. {
  764.     m_FileOffset = offset;
  765.     //if ((nwrite = ::write(m_Fd, buf, nbytes)) > 0)
  766. if (( nwrite = OpFsWrite( m_Fd, buf, nbytes)) != kOpFsErrAny)
  767.     {
  768. m_FileOffset += nwrite;
  769. if (m_FileOffset > m_FlushSize)
  770. m_FlushSize = m_FileOffset;
  771.     }
  772.     else
  773. m_LastError = errno;
  774. }
  775.     }
  776.     return nwrite;
  777. }
  778. /////////////////////////////////////////////////////////////////////////
  779. //
  780. // Method:
  781. //     OpenwaveHXDataFile::GetFileStat
  782. //  Purpose
  783. //   Get file stat. If all is of HXR_OK is returned otherwise HXR_FAIL
  784. //
  785. INT32
  786. OpenwaveHXDataFile::GetFileStat(struct stat* st) const
  787. {
  788.     INT32 status = HXR_FAIL;
  789. OpFsStatStruct filestats;
  790.     if (m_Fd  >= 0)
  791.     {
  792.         if (OpFsStat((const char*) m_pFileName->GetBuffer(), &filestats) == kOpFsErrOk)
  793. {
  794. st->st_size = filestats.size;
  795. status = HXR_OK;
  796. }
  797.     }
  798. // cast to get around const
  799.     ((OpenwaveHXDataFile*) this)->m_LastError = status == HXR_OK ? 0 : errno;
  800. return status;
  801. }
  802. /////////////////////////////////////////////////////////////////////////
  803. //
  804. // Method:
  805. //     OpenwaveHXDataFile::GetPageSize:
  806. // Purpose:
  807. //    Get the system page size.
  808. INT32
  809. OpenwaveHXDataFile::GetPageSize() const
  810. {
  811.     //return ::sysconf(_SC_PAGE_SIZE);
  812. return 0;  // On Openwave platform, pages service not available
  813. }