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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: copyfile.cpp,v 1.2.42.3 2004/07/09 01:44:13 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 <string.h>
  50. #include "hxtypes.h"
  51. #include "copyfile.h"
  52. OSErr DoCopyFile(FSSpec &srcSpec, FSSpec &dstSpec, Boolean moveflag)
  53. {
  54. FInfo dstinfo,srcinfo;
  55. OSErr err = noErr;
  56. short srcRefNum, dstRefNum;
  57. Ptr filePtr = nil;
  58. UINT32 dataleft,fsize,vleft;
  59. long numBytes, blockSize;
  60. if (EqualFSSpec(dstSpec, srcSpec)) return noErr;
  61. err = FSpDelete(&dstSpec);
  62. if (err && err != fnfErr) return err;
  63. if ((dstSpec.vRefNum == srcSpec.vRefNum) && moveflag) { // if on same volume, do it the easy way.
  64. FSSpec dstFolder;
  65. err = FSpRename(&srcSpec,dstSpec.name);
  66. if (err) return err;
  67. memcpy(&dstSpec.name[1],&srcSpec.name[1],srcSpec.name[0]); /* Flawfinder: ignore */
  68. dstSpec.name[0] = srcSpec.name[0];
  69. err = FSMakeFSSpec(dstSpec.vRefNum, dstSpec.parID,NULL, &dstFolder);
  70. if(err) return err;
  71. // if (err = FSSpecFromDirID(dstSpec.vRefNum, dstSpec.parID, dstFolder)) return err;
  72. err = FSpCatMove(&srcSpec,&dstFolder);
  73. if (err) return err;
  74. return noErr;
  75. }
  76. err = GetFileSize(srcSpec,&fsize);
  77. if (err) return err;
  78. vleft = GetVolumeFreeSpace(dstSpec.vRefNum);
  79. if (fsize > vleft) return dskFulErr;
  80. // Get all Finder information for the existing file
  81. err = FSpGetFInfo(&srcSpec,&srcinfo);
  82. if (err) goto here;
  83. // Create the data fork of the new file
  84. FSpCreateResFile(&dstSpec, srcinfo.fdCreator, srcinfo.fdType,smCurrentScript);
  85. err = ResError();
  86. if (err) goto here;
  87. err = FSpGetFInfo(&dstSpec, &dstinfo);
  88. if (err) goto here;
  89. vleft = 0;
  90. // Open up the data fork of the existing file. Copy the entire data fork of the
  91. // source file into the destination file.
  92. blockSize = 0;
  93. err = FSpOpenDF(&srcSpec, fsRdPerm, &srcRefNum);
  94. if (!err) GetEOF(srcRefNum,&blockSize);
  95. dataleft = blockSize;
  96. if (blockSize && !err) {
  97. do {
  98. filePtr = NewPtr(blockSize);
  99. if (!filePtr) blockSize = blockSize * 3L / 4L;
  100. } while (!filePtr);
  101. err = FSpOpenDF(&dstSpec, fsWrPerm, &dstRefNum);
  102. if (!err) {
  103. err = SetFPos(srcRefNum, fsFromStart, 0L);
  104. err = SetFPos(dstRefNum, fsFromStart, 0L);
  105. do {
  106. numBytes = min(blockSize,dataleft);
  107. err = FSRead(srcRefNum, &numBytes, filePtr);
  108. err = FSWrite(dstRefNum, &numBytes, filePtr);
  109. vleft += numBytes;
  110. dataleft -= numBytes;
  111. } while (dataleft);
  112. err = FSClose(dstRefNum);
  113. }
  114. DisposePtr(filePtr);
  115. }
  116. err = FSClose(srcRefNum);
  117. // Open up the resource fork of the existing file. Only if there is a resource fork on the
  118. // existing file do we create a resource fork for the new file. Copy the entire resource fork
  119. // of the source file into the destination file.
  120. blockSize = 0;
  121. err = FSpOpenRF(&srcSpec, fsRdPerm, &srcRefNum);
  122. if (!err) GetEOF(srcRefNum,&blockSize);
  123. dataleft = blockSize;
  124. if (blockSize && !err) {
  125. do {
  126. filePtr = NewPtr(blockSize);
  127. if (!filePtr) blockSize = blockSize * 3L / 4L;
  128. } while (!filePtr);
  129. err = FSpOpenRF(&dstSpec, fsWrPerm, &dstRefNum);
  130. if (!err) {
  131. err = SetEOF(dstRefNum, 0L); // set to zip
  132. err = SetFPos(srcRefNum, fsFromStart, 0L);
  133. err = SetFPos(dstRefNum, fsFromStart, 0L);
  134. do {
  135. numBytes = min(blockSize,dataleft);
  136. err = FSRead(srcRefNum, &numBytes, filePtr);
  137. err = FSWrite(dstRefNum, &numBytes, filePtr);
  138. vleft += numBytes;
  139. dataleft -= numBytes;
  140. } while (dataleft);
  141. err = FSClose(dstRefNum);
  142. }
  143. DisposePtr(filePtr);
  144. }
  145. err = FSClose(srcRefNum);
  146. // Restore the (almost) exact finder information as the original source file
  147. srcinfo.fdLocation.h =
  148. srcinfo.fdLocation.v = -1;
  149. err = FSpSetFInfo(&dstSpec, &srcinfo); 
  150. here:
  151. if (moveflag) return FSpDelete(&srcSpec);
  152. return noErr;
  153. }
  154. long GetVolumeFreeSpace(short vRefNum)
  155. {
  156. #ifdef _CARBON
  157. // xxxbobclark PBXGetVolInfoSync exists in OS 8.5 and later, but still
  158. // I'll leave the old code there for all non-Carbon. By only using it
  159. // in Carbon code we'll never even risk calling it accidentally.
  160. XVolumeParam xpb;
  161. xpb.ioCompletion = NULL;
  162. xpb.ioNamePtr = NULL;
  163. xpb.ioVRefNum = vRefNum;
  164. OSErr err = PBXGetVolInfoSync(&xpb);
  165. if (err) return 0;
  166. if (xpb.ioVFreeBytes > 0x000000007fffffff)
  167. {
  168. return 0x7fffffff;
  169. }
  170. return (long)xpb.ioVFreeBytes;
  171. #else
  172. HVolumeParam block;
  173. OSErr err;
  174. long freeSpace = 0L;
  175. Str255 volname = {0};
  176. memset(&block,0,sizeof(HVolumeParam));
  177. block.ioVRefNum = vRefNum;
  178. err = PBHGetVInfoSync((HParmBlkPtr)&block);
  179. if (!err) {
  180. err = GetVInfo(block.ioVDrvInfo,volname,&vRefNum,&freeSpace);
  181. }
  182. return freeSpace;
  183. #endif
  184. }
  185. Boolean EqualFSSpec(FSSpec &srcSpec, FSSpec &dstSpec)
  186. {
  187. Boolean bEqual = srcSpec.vRefNum == dstSpec.vRefNum;
  188. if(bEqual)
  189. {
  190. bEqual = srcSpec.parID == dstSpec.parID;
  191. }
  192. if(bEqual)
  193. {
  194. bEqual = srcSpec.name[0] == dstSpec.name[0];
  195. }
  196. if(bEqual)
  197. {
  198. bEqual = memcmp(&srcSpec.name[1],&dstSpec.name[1],srcSpec.name[0]) == 0;
  199. }
  200. return bEqual;
  201. }
  202. OSErr GetFileSize(FSSpec &srcSpec,UINT32 *fsize)
  203. {
  204. short srcRefNum;
  205. OSErr err = FSpOpenDF(&srcSpec, fsRdPerm, &srcRefNum);
  206. if (!err) 
  207. {
  208. err = GetEOF(srcRefNum,(long*)fsize);
  209. FSClose(srcRefNum);
  210. }
  211. if(err)
  212. {
  213. *fsize = 0;
  214. }
  215. return err;
  216. }