UT_Error AbiCollabSessionManager::deserializeDocument(PD_Document** pDoc, const std::string& document, bool isEncodedBase64) { UT_return_val_if_fail(pDoc, UT_ERROR); UT_Error res = UT_ERROR; // really bad abuse of std::string's below, but more efficient than copying // the whole buffer (which could be massive) into a temporary buffer GsfInput *source; if (isEncodedBase64) { char* base64gzBuf = const_cast<char*>(document.c_str()); size_t gzbufLen = gsf_base64_decode_simple((guint8*)base64gzBuf, strlen(base64gzBuf)); char* gzBuf = base64gzBuf; source = gsf_input_memory_new((guint8*)gzBuf, gzbufLen, false); } else { // string contains raw zipped data source = gsf_input_memory_new((guint8*)document.c_str(), document.size(), false); } if (source) { GsfInput *gzabwBuf = gsf_input_gzip_new (source, NULL); // todo: don't pass null here, but check for errors if (gzabwBuf) { bool create = (*pDoc == NULL); if (create) { UT_DEBUGMSG(("Creating a new document in AbiCollabSessionManager::deserializeDocument()\n")); (*pDoc) = new PD_Document(); (*pDoc)->createRawDocument(); } IE_Imp* imp = (IE_Imp*)new IE_Imp_AbiWord_1(*pDoc); imp->importFile(gzabwBuf); // todo: check for errors (*pDoc)->repairDoc(); if (create) (*pDoc)->finishRawCreation(); DELETEP(imp); g_object_unref(G_OBJECT(gzabwBuf)); res = UT_OK; } else { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); } g_object_unref(G_OBJECT(source)); } else { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); } return res; }
static int test (int argc, char *argv[]) { GsfInput *input; GsfInput *gzip; GError *err = NULL; int i; for (i = 1 ; i < argc ; i++) { puts (argv[i]); input = gsf_input_stdio_new (argv[i], &err); if (input == NULL) { g_return_val_if_fail (err != NULL, 1); g_warning ("'%s' error: %s", argv[i], err->message); g_error_free (err); err = NULL; continue; } gzip = gsf_input_gzip_new (input, &err); if (gzip == NULL) { g_return_val_if_fail (err != NULL, 1); g_warning ("'%s' Not a GZip file: %s", argv[i], err->message); g_error_free (err); err = NULL; g_object_unref (G_OBJECT (input)); continue; } gsf_input_dump (gzip, FALSE); g_object_unref (G_OBJECT (gzip)); g_object_unref (G_OBJECT (input)); } return 0; }