diff --git a/file.c b/file.c index e38a4afb5a..1753f45b8c 100755 --- a/file.c +++ b/file.c @@ -146,7 +146,7 @@ int ast_stopstream(struct ast_channel *tmp) if (!tmp->stream) return 0; tmp->stream->fmt->close(tmp->stream); - if (ast_set_write_format(tmp, tmp->oldwriteformat)) + if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat)) ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat); return 0; } @@ -192,6 +192,45 @@ int ast_writestream(struct ast_filestream *fs, struct ast_frame *f) } } +static int copy(char *infile, char *outfile) +{ + int ifd; + int ofd; + int res; + int len; + char buf[4096]; + if ((ifd = open(infile, O_RDONLY)) < 0) { + ast_log(LOG_WARNING, "Unable to open %s in read-only mode\n", infile); + return -1; + } + if ((ofd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 0600)) < 0) { + ast_log(LOG_WARNING, "Unable to open %s in write-only mode\n", outfile); + close(ifd); + return -1; + } + do { + len = read(ifd, buf, sizeof(buf)); + if (len < 0) { + ast_log(LOG_WARNING, "Read failed on %s: %s\n", infile, strerror(errno)); + close(ifd); + close(ofd); + unlink(outfile); + } + if (len) { + res = write(ofd, buf, len); + if (res != len) { + ast_log(LOG_WARNING, "Write failed on %s (%d of %d): %s\n", outfile, res, len, strerror(errno)); + close(ifd); + close(ofd); + unlink(outfile); + } + } + } while(len); + close(ifd); + close(ofd); + return 0; +} + static char *build_filename(char *filename, char *ext) { char *fn; @@ -210,6 +249,7 @@ static char *build_filename(char *filename, char *ext) #define ACTION_DELETE 2 #define ACTION_RENAME 3 #define ACTION_OPEN 4 +#define ACTION_COPY 5 static int ast_filehelper(char *filename, char *filename2, char *fmt, int action) { @@ -265,6 +305,16 @@ static int ast_filehelper(char *filename, char *filename2, char *fmt, int action } else ast_log(LOG_WARNING, "Out of memory\n"); break; + case ACTION_COPY: + nfn = build_filename(filename2, ext); + if (nfn) { + res = copy(fn, nfn); + if (res) + ast_log(LOG_WARNING, "copy(%s,%s) failed: %s\n", fn, nfn, strerror(errno)); + free(nfn); + } else + ast_log(LOG_WARNING, "Out of memory\n"); + break; case ACTION_OPEN: if ((ret < 0) && ((chan->writeformat & f->format))) { ret = open(fn, O_RDONLY); @@ -343,6 +393,11 @@ int ast_filerename(char *filename, char *filename2, char *fmt) return ast_filehelper(filename, filename2, fmt, ACTION_RENAME); } +int ast_filecopy(char *filename, char *filename2, char *fmt) +{ + return ast_filehelper(filename, filename2, fmt, ACTION_COPY); +} + int ast_streamfile(struct ast_channel *chan, char *filename, char *preflang) { /* This is a fairly complex routine. Essentially we should do diff --git a/include/asterisk/file.h b/include/asterisk/file.h index 5e424358bb..95c77f6b7e 100755 --- a/include/asterisk/file.h +++ b/include/asterisk/file.h @@ -59,6 +59,9 @@ int ast_filerename(char *oldname, char *newname, char *fmt); /* Delete a given file in a given format, or if fmt is NULL, then do so for all */ int ast_filedelete(char *filename, char *fmt); +/* Copy a given file in a given format, or if fmt is NULL, then do so for all */ +int ast_filecopy(char *oldname, char *newname, char *fmt); + /* Wait for a stream to stop or for any one of a given digit to arrive, Returns 0 if the stream finishes, the character if it was interrupted, and -1 on error */ char ast_waitstream(struct ast_channel *c, char *breakon); diff --git a/sounds/vm-Family.gsm b/sounds/vm-Family.gsm new file mode 100755 index 0000000000..0e64ea6be4 --- /dev/null +++ b/sounds/vm-Family.gsm @@ -0,0 +1,8 @@ +جPbDUaȹDAǓHO ֝!:QbxmVկƢW@”a0v)qJ,[s֜G +AȑaYbo\āil' i`Yd Zl훐ؒndF,~[g"أ5cnf9kFVcG$Ha&ށ _Kקơl]Ţxv^Tw&I6עK[VDm`6ӁJ_Ƣ;h6FO~DŠ‹*NIJأZu<聖`{A$Yi8mXbn E|º\#d扞f6MͽV&ca[DV,&nTO$&SquoRZs +sHFA]u +lpu'eshوuG*rK7'sJԥxGc4LM;$brjsCNHHNW+^vI s*اy޵;^ +D{qLJhqF8Gr4{'nqj$Hqf'p($( ):֢rr +I$F.zƳ[~X(fAžs#gܐc#dnM|ߣ!sMs|(#q$i{[̺ESq.q;W"l,jqC( qDS`ٮq䕹$qcOZ$Ƨwg=9Zq:뮉#aq&mq&eJcGV%2(֠;tsM UsS:0qe +8"dؠXfNLz2h 3T?ےц8+؁ZInQr/=QYwdb*37[K"ZAB)(:Rwc4¥`E"סUyCe"dn/beJ0T_ +j¥$TH? +5:ATR1kN¬m6v>B +/wbzSoyۃiZs[$AuTtwPNj$Z~M`eC:ґWjkҥ!"UgQ] 9ݤ?*S9gpV&gi/iDʒi-RngHˑDi:g2r5s3ύ( C`gA#iƛ~.u֞s:gQώ'du[ip&wgi [676rϓۑg5,i1( !qȓ\ ztvli&gQSjƌQoc4gȜq{.k1q7iQ-SkK#D`c{jkmjſkz.ȩױ^6mSh,$&m\Hͮr&mRG,E$P6ڮj#29PjLP{# 쵩oo8m Ԥy|խoi2 q+Vm7?to[*ʕnE4¥GN[jңznߛF)[%];-܆n$&lǿQQ"؆7ڦBrU5m$ O8$"}2k&GJmC% mnG؃ `3ïsŇ5̌jEy$k0(_܋c܄NnZ 4p„g`ΫIu6`{"4{:cd%!dr:l.Tݓ܋v[BP[Щ8+Ԟbig9N%iDCǧkCS ehԤuh_ͳDܭ~-#BnJ,ƗUĦ8jWb5\p%֜©,~C֛XάҡYc]Zp6ѤԢ acA eBG+bZe:`vS3eE Vrc0. +UmP߭ި)gcQISͩ WZ9`݌ c)[]dZj]dw ZƢAYU޸LnKoZer٧X9$Xrn\Yu lElVԝb%b¨g!tb(yb\#诜MGϵ·Rb嗓t&\g#&DƥGmL%5V&eVKaaWcFCFc|ju2ai-6:ha^b(`sbVaCR$_i_iE-Vzvנj]-N]n;nF]ʩcS8]x̜#Z&4]ܪ(g]LV\xp2DIuYU)'Z͢l;BĨsI9;\ ͩdgzc\SӸز`aF_'OkflaYyO[Y֘o8N]Zgi→BGoYdߒdK&jKk9JMf5)@ SiI$@e)\JUZ:-ĎjS&r0A>h Һa,)2䧷ocf]$[ڪlr.lÅyEbU!qFR9)؋;3EuKƢYzȸnKhQnN9XI"mʚfm$&Yw\7fWh^Q,Z['vB![ӤWF:p۱(xY ++f; ӣW(F&W%WBI.|W>ړ;ӤW#ʺϭhUE?+ +-ԠXW$]2t&KJXc.K`GYcDNhWB5&"/B̐ȃ:^Y2 ݬTln{%t!bɷC5@Du:כ\yŧx$q*?U<8QK>؎t---'(ia|5\4^!k1qlA6 +ߌrՑ# E,©#j3`yaF!P=QhPu +{$&rl+p7KFv8h[ -$ģ3 Z֧idhA@%EgmyH$ۧ'fXdqj(#0'-ISc?$*YPHzB˖F(/\#iTҀFVǵ#6Gb"XUPS5<#+; +r*nuȕcZWnV%2Sגd٭]٦lލX\?bŻm%lFsY$GeD0О5 m݊ٔd㝳Ԃ'q7C!Ir*{d"eTQԂFڞ'+;Hޝ+_YjT4ޭ`xƉ \ No newline at end of file diff --git a/sounds/vm-delete.gsm b/sounds/vm-delete.gsm new file mode 100755 index 0000000000..ba15d85b7b Binary files /dev/null and b/sounds/vm-delete.gsm differ diff --git a/sounds/vm-first.gsm b/sounds/vm-first.gsm new file mode 100755 index 0000000000..795ed9add5 Binary files /dev/null and b/sounds/vm-first.gsm differ diff --git a/sounds/vm-for.gsm b/sounds/vm-for.gsm new file mode 100755 index 0000000000..0f58813792 Binary files /dev/null and b/sounds/vm-for.gsm differ diff --git a/sounds/vm-helpexit.gsm b/sounds/vm-helpexit.gsm new file mode 100755 index 0000000000..ecce174220 Binary files /dev/null and b/sounds/vm-helpexit.gsm differ diff --git a/sounds/vm-incorrect.gsm b/sounds/vm-incorrect.gsm index 486a9b8b4e..8b78becf3e 100755 Binary files a/sounds/vm-incorrect.gsm and b/sounds/vm-incorrect.gsm differ diff --git a/sounds/vm-last.gsm b/sounds/vm-last.gsm new file mode 100755 index 0000000000..5fe7b7f51f Binary files /dev/null and b/sounds/vm-last.gsm differ diff --git a/sounds/vm-next.gsm b/sounds/vm-next.gsm new file mode 100755 index 0000000000..7786bf6ff3 Binary files /dev/null and b/sounds/vm-next.gsm differ diff --git a/sounds/vm-onefor.gsm b/sounds/vm-onefor.gsm new file mode 100755 index 0000000000..71b9c65d8f Binary files /dev/null and b/sounds/vm-onefor.gsm differ diff --git a/sounds/vm-opts.gsm b/sounds/vm-opts.gsm new file mode 100755 index 0000000000..3e9006dfc0 Binary files /dev/null and b/sounds/vm-opts.gsm differ diff --git a/sounds/vm-press.gsm b/sounds/vm-press.gsm new file mode 100755 index 0000000000..35507909ff Binary files /dev/null and b/sounds/vm-press.gsm differ diff --git a/sounds/vm-prev.gsm b/sounds/vm-prev.gsm new file mode 100755 index 0000000000..de964a73c4 --- /dev/null +++ b/sounds/vm-prev.gsm @@ -0,0 +1,6 @@ +ibP&GD,uꦄv2P)so(Dلס*RJa4e`\Ă!Кޛ بzg\ơJ%2ځ*\\a!b25_Xґ$ew [H-#;[6ʒwxbfkP\̤>bBjB 8݃Y"sw}ˡzآE [IW/]Vm$C=`O)˥8cUU̔5ү-ScT-bC w#~*f[CZݩw).1)hЧwc^D;7{]Y|#<*WDKsB2aVi#k#֐꡼Kء2TY%䉨⡵u”`YĞBG&ؚYpVIFh'$nWЁhdli)m!wAb%JoE\5[ag79h!Z鉨tFt%#ݶcPMԤ,#JQ +쎅+vҪʢNI#']}bXLԔIpCJ.[&CvdB:pZa7MiqRW0aUp4j$%~v])EZ&ٟ]؁aZQBlTǝ桫=㘢""$סiajA8Yh*TTh$"נek䝒[n9oSoOLKvb!fᲃiۼHhZf^@fC6Jڂ\SPAe{<&XæjXǃ8&uGlj'…),,ng$-6<٩@Љ_K/wl~V2)cg,4d`ؘ$.:moVOv1eoʈ %PnM~~;Jϒ %٭aHr%=X1òx6e( c5RZU &Ѯ{:3QJ٨k~kfk"ŨxLjcj,X򣓝CYHꚲ!"S ^:r5,zX%ctU%L`T!r~ZI hm.X_THܴJa*{ipsi#kkgźgt9dԡi'$Ae46og4 c3*iؔbcl3:3 is6۱m[I8Sf4qsi98kSTmkM]dF׍Y8DV {6mTmpr&j}ޯRpovUU֠[|R)$qQG$NDN,r9Ruq7>"Stp'hqQ\yν{N(עC2{nG_lF&wof$CrN&ORēF .;7eD#J7=NXV܉2omԌWl +aJ>}-JH + jS8mIpvC:$UۊK4y/; b.-ĸdlt9#f[X•v! asbܢ!# +{5"6qƣy٬Z +Z[s)|Txvu)KUqۢabVCچ(#|#T"ȍ(]"Nj5`%)RQhmS%p:ZcJy52],ȩ܂ybaIeXΪVPtU%٩r] oLb+sd/7G=[QU#U򥄨&Xݪ:4toأ–bxETrD~GHerGnS:7{·0ؠ¥VZ†iH& LBZYQuC4(R6v +쾁ӜM[Ң8n%B&&w!Y)*h؞!ba" Qj#kxlzFEjפˡ[^? ez̒c9c%b~mHߊDb[ӷ\Hi8lǤ(>ށĦ_ZcԊ"w N")2ɿ#(Qޢy!\lThosA ]3S$IWb9ҵAן*עXR)"to!=TOB(mZRP"ta%TttgB.ܠT0؉FzURdQ-Ll┑B[ԖY +PIVjWd'*n5 m \ No newline at end of file diff --git a/sounds/vm-savedto.gsm b/sounds/vm-savedto.gsm new file mode 100755 index 0000000000..00e96cae8c Binary files /dev/null and b/sounds/vm-savedto.gsm differ diff --git a/sounds/vm-savefolder.gsm b/sounds/vm-savefolder.gsm new file mode 100755 index 0000000000..dbc9d072f0 Binary files /dev/null and b/sounds/vm-savefolder.gsm differ diff --git a/sounds/vm-savemessage.gsm b/sounds/vm-savemessage.gsm new file mode 100755 index 0000000000..7d06542e1e Binary files /dev/null and b/sounds/vm-savemessage.gsm differ diff --git a/sounds/vm-tocancel.gsm b/sounds/vm-tocancel.gsm new file mode 100755 index 0000000000..a53289ac44 Binary files /dev/null and b/sounds/vm-tocancel.gsm differ diff --git a/sounds/vm-toforward.gsm b/sounds/vm-toforward.gsm new file mode 100755 index 0000000000..627d52eec2 Binary files /dev/null and b/sounds/vm-toforward.gsm differ diff --git a/sounds/vm-undelete.gsm b/sounds/vm-undelete.gsm new file mode 100755 index 0000000000..7496f06472 Binary files /dev/null and b/sounds/vm-undelete.gsm differ