opwavehxdataf.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:22k
源码类别:

Symbian

开发平台:

C/C++

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