00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "export.h"
00022
00023 namespace SaX {
00024
00025
00026
00027 SaXExport::SaXExport (SaXImport* import, SaXException* to) {
00028
00032
00033 if (to) {
00034 mTo = to;
00035 }
00036 switch (import->getSectionID()) {
00037 case SAX_CARD:
00038 mFile = ISAXCARD;
00039 break;
00040 case SAX_DESKTOP:
00041 mFile = ISAXDESKTOP;
00042 break;
00043 case SAX_POINTERS:
00044 mFile = ISAXINPUT;
00045 break;
00046 case SAX_KEYBOARD:
00047 mFile = ISAXKEYBOARD;
00048 break;
00049 case SAX_LAYOUT:
00050 mFile = ISAXLAYOUT;
00051 break;
00052 case SAX_PATH:
00053 mFile = ISAXPATH;
00054 break;
00055 case SAX_EXTENSIONS:
00056 mFile = ISAXEXTENSIONS;
00057 break;
00058 default:
00059 excExportSectionFailed();
00060 qError (errorString(),EXC_EXPORTSECTIONFAILED);
00061 if (mTo) {
00062 mTo -> excExportSectionFailed();
00063 }
00064 break;
00065 }
00066 mHandle = new QFile (mFile);
00067 mImport = import;
00068 }
00069
00070
00071
00072
00073 bool SaXExport::doExport (void) {
00074
00077
00078 if (! havePrivileges()) {
00079 excPermissionDenied ();
00080 qError (errorString(),EXC_PERMISSIONDENIED);
00081 if (mTo) {
00082 mTo -> excPermissionDenied ();
00083 }
00084 return false;
00085 }
00086 if (! mHandle -> open(IO_WriteOnly)) {
00087 excFileOpenFailed ( errno );
00088 qError (errorString(),EXC_FILEOPENFAILED);
00089 if (mTo) {
00090 mTo -> excFileOpenFailed ( errno );
00091 }
00092 return false;
00093 }
00094 if ((flock (mHandle->handle(),LOCK_EX)) != 0) {
00095 excLockSetFailed ( errno );
00096 qError (errorString(),EXC_LOCKSETFAILED);
00097 if (mTo) {
00098 mTo -> excLockSetFailed ( errno );
00099 }
00100 mHandle -> close();
00101 return false;
00102 }
00103 for (int id=0; id < mImport->getCount();id++) {
00104 QDict<QString>* data = mImport->getTablePointer (id);
00105 if ( ! data ) {
00106 excNoStorage(id);
00107 qError (errorString(),EXC_NOSTORAGE);
00108 if (mTo) {
00109 mTo -> excNoStorage(id);
00110 }
00111 continue;
00112 }
00113 QDictIterator<QString> it (*data);
00114 for (; it.current(); ++it) {
00115 QString line;
00116 line.sprintf ("%d : %-20s : %s\n",
00117 id,it.currentKey().ascii(),it.current()->ascii()
00118 );
00119 mHandle -> writeBlock (
00120 line.ascii(),line.length()
00121 );
00122 }
00123 }
00124 if ((flock (mHandle->handle(),LOCK_UN)) != 0) {
00125 excLockUnsetFailed ( errno );
00126 qError (errorString(),EXC_LOCKUNSETFAILED);
00127 if (mTo) {
00128 mTo -> excLockUnsetFailed ( errno );
00129 }
00130 mHandle -> close();
00131 return false;
00132 }
00133 mHandle -> close();
00134 return true;
00135 }
00136 }